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 }