From d39682b1438a04e5fab701e8b87a3264a9bff5b9 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sun, 8 Mar 2026 01:16:10 +0300 Subject: [PATCH] tried to parse string functions using `constexpr` in C++ --- F0:F030,F042,F072/usbcan_gpio/gpioproto.c | 2 + F0:F030,F042,F072/usbcan_gpio/hashparser.cpp | 151 ++++++++++++++++++ F0:F030,F042,F072/usbcan_gpio/hashparser.h | 34 ++++ F0:F030,F042,F072/usbcan_gpio/usbcangpio.bin | Bin 22860 -> 24344 bytes .../usbcan_gpio/usbcangpio.creator.user | 2 +- .../usbcan_gpio/usbcangpio.files | 5 + F0:F030,F042,F072/usbcan_gpio/version.inc | 4 +- F3:F303/Multistepper/hashgen/hashgen.c | 21 +-- F3:F303/Multistepper/multistepper.bin | Bin 28032 -> 28032 bytes makefile.stm32 | 10 +- 10 files changed, 215 insertions(+), 14 deletions(-) create mode 100644 F0:F030,F042,F072/usbcan_gpio/hashparser.cpp create mode 100644 F0:F030,F042,F072/usbcan_gpio/hashparser.h diff --git a/F0:F030,F042,F072/usbcan_gpio/gpioproto.c b/F0:F030,F042,F072/usbcan_gpio/gpioproto.c index b76d98f..0485fdd 100644 --- a/F0:F030,F042,F072/usbcan_gpio/gpioproto.c +++ b/F0:F030,F042,F072/usbcan_gpio/gpioproto.c @@ -90,9 +90,11 @@ static const char* setCANspeed(char *buf){ return sOKn; } +#include "hashparser.h" static const char *cmd_parser(char *buf){ if(!buf || !*buf) return NULL; if(strlen(buf) > 1){ + chk(buf); // "long" commands char c = *buf++; switch(c){ diff --git a/F0:F030,F042,F072/usbcan_gpio/hashparser.cpp b/F0:F030,F042,F072/usbcan_gpio/hashparser.cpp new file mode 100644 index 0000000..e5a6563 --- /dev/null +++ b/F0:F030,F042,F072/usbcan_gpio/hashparser.cpp @@ -0,0 +1,151 @@ +/* + * This file is part of the usbcangpio project. + * Copyright 2026 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +extern "C"{ +#include +#include "can.h" +#include "flash.h" +#include "hashparser.h" +#include "gpioproto.h" +#define USBIF IGPIO +#include "strfunc.h" +} + +static const char *const sOKn = "OK\n", *const sERRn = "ERR\n"; +extern uint32_t Tms; + +// list of all commands and handlers +#define COMMAND_TABLE \ + COMMAND(canspeed, "CAN bus speed setter/getter (kBaud, 10..1000)") \ + COMMAND(dumpflash, "flash config dump") \ + COMMAND(time, "Current time (ms)") \ + COMMAND(help, "Show this help") + +typedef struct { + const char *name; + const char *desc; +} CmdInfo; + +// prototypes +#define COMMAND(name, desc) static errcodes_t cmd_ ## name(const char*, char*); + COMMAND_TABLE +#undef COMMAND + +static const CmdInfo cmdInfo[] = { // command name, description - for `help` +#define COMMAND(name, desc) { #name, desc }, + COMMAND_TABLE +#undef COMMAND +}; + +static errcodes_t cmd_canspeed(const char *cmd, char _U_ *args){ + SEND(cmd); PUTCHAR('='); SENDn(u2str(CAN_getspeed())); + if(args && *args){SEND("You entered: "); SENDn(args);} + return ERR_AMOUNT; +} + +static errcodes_t cmd_dumpflash(const char _U_ *cmd, char _U_ *args){ + SEND("userconf_sz="); SEND(u2str(the_conf.userconf_sz)); + SEND("\ncurrentconfidx="); SENDn(i2str(currentconfidx)); + for(int i = 0; i < InterfacesAmount; ++i){ + SEND("interface"); PUTCHAR('0' + i); + PUTCHAR('='); + int l = the_conf.iIlengths[i] / 2; + char *ptr = (char*) the_conf.iInterface[i]; + for(int j = 0; j < l; ++j){ + PUTCHAR(*ptr); + ptr += 2; + } + NL(); + } + SEND("canspeed="); SENDn(u2str(the_conf.CANspeed)); + return ERR_AMOUNT; +} + +static errcodes_t cmd_time(const char* cmd, char _U_ *args){ + SEND(cmd); PUTCHAR('='); SENDn(u2str(Tms)); + return ERR_AMOUNT; +} + +static errcodes_t cmd_help(const char _U_ *cmd, char _U_ *args){ + SEND(REPOURL); + for(size_t i = 0; i < sizeof(cmdInfo)/sizeof(cmdInfo[0]); i++){ + SEND(cmdInfo[i].name); + SEND(" - "); + SENDn(cmdInfo[i].desc); + } + return ERR_AMOUNT; +} + +constexpr uint32_t hash(const char* str, uint32_t h = 0){ + return *str ? hash(str + 1, h + ((h << 7) ^ *str)) : h; +} + +static const char* errtxt[ERR_AMOUNT] = { + [ERR_OK] = "OK", + [ERR_BADPAR] = "BADPAR", + [ERR_BADVAL] = "BADVAL", + [ERR_WRONGLEN] = "WRONGLEN", + [ERR_CANTRUN] = "CANTRUN", +}; + + +// TODO: add checking real command length! + +void chk(char *str){ + if(!str || !*str) return; + char command[CMD_MAXLEN+1]; + int i = 0; + while(*str > '@' && i < CMD_MAXLEN){ command[i++] = *str++; } + command[i] = 0; + while(*str && *str <= ' ') ++str; + char *restof = (char*) str; + uint32_t h = hash(command); + errcodes_t ecode = ERR_AMOUNT; + switch(h){ +#define COMMAND(name, desc) case hash(#name): ecode = cmd_ ## name(command, restof); break; + COMMAND_TABLE +#undef COMMAND + default: SEND("Unknown command, try 'help'\n"); break; + } + if(ecode < ERR_AMOUNT) SENDn(errtxt[ecode]); + ; +} + + +/* +if(*args){ + const char *n = getnum(args, &N); + if(n != args){ // get parameter + if(N >= CANMESG_NOPAR){ + USB_sendstr(errtxt[ERR_BADPAR]); newline(); + return RET_GOOD; + } + par = (uint8_t) N; + } + n = strchr(n, '='); + if(n){ + ++n; + const char *nxt = getint(n, &val); + if(nxt != n){ // set setter flag + par |= SETTERFLAG; + } + } +} +*/ diff --git a/F0:F030,F042,F072/usbcan_gpio/hashparser.h b/F0:F030,F042,F072/usbcan_gpio/hashparser.h new file mode 100644 index 0000000..fcad2fd --- /dev/null +++ b/F0:F030,F042,F072/usbcan_gpio/hashparser.h @@ -0,0 +1,34 @@ +/* + * This file is part of the usbcangpio project. + * Copyright 2026 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +// error codes for answer message +typedef enum{ + ERR_OK, // all OK + ERR_BADPAR, // wrong parameter + ERR_BADVAL, // wrong value (for setter) + ERR_WRONGLEN, // wrong message length + ERR_CANTRUN, // can't run given command due to bad parameters or other + ERR_AMOUNT // amount of error codes or "send nothing" +} errcodes_t; + +// maximal length of command (without trailing zero) +#define CMD_MAXLEN (15) + +void chk(char *str); diff --git a/F0:F030,F042,F072/usbcan_gpio/usbcangpio.bin b/F0:F030,F042,F072/usbcan_gpio/usbcangpio.bin index 1a75ca53657320d8c0282a8dcc4ed227ec3e1a55..4277f73de25393844078646a8944e085288b00c3 100755 GIT binary patch delta 5413 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 delta 4070 zcmcIneRPx68Nc^!Qqq!sH*K0w^VQmxw9qv`!L$%sXelpXTPvRhLn&KQI;lr?4ia38 z!*dF9ChS%xg`>l%2Nkt6FoB3G8#_*cnF1=v~k5%k(l`wYGaA$^Jv z3~71oP7Tt)bHnIxL+W@D<9tbGbG7CHF%>upGdC{d5okrGgw7$*HV9fF1Nx&dFDHk% z2j%5J86;^bK2j<#!w1Pqc}3eYX}7PD zS#6N&d96d6sYaaeLn#Hty{wh$7{5lEOZm#EG0#S2I+8M_(i|qECvVBuSZ<4@?EUXz zKCF?!3YpiyXrGE%K;vSxVn&-FZK-+v!x{Kn5GM z55^(DaZ;gZ?!Oe2X3*l`1RG!Ih4J7jLU|=DO<$hwGK3U)enGtX$8?vpWfUWLc zL5#{5i)|>aM{%+QSEZ%z_G*$ z(;!S&*RCFyW4J*+eu-)SbL7CJ$Eh{TZ@$GS*CIcgJm)k)iZp$$9yP+k3o%_Thju42 z*Nnf(O#NW%E(2;D7CSWKSJbY|?1R8G3!tEMvTM4QEzwnk8ra%W5{GFi81 zegE#~Ch}O84yTisvrKpfc{i&VXSl!0+KgK}!`5w7)g$4AxqHHy%$Zf;^G#VJ2jKwA zUx^eYfNB7({1q_T0S5tR0FR@`(dRIRR+6W4mK5iPJA9sAs`d*|>*-cP#yq_=V^}C5 z(HvD_Fl6kvU^{<6uqwBrN^~XX-nD(QgN}n~;nP!&X z_$4C|GMTHg42IM`tMkaH8b$rGz|R@);gHoyRsA}tYDZ`<<83Duc?)nm*^<}B%OMF; zS3Wo;^~9541E)M)Vvnb1xPkNTa&F``_Kj?1ZfG4nia>8|Qm=xAI7Fg(bNj!L8u<+| ziG@jtkEJDS{fCm3KN924PIA3)u+uY*6E49)JrU#TliUkZE#tl+Rr1Zo*a@=mtuNeSsAeif7+_4+Jp3Y@T?t%PGHzo@_b9yng$gA24G zMRpssFZj?-z`Gvil>i%H8K4u;2cUI!07iO(j=(qt>rcTr2Dl8kL1}>OcBF9iU}z?2 z{EF`!^Ql3y#y&Gg!W*TqKsv>kbI3EQ!oqS%=6jVbH)u~%!We6CobYPU0}aBn z*+Q-rR`sWdW?vOs84i~E%xvxt(gGR^ME$EpjjxPRzYLbLa!oWWPPi3}m(2aaRG$vG z@zVPsIM#H&DL-~2ngN?u0-&2*31c;24xp|bEmyR{qyu0FbOUG?Kr*zf7v?(vw2F4a zI0SeOK&vPns^mD#M*wF47XjDF+iG4;xnrcLr~-G9#-i<=9jr5PLTNC5@!$^nH6oa!ia?TP8;1YyIK+nB2Eyv2He=AP?xY?N`DQ z^drd*PxJ5olFh8tMAG;TF(1|>t&}q>r(&_lAeQ{qa9@LnOJKCaI3LC(tI0>Yk~$+K z5bi8aWWLucI%$J#^TKu3yy}Jog^q+jf!a8~*(*8e2hs>5ZOSi5WTF1a;z7vI0l>iN zy|G(2?LzUsjf9uUH+oAt`g8E|G`^ABzkyP>@Q6*$&50E5;r z7V5$&cVKTN-|nmATVvu;{~aK)9Ol>>&(X|qJeR)-(eA#~sxw<|3?l;%7c<8*O;P_( zBQ?ILe`ADd((+ZlBHj$|CqspN8I1SA4wzts?g#ulGTqpclZa#xveOEW>*pH*r`1L)h{D7fFmfpC&D}&EmuCYh` zZ@CYb{vLDF17uT~QHF&;)V;T?Bn4*O5prUt1}67L$U8G5+(%*Zj=70@J4|vb+wmvv zt(EVlW-8XeB^#hzixe}~kOqr`n+lQ>mQcnN6tRPYB8G&0PEODH826GV=6;e!X_WUl z*)#8MaCbcRG}KmcxdGBz+Y4gnYs=vIY3&+($X!2w8p8m`fyWy#|>rvum}AXdK!zB4RR`BmnNgNDk;m7%5jFMJCKqC;7+5 mRoqYqY1q_N-v`NtGx - + EnvironmentId diff --git a/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files b/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files index 5976930..1dbb0d4 100644 --- a/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files +++ b/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files @@ -8,6 +8,11 @@ gpioproto.c gpioproto.h hardware.c hardware.h +hashgen/Readme +hashgen/hashgen.c +hashgen/mktestdic +hashparser.cpp +hashparser.h main.c ringbuffer.c ringbuffer.h diff --git a/F0:F030,F042,F072/usbcan_gpio/version.inc b/F0:F030,F042,F072/usbcan_gpio/version.inc index 789476e..f7ff2a9 100644 --- a/F0:F030,F042,F072/usbcan_gpio/version.inc +++ b/F0:F030,F042,F072/usbcan_gpio/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "85" -#define BUILD_DATE "2026-03-07" +#define BUILD_NUMBER "94" +#define BUILD_DATE "2026-03-08" diff --git a/F3:F303/Multistepper/hashgen/hashgen.c b/F3:F303/Multistepper/hashgen/hashgen.c index a3c300f..88350ec 100644 --- a/F3:F303/Multistepper/hashgen/hashgen.c +++ b/F3:F303/Multistepper/hashgen/hashgen.c @@ -31,23 +31,23 @@ typedef struct{ static glob_pars G = {.headerfile = "hash.h", .sourcefile = "hash.c"}; static int help = 0; -static myoption cmdlnopts[] = { +static sl_option_t cmdlnopts[] = { {"help", NO_ARGS, NULL, 'h', arg_int, APTR(&help), "show this help"}, {"dict", NEED_ARG, NULL, 'd', arg_string, APTR(&G.dict), "dictionary file"}, {"header", NEED_ARG, NULL, 'H', arg_string, APTR(&G.headerfile),"output header filename"}, {"source", NEED_ARG, NULL, 'S', arg_string, APTR(&G.sourcefile),"output source filename"}, - {"genfunc", NO_ARGS, NULL, 'F', arg_int, APTR(&G.genfunc), "generate function bodys"}, + {"genfunc", NO_ARGS, NULL, 'F', arg_int, APTR(&G.genfunc), "generate function bodies"}, end_option }; static void parse_args(int argc, char **argv){ - parseargs(&argc, &argv, cmdlnopts); - if(help) showhelp(-1, cmdlnopts); + sl_parseargs(&argc, &argv, cmdlnopts); + if(help) sl_showhelp(-1, cmdlnopts); if(argc > 0){ red("Unused arguments:\n"); for(int i = 0; i < argc; ++i) printf("%s ", argv[i]); printf("\n"); - showhelp(-1, cmdlnopts); + sl_showhelp(-1, cmdlnopts); } } @@ -189,7 +189,10 @@ static const char *fns = "int fn_%s(uint32_t _U_ hash, char _U_ *args) WAL; // \"%s\" (%u)\n\n" ; static const char *headercontent = -"#ifndef _U_\n\ +"// Generated by HASHGEN (https://github.com/eddyem/eddys_snippets/tree/master/stringHash4MCU_)\n\ +// Licensed by GPLv3\n\ +#pragma once\n\ +#ifndef _U_\n\ #define _U_ __attribute__((__unused__))\n\ #endif\n\n\ #define CMD_MAXLEN (32)\n\n\ @@ -259,12 +262,12 @@ static void build(strhash *H, int hno, int hlen){ } int main(int argc, char **argv){ - initial_setup(); + sl_init(); parse_args(argc, argv); if(!G.dict) ERRX("point dictionary file"); if(!G.headerfile) ERRX("point header source file"); if(!G.sourcefile) ERRX("point c source file"); - mmapbuf *b = My_mmap(G.dict); + sl_mmapbuf_t *b = sl_mmap(G.dict); if(!b) ERRX("Can't open %s", G.dict); char *word = b->data; strhash *H = MALLOC(strhash, ALLOCSZ); @@ -320,6 +323,6 @@ int main(int argc, char **argv){ } if(hno == HASHFNO) WARNX("Can't find proper hash function"); FREE(H); - My_munmap(b); + sl_munmap(b); return 0; } diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 3b536dd61dc02abc07e70737ea53f07c7fa2bc22..12bd3374e8767dd7e322634fdb6ca7ae0b3d00e2 100755 GIT binary patch delta 16 YcmZp;&De08al;N{MuW{ejgMOb06v@tBme*a delta 16 YcmZp;&De08al;N{MuE*cjgMOb06p9X1ONa4 diff --git a/makefile.stm32 b/makefile.stm32 index df54127..ef9a466 100644 --- a/makefile.stm32 +++ b/makefile.stm32 @@ -13,6 +13,7 @@ PREFIX ?= /opt/bin/arm-none-eabi RM := rm -f RMDIR := rmdir CC := $(PREFIX)-gcc +CPP := $(PREFIX)-g++ # don't replace ld with gcc: the binary size would be much greater!! LD := $(PREFIX)-gcc AR := $(PREFIX)-ar @@ -33,7 +34,8 @@ TARGFILE := $(OBJDIR)/TARGET # autoincremental version & build date VERSION_FILE = version.inc SRC := $(wildcard *.c) -OBJS := $(addprefix $(OBJDIR)/, $(SRC:%.c=%.o)) +SRCPP := $(wildcard *.cpp) +OBJS := $(addprefix $(OBJDIR)/, $(SRC:%.c=%.o) $(SRCPP:%.cpp=%.o)) STARTUP := $(OBJDIR)/startup.o MAP := $(OBJDIR)/$(BINARY).map OBJS += $(STARTUP) @@ -132,6 +134,10 @@ $(OBJDIR)/%.o: %.c @echo " CC $<" $(CC) $(CFLAGS) $(DEFS) $(INCLUDE) -o $@ -c $< +$(OBJDIR)/%.o: %.cpp + @echo " C++ $<" + $(CPP) -c $(CFLAGS) -fno-exceptions $(DEFS) $(INCLUDE) -o $@ -c $< + $(BIN): $(ELF) @echo " OBJCOPY $(BIN)" $(OBJCOPY) -Obinary $(ELF) $(BIN) @@ -158,7 +164,7 @@ clean: flash: $(BIN) @echo " FLASH $(BIN)" - $(STFLASH) --reset write $(BIN) 0x8000000 + $(STFLASH) write $(BIN) 0x8000000 $(STFLASH) reset boot: $(BIN)