/**************************************************************************** * NAME: bProcessGPDEvent * * DESCRIPTION: * Handles SW1 functionalities * * RETURNS: * Return whether device can go to sleep * ****************************************************************************/ bool bProcessGPDEvent(void) { bool bEnableSleep = TRUE; /* send command based on the state the device is in */ HandleGPDStateMachine(0); #ifdef DK4 /** wait till short press time is elapsed , enabling interrupts . If next * short press is initiated, interrupt should be fired while this time interval */ /* wait till button release */ bButtonPressed = FALSE; uint32 u32DIOVal = u32AHI_DioReadInput(); uint32 u32DIOVal2 = u32AHI_DioReadInput(); while(u32DIOVal2 == u32DIOVal) { u32DIOVal = u32AHI_DioReadInput(); } /* stop timer if already running (by previous button press )*/ vEH_StopTimer(); uint32 u32StartTime; /* start timer to account next button press interval */ u32StartTime = u32EH_StartTimer(); u32Button = 0; (void) u32AHI_DioInterruptStatus(); vAHI_DioInterruptEnable(APP_BUTTONS_DIO_MASK, 0); while( 1) { if(bEH_IsTimeElapsedInMicrosSec( APP_TIME_MS(SHORT_PRESS_TIME) ,u32StartTime)) { vEH_StopTimer(); sGPDData.u8ButtonCount = 0; DBG_vPrintf(DBG_DEVICE_SWITCH, "\n short press timer expired \n" ); break; } if((u32Button == APP_E_BUTTONS_BUTTON_SW1)|| (u32Button == APP_E_BUTTONS_BUTTON_SW2) || (u32Button == APP_E_BUTTONS_BUTTON_SW3)|| (u32Button == APP_E_BUTTONS_BUTTON_SW4) ) { bEnableSleep = FALSE; (void) u32AHI_DioInterruptStatus(); DBG_vPrintf(DBG_DEVICE_SWITCH, "\n short press timer detected \n" ); break; } } #endif return bEnableSleep; }
PRSEV_HANDLER_DEF(E_STATE_APP_SLEEP, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { if (eEvent == E_EVENT_NEW_STATE) { // Sleep は必ず E_EVENT_NEW_STATE 内など1回のみ呼び出される場所で呼び出す。 V_PRINTF(LB"! Sleeping..."); V_FLUSH(); pEv->bKeepStateOnSetAll = FALSE; // スリープ復帰の状態を維持 // Mininode の場合、特別な処理は無いのだが、ポーズ処理を行う ToCoNet_Nwk_bPause(sAppData.pContextNwk); // センサー用の電源制御回路を Hi に戻す vPortSetSns(FALSE); #ifdef LITE2525A vPortSetLo(LED); #else vPortSetHi(LED); #endif // 周期スリープに入る if(sAppData.sFlash.sData.i16param == NORMAL || sAppData.sFlash.sData.i16param == NEKOTTER ){ vSleep(sAppData.sFlash.sData.u32Slp, sAppData.u16frame_count == 1 ? FALSE : TRUE, FALSE); }else{ // 割り込みの設定 vAHI_DioSetDirection(PORT_INPUT_MASK_ADXL345, 0); // set as input (void)u32AHI_DioInterruptStatus(); // clear interrupt register vAHI_DioWakeEnable(PORT_INPUT_MASK_ADXL345, 0); // also use as DIO WAKE SOURCE vAHI_DioWakeEdge(PORT_INPUT_MASK_ADXL345, 0); // 割り込みエッジ(立上がりに設定) vSleep(0, FALSE, FALSE); } } }
/**************************************************************************** * * NAME: vActionOnButtonActivationAfterDeepSleep * * DESCRIPTION: * When we wake up, we have restarted so we need to manually check to see * what Dio woke us. Start the ButtonScanTask and disable wake interrupts * ****************************************************************************/ PUBLIC void vActionOnButtonActivationAfterDeepSleep(void) { DBG_vPrintf(TRACE_APP_BUTTON, "\nAPP Button: Interrupt Status = %d", u32AHI_DioInterruptStatus()); u32DioInterrupts |= APP_BUTTONS_DIO_MASK; vAHI_DioWakeEnable(0, u32DioInterrupts); OS_eActivateTask(APP_ButtonsScanTask); }
/* スリープをする状態 */ PRSEV_HANDLER_DEF(E_STATE_APP_SLEEP, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { if (eEvent == E_EVENT_NEW_STATE) { // Sleep は必ず E_EVENT_NEW_STATE 内など1回のみ呼び出される場所で呼び出す。 V_PRINTF(LB"Sleeping..."); V_FLUSH(); // Mininode の場合、特別な処理は無いのだが、ポーズ処理を行う ToCoNet_Nwk_bPause(sAppData.pContextNwk); // print message. vAHI_UartDisable(UART_PORT); // UART を解除してから(このコードは入っていなくても動作は同じ) // set UART Rx port as interrupt source vAHI_DioSetDirection(PORT_INPUT_MASK, 0); // set as input (void)u32AHI_DioInterruptStatus(); // clear interrupt register vAHI_DioWakeEnable(PORT_INPUT_MASK, 0); // also use as DIO WAKE SOURCE // i16paramに関わらず状態の変化で起床 if(sAppData.bDI1_Now_Opened) { vAHI_DioWakeEdge(0, PORT_INPUT_MASK); // 割り込みエッジ(立下りに設定) } else { vAHI_DioWakeEdge(PORT_INPUT_MASK, 0); // 割り込みエッジ(立上がりに設定) } // wake up using wakeup timer as well. ToCoNet_vSleep(E_AHI_WAKE_TIMER_0, sAppData.sFlash.sData.u32Slp, FALSE, FALSE ); // PERIODIC RAM OFF SLEEP USING WK0 } }
void vEH_ButtonCallback(uint32 u32DeviceId, uint32 u32ItemBitmap) { #ifdef DK4 /* clear pending DIO changed bits by reading register */ (void) u32AHI_DioInterruptStatus(); uint32 u32IntStatus = u32AHI_DioReadInput(); /* disable edge detection until handling of button press complete */ vAHI_DioInterruptEnable(0, APP_BUTTONS_DIO_MASK); DBG_vPrintf(DBG_DEVICE_SWITCH, "\nvEH_ButtonCallback u32DeviceId = 0x%8x, u32ItemBitmap = 0x%8x u32IntStatus = 0x%8x" , u32DeviceId,u32ItemBitmap, u32IntStatus); /* Update flags indicating that Button press detected */ bButtonPressed = TRUE; u32Button = u32ItemBitmap; #endif }
bool bHandleButtonPress(bool bIsPowerUp) { uint32 u32StartTime; bool bEnableSleep = TRUE; /* ISR will set bButtonPressed to true */ if(bButtonPressed) { switch(u32Button) { /* Switch 1: mapping * 1. Commissioning Commands * 2. On Or Toggle Command * 3. De commissioning command * 4. Factory Reset * */ case APP_E_BUTTONS_BUTTON_SW1: bEnableSleep = bProcessGPDEvent(); break; case APP_E_BUTTONS_BUTTON_SW2: DBG_vPrintf(DBG_DEVICE_SWITCH, "\n APP_E_BUTTONS_BUTTON_SW2 \n"); /* Button 2 mapping : * Off command */ HandleGPDStateMachine(E_GPD_OFF_CMD); bButtonPressed = FALSE; break; case APP_E_BUTTONS_BUTTON_SW3: DBG_vPrintf(DBG_DEVICE_SWITCH, "\n APP_E_BUTTONS_BUTTON_SW3 \n"); /* Button 3 mapping : * Move up with on/off( button press) , * Level control stop (button release ) */ { HandleGPDStateMachine(E_GPD_MOVE_UP_CMD); bButtonPressed = FALSE; uint32 u32DIOVal2 = u32AHI_DioReadInput(); uint32 u32DIOVal = u32AHI_DioReadInput(); /* start timer to account next button press interval */ u32StartTime = u32EH_StartTimer(); while(u32DIOVal2 == u32DIOVal) { if(bEH_IsTimeElapsedInMicrosSec((uint32)( APP_TIME_MS(NEXT_MOVE_CMD_DURATION)) ,u32StartTime)) { u32StartTime = u32EH_StartTimer(); u32DIOVal = u32AHI_DioReadInput(); } } DBG_vPrintf(DBG_DEVICE_SWITCH, "\n APP_E_BUTTONS_BUTTON_SW3 Release u32DIOVal = 0x%8x \n",u32DIOVal); HandleGPDStateMachine(E_GPD_LEVEL_CONTROL_STOP); } break; case APP_E_BUTTONS_BUTTON_SW4: DBG_vPrintf(DBG_DEVICE_SWITCH, "\n APP_E_BUTTONS_BUTTON_SW4 \n"); /* Button 4 mapping : * Move Down with on / off( button press), * Level control stop(button release ) */ { HandleGPDStateMachine(E_GPD_MOVE_DOWN_CMD); bButtonPressed = FALSE; uint32 u32DIOVal = u32AHI_DioReadInput(); uint32 u32DIOVal2 = u32AHI_DioReadInput(); u32StartTime = u32EH_StartTimer(); while(u32DIOVal2 == u32DIOVal) { if(bEH_IsTimeElapsedInMicrosSec((uint32)( APP_TIME_MS(NEXT_MOVE_CMD_DURATION)) ,u32StartTime)) { u32StartTime = u32EH_StartTimer(); u32DIOVal = u32AHI_DioReadInput(); } } DBG_vPrintf(DBG_DEVICE_SWITCH, "\n APP_E_BUTTONS_BUTTON_SW4 Release u32DIOVal = 0x%8x\n",u32DIOVal); HandleGPDStateMachine(E_GPD_LEVEL_CONTROL_STOP); } break; case APP_BUTTONS_BUTTON_1: if(bIsPowerUp) { vClearPersistentData(TRUE); } bButtonPressed = FALSE; break; default: DBG_vPrintf(DBG_DEVICE_SWITCH, "\n Button Handler u32Button = 0x%8x", u32Button); break; } /* enable interrupts again (on DK4) */ DBG_vPrintf(DBG_DEVICE_SWITCH, "\n Enable int 1 \n" ); (void) u32AHI_DioInterruptStatus(); vAHI_DioInterruptEnable(APP_BUTTONS_DIO_MASK, 0); } return bEnableSleep; }