75 lines
1.7 KiB
C

#include <main.h>
#include <usart.h>
#include <PontCoopScheduler.h>
#include <mbusComm.h>
#include <loopCtrl.h>
#include <led.h>
typedef enum {
IDLE,
SEND,
SEND_CONT
} e_mbusCommState;
typedef struct {
e_mbusCommState state;
uint8_t retryCnt;
uint8_t cmd;
uint8_t addr;
uint8_t sendBuf[5];
} t_mbusCommHandle;
static t_mbusCommHandle mbusCommHandle = { .state = IDLE, .retryCnt = 0, .cmd = 0, .addr = 0 };
static void handleRequestEngine(void *handle) {
t_mbusCommHandle *myHandle = (t_mbusCommHandle*) handle;
switch (myHandle->state) {
case IDLE:
break;
case SEND:
myHandle->sendBuf[0] = 0x10;
myHandle->sendBuf[1] = myHandle->cmd;
myHandle->sendBuf[2] = myHandle->addr;
myHandle->sendBuf[3] = myHandle->cmd + myHandle->addr; // checksum
myHandle->sendBuf[4] = 0x16;
myHandle->state = SEND_CONT;
// no break !!
case SEND_CONT:
ledRed(false);
if (! loopActive) {
myHandle->retryCnt++;
loopEnable();
schAdd(handleRequestEngine, handle, 10, 0);
} else {
// write(fd, sendBuf, 5);
HAL_UART_Transmit_IT(&mbusUart, myHandle->sendBuf, 5);
myHandle->state = IDLE;
}
break;
default:
myHandle->state = IDLE;
break;
}
}
void mbusCommRequest(uint8_t cmd, uint8_t addr) {
if (mbusCommHandle.state == IDLE) {
mbusCommHandle.state = SEND;
mbusCommHandle.retryCnt = 0;
mbusCommHandle.cmd = cmd;
mbusCommHandle.addr = addr;
schAdd(handleRequestEngine, (void*) &mbusCommHandle, 0, 0);
} else {
// busy
}
}