From e5e0001a0ea3b4fe571828e136508a82c9d20ce7 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 2 Nov 2020 19:37:02 +0100 Subject: [PATCH] meterbus state machine --- cube/User/Src/mbusComm.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/cube/User/Src/mbusComm.c b/cube/User/Src/mbusComm.c index 35e8f63..8e7bf54 100644 --- a/cube/User/Src/mbusComm.c +++ b/cube/User/Src/mbusComm.c @@ -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);