// 统一字符输出入口
static void put_char(char ch)
{
#ifdef PRINT_TARGET_RTT
SEGGER_RTT_PutCharSkipNoLock(0, ch);
#endif
#ifdef PRINT_TARGET_UART
// 调用你工程的串口发送单字符函数
UART_SendData(ch);
#endif
#ifdef PRINT_TARGET_LCD
// 调用液晶屏幕字符输出函数
LCD_PutChar(ch);
#endif
}
//适合前导零补齐,或空格右对齐
void putNum(int num, int base, uint8_t charNum, uint8_t fillchar)
{
char buf12;
int i = 0;
int is_neg = 0;
if(num < 0)
{
is_neg = 1;
num = -num;
}
if(num == 0)
{
bufi++ = '0';
}
else
{
do
{
int rem = num % base;
if(rem < 10)
bufi++ = '0' + rem;
else
bufi++ = 'A' + (rem - 10);
num /= base;
} while(num > 0);
}
int pad_len = charNum - i;
if(is_neg) pad_len--;
while(pad_len > 0)
{
put_char(fillchar);
pad_len--;
}
if(is_neg)
{
put_char('-');
}
while(i > 0)
{
put_char(buf--i);
}
}
int log_print(const char * sFormat, ...)
{
int i = 0;
uint8_t format;
va_list ParamList;
va_start(ParamList, sFormat);
const char* s = sFormat;
while(*s != '\0' && i < 255)
{
if (*s == '%')
{
s++;
int wide = 0;
int widePoint = 0;
// 解析总位宽
while(*s >= '0' && *s <= '9')
{
wide = wide * 10 + (*s - '0');
s++;
}
// 解析小数位
if(*s == '.')
{
s++;
while(*s >= '0' && *s <= '9')
{
widePoint = widePoint * 10 + (*s - '0');
s++;
}
}
format = *s;
s++;
if(format >= 'a' && format <= 'z')
format -= 'a' - 'A';
if(format == 'F')
{
double f = va_arg(ParamList, double);
int is_neg = 0;
if(f < 0)
{
is_neg = 1;
f = -f;
}
int int_val = (int)f;
int int_w = wide;
if(widePoint > 0)
int_w = wide - widePoint - 1;
if(is_neg)
{
put_char('-');
int_w--;
}
putNum(int_val, 10, int_w, ' ');
if(widePoint > 0)
{
put_char('.');
unsigned int dec_val = (unsigned int)(f * pow(10, widePoint) + 0.5);
putNum(dec_val, 10, widePoint, '0');
}
}
else
{
int v = va_arg(ParamList, int);
switch(format)
{
case 'S':
put_char((char)v);
break;
case 'D':
putNum(v, 10, wide, ' ');
break;
case 'X':
case 'P':
putNum(v, 16, wide, '0');
break;
default:
break;
}
}
}
else
{
put_char(*s);
s++;
}
i++;
}
va_end(ParamList);
return 0;
}