From 166ab97fe7d8a04f427cfb9eea704d0c4200bc3a Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 30 May 2024 21:08:33 +0300 Subject: [PATCH] simplest stub --- F1:F103/FX3U/fx3u.bin | Bin 0 -> 7064 bytes F1:F103/FX3U/fx3u.creator.user | 15 +++--- F1:F103/FX3U/main.c | 5 +- F1:F103/FX3U/proto.c | 90 ++++++++++++++++++++++++++++++++- F1:F103/FX3U/proto.h | 17 +++++-- F1:F103/FX3U/version.inc | 4 +- 6 files changed, 116 insertions(+), 15 deletions(-) create mode 100755 F1:F103/FX3U/fx3u.bin diff --git a/F1:F103/FX3U/fx3u.bin b/F1:F103/FX3U/fx3u.bin new file mode 100755 index 0000000000000000000000000000000000000000..045d90aaa6824236b72550604eb324570dcf6461 GIT binary patch literal 7064 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 Xy-0T`{C-sE2`>Izks^c_8G!!_uLGzA literal 0 HcmV?d00001 diff --git a/F1:F103/FX3U/fx3u.creator.user b/F1:F103/FX3U/fx3u.creator.user index 2d3fcea..dc4772c 100644 --- a/F1:F103/FX3U/fx3u.creator.user +++ b/F1:F103/FX3U/fx3u.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -106,8 +106,8 @@ GenericProjectManager.GenericMakeStep 1 - Сборка - Сборка + Build + Build ProjectExplorer.BuildSteps.Build @@ -119,8 +119,8 @@ GenericProjectManager.GenericMakeStep 1 - Очистка - Очистка + Clean + Clean ProjectExplorer.BuildSteps.Clean 2 @@ -135,8 +135,8 @@ 0 - Развёртывание - Развёртывание + Deploy + Deploy ProjectExplorer.BuildSteps.Deploy 1 @@ -155,6 +155,7 @@ 2 false + -e cpu-cycles --call-graph dwarf,4096 -F 250 ProjectExplorer.CustomExecutableRunConfiguration diff --git a/F1:F103/FX3U/main.c b/F1:F103/FX3U/main.c index 61880d3..e3a34bf 100644 --- a/F1:F103/FX3U/main.c +++ b/F1:F103/FX3U/main.c @@ -77,7 +77,10 @@ int main(void){ char *str; int g = usart_getline(&str); if(g < 0) usart_send("USART IN buffer overflow!\n"); - else if(g > 0) cmd_parser(str); + else if(g > 0){ + const char *ans = cmd_parser(str); + if(ans) usart_send(ans); + } } return 0; } diff --git a/F1:F103/FX3U/proto.c b/F1:F103/FX3U/proto.c index 4b7e6b5..b50013d 100644 --- a/F1:F103/FX3U/proto.c +++ b/F1:F103/FX3U/proto.c @@ -28,6 +28,7 @@ flags_t flags = { .can_monitor = 0 }; +/* static void printans(int res){ if(res) usart_send("OK"); else usart_send("FAIL"); @@ -44,11 +45,96 @@ static void isetter(int(*fn)(int32_t), char* str){ if(str == getint(str, &d)) printans(FALSE); else printans(fn(d)); } +*/ + +// parno - number of parameter (or -1); cargs - string with arguments (after '=') (==NULL for getter), iarg - integer argument +static int goodstub(const char *cmd, int parno, const char *carg, int32_t iarg){ + usart_send("cmd="); usart_send(cmd); + usart_send(", parno="); usart_send(i2str(parno)); + usart_send(", args="); usart_send(carg); + usart_send(", intarg="); usart_send(i2str(iarg)); newline(); + return RET_GOOD; +} + +typedef struct{ + int (*fn)(const char*, int, const char*, int32_t); + const char *cmd; + const char *help; +} commands; + +static commands cmdlist[] = { + {goodstub, "stub", "simple stub"}, + {NULL, "Different commands", NULL}, +// {adcval, "ADC", "get ADCx value (without x - for all)"}, +// {adcvoltage, "ADCv", "get ADCx voltage (without x - for all)"}, +// {mcut, "mcut", "get MCU temperature"}, + {NULL, NULL, NULL} +}; + +static void printhelp(){ + commands *c = cmdlist; + usart_send("https://github.com/eddyem/stm32samples/tree/master/F1:F103/FX3U#" BUILD_NUMBER " @ " BUILD_DATE "\n"); + while(c->cmd){ + if(!c->fn){ // header + usart_send("\n "); + usart_send(c->cmd); + usart_putchar(':'); + }else{ + usart_send(c->cmd); + usart_send(" - "); + usart_send(c->help); + } + newline(); + ++c; + } +} + +/** + * @brief parsecmd - parse text commands over RS-232 + * @param str - input string + * @return answer code + */ +static int parsecmd(const char *str){ + char cmd[CMD_MAXLEN + 1]; + //USB_sendstr("cmd="); USB_sendstr(str); USB_sendstr("__\n"); + if(!str || !*str) return RET_CMDNOTFOUND; + int i = 0; + while(*str > '@' && i < CMD_MAXLEN){ cmd[i++] = *str++; } + cmd[i] = 0; + int parno = -1; + int32_t iarg = __INT32_MAX__; + if(*str){ + uint32_t N; + const char *nxt = getnum(str, &N); + if(nxt != str) parno = (int) N; + str = strchr(str, '='); + if(str){ + str = omit_spaces(++str); + getint(str, &iarg); + } + }else str = NULL; + commands *c = cmdlist; + while(c->cmd){ + if(strcmp(c->cmd, cmd) == 0){ + if(!c->fn) return RET_CMDNOTFOUND; + return c->fn(cmd, parno, str, iarg); + } + ++c; + } + return RET_CMDNOTFOUND; +} /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data */ -void cmd_parser(char *txt){ - (void)txt; +const char *cmd_parser(const char *txt){ + int ret = parsecmd(txt); + switch(ret){ + case RET_WRONGPARNO: return "Wrong parameter number\n"; break; + case RET_CMDNOTFOUND: printhelp(); return NULL; break; + case RET_WRONGARG: return "Wrong command parameters\n"; break; + case RET_GOOD: return NULL; break; + default: return "FAIL\n"; break; + } } diff --git a/F1:F103/FX3U/proto.h b/F1:F103/FX3U/proto.h index 023471a..0402f29 100644 --- a/F1:F103/FX3U/proto.h +++ b/F1:F103/FX3U/proto.h @@ -21,7 +21,19 @@ #include #include "hardware.h" -#define BUFSZ (64) +#ifndef _U_ +#define _U_ __attribute__((__unused__)) +#endif + +#define CMD_MAXLEN (32) + +enum{ + RET_WRONGPARNO = -3, // wrong parameter number + RET_CMDNOTFOUND = -2, // command not found + RET_WRONGARG = -1, // wrong argument + RET_GOOD = 0, // all OK + RET_BAD = 1 // something wrong +}; typedef struct{ uint32_t can_monitor : 1; @@ -36,5 +48,4 @@ extern flags_t flags; #define DBG(str) #endif - -void cmd_parser(char *buf); +const char *cmd_parser(const char *txt); diff --git a/F1:F103/FX3U/version.inc b/F1:F103/FX3U/version.inc index 249941c..8c865e6 100644 --- a/F1:F103/FX3U/version.inc +++ b/F1:F103/FX3U/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "5" -#define BUILD_DATE "2024-05-29" +#define BUILD_NUMBER "20" +#define BUILD_DATE "2024-05-30"