271 lines
6.2 KiB
C
271 lines
6.2 KiB
C
|
|
|||
|
#include "uart_console.h"
|
|||
|
#include "debug.h"
|
|||
|
typedef struct uart_config
|
|||
|
{
|
|||
|
char *name;
|
|||
|
void (*fun)(u8, void *);
|
|||
|
} uart_config;
|
|||
|
#define NAME_SIZE 20
|
|||
|
#define PAR_SIZE 100
|
|||
|
typedef struct uart_console
|
|||
|
{
|
|||
|
|
|||
|
char fun_name[NAME_SIZE];
|
|||
|
|
|||
|
int par_int[PAR_SIZE];
|
|||
|
float par_float[PAR_SIZE];
|
|||
|
|
|||
|
uart_config *cfg;
|
|||
|
// private
|
|||
|
u8 pos;
|
|||
|
u8 step;
|
|||
|
u8 par_num;
|
|||
|
u8 fun_ord;
|
|||
|
u8 dot : 1; // С<><D0A1>
|
|||
|
u8 nega : 1; // <20><><EFBFBD><EFBFBD>
|
|||
|
} uart_console;
|
|||
|
|
|||
|
/*_______________________________________Driver___________________________________________________________*/
|
|||
|
|
|||
|
static u8 str_cmp(char *char1, char *char2, u8 len)
|
|||
|
{
|
|||
|
for (int i = 0; i < NAME_SIZE; i++)
|
|||
|
{
|
|||
|
if ((*char1 == *char2) && *char1 == '\0')
|
|||
|
{
|
|||
|
return 1;
|
|||
|
}
|
|||
|
if (*char1 != *char2)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
char1++;
|
|||
|
char2++;
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
/** function comment
|
|||
|
* @description:
|
|||
|
* @param {uart_console} *tis
|
|||
|
* @return {*}
|
|||
|
*/
|
|||
|
u8 uart_console_name_analysis(uart_console *tis)
|
|||
|
{
|
|||
|
uart_config *cfg = tis->cfg;
|
|||
|
u8 ord = 0;
|
|||
|
while (!(str_cmp(cfg[ord].name, "end", 3)))
|
|||
|
{
|
|||
|
if (str_cmp(cfg[ord].name, tis->fun_name, tis->pos))
|
|||
|
{
|
|||
|
|
|||
|
return ord;
|
|||
|
}
|
|||
|
|
|||
|
ord++;
|
|||
|
}
|
|||
|
return 255;
|
|||
|
}
|
|||
|
|
|||
|
extern uart_console console;
|
|||
|
/** function comment
|
|||
|
* @description:
|
|||
|
* @return {*}
|
|||
|
*/
|
|||
|
void uart_console_put_char(u8 data)
|
|||
|
{
|
|||
|
uart_console *tis = &console;
|
|||
|
|
|||
|
if (data == '@')
|
|||
|
{
|
|||
|
tis->step = 0;
|
|||
|
tis->pos = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
switch (tis->step)
|
|||
|
{
|
|||
|
|
|||
|
case 0:
|
|||
|
if (data == '(')
|
|||
|
{
|
|||
|
tis->fun_ord = uart_console_name_analysis(tis);
|
|||
|
// Printf("name is %d\n", tis->fun_ord);
|
|||
|
if (tis->fun_ord != 255)
|
|||
|
{
|
|||
|
tis->nega = 0;
|
|||
|
tis->step++;
|
|||
|
tis->pos = 0;
|
|||
|
tis->par_num = 0;
|
|||
|
tis->dot = 0;
|
|||
|
tis->par_int[0] = 0;
|
|||
|
// Printf("name is %d\n", tis->fun_ord);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tis->step = 0;
|
|||
|
tis->pos = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tis->fun_name[tis->pos] = data;
|
|||
|
tis->pos++;
|
|||
|
tis->fun_name[tis->pos] = '\0';
|
|||
|
if (tis->pos == NAME_SIZE)
|
|||
|
{
|
|||
|
Printf("error: uart console buffer overflow\n");
|
|||
|
tis->pos = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case 1:
|
|||
|
|
|||
|
if (data == ')')
|
|||
|
{
|
|||
|
tis->cfg[tis->fun_ord].fun(tis->par_num, tis);
|
|||
|
tis->step = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
tis->step++;
|
|||
|
}
|
|||
|
case 2:
|
|||
|
|
|||
|
if (data == ')')
|
|||
|
{
|
|||
|
|
|||
|
while (tis->par_float[tis->pos] > 1)
|
|||
|
{
|
|||
|
tis->par_float[tis->pos] = tis->par_float[tis->pos] / 10.0;
|
|||
|
}
|
|||
|
tis->par_float[tis->pos] = (float)tis->par_int[tis->pos] + tis->par_float[tis->pos];
|
|||
|
|
|||
|
if (tis->nega == 1)
|
|||
|
{
|
|||
|
Printf("nega\n");
|
|||
|
tis->par_float[tis->pos] = tis->par_float[tis->pos] * (-1.0);
|
|||
|
tis->par_int[tis->pos] = tis->par_int[tis->pos] * (-1);
|
|||
|
}
|
|||
|
|
|||
|
tis->par_num++;
|
|||
|
tis->cfg[tis->fun_ord].fun(tis->par_num, tis);
|
|||
|
tis->step = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
else if (data == '.')
|
|||
|
{
|
|||
|
tis->dot = 1;
|
|||
|
return;
|
|||
|
}
|
|||
|
else if (data == '-')
|
|||
|
{
|
|||
|
tis->nega = 1;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
else if (data == ',')
|
|||
|
{
|
|||
|
|
|||
|
while (tis->par_float[tis->pos] > 1)
|
|||
|
{
|
|||
|
tis->par_float[tis->pos] = tis->par_float[tis->pos] / 10.0;
|
|||
|
}
|
|||
|
tis->par_float[tis->pos] = (float)tis->par_int[tis->pos] + tis->par_float[tis->pos];
|
|||
|
|
|||
|
if (tis->nega == 1)
|
|||
|
{
|
|||
|
Printf("nega\n");
|
|||
|
tis->par_float[tis->pos] = tis->par_float[tis->pos] * (-1.0);
|
|||
|
tis->par_int[tis->pos] = tis->par_int[tis->pos] * (-1);
|
|||
|
}
|
|||
|
|
|||
|
tis->nega = 0;
|
|||
|
tis->dot = 0;
|
|||
|
tis->pos++;
|
|||
|
tis->par_num++;
|
|||
|
tis->par_float[tis->pos] = 0.0;
|
|||
|
tis->par_int[tis->pos] = 0;
|
|||
|
if (tis->par_num == PAR_SIZE)
|
|||
|
{
|
|||
|
Printf("error : uart console par overflow\n");
|
|||
|
tis->par_num = 0;
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
else if (data < '0' || data > '9')
|
|||
|
{
|
|||
|
Printf("error: uart console illegal parameter\n");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (!tis->dot)
|
|||
|
{
|
|||
|
|
|||
|
tis->par_int[tis->pos] = tis->par_int[tis->pos] * 10 + data - '0';
|
|||
|
// Printf("%d\n",tis->par_int[tis->pos]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
tis->par_float[tis->pos] = tis->par_float[tis->pos] * 10 + data - '0';
|
|||
|
}
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
/*__________________________________________________________________________________________________*/
|
|||
|
|
|||
|
/*__________________________________________user________________________________________________________*/
|
|||
|
static void test_cmd(u8 par_num, void *par)
|
|||
|
{
|
|||
|
uart_console *tis = (uart_console *)par;
|
|||
|
Printf("test cmd %d\n", par_num);
|
|||
|
for (int i = 0; i < par_num; i++)
|
|||
|
{
|
|||
|
Printf(" %d,%f\n", tis->par_int[i], tis->par_float[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
static void pwm_set(u8 par_num, void *par)
|
|||
|
{
|
|||
|
uart_console *tis = (uart_console *)par;
|
|||
|
extern void duty_set(unsigned char ch, unsigned char _duty);
|
|||
|
duty_set((unsigned char)tis->par_int[0], (unsigned char)tis->par_int[1]);
|
|||
|
}
|
|||
|
static void test_ds18b20(u8 par_num, void *par){
|
|||
|
uart_console *tis = (uart_console *)par;
|
|||
|
#include "ds18b20.h"
|
|||
|
#include "debug.h"
|
|||
|
float temp = ds18b20_read_temp(0);
|
|||
|
Printf("temp = %f\n", temp);
|
|||
|
ds18b20_start_convert(0);
|
|||
|
// ds18b20_rst(0);
|
|||
|
// ds18b20_write_data(0, 0xcc);
|
|||
|
}
|
|||
|
static uart_config cfg[] = {
|
|||
|
|
|||
|
{"test", test_cmd},
|
|||
|
{"pwm", pwm_set},
|
|||
|
{"ds18b20",test_ds18b20},
|
|||
|
{"end", NULL},
|
|||
|
};
|
|||
|
uart_console console = {
|
|||
|
.step = 0,
|
|||
|
.cfg = cfg,
|
|||
|
};
|
|||
|
|
|||
|
// int main()
|
|||
|
// {
|
|||
|
// u8 data[] = "@test123(12,3214,2183,0.232434,-12321)";
|
|||
|
// for (int i = 0; i < sizeof(data); i++)
|
|||
|
// {
|
|||
|
// uart_console_put_char(data[i]);
|
|||
|
// }
|
|||
|
// }
|