示例#1
0
/****************************************************************************
 * 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;
 }
示例#2
0
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

	}
}
示例#5
0
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
}
示例#6
0
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;
}