/** * @author Rémi Heredero * @version 1.0.0 * @date August 2023 * @file drive.h */ #ifndef DRIVE_H #define DRIVE_H #include "../xf/xf.h" #include "../middleware/alive.h" typedef enum { STDR_INIT = 100, STDR_WAIT, STDR_RUN, STDR_DEAD } DRIVE_STATES; typedef enum { evDRinit = 100, evDRstart, evDRstop, evDRresurrect, evDRpollSpeed, evDRpollTorque } DRIVE_EVENTS; typedef void (*DRIVE_CALLBACK_FUNCTION)(void*); typedef struct { DRIVE_CALLBACK_FUNCTION f; // function void* p; // param(s) } DRIVE_CALLBACK; typedef struct { DRIVE_STATES state; ALIVE myChecker; DRIVE_CALLBACK wait; DRIVE_CALLBACK run; DRIVE_CALLBACK dead; } DRIVE; /** * Initialize the DRIVE * @param me the DRIVE itself */ void DRIVE_init(DRIVE* me); /** * Start the DRIVE state machine * @param me the DRIVE itself */ void DRIVE_startBehaviour(DRIVE* me); /** * Process the event * @param ev the event to process * @return true if the event is processed */ bool DRIVE_processEvent(Event* ev); /************* * Callbacks * *************/ /** * Set the callback function to call when the DRIVE is entering state wait * @param me the DRIVE itself * @param f the function to call * @param p the param(s) to pass to the function */ void DRIVE_onWait(DRIVE* me, DRIVE_CALLBACK_FUNCTION f, void* p); /** * Set the callback function to call when the DRIVE is entering state run * @param me the DRIVE itself * @param f the function to call * @param p the param(s) to pass to the function */ void DRIVE_onRun(DRIVE* me, DRIVE_CALLBACK_FUNCTION f, void* p); /** * Set the callback function to call when the DRIVE is entering state dead * @param me the DRIVE itself * @param f the function to call * @param p the param(s) to pass to the function */ void DRIVE_onDead(DRIVE* me, DRIVE_CALLBACK_FUNCTION f, void* p); /************ * EMITTERS * ************/ /** * Emit the start event * @param p the DRIVE itself */ void DRIVE_emitStart(void* p); /** * Emit the stop event * @param p the DRIVE itself */ void DRIVE_emitStop(void* p); /** * Emit the resurrect event * @param p the DRIVE itself */ void DRIVE_emitResurrect(void* p); /** * Emit the pollSpeed event * @param p the DRIVE itself */ void DRIVE_emitPollSpeed(void* p); /** * Emit the pollTorque event * @param p the DRIVE itself */ void DRIVE_emitPollTorque(DRIVE* me, uint16_t t, int64_t data); /*********** * SETTERS * ***********/ #endif