1 /*
2 * Copyright (c) 2006-2025 RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2018-04-14 chenyong first version
9 * 2023-06-09 CX optimize at_vprintfln interface
10 */
11
12 #include <at.h>
13 #include <stdlib.h>
14 #include <stdio.h>
15
16 /**
17 * dump hex format data to console device
18 *
19 * @param name name for hex object, it will show on log header
20 * @param buf hex buffer
21 * @param size buffer size
22 */
at_print_raw_cmd(const char * name,const char * buf,rt_size_t size)23 void at_print_raw_cmd(const char *name, const char *buf, rt_size_t size)
24 {
25 #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
26 #define WIDTH_SIZE 32
27
28 rt_size_t i, j;
29
30 for (i = 0; i < size; i += WIDTH_SIZE)
31 {
32 rt_kprintf("[D/AT] %s: %04X-%04X: ", name, i, i + WIDTH_SIZE);
33 for (j = 0; j < WIDTH_SIZE; j++)
34 {
35 if (i + j < size)
36 {
37 rt_kprintf("%02X ", (unsigned char)buf[i + j]);
38 }
39 else
40 {
41 rt_kprintf(" ");
42 }
43 if ((j + 1) % 8 == 0)
44 {
45 rt_kprintf(" ");
46 }
47 }
48 rt_kprintf(" ");
49 for (j = 0; j < WIDTH_SIZE; j++)
50 {
51 if (i + j < size)
52 {
53 rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
54 }
55 }
56 rt_kprintf("\n");
57 }
58 }
at_utils_send(rt_device_t dev,rt_off_t pos,const void * buffer,rt_size_t size)59 rt_weak rt_size_t at_utils_send(rt_device_t dev,
60 rt_off_t pos,
61 const void *buffer,
62 rt_size_t size)
63 {
64 return rt_device_write(dev, pos, buffer, size);
65 }
at_vprintf(rt_device_t device,char * send_buf,rt_size_t buf_size,const char * format,va_list args)66 rt_size_t at_vprintf(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args)
67 {
68 rt_size_t len = vsnprintf(send_buf, buf_size, format, args);
69 if (len == 0)
70 {
71 return 0;
72 }
73
74 #ifdef AT_PRINT_RAW_CMD
75 at_print_raw_cmd("sendline", send_buf, len);
76 #endif
77
78 return at_utils_send(device, 0, send_buf, len);
79 }
at_vprintfln(rt_device_t device,char * send_buf,rt_size_t buf_size,const char * format,va_list args)80 rt_size_t at_vprintfln(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args)
81 {
82 rt_size_t len = vsnprintf(send_buf, buf_size - 2, format, args);
83 if (len == 0)
84 {
85 return 0;
86 }
87
88 send_buf[len++] = '\r';
89 send_buf[len++] = '\n';
90
91 #ifdef AT_PRINT_RAW_CMD
92 at_print_raw_cmd("sendline", send_buf, len);
93 #endif
94
95 return at_utils_send(device, 0, send_buf, len);
96 }
at_vprintfcr(rt_device_t device,char * send_buf,rt_size_t buf_size,const char * format,va_list args)97 rt_size_t at_vprintfcr(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args)
98 {
99 rt_size_t len = vsnprintf(send_buf, buf_size - 1, format, args);
100 if (len == 0)
101 {
102 return 0;
103 }
104
105 send_buf[len++] = '\r';
106
107 #ifdef AT_PRINT_RAW_CMD
108 at_print_raw_cmd("sendline", send_buf, len);
109 #endif
110
111 return at_utils_send(device, 0, send_buf, len);
112 }
at_vprintflf(rt_device_t device,char * send_buf,rt_size_t buf_size,const char * format,va_list args)113 rt_size_t at_vprintflf(rt_device_t device, char *send_buf, rt_size_t buf_size, const char *format, va_list args)
114 {
115 rt_size_t len = vsnprintf(send_buf, buf_size - 1, format, args);
116 if (len == 0)
117 {
118 return 0;
119 }
120
121 send_buf[len++] = '\n';
122
123 #ifdef AT_PRINT_RAW_CMD
124 at_print_raw_cmd("sendline", send_buf, len);
125 #endif
126
127 return at_utils_send(device, 0, send_buf, len);
128 }