diff --git a/F1:F103/FX3U/fx3u.bin b/F1:F103/FX3U/fx3u.bin new file mode 100755 index 0000000..045d90a Binary files /dev/null and b/F1:F103/FX3U/fx3u.bin differ 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"