Implement streaming protocol (mw_feed_...)
This commit is contained in:
parent
2089fbe853
commit
7d8f5f3b72
3 changed files with 44 additions and 5 deletions
36
metawatch.c
36
metawatch.c
|
@ -480,7 +480,7 @@ void mw_set_status_change_event_cb(mwdevice_t *mwdevice, void (*mw_status_change
|
||||||
* Protocol handling
|
* 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 short crc;
|
||||||
unsigned char msglen;
|
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
|
* General code usage
|
||||||
* ---------------------------------------------------------------------- */
|
* ---------------------------------------------------------------------- */
|
||||||
|
@ -555,6 +587,8 @@ int mw_init(mwdevice_t *mwdevice, int mw_fd)
|
||||||
{
|
{
|
||||||
memset(mwdevice, 0, sizeof(mwdevice_t));
|
memset(mwdevice, 0, sizeof(mwdevice_t));
|
||||||
mwdevice->mw_fd = mw_fd;
|
mwdevice->mw_fd = mw_fd;
|
||||||
|
memset(mwdevice->pbuf, 0, MW_PBUF_LEN);
|
||||||
|
mwdevice->pbuf_len = 0;
|
||||||
|
|
||||||
/* figure out which device we run with */
|
/* figure out which device we run with */
|
||||||
mw_send_frame(mwdevice, MW_GET_DEVICE_TYPE, 0, NULL, 0);
|
mw_send_frame(mwdevice, MW_GET_DEVICE_TYPE, 0, NULL, 0);
|
||||||
|
|
|
@ -10,8 +10,12 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "metawatch_protocol.h"
|
#include "metawatch_protocol.h"
|
||||||
|
|
||||||
|
#define MW_PBUF_LEN 512
|
||||||
|
|
||||||
typedef struct _mwdevice_t {
|
typedef struct _mwdevice_t {
|
||||||
int mw_fd; /* file decriptor for MW connection */
|
int mw_fd; /* file decriptor for MW connection */
|
||||||
|
char pbuf[MW_PBUF_LEN]; /* protocol receive buffer */
|
||||||
|
int pbuf_len;
|
||||||
unsigned char devtype; /* the device type of the connected device */
|
unsigned char devtype; /* the device type of the connected device */
|
||||||
/* watch message callbacks */
|
/* watch message callbacks */
|
||||||
void (*mw_get_device_type_response_cb) (struct _mwdevice_t *mwdevice, unsigned char devtype, void *user_data);
|
void (*mw_get_device_type_response_cb) (struct _mwdevice_t *mwdevice, unsigned char devtype, void *user_data);
|
||||||
|
@ -79,7 +83,9 @@ int mw_disable_button(mwdevice_t *mwdevice, unsigned char mode, unsigned char bu
|
||||||
|
|
||||||
int mw_advance_watch_hands(mwdevice_t *mwdevice, unsigned char hours, unsigned char minutes, unsigned char seconds);
|
int mw_advance_watch_hands(mwdevice_t *mwdevice, unsigned char hours, unsigned char minutes, unsigned char seconds);
|
||||||
|
|
||||||
int decode_frame(mwdevice_t *mwdevice, unsigned char *buf, int len);
|
int mw_decode_frame(mwdevice_t *mwdevice, unsigned char *buf, int len);
|
||||||
|
|
||||||
|
int mw_feed_msg_buffer(mwdevice_t *mwdevice, unsigned char *buf, int len);
|
||||||
|
|
||||||
int mw_init(mwdevice_t *mwdevice, int mw_fd);
|
int mw_init(mwdevice_t *mwdevice, int mw_fd);
|
||||||
|
|
||||||
|
|
|
@ -448,7 +448,7 @@ gboolean handle_mw_io(GIOChannel *mw_io, GIOCondition condition, gpointer udata)
|
||||||
mwdata_t *mdata = (mwdata_t *)udata;
|
mwdata_t *mdata = (mwdata_t *)udata;
|
||||||
int rcvd;
|
int rcvd;
|
||||||
|
|
||||||
rcvd = read(mdata->mwdevice.mw_fd, mdata->rcvbuf+mdata->rcvbuf_pos, 64);
|
rcvd = read(mdata->mwdevice.mw_fd, mdata->rcvbuf, 64);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "read %d bytes:\n", rcvd);
|
fprintf(stderr, "read %d bytes:\n", rcvd);
|
||||||
#endif
|
#endif
|
||||||
|
@ -456,8 +456,7 @@ gboolean handle_mw_io(GIOChannel *mw_io, GIOCondition condition, gpointer udata)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
dump_frame(mdata->rcvbuf, rcvd);
|
dump_frame(mdata->rcvbuf, rcvd);
|
||||||
#endif
|
#endif
|
||||||
decode_frame(&mdata->mwdevice, mdata->rcvbuf, rcvd);
|
mw_feed_msg_buffer(&mdata->mwdevice, mdata->rcvbuf, rcvd);
|
||||||
mdata->rcvbuf_pos = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in a new issue