/******************************************************************************* * File Name : LED.c * Description : * Created on : 2018Äê8ÔÂ8ÈÕ * Author : www.hido-studio.com *******************************************************************************/ /******************************************************************************* * Include Files * *******************************************************************************/ #include "LED.h" #include "GPIO.h" #include "HIDO_Timer.h" #include "stm32f1xx_hal.h" #include "HIDO_Lock.h" #include "string.h" /******************************************************************************* * Macro * *******************************************************************************/ /******************************************************************************* * Type Definition * *******************************************************************************/ typedef struct { ST_GPIO m_stPin; E_LedActiveState m_eActiveState; }ST_LED; typedef enum { LED_STATE_IDLE, LED_STATE_ACTIVE, LED_STATE_INACTIVE, } E_LedState; /******************************************************************************* * Local Variable * *******************************************************************************/ static ST_LED l_astLed[LED_ID_MAX]; static ST_LedCtrl l_astLedCtrl[LED_ID_MAX]; static E_LedState l_aeLedState[LED_ID_MAX]; static HIDO_UINT32 l_au32LedTime[LED_ID_MAX]; /******************************************************************************* * Local Function Declaration * *******************************************************************************/ /******************************************************************************* * Local Function * *******************************************************************************/ /******************************************************************************* * Global Function * *******************************************************************************/ /******************************************************************************* * Function Name : Led_PinRegister * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_PinRegister(E_LedID _eID, HIDO_VOID *_pGPIO, HIDO_UINT16 _u16Pin, E_LedActiveState _eActiveState) { l_astLed[_eID].m_stPin.m_pstGPIOx = (GPIO_TypeDef *)_pGPIO; l_astLed[_eID].m_stPin.m_u16GPIOPin = _u16Pin; l_astLed[_eID].m_eActiveState = _eActiveState; return HIDO_OK; } /******************************************************************************* * Function Name : Led_On * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_On(E_LedID _eID) { if(l_astLed[_eID].m_eActiveState == LED_ACTIVE_STATE_RESET) { GPIO_RESET(&l_astLed[_eID].m_stPin); } else { GPIO_SET(&l_astLed[_eID].m_stPin); } return HIDO_OK; } /******************************************************************************* * Function Name : Led_Off * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_Off(E_LedID _eID) { if (l_astLed[_eID].m_eActiveState == LED_ACTIVE_STATE_SET) { GPIO_RESET(&l_astLed[_eID].m_stPin); } else { GPIO_SET(&l_astLed[_eID].m_stPin); } return HIDO_OK; } /******************************************************************************* * Function Name : Led_AllOff * Description : LEDÈ«²¿¹Ø±Õ * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_AllOff(HIDO_VOID) { HIDO_UINT32 i = 0; for (i = 0; i < LED_ID_MAX; i++) { Led_Off((E_LedID)i); } return HIDO_OK; } /******************************************************************************* * Function Name : Led_AllOn * Description : LEDÈ«²¿¿ªÆô * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_AllOn(HIDO_VOID) { HIDO_UINT32 i = 0; for (i = 0; i < LED_ID_MAX; i++) { Led_On((E_LedID)i); } return HIDO_OK; } /******************************************************************************* * Function Name : Led_Toggle * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_Toggle(E_LedID _eID) { GPIO_TOGGLE(&l_astLed[_eID].m_stPin); return HIDO_OK; } /******************************************************************************* * Function Name : Led_10MsISR * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2021Äê3ÔÂ25ÈÕ *******************************************************************************/ HIDO_VOID Led_10MsISR(HIDO_VOID) { HIDO_UINT32 i = 0; for (i = 0; i < LED_ID_MAX; i++) { if (LED_STATE_ACTIVE == l_aeLedState[i]) { l_au32LedTime[i] += 10; if (l_au32LedTime[i] >= l_astLedCtrl[i].m_u32ActiveTime) { Led_Off((E_LedID) i); if (l_astLedCtrl[i].m_u32LoopCnt > 0) { if (l_astLedCtrl[i].m_u32LoopCnt != LED_LOOP_CNT_FOREVER) { l_astLedCtrl[i].m_u32LoopCnt--; } } if(l_astLedCtrl[i].m_u32LoopCnt != 0) { l_aeLedState[i] = LED_STATE_INACTIVE; l_au32LedTime[i] = 0; } else { l_aeLedState[i] = LED_STATE_IDLE; } } } else if (LED_STATE_INACTIVE == l_aeLedState[i]) { l_au32LedTime[i] += 10; if (l_au32LedTime[i] >= l_astLedCtrl[i].m_u32InactiveTime) { l_aeLedState[i] = LED_STATE_ACTIVE; l_au32LedTime[i] = 0; Led_On((E_LedID) i); } } } } /******************************************************************************* * Function Name : Led_Ctrl * Description : LED¿ØÖÆ * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2021Äê3ÔÂ25ÈÕ *******************************************************************************/ HIDO_INT32 Led_Ctrl(E_LedID _eID, ST_LedCtrl *_pstCtrl) { HIDO_Lock(); memcpy(&l_astLedCtrl[_eID], _pstCtrl, sizeof(ST_LedCtrl)); HIDO_UnLock(); if(l_astLedCtrl[_eID].m_u32LoopCnt > 0) { l_aeLedState[_eID] = LED_STATE_ACTIVE; l_au32LedTime[_eID] = 0; Led_On(_eID); } return HIDO_OK; } /******************************************************************************* * Function Name : Led_Init * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2018Äê8ÔÂ8ÈÕ *******************************************************************************/ HIDO_INT32 Led_Init(void) { HIDO_UINT32 i = 0; for (i = 0; i < LED_ID_MAX; i++) { Led_Off((E_LedID)i); } return HIDO_OK; }