void HandleAccelerometer(tMessage *pMsg) { if (Control == INIT_MODE) InitAccelerometer(); switch (pMsg->Options) { case MSG_OPT_ACCEL_DATA: AccelerometerSendDataHandler(); break; case MSG_OPT_ACCEL_ENABLE: if (!(Control & PC1_OPERATING_MODE)) EnableAccelerometer(); break; case MSG_OPT_ACCEL_DISABLE: if (Control & PC1_OPERATING_MODE) DisableAccelerometer(); break; case MSG_OPT_ACCEL_STREAMING: ENTER_STANDBY_MODE(); Control &= ~WUF_ENABLE; Control |= DRDYE_DATA_AVAILABLE; AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); ENTER_OPERATING_MODE(); break; case MSG_OPT_ACCEL_WUF: ENTER_STANDBY_MODE(); Control &= ~DRDYE_DATA_AVAILABLE; Control |= WUF_ENABLE; AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); ENTER_OPERATING_MODE(); break; case MSG_OPT_ACCEL_WUF_THRESHOLD: ENTER_STANDBY_MODE(); *Data = *pMsg->pBuffer; AccelerometerWrite(KIONIX_WUF_THRESH, Data, ONE_BYTE); ENTER_OPERATING_MODE(); break; case MSG_OPT_ACCEL_G_RANGE: ENTER_STANDBY_MODE(); Control &= ~ACCEL_RANGE_MASK; Control |= *pMsg->pBuffer << ACCEL_RANGE_SHFT; AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); ENTER_OPERATING_MODE(); break; default: break; } }
/*! Handle the messages routed to the background task */ static void BackgroundMessageHandler(tMessage* pMsg) { tMessage OutgoingMsg; switch(pMsg->Type) { case SetCallbackTimerMsg: SetCallbackTimerHandler(pMsg); break; case GetDeviceType: SetupMessageAndAllocateBuffer(&OutgoingMsg, GetDeviceTypeResponse, NO_MSG_OPTIONS); OutgoingMsg.pBuffer[0] = BOARD_TYPE; OutgoingMsg.Length = 1; RouteMsg(&OutgoingMsg); break; case AdvanceWatchHandsMsg: AdvanceWatchHandsHandler(pMsg); break; case SetVibrateMode: SetVibrateModeHandler(pMsg); break; case SetRealTimeClock: halRtcSet((tRtcHostMsgPayload*)pMsg->pBuffer); #ifdef DIGITAL SetupMessage(&OutgoingMsg,IdleUpdate,NO_MSG_OPTIONS); RouteMsg(&OutgoingMsg); #endif break; case GetRealTimeClock: SetupMessageAndAllocateBuffer(&OutgoingMsg, GetRealTimeClockResponse, NO_MSG_OPTIONS); halRtcGet((tRtcHostMsgPayload*)OutgoingMsg.pBuffer); OutgoingMsg.Length = sizeof(tRtcHostMsgPayload); RouteMsg(&OutgoingMsg); break; case EnableButtonMsg: EnableButtonMsgHandler(pMsg); break; case DisableButtonMsg: DisableButtonMsgHandler(pMsg); break; case ReadButtonConfigMsg: ReadButtonConfigHandler(pMsg); break; case BatteryChargeControl: #ifdef DIGITAL /* update the screen if there has been a change in charging status */ if ( BatteryChargingControl() ) { SetupMessage(&OutgoingMsg, IdleUpdate, NO_MSG_OPTIONS); RouteMsg(&OutgoingMsg); } #endif BatterySenseCycle(); LowBatteryMonitor(); #ifdef TASK_DEBUG UTL_FreeRtosTaskStackCheck(); #endif #if 0 LightSenseCycle(); #endif break; case LedChange: LedChangeHandler(pMsg); break; case BatteryConfigMsg: SetBatteryLevels(pMsg->pBuffer); break; case ReadBatteryVoltageMsg: ReadBatteryVoltageHandler(); break; case ReadLightSensorMsg: ReadLightSensorHandler(); break; case SoftwareResetMsg: SoftwareResetHandler(pMsg); break; case NvalOperationMsg: NvalOperationHandler(pMsg); break; case GeneralPurposeWatchMsg: /* insert handler here */ break; case ButtonStateMsg: ButtonStateHandler(); break; /* * Accelerometer Messages */ case AccelerometerEnableMsg: AccelerometerEnable(); break; case AccelerometerDisableMsg: AccelerometerDisable(); break; case AccelerometerSendDataMsg: AccelerometerSendDataHandler(); break; case AccelerometerAccessMsg: AccelerometerAccessHandler(pMsg); break; case AccelerometerSetupMsg: AccelerometerSetupHandler(pMsg); break; /* * */ case RateTestMsg: SetupMessageAndAllocateBuffer(&OutgoingMsg,DiagnosticLoopback,NO_MSG_OPTIONS); /* don't care what data is */ OutgoingMsg.Length = 10; RouteMsg(&OutgoingMsg); break; /* * */ default: PrintStringAndHex("<<Unhandled Message>> in Background Task: Type 0x", pMsg->Type); break; } }
void HandleAccelerometer(tMessage *pMsg) { if (Control == INIT_MODE) InitAccelerometer(); switch (pMsg->Options) { case MSG_OPT_ACCEL_DATA: if (Connected(CONN_TYPE_SPP) && QuerySniffState() == Active #if SUPPORT_BLE || Connected(CONN_TYPE_BLE) && CurrentInterval(INTERVAL_STATE) == SHORT #endif ) AccelerometerSendDataHandler(); break; case MSG_OPT_ACCEL_ENABLE: if (Connected(CONN_TYPE_BLE)) SendMessage(UpdConnParamMsg, SHORT); else if (Connected(CONN_TYPE_SPP)) SendMessage(SniffControlMsg, MSG_OPT_EXIT_SNIFF); if (pMsg->Length) { ENTER_STANDBY_MODE(); Control &= ~ACCEL_RANGE_MASK; Control |= (*pMsg->pBuffer & 0x03) << ACCEL_RANGE_SHFT; AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); } /* enable accelerometer */ ENTER_OPERATING_MODE(); ACCELEROMETER_INT_ENABLE(); break; case MSG_OPT_ACCEL_DISABLE: /* put into low power mode */ ACCELEROMETER_INT_DISABLE(); ENTER_STANDBY_MODE(); if (Connected(CONN_TYPE_BLE)) SendMessage(UpdConnParamMsg, LONG); break; case MSG_OPT_ACCEL_STREAMING: ENTER_STANDBY_MODE(); Control &= ~WUF_ENABLE; Control |= DRDYE_DATA_AVAILABLE; AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); ENTER_OPERATING_MODE(); break; case MSG_OPT_ACCEL_WUF: ENTER_STANDBY_MODE(); if (pMsg->Length) AccelerometerWrite(KIONIX_WUF_THRESH, pMsg->pBuffer, ONE_BYTE); Control &= ~DRDYE_DATA_AVAILABLE; Control |= WUF_ENABLE; AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); ENTER_OPERATING_MODE(); break; default: break; } }