/* Send interrupt notification to the phone or * read data from the accelerometer and send it to the phone */ static void AccelerometerSendDataHandler(void) { tMessage Msg; SetupMessageWithBuffer(&Msg, AccelIndMsg, MSG_OPT_NONE); if (Msg.pBuffer != NULL) { if (Control & WUF_ENABLE) { AccelerometerRead(KIONIX_XOUT_HPF_L, Data, XYZ_DATA_LENGTH); AccelerometerRead(KIONIX_INT_REL, Data, ONE_BYTE); //clear int } else AccelerometerRead(KIONIX_XOUT_L, Data, XYZ_DATA_LENGTH); Msg.pBuffer[0] = CONVERT_TO_8_BIT(0); Msg.pBuffer[1] = CONVERT_TO_8_BIT(2); Msg.pBuffer[2] = CONVERT_TO_8_BIT(4); Msg.Length = 3; RouteMsg(&Msg); PrintH(Msg.pBuffer[0]); PrintC(SPACE); PrintH(Msg.pBuffer[1]); PrintC(SPACE); PrintH(Msg.pBuffer[2]); PrintR(); } }
/* Send interrupt notification to the phone or * read data from the accelerometer and send it to the phone */ static void AccelerometerSendDataHandler(void) { tMessage Msg = {3, AccelIndMsg, MSG_OPT_NONE, NULL}; if (CreateMessage(&Msg)) { if (Control & DRDYE_DATA_AVAILABLE || (Control & WUF_ENABLE)) { AccelerometerRead(Control & DRDYE_DATA_AVAILABLE ? KIONIX_XOUT_L : KIONIX_XOUT_HPF_L, Data, XYZ_DATA_LENGTH); Msg.pBuffer[0] = Data[1]; Msg.pBuffer[1] = Data[3]; Msg.pBuffer[2] = Data[5]; RouteMsg(&Msg); // PrintQ(Msg.pBuffer, 3); } else if (Control & TILT_ENABLE_TPE) { AccelerometerRead(KIONIX_TILT_POS_CUR, Msg.pBuffer, ONE_BYTE); Msg.Length = 1; RouteMsg(&Msg); PrintH(Msg.pBuffer[0]); PrintR(); } AccelerometerRead(KIONIX_INT_REL, Data, ONE_BYTE); //clear int } }
void DrawBootloaderScreen(void) { #if BOOTLOADER FillMyBuffer(STARTING_ROW, LCD_ROW_NUM, 0x00); CopyRowsIntoMyBuffer(pBootloader, BOOTLOADER_START_ROW, BOOTLOADER_ROWS); // Draw version SetFont(MetaWatch5); gRow = 61; gColumn = 4; gBitColumnMask = BIT3; DrawString("V ", DRAW_OPT_BITWISE_OR); DrawString((char const *)VERSION, DRAW_OPT_BITWISE_OR); unsigned char i = 0; char const *pBootVer = BootVersion; PrintF("BL_VER addr:%04X", pBootVer); for (; i < 8; ++i) {PrintH(pBootVer[i]); PrintC(SPACE);} i = 0; while (*pBootVer && i++ < 8) { if ((*pBootVer < ZERO || *pBootVer > '9') && *pBootVer != '.') break; pBootVer ++; } if (i > 4) // at least x.x.x { gRow += 7; gColumn = 4; gBitColumnMask = BIT3; DrawString("B ", DRAW_OPT_BITWISE_OR); DrawString(BootVersion, DRAW_OPT_BITWISE_OR); } DrawLocalAddress(1, 80); SendMyBufferToLcd(STARTING_ROW, LCD_ROW_NUM); #endif }
void PrintQ(unsigned char const *pHex, unsigned char const Len) { unsigned char i; for (i = 0; i < Len; ++i) PrintH(*pHex++); PrintR(); }
/*! Handle the messages routed to the display queue */ static void DisplayQueueMessageHandler(tMessage* pMsg) { tMessage Msg; unsigned char i = 0; switch (pMsg->Type) { case WriteBufferMsg: WriteBufferHandler(pMsg); break; case SetWidgetListMsg: SetWidgetList(pMsg); break; case UpdateDisplayMsg: if ((!(pMsg->Options & MSG_OPT_UPD_INTERNAL) && (pMsg->Options & MODE_MASK) == NOTIF_MODE) && GetProperty(PROP_AUTO_BACKLIGHT)) SendMessage(&Msg, AutoBacklightMsg, MSG_OPT_NONE); UpdateDisplayHandler(pMsg); break; case UpdateClockMsg: UpdateClock(); break; case DrawClockWidgetMsg: DrawClockWidget(pMsg->Options); break; case MonitorBatteryMsg: MonitorBattery(); break; case BluetoothStateChangeMsg: BluetoothStateChangeHandler(pMsg); break; case IdleUpdateMsg: IdleUpdateHandler(); break; case ButtonStateMsg: ButtonStateHandler(); break; case CallerIdMsg: pMsg->pBuffer[pMsg->Length] = NUL; ShowCall((char *)pMsg->pBuffer, pMsg->Options); break; case CallerNameMsg: if (pMsg->Length) { pMsg->pBuffer[pMsg->Length] = NUL; ShowCall((char *)pMsg->pBuffer, SHOW_NOTIF_CALLER_NAME); if (GetProperty(PROP_AUTO_BACKLIGHT)) SendMessage(&Msg, AutoBacklightMsg, MSG_OPT_NONE); } else ShowCall("", pMsg->Options); break; case MusicPlayStateMsg: HandleMusicPlayStateChange(pMsg->Options); break; case ChangeModeMsg: ChangeModeHandler(pMsg->Options); break; case ControlFullScreenMsg: SetProperty(PROP_PHONE_DRAW_TOP, pMsg->Options || *pMsg->pBuffer ? PROP_PHONE_DRAW_TOP : 0); break; case ModifyTimeMsg: ModifyTimeHandler(pMsg); break; case MenuModeMsg: MenuModeHandler(pMsg->Options); break; case MenuButtonMsg: MenuButtonHandler(pMsg->Options); break; case EnableButtonMsg: EnableButtonMsgHandler(pMsg); break; case DevTypeMsg: SetupMessageWithBuffer(&Msg, DevTypeRespMsg, BOARD_TYPE); //default G2 if (Msg.pBuffer != NULL) { Msg.pBuffer[0] = BOARD_TYPE; // backward compatible Msg.Length = 1; if (GetMsp430HardwareRevision() < 'F') { Msg.Options = DIGITAL_WATCH_TYPE_G1; Msg.pBuffer[0] = DIGITAL_WATCH_TYPE_G1; // backward compatible } Msg.Options |= pMsg->Options & 0x80; // support ACK RouteMsg(&Msg); } PrintF("- DevTypeResp:%d", Msg.Options); // set ACK bit SendMessage(&Msg, ConnTypeMsg, pMsg->Options); break; case VerInfoMsg: SetupMessageWithBuffer(&Msg, VerInfoRespMsg, MSG_OPT_NONE); if (Msg.pBuffer != NULL) { /* exclude middle '.' */ strncpy((char *)Msg.pBuffer, BUILD, 3); strncpy((char *)Msg.pBuffer + 3, BUILD + 4, 3); Msg.Length += strlen(BUILD) - 1; *(Msg.pBuffer + Msg.Length++) = (unsigned char)atoi(VERSION); while (VERSION[i++] != '.'); *(Msg.pBuffer + Msg.Length++) = atoi(VERSION + i); *(Msg.pBuffer + Msg.Length++) = NULL; RouteMsg(&Msg); } PrintS("-Ver:"); for (i = 6; i < Msg.Length; ++i) PrintH(Msg.pBuffer[i]); break; case SetVibrateMode: SetVibrateModeHandler(pMsg); break; case SetRtcMsg: SetRtc((Rtc_t *)pMsg->pBuffer); #if COUNTDOWN_TIMER if (CurrentPage[PageType] == CountdownPage && CountdownMode() == COUNTING) SendMessage(&Msg, CountDownMsg, MSG_OPT_CNTDWN_TIME); #endif UpdateClock(); break; #if COUNTDOWN_TIMER case CountDownMsg: if (pMsg->Options == MSG_OPT_NONE) { PageType = PAGE_TYPE_INFO; CurrentPage[PageType] = CountdownPage; } DrawCountdownScreen(pMsg->Options); break; case SetCountdownDoneMsg: // for testing // Rtc_t Done; // Done.Month = 5; // Done.Day = 1; // Done.Hour = 0; // Done.Minute = 0; // SetDoneTime(&Done); // Valid only DoneTime is different if (SetDoneTime((Rtc_t *)pMsg->pBuffer)) SendMessage(&Msg, CountDownMsg, MSG_OPT_NONE); break; #endif case ServiceMenuMsg: ServiceMenuHandler(); break; case DisableButtonMsg: DisableButtonMsgHandler(pMsg); break; case ReadButtonConfigMsg: ReadButtonConfigHandler(pMsg); break; case SetBacklightMsg: SetBacklight(pMsg->Options); // testing // pMsg->Type = AccelMsg; // pMsg->Options = 1; //enable // HandleAccelerometer(pMsg); break; case AutoBacklightMsg: if (LightSenseCycle() < DARK_LEVEL) SetBacklight(LED_ON_OPTION); break; case BatteryConfigMsg: SetBatteryLevels(pMsg->pBuffer); break; case ReadBatteryVoltageMsg: ReadBatteryVoltageHandler(); break; case ResetMsg: SoftwareResetHandler(pMsg); break; case NvalOperationMsg: NvalOperationHandler(pMsg); break; case SecInvertMsg: HandleSecInvert(pMsg->Options); break; case LoadTemplateMsg: LoadTemplateHandler(pMsg); break; case LinkAlarmMsg: if (LinkAlarmEnable) { SetupMessageWithBuffer(&Msg, SetVibrateMode, MSG_OPT_NONE); if (Msg.pBuffer != NULL) { *(tSetVibrateModePayload *)Msg.pBuffer = LnkAlmTone; RouteMsg(&Msg); } } break; case ModeTimeoutMsg: ModeTimeoutHandler(); break; case WatchStatusMsg: PageType = PAGE_TYPE_INFO; CurrentPage[PageType] = StatusPage; DrawWatchStatusScreen(); break; // case ListPairedDevicesMsg: // ListPairedDevicesHandler(); // break; case WatchDrawnScreenTimeout: IdleUpdateHandler(); break; case TermModeMsg: TermModeHandler(); break; case LowBatteryWarningMsg: break; case LowBatteryBtOffMsg: UpdateClock(); break; #if __IAR_SYSTEMS_ICC__ case EraseTemplateMsg: EraseTemplateHandler(pMsg); break; case WriteToTemplateMsg: WriteToTemplateHandler(pMsg); break; #endif case AccelMsg: HandleAccelerometer(pMsg); break; case ReadLightSensorMsg: ReadLightSensorHandler(); break; case RateTestMsg: SetupMessageWithBuffer(&Msg, DiagnosticLoopback, MSG_OPT_NONE); if (Msg.pBuffer != NULL) { /* don't care what data is */ Msg.Length = 10; RouteMsg(&Msg); } break; default: PrintF("# Disp Msg: 0x%02x", pMsg->Type); break; } }
void SetWidgetList(tMessage *pMsg) { static Widget_t *pCurrWidget = NULL; // point to Widget in current Widget[] static Widget_t *pNextWidget = NULL; // point to Widget in new Widget[] static unsigned char ChangedClockWidget = INVALID_ID; xSemaphoreTake(SramMutex, portMAX_DELAY); WidgetList_t *pMsgWgtLst = (WidgetList_t *)pMsg->pBuffer; unsigned char WidgetNum = pMsg->Length / WIDGET_HEADER_LEN; unsigned char i = 0; PrintF(">SetWLst I:%d %s %d %s %d", WGTLST_INDEX(pMsg->Options), "T:", WGTLST_TOTAL(pMsg->Options), "Num:", WidgetNum); for(; i<WidgetNum; ++i) {PrintH(pMsgWgtLst[i].Id); PrintH(pMsgWgtLst[i].Layout);} PrintR(); if (pNextWidget == NULL) // first time call, only add widgets { pCurrWidget = pCurrWidgetList; pNextWidget = &Widget[0]; } else { if (WGTLST_INDEX(pMsg->Options) == 0 && (pCurrWidget != pCurrWidgetList || (pNextWidget != &Widget[0] && pNextWidget != &Widget[MAX_WIDGET_NUM]))) { // last SetWLst failed in the middle.Clean up whole list PrintS("# Last SetWgtLst broken!"); pCurrWidget = pCurrWidgetList; pNextWidget = &Widget[0] + (&Widget[MAX_WIDGET_NUM] - pCurrWidgetList); } } while (WidgetNum) // number of list items { /* old clock widgets */ if (!IS_CLOCK_WIDGET(pMsgWgtLst->Layout) && pMsgWgtLst->Id <= CLOCK_WIDGET_ID_RANGE) TestFaceId(pMsgWgtLst); unsigned char Change = GetWidgetChange(pCurrWidget->Id, pCurrWidget->Layout, pMsgWgtLst->Id, pMsgWgtLst->Layout); switch (Change) { case WGT_CHG_CLK_FACE: PrintS("Chg ClkFce"); if (ON_CURRENT_PAGE(pMsgWgtLst->Layout)) ChangedClockWidget = pMsgWgtLst->Id; case WGT_CHG_SETTING: //cpy layout to curr; cpy curr to next; msg, curr, next ++ PrintF("=%02X", pCurrWidget->Id); pCurrWidget->Id = pMsgWgtLst->Id; pCurrWidget->Layout = pMsgWgtLst->Layout; *pNextWidget++ = *pCurrWidget++; pMsgWgtLst ++; WidgetNum --; break; case WGT_CHG_CLK_ADD: PrintS("+Clk"); if (ON_CURRENT_PAGE(pMsgWgtLst->Layout)) ChangedClockWidget = pMsgWgtLst->Id; case WGT_CHG_ADD: //pCurrWidget->Id > pMsgWgtLst->Id) // add new widget: cpy msg to next; msg and next ++; curr stays PrintF("+%02X", pMsgWgtLst->Id); pNextWidget->Id = pMsgWgtLst->Id; pNextWidget->Layout = pMsgWgtLst->Layout; AssignWidgetBuffer(pNextWidget); pNextWidget ++; pMsgWgtLst ++; WidgetNum --; break; case WGT_CHG_REMOVE: // remove widget: curr ++ PrintF("-%02X", pCurrWidget->Id); FreeWidgetBuffer(pCurrWidget); pCurrWidget ++; break; default: break; } } PrintR(); // if part index + 1 == parts, SetWidgetList complete if (WGTLST_TOTAL(pMsg->Options) == WGTLST_INDEX(pMsg->Options) + 1) { // PrintS("C:"); // for (i=0; pCurrWidgetList[i].Id != INVALID_ID && i < MAX_WIDGET_NUM; ++i) PrintH(pCurrWidgetList[i].Id); // PrintR(); while (pCurrWidget->Id != INVALID_ID && pCurrWidget < &pCurrWidgetList[MAX_WIDGET_NUM]) { FreeWidgetBuffer(pCurrWidget); pCurrWidget->Id = INVALID_ID; pCurrWidget ++; } for (i = 0; i < MAX_WIDGET_NUM; ++i) { if (pCurrWidgetList[i].Id != INVALID_ID) { // clear the widget id in the curr list pCurrWidgetList[i].Id = INVALID_ID; } } pNextWidget = pCurrWidgetList; pCurrWidgetList = &Widget[0] + (&Widget[MAX_WIDGET_NUM] - pCurrWidgetList); pCurrWidget = pCurrWidgetList; // PrintS("N:"); // for (i=0; pCurrWidgetList[i].Id != INVALID_ID; ++i) PrintH(pCurrWidgetList[i].Id); // PrintR(); PrintF("Tg:%04X", BufTag); if (ChangedClockWidget != INVALID_ID) { CreateAndSendMessage(DrawClockWidgetMsg, ChangedClockWidget); ChangedClockWidget = INVALID_ID; } } xSemaphoreGive(SramMutex); }