123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566 |
- #include "comdef.h"
- #include "OnBoard.h"
- #include "OSAL.h"
- #include "OSAL_Timers.h"
- #include "hal_timer.h"
- typedef struct
- {
- void *next;
- uint16 timeout;
- uint16 event_flag;
- uint8 task_id;
- uint16 reloadTimeout;
- } osalTimerRec_t;
- osalTimerRec_t *timerHead;
- static uint32 osal_systemClock;
- osalTimerRec_t *osalAddTimer( uint8 task_id, uint16 event_flag, uint16 timeout );
- osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag );
- void osalDeleteTimer( osalTimerRec_t *rmTimer );
- void osalTimerInit( void )
- {
- osal_systemClock = 0;
- }
- osalTimerRec_t * osalAddTimer( uint8 task_id, uint16 event_flag, uint16 timeout )
- {
- osalTimerRec_t *newTimer;
- osalTimerRec_t *srchTimer;
-
- newTimer = osalFindTimer( task_id, event_flag );
- if ( newTimer )
- {
-
- newTimer->timeout = timeout;
- return ( newTimer );
- }
- else
- {
-
- newTimer = osal_mem_alloc( sizeof( osalTimerRec_t ) );
- if ( newTimer )
- {
-
- newTimer->task_id = task_id;
- newTimer->event_flag = event_flag;
- newTimer->timeout = timeout;
- newTimer->next = (void *)NULL;
- newTimer->reloadTimeout = 0;
-
- if ( timerHead == NULL )
- {
-
- timerHead = newTimer;
- }
- else
- {
-
- srchTimer = timerHead;
-
- while ( srchTimer->next )
- srchTimer = srchTimer->next;
-
- srchTimer->next = newTimer;
- }
- return ( newTimer );
- }
- else
- return ( (osalTimerRec_t *)NULL );
- }
- }
- osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag )
- {
- osalTimerRec_t *srchTimer;
-
- srchTimer = timerHead;
-
- while ( srchTimer )
- {
- if ( srchTimer->event_flag == event_flag &&
- srchTimer->task_id == task_id )
- break;
-
- srchTimer = srchTimer->next;
- }
- return ( srchTimer );
- }
- void osalDeleteTimer( osalTimerRec_t *rmTimer )
- {
-
- if ( rmTimer )
- {
-
-
- rmTimer->event_flag = 0;
- }
- }
- uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
- {
- halIntState_t intState;
- osalTimerRec_t *newTimer;
- HAL_ENTER_CRITICAL_SECTION( intState );
-
- newTimer = osalAddTimer( taskID, event_id, timeout_value );
- HAL_EXIT_CRITICAL_SECTION( intState );
- return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL );
- }
- uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint16 timeout_value )
- {
- halIntState_t intState;
- osalTimerRec_t *newTimer;
- HAL_ENTER_CRITICAL_SECTION( intState );
-
- newTimer = osalAddTimer( taskID, event_id, timeout_value );
- if ( newTimer )
- {
-
- newTimer->reloadTimeout = timeout_value;
- }
- HAL_EXIT_CRITICAL_SECTION( intState );
- return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL );
- }
- uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id )
- {
- halIntState_t intState;
- osalTimerRec_t *foundTimer;
- HAL_ENTER_CRITICAL_SECTION( intState );
-
- foundTimer = osalFindTimer( task_id, event_id );
- if ( foundTimer )
- {
- osalDeleteTimer( foundTimer );
- }
- HAL_EXIT_CRITICAL_SECTION( intState );
- return ( (foundTimer != NULL) ? SUCCESS : INVALID_EVENT_ID );
- }
- uint16 osal_get_timeoutEx( uint8 task_id, uint16 event_id )
- {
- halIntState_t intState;
- uint16 rtrn = 0;
- osalTimerRec_t *tmr;
- HAL_ENTER_CRITICAL_SECTION( intState );
- tmr = osalFindTimer( task_id, event_id );
- if ( tmr )
- {
- rtrn = tmr->timeout;
- }
- HAL_EXIT_CRITICAL_SECTION( intState );
- return rtrn;
- }
- uint8 osal_timer_num_active( void )
- {
- halIntState_t intState;
- uint8 num_timers = 0;
- osalTimerRec_t *srchTimer;
- HAL_ENTER_CRITICAL_SECTION( intState );
-
- srchTimer = timerHead;
-
- while ( srchTimer != NULL )
- {
- num_timers++;
- srchTimer = srchTimer->next;
- }
- HAL_EXIT_CRITICAL_SECTION( intState );
- return num_timers;
- }
- void osalTimerUpdate( uint16 updateTime )
- {
- halIntState_t intState;
- osalTimerRec_t *srchTimer;
- osalTimerRec_t *prevTimer;
- HAL_ENTER_CRITICAL_SECTION( intState );
-
- osal_systemClock += updateTime;
- HAL_EXIT_CRITICAL_SECTION( intState );
-
- if ( timerHead != NULL )
- {
-
- srchTimer = timerHead;
- prevTimer = (void *)NULL;
-
- while ( srchTimer )
- {
- osalTimerRec_t *freeTimer = NULL;
-
- HAL_ENTER_CRITICAL_SECTION( intState );
-
- if (srchTimer->timeout <= updateTime)
- {
- srchTimer->timeout = 0;
- }
- else
- {
- srchTimer->timeout = srchTimer->timeout - updateTime;
- }
-
-
- if ( (srchTimer->timeout == 0) && (srchTimer->reloadTimeout) && (srchTimer->event_flag) )
- {
-
- osal_set_event( srchTimer->task_id, srchTimer->event_flag );
-
-
- srchTimer->timeout = srchTimer->reloadTimeout;
- }
-
-
- if ( srchTimer->timeout == 0 || srchTimer->event_flag == 0 )
- {
-
- if ( prevTimer == NULL )
- timerHead = srchTimer->next;
- else
- prevTimer->next = srchTimer->next;
-
- freeTimer = srchTimer;
-
- srchTimer = srchTimer->next;
- }
- else
- {
-
- prevTimer = srchTimer;
- srchTimer = srchTimer->next;
- }
-
- HAL_EXIT_CRITICAL_SECTION( intState );
-
- if ( freeTimer )
- {
- if ( freeTimer->timeout == 0 )
- {
- osal_set_event( freeTimer->task_id, freeTimer->event_flag );
- }
- osal_mem_free( freeTimer );
- }
- }
- }
- }
- #ifdef POWER_SAVING
- void osal_adjust_timers( void )
- {
- uint16 eTime;
- if ( timerHead != NULL )
- {
-
- eTime = TimerElapsed() / TICK_COUNT;
- if ( eTime )
- osalTimerUpdate( eTime );
- }
- }
- uint16 osal_next_timeout( void )
- {
- uint16 nextTimeout;
- osalTimerRec_t *srchTimer;
- if ( timerHead != NULL )
- {
-
- srchTimer = timerHead;
- nextTimeout = OSAL_TIMERS_MAX_TIMEOUT;
-
- while ( srchTimer != NULL )
- {
- if (srchTimer->timeout < nextTimeout)
- {
- nextTimeout = srchTimer->timeout;
- }
-
- srchTimer = srchTimer->next;
- }
- }
- else
- {
-
- nextTimeout = 0;
- }
- return ( nextTimeout );
- }
- #endif
- uint32 osal_GetSystemClock( void )
- {
- return ( osal_systemClock );
- }
|