static void button_timer_event_handler(void) { if (HAL_Buttons[BUTTON1].active && (BUTTON_GetState(BUTTON1) == BUTTON1_PRESSED)) { if (!HAL_Buttons[BUTTON1].debounce_time) { HAL_Buttons[BUTTON1].debounce_time += BUTTON_DEBOUNCE_INTERVAL; #if MODULE_FUNCTION != MOD_FUNC_BOOTLOADER HAL_Notify_Button_State(BUTTON1, true); #endif } HAL_Buttons[BUTTON1].debounce_time += BUTTON_DEBOUNCE_INTERVAL; } else if (HAL_Buttons[BUTTON1].active) { HAL_Buttons[BUTTON1].active = false; button_reset(BUTTON1); } if ((HAL_Buttons[BUTTON1_MIRROR].pin != PIN_INVALID) && HAL_Buttons[BUTTON1_MIRROR].active && BUTTON_GetState(BUTTON1_MIRROR) == (HAL_Buttons[BUTTON1_MIRROR].interrupt_mode == RISING ? 1 : 0)) { if (!HAL_Buttons[BUTTON1_MIRROR].debounce_time) { HAL_Buttons[BUTTON1_MIRROR].debounce_time += BUTTON_DEBOUNCE_INTERVAL; #if MODULE_FUNCTION != MOD_FUNC_BOOTLOADER HAL_Notify_Button_State(BUTTON1_MIRROR, true); #endif } HAL_Buttons[BUTTON1_MIRROR].debounce_time += BUTTON_DEBOUNCE_INTERVAL; } else if ((HAL_Buttons[BUTTON1_MIRROR].pin != PIN_INVALID) && HAL_Buttons[BUTTON1_MIRROR].active) { HAL_Buttons[BUTTON1_MIRROR].active = false; button_reset(BUTTON1_MIRROR); } }
/** * @brief This function handles TIM2_IRQ Handler. * @param None * @retval None */ void TIM2_irq(void) { if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { if (BUTTON_GetState(BUTTON1) == BUTTON1_PRESSED) { if (!BUTTON_DEBOUNCED_TIME[BUTTON1]) { BUTTON_DEBOUNCED_TIME[BUTTON1] += BUTTON_DEBOUNCE_INTERVAL; HAL_Notify_Button_State(BUTTON1, true); } BUTTON_DEBOUNCED_TIME[BUTTON1] += BUTTON_DEBOUNCE_INTERVAL; } else { HAL_Core_Mode_Button_Reset(); } } HAL_System_Interrupt_Trigger(SysInterrupt_TIM2_IRQ, NULL); uint8_t result = handle_timer(TIM2, TIM_IT_CC1, SysInterrupt_TIM2_Compare1) || handle_timer(TIM2, TIM_IT_CC2, SysInterrupt_TIM2_Compare2) || handle_timer(TIM2, TIM_IT_CC3, SysInterrupt_TIM2_Compare3) || handle_timer(TIM2, TIM_IT_CC4, SysInterrupt_TIM2_Compare4) || handle_timer(TIM2, TIM_IT_Update, SysInterrupt_TIM2_Update) || handle_timer(TIM2, TIM_IT_Trigger, SysInterrupt_TIM2_Trigger); UNUSED(result); }
/** * Force the button in the unpressed state. */ void HAL_Core_Mode_Button_Reset(void) { /* Disable TIM2 CC1 Interrupt */ TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE); BUTTON_DEBOUNCED_TIME[BUTTON1] = 0x00; HAL_Notify_Button_State(BUTTON1, false); /* Enable BUTTON1 Interrupt */ BUTTON_EXTI_Config(BUTTON1, ENABLE); }
static void button_reset(uint16_t button) { HAL_Buttons[button].debounce_time = 0x00; if (!HAL_Buttons[BUTTON1].active && !HAL_Buttons[BUTTON1_MIRROR].active) { button_timer_stop(); } #if MODULE_FUNCTION != MOD_FUNC_BOOTLOADER HAL_Notify_Button_State((Button_TypeDef)button, false); #endif /* Enable Button Interrupt */ BUTTON_EXTI_Config((Button_TypeDef)button, ENABLE); }
void HAL_Core_Mode_Button_Reset(uint16_t button) { /* Disable TIM1 CC4 Interrupt */ TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE); BUTTON_ResetDebouncedState(BUTTON1); HAL_Notify_Button_State(BUTTON1, false); /* Enable BUTTON1 Interrupt */ BUTTON_EXTI_Config(BUTTON1, ENABLE); }
/******************************************************************************* * Function Name : HAL_SysTick_Handler * Description : Decrements the various Timing variables related to SysTick. * Input : None * Output : None. * Return : None. ************************************************ *******************************/ extern "C" void HAL_SysTick_Handler(void) { if (LED_RGB_IsOverRidden()) { #ifndef SPARK_NO_CLOUD if (LED_Spark_Signal != 0) { LED_Signaling_Override(); } #endif } else if (TimingLED != 0x00) { TimingLED--; } else if(SPARK_FLASH_UPDATE || Spark_Error_Count || network.listening()) { //Do nothing } else if (SYSTEM_POWEROFF) { LED_SetRGBColor(RGB_COLOR_GREY); LED_On(LED_RGB); } else if(SPARK_LED_FADE && (!SPARK_CLOUD_CONNECTED || system_cloud_active())) { LED_Fade(LED_RGB); TimingLED = 20;//Breathing frequency kept constant } else if(SPARK_CLOUD_CONNECTED) { LED_SetRGBColor(system_mode()==SAFE_MODE ? RGB_COLOR_MAGENTA : RGB_COLOR_CYAN); LED_On(LED_RGB); SPARK_LED_FADE = 1; } else { LED_Toggle(LED_RGB); if(SPARK_CLOUD_SOCKETED || ( network.connected() && !network.ready())) TimingLED = 50; //50ms else TimingLED = 100; //100ms } if(SPARK_FLASH_UPDATE) { #ifndef SPARK_NO_CLOUD if (TimingFlashUpdateTimeout >= TIMING_FLASH_UPDATE_TIMEOUT) { //Reset is the only way now to recover from stuck OTA update HAL_Core_System_Reset(); } else { TimingFlashUpdateTimeout++; } #endif } else if(network.listening() && HAL_Core_Mode_Button_Pressed(10000)) { network.listen_command(); } // determine if the button press needs to change the state (and hasn't done so already)) else if(!network.listening() && HAL_Core_Mode_Button_Pressed(3000) && !wasListeningOnButtonPress) { if (network.connecting()) { network.connect_cancel(true, true); } // fire the button event to the user, then enter listening mode (so no more button notifications are sent) // there's a race condition here - the HAL_notify_button_state function should // be thread safe, but currently isn't. HAL_Notify_Button_State(0, false); network.listen(); HAL_Notify_Button_State(0, true); } #ifdef IWDG_RESET_ENABLE if (TimingIWDGReload >= TIMING_IWDG_RELOAD) { TimingIWDGReload = 0; /* Reload WDG counter */ HAL_Notify_WDT(); DECLARE_SYS_HEALTH(CLEARED_WATCHDOG); } else { TimingIWDGReload++; } #endif }