165 lines
4.0 KiB
C
165 lines
4.0 KiB
C
/**
|
|
* @author Rémi Heredero
|
|
* @version 1.0.0
|
|
* @date September 2023
|
|
* @file steering.c
|
|
*/
|
|
|
|
#include "steering.h"
|
|
#include "can_message.h"
|
|
#include "car.h"
|
|
//#include "drive.h"
|
|
|
|
void STEERING_init(STEERING* me){
|
|
me->state = STST_INIT;
|
|
ALIVE_init(&me->myChecker);
|
|
ALIVE_onSetup(&me->myChecker, CM_STEERING_SETUP, &ALWAYSFALSE);
|
|
ALIVE_onWait(&me->myChecker, STEERING_emitStart, me);
|
|
ALIVE_onDead(&me->myChecker, STEERING_emitStop, me);
|
|
ALIVE_onBorn(&me->myChecker, STEERING_emitResurrect, me);
|
|
me->wait.f = NULL;
|
|
me->run.f = NULL;
|
|
me->dead.f = NULL;
|
|
}
|
|
|
|
void STEERING_startBehaviour(STEERING* me){
|
|
POST(me, &STEERING_processEvent, evSTinit, 100, 0);
|
|
}
|
|
|
|
bool STEERING_processEvent(Event* ev) {
|
|
bool processed = false;
|
|
STEERING* me = (STEERING*)Event_getTarget(ev);
|
|
STEERING_STATES oldState = me->state;
|
|
evIDT evid = Event_getId(ev);
|
|
uint64_t data = Event_getData(ev);
|
|
|
|
switch (me->state) { // onState
|
|
case STST_INIT:
|
|
if (ev->id == evSTinit) {
|
|
me->state = STST_WAIT;
|
|
ALIVE_startBehaviourChecker(&me->myChecker); // Start alive checker
|
|
}
|
|
break;
|
|
|
|
case STST_WAIT:
|
|
if (ev->id == evSTstart) {
|
|
me->state = STST_RUN;
|
|
}
|
|
ALIVE_setAliveTime(&me->myChecker, KART_CST.STEERING_ALIVE_TIME);
|
|
ALIVE_emitBorn(&me->myChecker, 100, 0);
|
|
ALIVE_emitReady(&me->myChecker, 200, 0);
|
|
break;
|
|
|
|
case STST_RUN:
|
|
if (ev->id == evSTstop) {
|
|
me->state = STST_DEAD;
|
|
}
|
|
|
|
if (ev->id == evSTpollDir) {
|
|
//if(drive()->state == STDR_RUN) {
|
|
CM_STEERING_SET(&eKart.position);
|
|
//}
|
|
}
|
|
break;
|
|
|
|
case STST_DEAD:
|
|
if (ev->id == evSTresurrect) {
|
|
me->state = STST_WAIT;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(oldState != me->state){
|
|
switch (oldState) { // onExit
|
|
case STST_INIT:
|
|
break;
|
|
|
|
case STST_WAIT:
|
|
break;
|
|
|
|
case STST_RUN:
|
|
break;
|
|
|
|
case STST_DEAD:
|
|
break;
|
|
}
|
|
|
|
switch (me->state) { // onEntry
|
|
case STST_INIT:
|
|
break;
|
|
|
|
case STST_WAIT:
|
|
if (me->wait.f != NULL) {
|
|
me->wait.f(me->wait.p);
|
|
}
|
|
break;
|
|
|
|
case STST_RUN:
|
|
if (me->run.f != NULL) {
|
|
me->run.f(me->run.p);
|
|
}
|
|
break;
|
|
|
|
case STST_DEAD:
|
|
if (me->dead.f != NULL) {
|
|
me->dead.f(me->dead.p);
|
|
}
|
|
break;
|
|
}
|
|
|
|
processed = true;
|
|
}
|
|
return processed;
|
|
}
|
|
|
|
/*************
|
|
* Callbacks *
|
|
*************/
|
|
|
|
void STEERING_onWait(STEERING* me, STEERING_CALLBACK_FUNCTION f, void* p) {
|
|
me->wait.f = f;
|
|
me->wait.p = p;
|
|
}
|
|
|
|
void STEERING_onRun(STEERING* me, STEERING_CALLBACK_FUNCTION f, void* p) {
|
|
me->run.f = f;
|
|
me->run.p = p;
|
|
}
|
|
|
|
void STEERING_onDead(STEERING* me, STEERING_CALLBACK_FUNCTION f, void* p) {
|
|
me->dead.f = f;
|
|
me->dead.p = p;
|
|
}
|
|
|
|
/************
|
|
* EMITTERS *
|
|
************/
|
|
|
|
void STEERING_emitStart(void* p) {
|
|
STEERING* me = (STEERING*) p;
|
|
POST(me, &STEERING_processEvent, evSTstart, 0, 0);
|
|
}
|
|
|
|
void STEERING_emitStop(void* p) {
|
|
STEERING* me = (STEERING*) p;
|
|
POST(me, &STEERING_processEvent, evSTstop, 0, 0);
|
|
}
|
|
|
|
void STEERING_emitResurrect(void* p) {
|
|
STEERING* me = (STEERING*) p;
|
|
POST(me, &STEERING_processEvent, evSTresurrect, 0, 0);
|
|
}
|
|
|
|
void STEERING_emitPollDir(void* p) {
|
|
STEERING* me = (STEERING*) p;
|
|
POST(me, &STEERING_processEvent, evSTpollDir, 0, 0);
|
|
}
|
|
|
|
/***********
|
|
* SETTERS *
|
|
***********/
|
|
|
|
void STEERING_setMyChecker(STEERING* me, ALIVE v) {
|
|
me->myChecker = v;
|
|
}
|