From 67344670314d41a81992da1f9bfa1ffa9634bf8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Heredero?= Date: Tue, 22 Aug 2023 17:50:49 +0200 Subject: [PATCH] WIP CAN sender --- 306-controller_interface.X/factory/factory.c | 2 +- .../middleware/can/can_interface.c | 2 +- .../middleware/can/can_sender.c | 107 ++++++++++++++++++ .../middleware/can/can_sender.h | 105 +++++++++++++++++ .../nbproject/configurations.xml | 10 +- 5 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 306-controller_interface.X/middleware/can/can_sender.c create mode 100644 306-controller_interface.X/middleware/can/can_sender.h diff --git a/306-controller_interface.X/factory/factory.c b/306-controller_interface.X/factory/factory.c index d1c1920..f0f5b58 100644 --- a/306-controller_interface.X/factory/factory.c +++ b/306-controller_interface.X/factory/factory.c @@ -52,7 +52,7 @@ void Factory_build() { ButtonSM_setObserver(bsm(), blc(), &BLControl_onButton); ECAN_SetRXBnInterruptHandler(CANINTERFACE_newMsg); - CANINTERFACE_onProcessCan(foo); + //CANINTERFACE_onProcessCan(foo); } //start all state machines diff --git a/306-controller_interface.X/middleware/can/can_interface.c b/306-controller_interface.X/middleware/can/can_interface.c index b48d487..4ac0fce 100644 --- a/306-controller_interface.X/middleware/can/can_interface.c +++ b/306-controller_interface.X/middleware/can/can_interface.c @@ -10,7 +10,7 @@ void CANINTERFACE_init(){ CANINTERFACE_myself.wait.f = NULL; CANINTERFACE_myself.read.f = NULL; - CANINTERFACE_myself.processCan = NULL; + //CANINTERFACE_myself.processCan = NULL; } void CANINTERFACE_startBehaviour(){ diff --git a/306-controller_interface.X/middleware/can/can_sender.c b/306-controller_interface.X/middleware/can/can_sender.c new file mode 100644 index 0000000..1de392d --- /dev/null +++ b/306-controller_interface.X/middleware/can/can_sender.c @@ -0,0 +1,107 @@ +/** + * @author Rémi Heredero + * @version 1.0.0 + * @date August 2023 + * @file can_sender.c + */ + +#include "can_sender.h" + +void CAN_SENDER_init(CAN_SENDER* me){ + me->state = STCS_INIT; + me->sendingTime = 1; + me->wait.f = NULL; + me->send.f = NULL; +} + +void CAN_SENDER_startBehaviour(CAN_SENDER* me){ + POST(me, &CAN_SENDER_processEvent, evCSinit, 0, 0); +} + +bool CAN_SENDER_processEvent(Event* ev) { + bool processed = false; + CAN_SENDER* me = (CAN_SENDER*)Event_getTarget(ev); + CAN_SENDER_STATES oldState = me->state; + evIDT evid = Event_getId(ev); + + switch (me->state) { // onState + case STCS_INIT: + if (ev->id == evCSinit) { + + } + break; + + case STCS_WAIT: + break; + + case STCS_SEND: + break; + } + + if(oldState != me->state){ + switch (oldState) { // onExit + case STCS_INIT: + break; + + case STCS_WAIT: + break; + + case STCS_SEND: + break; + } + + switch (me->state) { // onEntry + case STCS_INIT: + break; + + case STCS_WAIT: + if (me->wait.f != NULL) { + me->wait.f(me->wait.p); + } + break; + + case STCS_SEND: + if (me->send.f != NULL) { + me->send.f(me->send.p); + } + break; + } + + processed = true; + } + return processed; +} + +/************* + * Callbacks * + *************/ + +void CAN_SENDER_onWait(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p) { + me->wait.f = f; + me->wait.p = p; +} + +void CAN_SENDER_onSend(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p) { + me->send.f = f; + me->send.p = p; +} + +/************ + * EMITTERS * + ************/ + +void CAN_SENDER_emitSend(CAN_SENDER* me, uint16_t t) { + POST(me, &CAN_SENDER_processEvent, evCSsend, t, 0); +} + +void CAN_SENDER_emitDone(CAN_SENDER* me, uint16_t t) { + POST(me, &CAN_SENDER_processEvent, evCSdone, t, 0); +} + +/*********** + * SETTERS * + ***********/ + +void CAN_SENDER_setSendingTime(CAN_SENDER* me, uint8_t v) { + me->sendingTime = v; +} diff --git a/306-controller_interface.X/middleware/can/can_sender.h b/306-controller_interface.X/middleware/can/can_sender.h new file mode 100644 index 0000000..633cec3 --- /dev/null +++ b/306-controller_interface.X/middleware/can/can_sender.h @@ -0,0 +1,105 @@ +/** + * @author Rémi Heredero + * @version 1.0.0 + * @date August 2023 + * @file can_sender.h + */ +#ifndef CAN_SENDER_H +#define CAN_SENDER_H + +#include "../../xf/xf.h" + +typedef enum { + STCS_INIT, + STCS_WAIT, + STCS_SEND +} CAN_SENDER_STATES; + +typedef enum { + evCSinit = 15, // TODO change this number (< 256) + evCSsend, + evCSdone +} CAN_SENDER_EVENTS; + +typedef void (*CAN_SENDER_CALLBACK_FUNCTION)(void*); +typedef struct { + CAN_SENDER_CALLBACK_FUNCTION f; // function + void* p; // param(s) +} CAN_SENDER_CALLBACK; + +typedef struct { + CAN_SENDER_STATES state; + uint8_t sendingTime; + CAN_SENDER_CALLBACK wait; + CAN_SENDER_CALLBACK send; +} CAN_SENDER; + +/** + * Initialize the CAN_SENDER + * @param me the CAN_SENDER itself + */ +void CAN_SENDER_init(CAN_SENDER* me); + +/** + * Start the CAN_SENDER state machine + * @param me the CAN_SENDER itself + */ +void CAN_SENDER_startBehaviour(CAN_SENDER* me); + +/** + * Process the event + * @param ev the event to process + * @return true if the event is processed + */ +bool CAN_SENDER_processEvent(Event* ev); + +/************* + * Callbacks * + *************/ + +/** + * Set the callback function to call when the CAN_SENDER is entering state wait + * @param me the CAN_SENDER itself + * @param f the function to call + * @param p the param(s) to pass to the function + */ +void CAN_SENDER_onWait(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p); + +/** + * Set the callback function to call when the CAN_SENDER is entering state send + * @param me the CAN_SENDER itself + * @param f the function to call + * @param p the param(s) to pass to the function + */ +void CAN_SENDER_onSend(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p); + +/************ + * EMITTERS * + ************/ + +/** + * Emit the send event + * @param me the CAN_SENDER itself + * @param t time to wait in ms before triggering event + */ +void CAN_SENDER_emitSend(CAN_SENDER* me, uint16_t t); + +/** + * Emit the done event + * @param me the CAN_SENDER itself + * @param t time to wait in ms before triggering event + */ + void CAN_SENDER_emitDone(CAN_SENDER* me, uint16_t t); + +/*********** + * SETTERS * + ***********/ + +/** + * + * @param me + * @param v + */ +void CAN_SENDER_setSendingTime(CAN_SENDER* me, uint8_t v); + +#endif diff --git a/306-controller_interface.X/nbproject/configurations.xml b/306-controller_interface.X/nbproject/configurations.xml index f88848a..b7db225 100644 --- a/306-controller_interface.X/nbproject/configurations.xml +++ b/306-controller_interface.X/nbproject/configurations.xml @@ -31,7 +31,10 @@ mcc_generated_files/memory.h - middleware/can_interface.h + + middleware/can/can_interface.h + middleware/can/can_sender.h + xf/event.h @@ -73,7 +76,10 @@ mcc_generated_files/memory.c - middleware/can_interface.c + + middleware/can/can_interface.c + middleware/can/can_sender.c + xf/event.c