Files
kunlun/dtest/dtest3/common/dtest_printf.c
2024-09-28 14:24:04 +08:00

130 lines
3.6 KiB
C
Executable File

#include "uart.h"
#include "dtest_printf.h"
#define DTEST_UART_TO_PC 0
#define DBUF_MAX_LEN (DTEST_PRINTF_MAX_DATA_BUF * 3)
static char dtestbuf[DBUF_MAX_LEN + 64];
extern struct uart_ctrl uart_e_ctrl;
void dtest_puts_data(char *mnane, char *pntr, int len)
{
int offset = 0, i;
offset = iot_sprintf(dtestbuf, "\r\n[DATA] - %s:#START#", mnane);
for (i = 0; i < len; i++) {
offset += iot_sprintf(dtestbuf + offset, "%02X ", pntr[i]);
if (DBUF_MAX_LEN <= offset + 4) {
break;
}
}
offset += iot_sprintf(dtestbuf + offset, "%s", "#END#");
dtestbuf[offset] = 0;
iot_printf("%s\n", dtestbuf);
return;
}
int dtest_get_config(char *mname)
{
/* TODO */
return 0xFFFFFFFF;
}
static int dtest_atoi(char *s)
{
int i = 0, n = 0;
int is_hex = 0;
if (*s == '0' && (*(s+1) == 'x' || *(s+1) == 'X')) {
is_hex = 1;
}
if (is_hex == 1) {
char c ;
int num = 0;
for(i = 2; *(s+i) != '\0' && i < 10; i++) { //The limited length is 10
if( (*(s+i) < '0') || (*(s+i) > '9' && *(s+i) < 'A')
|| (*(s+i) > 'F' && *(s+i) < 'a') || *(s+i) > 'f') {
return -1;
}
c = *(s+i);
switch(c) {
case 'a': case 'A': num = 10; break;
case 'b': case 'B': num = 11; break;
case 'c': case 'C': num = 12; break;
case 'd': case 'D': num = 13; break;
case 'e': case 'E': num = 14; break;
case 'f': case 'F': num = 15; break;
default : num = c - '0'; break;
}
n = 16 * n + num;
}
} else {
for(i = 0; *(s+i) != '\0'; i++) {
if( *(s+i) < 0x30 || *(s+i) > 0x39 ) {
return -1;
}
n = 10 * n + (*(s+i) - '0');
}
}
return n;
}
int dtest_get_case_group(uint32_t *case_group)
{
char buf[32] = {0}; //cmd len 21 bytes: [CONFIG] - 0x0000000B
char key[] = "[CONFIG] - ";
int result;
uint32_t i, len_buf, len_key, len_fifo, idx_buf = 0;
uint32_t timeout_cnt = 5000000; //about 9s
len_buf = sizeof(buf);
len_key = sizeof(key) - 1;
do {
timeout_cnt--;
if (timeout_cnt == 0) {
return -1;
}
if (idx_buf >= (len_key + 10)) {
for(i = 0; i < len_key; i++) {
if (buf[i] != key[i]) {
idx_buf = 0;
for (uint32_t j = 0; j < sizeof(buf); j++) {
buf[j] = 0;
}
break;
}
}
if (idx_buf) {
*case_group = dtest_atoi(&buf[len_key]);
if (*case_group == -1) {
*case_group = 0;
return -1;
}
return 0;
}
}
len_fifo = uart_e_ctrl.rx_fifo_cnt(DTEST_UART_TO_PC);
if (len_fifo <= 0) {
continue;
}
len_fifo = ((len_buf - idx_buf) > len_fifo ? len_fifo : len_buf - idx_buf);
for (i = 0; i < len_fifo; i++) {
result = uart_e_ctrl.getc(DTEST_UART_TO_PC);
if ((idx_buf == 0) && ((result & 0xff) != key[0])) {
continue;
}
buf[idx_buf] = result & 0xff;
idx_buf++;
// dprintf("recv uart data: %s\n", buf);
}
} while(1);
}