Skip to content

Commit 48c4bcf

Browse files
add example timer behavior to the hw lock ctrl service, demonstrating time movement.
Also test an assert.
1 parent 47e419c commit 48c4bcf

File tree

2 files changed

+60
-10
lines changed

2 files changed

+60
-10
lines changed

example/services/hwLockCtrlService/src/hwLockCtrlService.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ SOFTWARE.
2828
#include "FreeRTOS.h"
2929
#include "task.h"
3030
#include "queue.h"
31+
#include "timers.h"
3132

3233
typedef 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);
5860
static void* HLCS_SmUnlocked(const HLCS_EventTypeT* const event);
5961
static void* HLCS_SmSelfTest(const HLCS_EventTypeT* const event);
6062
static void HLCS_Task(void*);
63+
static void HLCS_CheckCurrentTimerCallback( TimerHandle_t xTimer );
64+
static void HLCS_DoCurrentCheck();
6165

6266
//constants
6367
static const size_t QueueDepth = 10;
@@ -74,6 +78,7 @@ static HLCS_ChangeStateCallback s_stateChangedCallback = NULL;
7478
static HLCS_SelfTestResultCallback s_selfTestResultCallback = NULL;
7579
static HLCS_StateMachineFunc s_currentState = NULL;
7680
static 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

135154
HLCS_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+
}

example/services/hwLockCtrlService/test/hwLockCtrlServiceTests.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2222
SOFTWARE.
2323
*/
2424
#include "hwLockCtrlService.h"
25+
#include "cpputest_freertos_timers.hpp"
26+
#include "cpputest_freertos_assert.hpp"
2527
#include "CppUTest/TestHarness.h"
2628
#include "CppUTestExt/MockSupport.h"
2729
#include "hwLockCtrl.h"
2830

2931
static constexpr const char* HW_LOCK_CTRL_MOCK = "HwLockCtrl";
3032
static constexpr const char* CB_MOCK = "TestCb";
3133

34+
using namespace std::chrono_literals;
35+
3236
static void TestLockStateCallback(HLCS_LockStateT state)
3337
{
3438
mock(CB_MOCK).actualCall("LockStateCallback").withIntParameter("state", static_cast<int>(state));
@@ -56,6 +60,7 @@ TEST_GROUP(HwLockCtrlServiceTests)
5660
{
5761
void setup() final
5862
{
63+
cms::test::InitFakeTimers();
5964
HLCS_Init();
6065
HLCS_RegisterChangeStateCallback(TestLockStateCallback);
6166
HLCS_RegisterSelfTestResultCallback(TestSelfTestResultCallback);
@@ -65,6 +70,7 @@ TEST_GROUP(HwLockCtrlServiceTests)
6570
{
6671
HLCS_Destroy(); //ensure we are stopped/clean/destroyed.
6772
mock().clear();
73+
cms::test::DestroyFakeTimers();
6874
}
6975

7076
void GiveProcessingTime()
@@ -201,14 +207,20 @@ TEST(HwLockCtrlServiceTests, given_unlocked_when_selftest_request_which_fails_th
201207
mock().checkExpectations();
202208
}
203209

204-
TEST(HwLockCtrlServiceTests, rapid_create_start_destroy_handles_real_thread_correctly)
205-
{
206-
//just make sure we don't see a crash or other hang or
207-
//unexpected behavior.
208-
mock().ignoreOtherCalls();
209-
HLCS_Start(EXECUTION_OPTION_NORMAL);
210-
HLCS_Destroy();
211-
HLCS_Init();
212-
HLCS_Start(EXECUTION_OPTION_NORMAL);
213-
HLCS_Destroy();
210+
TEST(HwLockCtrlServiceTests, given_unlocked_when_5_secs_passes_then_checks_current) {
211+
StartServiceToUnlocked();
212+
mock(HW_LOCK_CTRL_MOCK).expectOneCall("ReadCurrent").andReturnValue(100);
213+
cms::test::MoveTimeForward(5s);
214+
GiveProcessingTime();
215+
mock().checkExpectations();
216+
}
217+
218+
TEST(HwLockCtrlServiceTests, if_current_exceeds_2amps_will_assert) {
219+
StartServiceToUnlocked();
220+
mock(HW_LOCK_CTRL_MOCK).expectOneCall("ReadCurrent").andReturnValue(2001);
221+
cms::test::AssertOutputDisable();
222+
cms::test::MockExpectAssert();
223+
cms::test::MoveTimeForward(5s);
224+
GiveProcessingTime();
225+
mock().checkExpectations();
214226
}

0 commit comments

Comments
 (0)