@@ -28,6 +28,7 @@ SOFTWARE.
2828#include "FreeRTOS.h"
2929#include "task.h"
3030#include "queue.h"
31+ #include "timers.h"
3132
3233typedef enum Signal
3334{
@@ -36,6 +37,7 @@ typedef enum Signal
3637 SIG_REQUEST_LOCKED ,
3738 SIG_REQUEST_UNLOCKED ,
3839 SIG_REQUEST_SELF_TEST ,
40+ SIG_REQUEST_CURRENT_CHECK ,
3941 SIG_REQUEST_THREAD_EXIT
4042} SignalT ;
4143
@@ -58,6 +60,8 @@ static void* HLCS_SmLocked(const HLCS_EventTypeT* const event);
5860static void * HLCS_SmUnlocked (const HLCS_EventTypeT * const event );
5961static void * HLCS_SmSelfTest (const HLCS_EventTypeT * const event );
6062static void HLCS_Task (void * );
63+ static void HLCS_CheckCurrentTimerCallback ( TimerHandle_t xTimer );
64+ static void HLCS_DoCurrentCheck ();
6165
6266//constants
6367static const size_t QueueDepth = 10 ;
@@ -74,6 +78,7 @@ static HLCS_ChangeStateCallback s_stateChangedCallback = NULL;
7478static HLCS_SelfTestResultCallback s_selfTestResultCallback = NULL ;
7579static HLCS_StateMachineFunc s_currentState = NULL ;
7680static HLCS_StateMachineFunc s_stateHistory = NULL ;
81+ static TimerHandle_t s_timer = NULL ;
7782
7883//internal macros for state machine readability
7984#define TransitionTo (x ) (x)
@@ -85,6 +90,7 @@ void HLCS_Init()
8590 configASSERT (s_lockState == HLCS_LOCK_STATE_UNKNOWN );
8691 configASSERT (s_thread == NULL );
8792 configASSERT (s_eventQueue == NULL );
93+ configASSERT (s_timer == NULL );
8894 configASSERT (s_stateChangedCallback == NULL );
8995 configASSERT (s_selfTestResultCallback == NULL );
9096 configASSERT (s_currentState == NULL );
@@ -94,6 +100,10 @@ void HLCS_Init()
94100 s_eventQueue = xQueueCreate (QueueDepth , sizeof (HLCS_EventTypeT ));
95101 configASSERT (s_eventQueue != 0 );
96102
103+ s_timer = xTimerCreate ("current" , pdMS_TO_TICKS (5000 ), pdTRUE ,
104+ NULL , HLCS_CheckCurrentTimerCallback );
105+ configASSERT (s_timer != 0 );
106+
97107 //thread is created in Start()
98108}
99109
@@ -106,6 +116,11 @@ void HLCS_Destroy()
106116 vTaskDelete (s_thread );
107117 vQueueDelete (s_eventQueue );
108118 }
119+ if (s_timer != NULL )
120+ {
121+ xTimerDelete (s_timer , 1000 );
122+ s_timer = NULL ;
123+ }
109124 s_lockState = HLCS_LOCK_STATE_UNKNOWN ;
110125 s_eventQueue = NULL ;
111126 s_stateChangedCallback = NULL ;
@@ -130,6 +145,10 @@ void HLCS_Start(ExecutionOptionT option)
130145 {
131146 HLCS_SmInitialize ();
132147 }
148+
149+ BaseType_t rtn = xTimerStart (s_timer , 1000 );
150+ configASSERT (rtn == pdPASS );
151+
133152}
134153
135154HLCS_LockStateT HLCS_GetState ()
@@ -284,6 +303,10 @@ void* HLCS_SmLocked(const HLCS_EventTypeT* const event)
284303 case SIG_REQUEST_SELF_TEST :
285304 rtn = TransitionTo (HLCS_SmSelfTest );
286305 break ;
306+ case SIG_REQUEST_CURRENT_CHECK :
307+ HLCS_DoCurrentCheck ();
308+ rtn = Handled ();
309+ break ;
287310 default :
288311 rtn = Handled ();
289312 break ;
@@ -315,6 +338,10 @@ void* HLCS_SmUnlocked(const HLCS_EventTypeT* const event)
315338 case SIG_REQUEST_SELF_TEST :
316339 rtn = TransitionTo (HLCS_SmSelfTest );
317340 break ;
341+ case SIG_REQUEST_CURRENT_CHECK :
342+ HLCS_DoCurrentCheck ();
343+ rtn = Handled ();
344+ break ;
318345 default :
319346 rtn = Handled ();
320347 break ;
@@ -386,3 +413,14 @@ void HLCS_Task(void* params)
386413 HLCS_ProcessOneEvent (EXECUTION_OPTION_NORMAL );
387414 }
388415}
416+
417+ void HLCS_CheckCurrentTimerCallback ( TimerHandle_t xTimer )
418+ {
419+ HLCS_PushEvent (SIG_REQUEST_CURRENT_CHECK );
420+ }
421+
422+ void HLCS_DoCurrentCheck ()
423+ {
424+ int32_t milliamps = HwLockCtrlReadCurrent ();
425+ configASSERT (milliamps < 2000 );
426+ }
0 commit comments