WIP can sender - template done
This commit is contained in:
parent
d5c30dfea4
commit
ff9137a026
@ -7,34 +7,56 @@
|
|||||||
|
|
||||||
#include "can_sender.h"
|
#include "can_sender.h"
|
||||||
|
|
||||||
void CAN_SENDER_init(CAN_SENDER* me){
|
void CANSENDER_init(CANSENDER* me){
|
||||||
me->state = STCS_INIT;
|
me->state = STCS_INIT;
|
||||||
me->sendingTime = 1;
|
me->sendingTime = 1;
|
||||||
me->wait.f = NULL;
|
me->wait.f = NULL;
|
||||||
me->send.f = NULL;
|
me->send.f = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAN_SENDER_startBehaviour(CAN_SENDER* me){
|
void CANSENDER_startBehaviour(CANSENDER* me){
|
||||||
POST(me, &CAN_SENDER_processEvent, evCSinit, 0, 0);
|
POST(me, &CANSENDER_processEvent, evCSinit, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CAN_SENDER_processEvent(Event* ev) {
|
bool CANSENDER_processEvent(Event* ev) {
|
||||||
bool processed = false;
|
bool processed = false;
|
||||||
CAN_SENDER* me = (CAN_SENDER*)Event_getTarget(ev);
|
CANSENDER* me = (CANSENDER*)Event_getTarget(ev);
|
||||||
CAN_SENDER_STATES oldState = me->state;
|
CANSENDER_STATES oldState = me->state;
|
||||||
evIDT evid = Event_getId(ev);
|
evIDT evid = Event_getId(ev);
|
||||||
|
uint64_t data = Event_getData(ev);
|
||||||
|
|
||||||
switch (me->state) { // onState
|
switch (me->state) { // onState
|
||||||
case STCS_INIT:
|
case STCS_INIT:
|
||||||
if (ev->id == evCSinit) {
|
if (ev->id == evCSinit) {
|
||||||
|
CANSENDER.state = STCS_WAIT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STCS_WAIT:
|
case STCS_WAIT:
|
||||||
|
if (ev->id == evCSsend) {
|
||||||
|
CANSENDER.state = STCS_SEND;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STCS_SEND:
|
case STCS_SEND:
|
||||||
|
if (ev->id == evCSdone) {
|
||||||
|
CANSENDER.state = STCS_WAIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
uCAN_MSG canMsg;
|
||||||
|
canMsg.frame.data0 = (uint8_t) data;
|
||||||
|
data = data >> 8;
|
||||||
|
canMsg.frame.data1 = (uint8_t) data;
|
||||||
|
data = data >> 8;
|
||||||
|
canMsg.frame.data2 = (uint8_t) data;
|
||||||
|
data = data >> 8;
|
||||||
|
canMsg.frame.data3 = (uint8_t) data;
|
||||||
|
data = data >> 8;
|
||||||
|
canMsg.frame.id = (uint32_t) data;
|
||||||
|
CAN_transmit(&canMsg);
|
||||||
|
|
||||||
|
CANSENDER_emitDone(me, 0);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,12 +98,12 @@ bool CAN_SENDER_processEvent(Event* ev) {
|
|||||||
* Callbacks *
|
* Callbacks *
|
||||||
*************/
|
*************/
|
||||||
|
|
||||||
void CAN_SENDER_onWait(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p) {
|
void CANSENDER_onWait(CANSENDER* me, CANSENDER_CALLBACK_FUNCTION f, void* p) {
|
||||||
me->wait.f = f;
|
me->wait.f = f;
|
||||||
me->wait.p = p;
|
me->wait.p = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAN_SENDER_onSend(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p) {
|
void CANSENDER_onSend(CANSENDER* me, CANSENDER_CALLBACK_FUNCTION f, void* p) {
|
||||||
me->send.f = f;
|
me->send.f = f;
|
||||||
me->send.p = p;
|
me->send.p = p;
|
||||||
}
|
}
|
||||||
@ -90,18 +112,20 @@ void CAN_SENDER_onSend(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p)
|
|||||||
* EMITTERS *
|
* EMITTERS *
|
||||||
************/
|
************/
|
||||||
|
|
||||||
void CAN_SENDER_emitSend(CAN_SENDER* me, uint16_t t) {
|
void CANSENDER_emitSend(CANSENDER* me, uint16_t t) {
|
||||||
POST(me, &CAN_SENDER_processEvent, evCSsend, t, 0);
|
POST(me, &CANSENDER_processEvent, evCSsend, t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAN_SENDER_emitDone(CAN_SENDER* me, uint16_t t) {
|
void CANSENDER_emitDone(CANSENDER* me, uint16_t t) {
|
||||||
POST(me, &CAN_SENDER_processEvent, evCSdone, t, 0);
|
POST(me, &CANSENDER_processEvent, evCSdone, t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CANSENDER_sendCanMsg(CANSENDER* me, uint8_t id, uint32_t data)
|
||||||
|
|
||||||
/***********
|
/***********
|
||||||
* SETTERS *
|
* SETTERS *
|
||||||
***********/
|
***********/
|
||||||
|
|
||||||
void CAN_SENDER_setSendingTime(CAN_SENDER* me, uint8_t v) {
|
void CANSENDER_setSendingTime(CANSENDER* me, uint8_t v) {
|
||||||
me->sendingTime = v;
|
me->sendingTime = v;
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
* @date August 2023
|
* @date August 2023
|
||||||
* @file can_sender.h
|
* @file can_sender.h
|
||||||
*/
|
*/
|
||||||
#ifndef CAN_SENDER_H
|
#ifndef CANSENDER_H
|
||||||
#define CAN_SENDER_H
|
#define CANSENDER_H
|
||||||
|
|
||||||
#include "../../xf/xf.h"
|
#include "../../xf/xf.h"
|
||||||
|
|
||||||
@ -13,65 +13,65 @@ typedef enum {
|
|||||||
STCS_INIT,
|
STCS_INIT,
|
||||||
STCS_WAIT,
|
STCS_WAIT,
|
||||||
STCS_SEND
|
STCS_SEND
|
||||||
} CAN_SENDER_STATES;
|
} CANSENDER_STATES;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
evCSinit = 15, // TODO change this number (< 256)
|
evCSinit = 15, // TODO change this number (< 256)
|
||||||
evCSsend,
|
evCSsend,
|
||||||
evCSdone
|
evCSdone
|
||||||
} CAN_SENDER_EVENTS;
|
} CANSENDER_EVENTS;
|
||||||
|
|
||||||
typedef void (*CAN_SENDER_CALLBACK_FUNCTION)(void*);
|
typedef void (*CANSENDER_CALLBACK_FUNCTION)(void*);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CAN_SENDER_CALLBACK_FUNCTION f; // function
|
CANSENDER_CALLBACK_FUNCTION f; // function
|
||||||
void* p; // param(s)
|
void* p; // param(s)
|
||||||
} CAN_SENDER_CALLBACK;
|
} CANSENDER_CALLBACK;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CAN_SENDER_STATES state;
|
CANSENDER_STATES state;
|
||||||
uint8_t sendingTime;
|
uint8_t sendingTime;
|
||||||
CAN_SENDER_CALLBACK wait;
|
CANSENDER_CALLBACK wait;
|
||||||
CAN_SENDER_CALLBACK send;
|
CANSENDER_CALLBACK send;
|
||||||
} CAN_SENDER;
|
} CANSENDER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the CAN_SENDER
|
* Initialize the CANSENDER
|
||||||
* @param me the CAN_SENDER itself
|
* @param me the CANSENDER itself
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_init(CAN_SENDER* me);
|
void CANSENDER_init(CANSENDER* me);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start the CAN_SENDER state machine
|
* Start the CANSENDER state machine
|
||||||
* @param me the CAN_SENDER itself
|
* @param me the CANSENDER itself
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_startBehaviour(CAN_SENDER* me);
|
void CANSENDER_startBehaviour(CANSENDER* me);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the event
|
* Process the event
|
||||||
* @param ev the event to process
|
* @param ev the event to process
|
||||||
* @return true if the event is processed
|
* @return true if the event is processed
|
||||||
*/
|
*/
|
||||||
bool CAN_SENDER_processEvent(Event* ev);
|
bool CANSENDER_processEvent(Event* ev);
|
||||||
|
|
||||||
/*************
|
/*************
|
||||||
* Callbacks *
|
* Callbacks *
|
||||||
*************/
|
*************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the callback function to call when the CAN_SENDER is entering state wait
|
* Set the callback function to call when the CANSENDER is entering state wait
|
||||||
* @param me the CAN_SENDER itself
|
* @param me the CANSENDER itself
|
||||||
* @param f the function to call
|
* @param f the function to call
|
||||||
* @param p the param(s) to pass to the function
|
* @param p the param(s) to pass to the function
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_onWait(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p);
|
void CANSENDER_onWait(CANSENDER* me, CANSENDER_CALLBACK_FUNCTION f, void* p);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the callback function to call when the CAN_SENDER is entering state send
|
* Set the callback function to call when the CANSENDER is entering state send
|
||||||
* @param me the CAN_SENDER itself
|
* @param me the CANSENDER itself
|
||||||
* @param f the function to call
|
* @param f the function to call
|
||||||
* @param p the param(s) to pass to the function
|
* @param p the param(s) to pass to the function
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_onSend(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p);
|
void CANSENDER_onSend(CANSENDER* me, CANSENDER_CALLBACK_FUNCTION f, void* p);
|
||||||
|
|
||||||
/************
|
/************
|
||||||
* EMITTERS *
|
* EMITTERS *
|
||||||
@ -79,17 +79,21 @@ void CAN_SENDER_onSend(CAN_SENDER* me, CAN_SENDER_CALLBACK_FUNCTION f, void* p);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Emit the send event
|
* Emit the send event
|
||||||
* @param me the CAN_SENDER itself
|
* @param me the CANSENDER itself
|
||||||
* @param t time to wait in ms before triggering event
|
* @param t time to wait in ms before triggering event
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_emitSend(CAN_SENDER* me, uint16_t t);
|
void CANSENDER_emitSend(CANSENDER* me, uint16_t t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emit the done event
|
* Emit the done event
|
||||||
* @param me the CAN_SENDER itself
|
* @param me the CANSENDER itself
|
||||||
* @param t time to wait in ms before triggering event
|
* @param t time to wait in ms before triggering event
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_emitDone(CAN_SENDER* me, uint16_t t);
|
void CANSENDER_emitDone(CANSENDER* me, uint16_t t);
|
||||||
|
|
||||||
|
void CANSENDER_sendCanMsg(CANSENDER* me, uint8_t id, uint32_t data);
|
||||||
|
void sendCanMsg(uint32_t id, uint32_t data);
|
||||||
|
|
||||||
|
|
||||||
/***********
|
/***********
|
||||||
* SETTERS *
|
* SETTERS *
|
||||||
@ -100,6 +104,9 @@ void CAN_SENDER_emitSend(CAN_SENDER* me, uint16_t t);
|
|||||||
* @param me
|
* @param me
|
||||||
* @param v
|
* @param v
|
||||||
*/
|
*/
|
||||||
void CAN_SENDER_setSendingTime(CAN_SENDER* me, uint8_t v);
|
void CANSENDER_setSendingTime(CANSENDER* me, uint8_t v);
|
||||||
|
|
||||||
|
void CANSENDER_seSender(CANSENDER* me, uint8_t s);
|
||||||
|
void CANSENDER_setRecipient(CANSENDER* me, uint8_t r);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -319,21 +319,6 @@
|
|||||||
<property key="coverage-enable" value=""/>
|
<property key="coverage-enable" value=""/>
|
||||||
<property key="stack-guidance" value="false"/>
|
<property key="stack-guidance" value="false"/>
|
||||||
</XC8-CO>
|
</XC8-CO>
|
||||||
<XC8-config-global>
|
|
||||||
<property key="advanced-elf" value="true"/>
|
|
||||||
<property key="gcc-opt-driver-new" value="true"/>
|
|
||||||
<property key="gcc-opt-std" value="-std=c99"/>
|
|
||||||
<property key="gcc-output-file-format" value="dwarf-3"/>
|
|
||||||
<property key="omit-pack-options" value="false"/>
|
|
||||||
<property key="omit-pack-options-new" value="1"/>
|
|
||||||
<property key="output-file-format" value="-mcof,+elf"/>
|
|
||||||
<property key="stack-size-high" value="auto"/>
|
|
||||||
<property key="stack-size-low" value="auto"/>
|
|
||||||
<property key="stack-size-main" value="auto"/>
|
|
||||||
<property key="stack-type" value="compiled"/>
|
|
||||||
<property key="user-pack-device-support" value=""/>
|
|
||||||
<property key="wpo-lto" value="false"/>
|
|
||||||
</XC8-config-global>
|
|
||||||
</conf>
|
</conf>
|
||||||
</confs>
|
</confs>
|
||||||
</configurationDescriptor>
|
</configurationDescriptor>
|
||||||
|
16
UML/can.uxf
16
UML/can.uxf
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<diagram program="umlet" version="15.0.0">
|
<diagram program="umlet" version="15.1">
|
||||||
<zoom_level>15</zoom_level>
|
<zoom_level>15</zoom_level>
|
||||||
<element>
|
<element>
|
||||||
<id>UMLSpecialState</id>
|
<id>UMLSpecialState</id>
|
||||||
@ -211,14 +211,18 @@ evCSdone
|
|||||||
<coordinates>
|
<coordinates>
|
||||||
<x>765</x>
|
<x>765</x>
|
||||||
<y>630</y>
|
<y>630</y>
|
||||||
<w>645</w>
|
<w>705</w>
|
||||||
<h>150</h>
|
<h>270</h>
|
||||||
</coordinates>
|
</coordinates>
|
||||||
<panel_attributes>_*How to use*_
|
<panel_attributes>_*How to use*_
|
||||||
|
|
||||||
CANSENDER_send(uint32_t id, uint32_t data);
|
*Like a static class:*
|
||||||
or
|
sendCanMsg(uint32_t id, uint32_t data);
|
||||||
CANSENDER_send(CANSENDER *me, uint8_t id, uint32_t data);</panel_attributes>
|
|
||||||
|
*Or like an Object: *
|
||||||
|
CANSENDER_seSender(CANSENDER* me, uint8_t s);
|
||||||
|
CANSENDER_setRecipient(CANSENDER* me, uint8_t r);
|
||||||
|
CANSENDER_sendCanMsg(CANSENDER* me, uint8_t id, uint32_t data);</panel_attributes>
|
||||||
<additional_attributes/>
|
<additional_attributes/>
|
||||||
</element>
|
</element>
|
||||||
</diagram>
|
</diagram>
|
||||||
|
Reference in New Issue
Block a user