X-Git-Url: https://git.kernelconcepts.de/?p=metawatch.git;a=blobdiff_plain;f=metawatch.c;h=4576d9f6d175a16df63ce79f7180b76cfe3b5287;hp=5c5b73bfea3c36f3d939cf84d82d251964d56d6d;hb=887641a905eb3f68aa8eac5410640d7bd331f029;hpb=44f70f5275339fba3609ec94fe797c907290549b diff --git a/metawatch.c b/metawatch.c index 5c5b73b..4576d9f 100644 --- a/metawatch.c +++ b/metawatch.c @@ -480,7 +480,7 @@ void mw_set_status_change_event_cb(mwdevice_t *mwdevice, void (*mw_status_change * Protocol handling * ---------------------------------------------------------------------- */ -int decode_frame(mwdevice_t *mwdevice, unsigned char *buf, int len) +int mw_decode_frame(mwdevice_t *mwdevice, unsigned char *buf, int len) { unsigned short crc; unsigned char msglen; @@ -547,6 +547,38 @@ int decode_frame(mwdevice_t *mwdevice, unsigned char *buf, int len) } +int mw_feed_msg_buffer(mwdevice_t *mwdevice, unsigned char *buf, int len) +{ + char msgbuf[64]; + int tlen; + + if (len <= 0) + return -1; + + memcpy((mwdevice->pbuf+mwdevice->pbuf_len), buf, len); + mwdevice->pbuf_len += len; + + while (mwdevice->pbuf_len > 0) { + /* scan for MW_SOF */ + while (mwdevice->pbuf[0] != MW_SOF) { + memmove(mwdevice->pbuf, (mwdevice->pbuf+1), --mwdevice->pbuf_len); + } + tlen = mwdevice->pbuf[1]; + /* OK, there is an SOF but the message is too short */ + if (tlen > mwdevice->pbuf_len) { + /* we have to wait for more data to come in */ + break; + } + /* here we have a complete msg */ + memcpy(msgbuf, mwdevice->pbuf, tlen); + mw_decode_frame(mwdevice, msgbuf, tlen); + memmove(mwdevice->pbuf, (mwdevice->pbuf+tlen), tlen); + mwdevice->pbuf_len -= tlen; + } + return 0; +} + + /* ---------------------------------------------------------------------- * General code usage * ---------------------------------------------------------------------- */ @@ -555,6 +587,8 @@ int mw_init(mwdevice_t *mwdevice, int mw_fd) { memset(mwdevice, 0, sizeof(mwdevice_t)); mwdevice->mw_fd = mw_fd; + memset(mwdevice->pbuf, 0, MW_PBUF_LEN); + mwdevice->pbuf_len = 0; /* figure out which device we run with */ mw_send_frame(mwdevice, MW_GET_DEVICE_TYPE, 0, NULL, 0);