meterbus state machine
This commit is contained in:
parent
7aa330af95
commit
e5e0001a0e
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user