123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- #include "hal_mcu.h"
- #include "hal_defs.h"
- #include "hal_types.h"
- #include "hal_drivers.h"
- #include "hal_led.h"
- #include "osal.h"
- #include "hal_board.h"
- typedef struct {
- uint8 mode;
- uint8 todo;
- uint8 onPct;
- uint16 time;
- uint32 next;
- } HalLedControl_t;
- typedef struct
- {
- HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS];
- uint8 sleepActive;
- } HalLedStatus_t;
- static uint8 HalLedState;
- #if HAL_LED == TRUE
- static uint8 HalSleepLedState;
- static uint8 preBlinkState;
-
- #endif
- #ifdef BLINK_LEDS
- static HalLedStatus_t HalLedStatusControl;
- #endif
- #if (HAL_LED == TRUE)
- void HalLedUpdate (void);
- void HalLedOnOff (uint8 leds, uint8 mode);
- #endif
- void HalLedInit (void)
- {
- #if (HAL_LED == TRUE)
-
- HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF);
- #endif
- #ifdef BLINK_LEDS
-
- HalLedStatusControl.sleepActive = FALSE;
- #endif
- }
- uint8 HalLedSet (uint8 leds, uint8 mode)
- {
- #if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
- uint8 led;
- HalLedControl_t *sts;
- switch (mode)
- {
- case HAL_LED_MODE_BLINK:
-
- HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
- break;
- case HAL_LED_MODE_FLASH:
-
- HalLedBlink (leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
- break;
- case HAL_LED_MODE_ON:
- case HAL_LED_MODE_OFF:
- case HAL_LED_MODE_TOGGLE:
- led = HAL_LED_1;
- leds &= HAL_LED_ALL;
- sts = HalLedStatusControl.HalLedControlTable;
- while (leds)
- {
- if (leds & led)
- {
- if (mode != HAL_LED_MODE_TOGGLE)
- {
- sts->mode = mode;
- }
- else
- {
- sts->mode ^= HAL_LED_MODE_ON;
- }
- HalLedOnOff (led, sts->mode);
- leds ^= led;
- }
- led <<= 1;
- sts++;
- }
- break;
- default:
- break;
- }
- #elif (HAL_LED == TRUE)
- LedOnOff(leds, mode);
- #else
-
- (void) leds;
- (void) mode;
- #endif
- return ( HalLedState );
- }
- void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period)
- {
- #if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
- uint8 led;
- HalLedControl_t *sts;
- if (leds && percent && period)
- {
- if (percent < 100)
- {
- led = HAL_LED_1;
- leds &= HAL_LED_ALL;
- sts = HalLedStatusControl.HalLedControlTable;
- while (leds)
- {
- if (leds & led)
- {
-
- if(sts->mode < HAL_LED_MODE_BLINK )
- preBlinkState |= (led & HalLedState);
- sts->mode = HAL_LED_MODE_OFF;
- sts->time = period;
- sts->onPct = percent;
- sts->todo = numBlinks;
- if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH;
- sts->next = osal_GetSystemClock();
- sts->mode |= HAL_LED_MODE_BLINK;
- leds ^= led;
- }
- led <<= 1;
- sts++;
- }
-
- osal_stop_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT);
- osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT);
- }
- else
- {
- HalLedSet (leds, HAL_LED_MODE_ON);
- }
- }
- else
- {
- HalLedSet (leds, HAL_LED_MODE_OFF);
- }
- #elif (HAL_LED == TRUE)
- percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON;
- HalLedOnOff (leds, percent);
- #else
-
- (void) leds;
- (void) numBlinks;
- (void) percent;
- (void) period;
- #endif
- }
- #if (HAL_LED == TRUE)
- void HalLedUpdate (void)
- {
- uint8 led;
- uint8 pct;
- uint8 leds;
- HalLedControl_t *sts;
- uint32 time;
- uint16 next;
- uint16 wait;
- next = 0;
- led = HAL_LED_1;
- leds = HAL_LED_ALL;
- sts = HalLedStatusControl.HalLedControlTable;
-
- if (!HalLedStatusControl.sleepActive)
- {
- while (leds)
- {
- if (leds & led)
- {
- if (sts->mode & HAL_LED_MODE_BLINK)
- {
- time = osal_GetSystemClock();
- if (time >= sts->next)
- {
- if (sts->mode & HAL_LED_MODE_ON)
- {
- pct = 100 - sts->onPct;
- sts->mode &= ~HAL_LED_MODE_ON;
- HalLedOnOff (led, HAL_LED_MODE_OFF);
- if (!(sts->mode & HAL_LED_MODE_FLASH))
- {
- sts->todo--;
- }
- }
- else if ( (!sts->todo) && !(sts->mode & HAL_LED_MODE_FLASH) )
- {
- sts->mode ^= HAL_LED_MODE_BLINK;
- }
- else
- {
- pct = sts->onPct;
- sts->mode |= HAL_LED_MODE_ON;
- HalLedOnOff (led, HAL_LED_MODE_ON);
- }
- if (sts->mode & HAL_LED_MODE_BLINK)
- {
- wait = (((uint32)pct * (uint32)sts->time) / 100);
- sts->next = time + wait;
- }
- else
- {
-
- wait = 0;
-
- HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF);
-
- preBlinkState &= (led ^ 0xFF);
- }
- }
- else
- {
- wait = sts->next - time;
- }
- if (!next || ( wait && (wait < next) ))
- {
- next = wait;
- }
- }
- leds ^= led;
- }
- led <<= 1;
- sts++;
- }
- if (next)
- {
- osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next);
- }
- }
- }
- void HalLedOnOff (uint8 leds, uint8 mode)
- {
- if (leds & HAL_LED_1)
- {
- if (mode == HAL_LED_MODE_ON)
- {
- HAL_TURN_ON_LED1();
- }
- else
- {
- HAL_TURN_OFF_LED1();
- }
- }
- if (leds & HAL_LED_2)
- {
- if (mode == HAL_LED_MODE_ON)
- {
- HAL_TURN_ON_LED2();
- }
- else
- {
- HAL_TURN_OFF_LED2();
- }
- }
- if (leds & HAL_LED_3)
- {
- if (mode == HAL_LED_MODE_ON)
- {
- HAL_TURN_ON_LED3();
- }
- else
- {
- HAL_TURN_OFF_LED3();
- }
- }
- if (leds & HAL_LED_4)
- {
- if (mode == HAL_LED_MODE_ON)
- {
- HAL_TURN_ON_LED4();
- }
- else
- {
- HAL_TURN_OFF_LED4();
- }
- }
-
- if (mode)
- {
- HalLedState |= leds;
- }
- else
- {
- HalLedState &= (leds ^ 0xFF);
- }
- }
- #endif
- uint8 HalLedGetState ()
- {
- #if (HAL_LED == TRUE)
- return HalLedState;
- #else
- return 0;
- #endif
- }
- void HalLedEnterSleep( void )
- {
- #ifdef BLINK_LEDS
-
- HalLedStatusControl.sleepActive = TRUE;
- #endif
- #if (HAL_LED == TRUE)
-
- HalSleepLedState = 0;
- HalSleepLedState |= HAL_STATE_LED1();
- HalSleepLedState |= HAL_STATE_LED2() << 1;
- HalSleepLedState |= HAL_STATE_LED3() << 2;
- HalSleepLedState |= HAL_STATE_LED4() << 3;
-
- HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF);
- #endif
- }
- void HalLedExitSleep( void )
- {
- #if (HAL_LED == TRUE)
-
- HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON);
-
- HalLedUpdate();
- #endif
- #ifdef BLINK_LEDS
-
- HalLedStatusControl.sleepActive = FALSE;
- #endif
- }
|