Libreria per macchina a stati con eventi

Ciao a tutti, per un mio progetto personale ho avuto la necessità di gestire una macchina a stati con funzionalità "a eventi" e con timer automatici. Ne è uscito un pezzo di codice che mi soddisfa, e credo che potrebbe essere utile ad altri; quindi ho pensato di pubblicarlo come "libreria". Al momento è abbastanza testato su esp8266/esp32 ma ho un branch "dev" dove sto provando una versione compatibile con Arduino e rp2040.
FantasyFactory/EventStateMachine
Lo scopo di questa libreria è di gestire una macchina a stati associando in modo flessibile degli "eventi" agli stati o ai cambi di stato, che possono essere utili anche in una logica di implementazione di "plugin" (motivo principale per cui è stata fatta in questo modo).
Gli stati hanno anche la possibilità di avere un "timeout" automatico, in modo che uno stato possa essere automaticamente gestito con un tempo limite trascorso il quale passare a un altro stato o una gestione di errore.
Non ho trovato librerie valide per fare questo (ma correggetemi se ho fatto un lavoro inutile) e pubblico qui il riferimento a GitHub: se qualcuno vuole provarla, commentarla (suggerimenti o critiche ben accetti) valuterò poi in base ai vostri feedback se può avere senso pubblicarla in modo da essere inclusa nel library manager.
(chiedo venia ai moderatori se ho nuovamente sbagliato dove postare)

... utile o inutile non mi pronuncio, ma se cercavi per "macchina a stati finiti" qui sul forum Italiano, trovavi varie discussioni e librerie già fatte :wink:

Guglielmo

Eh immaginavo :grinning_face: ero anche mezzo consapevole di stare reinventando l'acqua calda, ma come ho detto era un pezzo di codice sviluppato per i miei scopi, e ho pensato che poteva essere utile ad altri. Se non lo è, non è un problema. Tante volte mi secca cercare cose già fatte che poi divento matto per adattare ai miei scopi, ma forse in questo caso si tratta di qualcosa di uso talmente comune che forse meritava una ricerca

Comunque bel lavoro, complimenti
In particolare ci è piaciuta l'idea di mettere anche una azione al timeout

Ai tempi noi non ci avevamo pensato

Comunque se vuoi vedere una cosa simile in C puro (non cpp) prova a cercare la nostra "AFSD Rhodense II"

Avevamo fatto una cosa simile, ma in C e senza allocazione dinamica

Di nuovo complimenti

Più o meno è lo stesso percorso di genesi della mia libreria (gli esempi sono ancora da sistemare in base alle ultime modifiche introdotte, sorry :anxious_face_with_sweat:) .
Concettualmente è molto simile alla tua "visione" solo che ho usato una linked list al posto dei std::vector per fare in modo che sia compatibile anche con piccole MCU tipo ATMega328.

Ho aggiunto anche il concetto di "azione", ispirandomi al linguaggio SFC cosi come definito nella IEC 61131-3, ma se devo essere sincero nei miei progetti non le uso quasi mai.

Anche se temo non avrai un gran feedback, io ti consiglierei di pubblicarla a prescindere nel repository.

Ho visto ora la tua :+1:, molto probabilmente se l'avessi vista prima non avrei fatto la mia

Sul branch "dev" ho una versione compatibile, ancora da testare bene. Non ho implementato una linked list come alternativa a std::vector, ma piuttosto un array statico a dimensione fissa. Molto meno elegante della tua, ma ha il vantaggio di essere più leggero e semplice, col limite di dover variare MAX_SIZE se non sufficiente

Anche io inizialmente avevo adottato questo approccio, alla fine per quelle che sono le esigenze tipiche, sarebbe andato altrettanto bene.