+#ifdef DEBUG
+ fprintf(stderr, "watch RTC is %s\n", asctime(&mtm));
+#endif
+ if (mwdevice->mw_get_real_time_clock_response_cb != NULL)
+ mwdevice->mw_get_real_time_clock_response_cb(mwdevice, &mtm, mwdevice->mw_grtcrsp_data);
+
+ return 0;
+}
+
+void mw_set_get_real_time_clock_response_cb(mwdevice_t *mwdevice, void (*mw_get_real_time_clock_response_cb) (mwdevice_t *mwdevice, struct tm *mw_tm, void *user_data), void *user_data)
+{
+ if (mw_get_real_time_clock_response_cb != NULL)
+ mwdevice->mw_get_real_time_clock_response_cb = mw_get_real_time_clock_response_cb;
+ if (user_data != NULL)
+ mwdevice->mw_grtcrsp_data = user_data;
+}
+
+
+int mw_get_battery_voltage_response(mwdevice_t *mwdevice, unsigned char *batrsp, int len)
+{
+ unsigned char power_good = batrsp[0];
+ unsigned char bat_charging = batrsp[1];
+ unsigned short voltage = *(unsigned short *)(batrsp+2);
+ unsigned short voltage_average = *(unsigned short *)(batrsp+4);
+
+#ifdef DEBUG
+ fprintf(stderr, "battery is at %dmV (average is %dmV), %s and %s\n", voltage, voltage_average, power_good ? "power is good" : "power fault", bat_charging ? "charging" : "not charging");
+#endif
+
+ if (mwdevice->mw_get_battery_voltage_response_cb != NULL)
+ mwdevice->mw_get_battery_voltage_response_cb(mwdevice, &voltage, &power_good, &bat_charging, mwdevice->mw_gbatvrsp_data);
+
+ return 0;
+}
+
+void mw_set_get_battery_voltage_response_cb(mwdevice_t *mwdevice, void (*mw_get_battery_voltage_response_cb) (mwdevice_t *mwdevice, unsigned short *voltage, unsigned char *pgood, unsigned char *charging, void *user_data), void *user_data)
+{
+ if (mw_get_battery_voltage_response_cb != NULL)
+ mwdevice->mw_get_battery_voltage_response_cb = mw_get_battery_voltage_response_cb;
+ if (user_data != NULL)
+ mwdevice->mw_gbatvrsp_data = user_data;
+}
+
+int mw_read_button_config_response(mwdevice_t *mwdevice, unsigned char *btnrsp, int len)
+{
+#ifdef DEBUG
+ fprintf(stderr, "read button config response\n");
+ fprintf(stderr, "screen mode : 0x%02x\n", btnrsp[0]);
+ fprintf(stderr, "button index : 0x%02x\n", btnrsp[1]);
+ fprintf(stderr, "mask table : 0x%02x (", btnrsp[2]);
+ fprintf(stderr, "%s ", (btnrsp[2] & 0x01) ? "Absolute, " : "");
+ fprintf(stderr, "%s ", (btnrsp[2] & 0x02) ? "Press&Release, " : "");
+ fprintf(stderr, "%s ", (btnrsp[2] & 0x04) ? "Press&Hold, " : "");
+ fprintf(stderr, "%s ", (btnrsp[2] & 0x08) ? "Press&LongHold, " : "");
+ fprintf(stderr, "%s ", (btnrsp[2] & 0x10) ? "Immediate" : "");
+ fprintf(stderr, ")\n");
+ fprintf(stderr, "callback msg type: 0x%02x\n", btnrsp[3]);
+ fprintf(stderr, "callback msg opts: 0x%02d\n", btnrsp[4]);
+#endif
+
+ return 0;
+}
+
+void mw_set_read_button_config_response_cb(mwdevice_t *mwdevice, void (*mw_read_button_config_response_cb) (mwdevice_t *mwdevice, void *user_data), void *user_data)
+{
+ if (mw_read_button_config_response_cb != NULL)
+ mwdevice->mw_read_button_config_response_cb = mw_read_button_config_response_cb;
+ if (user_data != NULL)
+ mwdevice->mw_rbtncnfrsp_data = user_data;