meterbus state machine

This commit is contained in:
Wolfgang Hottgenroth 2020-11-02 19:37:02 +01:00
parent 7aa330af95
commit e5e0001a0e
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F

View File

@ -50,6 +50,15 @@ typedef struct {
static t_mbusCommHandle mbusCommHandle = { .state = MBCS_IDLE, .retryCnt = 0, .cmd = 0, .addr = 0, .receiveCnt = 0, .receivedOctet = 0, .receiving = false };
static void printFrame(t_longframe *frame) {
logMsg("%02x %02x %02x %02x, C:%02x A:%02x CI:%02x",
frame->start1, frame->length1, frame->length2, frame->start2,
frame->c, frame->a, frame->ci);
logMsg("userdata ...");
logMsg("CHKSUM:%02x %02x\n", frame->chksum, frame->stop);
}
static void handleRequestEngine(void *handle);
static void timeoutHandler(void *handle) {
logMsg("mbc timeout");
@ -119,7 +128,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_START1:
logMsg("hre state START1");
//logMsg("hre state START1");
if (localMbusCommHandle->receivedOctet == 0x68) {
localMbusCommHandle->frame.start1 = localMbusCommHandle->receivedOctet;
localMbusCommHandle->state = MBCS_LENGTH1;
@ -132,7 +141,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_LENGTH1:
logMsg("hre state LENGTH1");
//logMsg("hre state LENGTH1");
if (localMbusCommHandle->receivedOctet <= 3) {
logMsg("hre err: length to small %02x", localMbusCommHandle->receivedOctet);
localMbusCommHandle->result = MBCR_ERROR_STATE_ENGINE__LENGTH1;
@ -152,7 +161,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_LENGTH2:
logMsg("hre state LENGTH2");
//logMsg("hre state LENGTH2");
if (localMbusCommHandle->frame.length1 != localMbusCommHandle->receivedOctet) {
logMsg("hre err: invalid length2 %02x vs. %02x", localMbusCommHandle->frame.length1, localMbusCommHandle->receivedOctet);
localMbusCommHandle->result = MBCR_ERROR_STATE_ENGINE__LENGTH2;
@ -165,7 +174,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_START2:
logMsg("hre state START2");
//logMsg("hre state START2");
if (localMbusCommHandle->receivedOctet == 0x68) {
localMbusCommHandle->frame.start2 = localMbusCommHandle->receivedOctet;
localMbusCommHandle->state = MBCS_C_FIELD;
@ -178,7 +187,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_C_FIELD:
logMsg("hre state C_FIELD");
//logMsg("hre state C_FIELD");
localMbusCommHandle->frame.c = localMbusCommHandle->receivedOctet;
calculatedChksum += localMbusCommHandle->receivedOctet;
localMbusCommHandle->state = MBCS_A_FIELD;
@ -186,7 +195,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_A_FIELD:
logMsg("hre state A_FIELD");
//logMsg("hre state A_FIELD");
localMbusCommHandle->frame.a = localMbusCommHandle->receivedOctet;
calculatedChksum += localMbusCommHandle->receivedOctet;
localMbusCommHandle->state = MBCS_CI_FIELD;
@ -194,7 +203,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_CI_FIELD:
logMsg("hre state CI_FIELD");
//logMsg("hre state CI_FIELD");
localMbusCommHandle->frame.ci = localMbusCommHandle->receivedOctet;
calculatedChksum += localMbusCommHandle->receivedOctet;
localMbusCommHandle->state = MBCS_USERDATA;
@ -202,7 +211,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_USERDATA:
logMsg("hre state USERDATA");
//logMsg("hre state USERDATA");
localMbusCommHandle->frame.userdata[userdataIdx] = localMbusCommHandle->receivedOctet;
calculatedChksum += localMbusCommHandle->receivedOctet;
userdataIdx++;
@ -213,7 +222,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_CHKSUM:
logMsg("hre state CHKSUM");
//logMsg("hre state CHKSUM");
if (localMbusCommHandle->receivedOctet != calculatedChksum) {
logMsg("hre err: invalid checksum %02x vs %02x", calculatedChksum, localMbusCommHandle->receivedOctet);
localMbusCommHandle->result = MBCR_ERROR_STATE_ENGINE__INVALID_CHKSUM;
@ -226,7 +235,7 @@ static void handleRequestEngine(void *handle) {
break;
case MBCS_STOP:
logMsg("hre state STOP");
//logMsg("hre state STOP");
if (localMbusCommHandle->receivedOctet == 0x16) {
localMbusCommHandle->frame.stop = localMbusCommHandle->receivedOctet;
localMbusCommHandle->state = MBCS_DONE;
@ -241,6 +250,7 @@ static void handleRequestEngine(void *handle) {
case MBCS_DONE:
logMsg("hre state DONE");
printFrame(&(localMbusCommHandle->frame));
localMbusCommHandle->result = MBCR_SUCCESS;
localMbusCommHandle->state = MBCS_DISABLE_FRONTEND;
schAdd(handleRequestEngine, handle, 0, 0);