1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2018-04-14 chenyong first version
9*10465441SEvalZero */
10*10465441SEvalZero
11*10465441SEvalZero #include <at.h>
12*10465441SEvalZero #include <stdlib.h>
13*10465441SEvalZero #include <stdio.h>
14*10465441SEvalZero
15*10465441SEvalZero static char send_buf[AT_CMD_MAX_LEN];
16*10465441SEvalZero static rt_size_t last_cmd_len = 0;
17*10465441SEvalZero
18*10465441SEvalZero /**
19*10465441SEvalZero * dump hex format data to console device
20*10465441SEvalZero *
21*10465441SEvalZero * @param name name for hex object, it will show on log header
22*10465441SEvalZero * @param buf hex buffer
23*10465441SEvalZero * @param size buffer size
24*10465441SEvalZero */
at_print_raw_cmd(const char * name,const char * buf,rt_size_t size)25*10465441SEvalZero void at_print_raw_cmd(const char *name, const char *buf, rt_size_t size)
26*10465441SEvalZero {
27*10465441SEvalZero #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
28*10465441SEvalZero #define WIDTH_SIZE 32
29*10465441SEvalZero
30*10465441SEvalZero rt_size_t i, j;
31*10465441SEvalZero
32*10465441SEvalZero for (i = 0; i < size; i += WIDTH_SIZE)
33*10465441SEvalZero {
34*10465441SEvalZero rt_kprintf("[D/AT] %s: %04X-%04X: ", name, i, i + WIDTH_SIZE);
35*10465441SEvalZero for (j = 0; j < WIDTH_SIZE; j++)
36*10465441SEvalZero {
37*10465441SEvalZero if (i + j < size)
38*10465441SEvalZero {
39*10465441SEvalZero rt_kprintf("%02X ", buf[i + j]);
40*10465441SEvalZero }
41*10465441SEvalZero else
42*10465441SEvalZero {
43*10465441SEvalZero rt_kprintf(" ");
44*10465441SEvalZero }
45*10465441SEvalZero if ((j + 1) % 8 == 0)
46*10465441SEvalZero {
47*10465441SEvalZero rt_kprintf(" ");
48*10465441SEvalZero }
49*10465441SEvalZero }
50*10465441SEvalZero rt_kprintf(" ");
51*10465441SEvalZero for (j = 0; j < WIDTH_SIZE; j++)
52*10465441SEvalZero {
53*10465441SEvalZero if (i + j < size)
54*10465441SEvalZero {
55*10465441SEvalZero rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
56*10465441SEvalZero }
57*10465441SEvalZero }
58*10465441SEvalZero rt_kprintf("\n");
59*10465441SEvalZero }
60*10465441SEvalZero }
61*10465441SEvalZero
at_get_last_cmd(rt_size_t * cmd_size)62*10465441SEvalZero const char *at_get_last_cmd(rt_size_t *cmd_size)
63*10465441SEvalZero {
64*10465441SEvalZero *cmd_size = last_cmd_len;
65*10465441SEvalZero return send_buf;
66*10465441SEvalZero }
67*10465441SEvalZero
at_vprintf(rt_device_t device,const char * format,va_list args)68*10465441SEvalZero rt_size_t at_vprintf(rt_device_t device, const char *format, va_list args)
69*10465441SEvalZero {
70*10465441SEvalZero last_cmd_len = vsnprintf(send_buf, sizeof(send_buf), format, args);
71*10465441SEvalZero
72*10465441SEvalZero #ifdef AT_PRINT_RAW_CMD
73*10465441SEvalZero at_print_raw_cmd("send", send_buf, last_cmd_len);
74*10465441SEvalZero #endif
75*10465441SEvalZero
76*10465441SEvalZero return rt_device_write(device, 0, send_buf, last_cmd_len);
77*10465441SEvalZero }
78*10465441SEvalZero
at_vprintfln(rt_device_t device,const char * format,va_list args)79*10465441SEvalZero rt_size_t at_vprintfln(rt_device_t device, const char *format, va_list args)
80*10465441SEvalZero {
81*10465441SEvalZero rt_size_t len;
82*10465441SEvalZero
83*10465441SEvalZero len = at_vprintf(device, format, args);
84*10465441SEvalZero
85*10465441SEvalZero rt_device_write(device, 0, "\r\n", 2);
86*10465441SEvalZero
87*10465441SEvalZero return len + 2;
88*10465441SEvalZero }
89