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; } }
static void InitAccelerometer(void) { InitAccelerometerPeripheral(); /* make sure accelerometer has had 20 ms to power up */ vTaskDelay(ACCELEROMETER_POWER_UP_TIME_MS); Control = ACCEL_CONTROL_DEFAULT0; // 0:wakeup; 1:streaming AccelerometerWrite(KIONIX_CTRL_REG1, &Control, ONE_BYTE); /* change to output data rate to 25 Hz */ *Data = WUF_ODR_25HZ; AccelerometerWrite(KIONIX_CTRL_REG3, Data, ONE_BYTE); /* enable interrupt and make it active high */ *Data = IEN | IEA; AccelerometerWrite(KIONIX_INT_CTRL_REG1, Data, ONE_BYTE); /* enable motion detection interrupt for all three axis */ *Data = ZBW; AccelerometerWrite(KIONIX_INT_CTRL_REG2, Data, ONE_BYTE); /* WUF delay = COUNT * (1/WUF_ODR_25HZ) */ *Data = WUF_DEFAULT_DELAY_COUNT; AccelerometerWrite(KIONIX_WUF_TIMER, Data, ONE_BYTE); /* 0.5g = 0x08 */ *Data = WUF_DEFAULT_THRESHOLD; AccelerometerWrite(KIONIX_WUF_THRESH, Data, ONE_BYTE); /* Make sure HW is functioning */ AccelerometerRead(KIONIX_DCST_RESP, Data, ONE_BYTE); PrintF("%s Accel Initd", *Data == PROOF_READ_CODE ? OK : NOK); }
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; } }