if (mwdevice->devtype != MW_DEVICE_TYPE_ANA_DIGI && mwdevice->devtype != MW_DEVICE_TYPE_DEVB_ANA_DIGI)
return -1;
+ fprintf(stderr, "write oled buf len = %d\n", buflen);
/* lower row first since display wil be updated after completion of upper row */
if (buflen > 80) {
for (i=80; i<buflen; i+=20) {
memcpy((mdata+1), (buffer+i), 20);
mw_send_frame(mwdevice, MW_WRITE_OLED_IDLE_DISPLAY_MSG, 1 | (oled ? 2 : 0), mdata, 21);
}
+
return 0;
}
return mw_send_frame(mwdevice, MW_ENABLE_BUTTON, 0, mdata, 3);
}
+int mw_advance_watch_hands(mwdevice_t *mwdevice, unsigned char hours, unsigned char minutes, unsigned char seconds)
+{
+ unsigned char mdata[4];
+
+ if (hours > 12)
+ return -1;
+ if (minutes > 60)
+ return -1;
+ if (seconds > 60)
+ return -1;
+
+ mdata[0] = hours;
+ mdata[1] = minutes;
+ mdata[2] = seconds;
+
+ return mw_send_frame(mwdevice, MW_ADVANCE_WATCH_HANDS, 0, mdata, 3);
+}
+
/* ----------------------------------------------------------------------
* Watch responses, events or notifications
* ---------------------------------------------------------------------- */
+int mw_get_device_type_response(mwdevice_t *mwdevice, unsigned char devtype)
+{
+#ifdef DEBUG
+ fprintf(stderr, "Got device type ");
+ switch(devtype) {
+ case 0:
+ fprintf(stderr, "Reserved\n");
+ break;
+ case 1:
+ fprintf(stderr, "Ana-Digi\n");
+ break;
+ case 2:
+ fprintf(stderr, "Digital\n");
+ break;
+ case 3:
+ fprintf(stderr, "Development Board Digital\n");
+ break;
+ case 4:
+ fprintf(stderr, "Development Board Ana-Digi\n");
+ break;
+ default:
+ fprintf(stderr, "unknown %d\n", devtype);
+ break;
+ };
+#endif
+ mwdevice->devtype = devtype;
+ if (mwdevice->mw_get_device_type_response_cb != NULL)
+ mwdevice->mw_get_device_type_response_cb(mwdevice, devtype, mwdevice->mw_gdtypersp_data);
+ return 0;
+}
+
+void mw_set_get_device_type_response_cb(mwdevice_t *mwdevice, void (*mw_get_device_type_response_cb) (mwdevice_t *mwdevice, unsigned char devtype, void *user_data), void *user_data)
+{
+ if (mw_get_device_type_response_cb != NULL)
+ mwdevice->mw_get_device_type_response_cb = mw_get_device_type_response_cb;
+ if (user_data != NULL)
+ mwdevice->mw_gdtypersp_data = user_data;
+}
+
+
int mw_get_real_time_clock_response(mwdevice_t *mwdevice, unsigned char *rtcrsp, int len)
{
struct tm mtm;
* 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;
fprintf(stderr, "decode frame CRC error\n");
return -1;
}
-#ifdef DEBUG
- else
- fprintf(stderr, "decode frame CRC OK\n");
-#endif
if (buf[0] != MW_SOF) {
fprintf(stderr, "decode frame SOF not found\n");
return -1;
}
-#ifdef DEBUG
- else
- fprintf(stderr, "decode frame found SOF\n");
-#endif
msglen = buf[1];
msgtype = buf[2];
switch (msgtype) {
case MW_GET_DEVICE_TYPE_RSP:
- fprintf(stderr, "Got device type ");
- switch(msgdata[0]) {
- case 0:
- fprintf(stderr, "Reserved\n");
- break;
- case 1:
- fprintf(stderr, "Ana-Digi\n");
- break;
- case 2:
- fprintf(stderr, "Digital\n");
- break;
- case 3:
- fprintf(stderr, "Development Board Digital\n");
- break;
- case 4:
- fprintf(stderr, "Development Board Ana-Digi\n");
- break;
- default:
- fprintf(stderr, "unknown %d\n", msgdata[0]);
- break;
- };
- mwdevice->devtype = msgdata[0];
+ mw_get_device_type_response(mwdevice, msgdata[0]);
break;
case MW_GET_INFORMATION_STRING_RSP:
msgdata[len-2] = 0;
}
+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
* ---------------------------------------------------------------------- */
{
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);