Skip to content

Commit 2917ce6

Browse files
committed
#45: Mode handler mode selection test
1 parent 48e22ec commit 2917ce6

File tree

4 files changed

+93
-29
lines changed

4 files changed

+93
-29
lines changed

Src/Application/mode_handler.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,11 @@ mode_handler_mode_t mode_handler_handle(imu_data_t *imu_data, remote_data_t *rem
8989
/*
9090
* Setpoint selection
9191
*/
92-
if (imu_active && remote_active && flightcomputer_active && !remote_data->override_active &&
93-
remote_data->is_armed) {
94-
return MODE_FLIGHTCOMPUTER;
92+
if (imu_active && remote_active && flightcomputer_active && !remote_data->override_active) {
93+
if (remote_data->is_armed) {
94+
return MODE_FLIGHTCOMPUTER;
95+
}
96+
return MODE_STABILISED_FAILSAVE;
9597
}
9698

9799
if (remote_active) {

Src/Application/mode_handler.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ void mode_handler_init(void);
4747
* | IMU | Remote | FCP | Override | Armed | Mode |
4848
* | --- | ------ | --- | -------- | ----- | -------------------- |
4949
* | Y | Y | Y | N | Y | FCP |
50-
* | | Y | | | | Remote |
50+
* | Y | Y | Y | N | N | Stabilisied Failsave |
5151
* | Y | N | | | | Stabilisied Failsave |
52-
* | N | N | | | | Failsave |
52+
* | | Y | | | | Remote |
53+
* | | | | | | Failsave |
5354
*
5455
*
5556
* @param imu_data out-parameter, contains the last valid imu measurement

Tests/LowLevel/Application/mode_handler.cpp

Lines changed: 84 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,6 @@ extern "C" {
88
#include <Application/mode_handler.h>
99
}
1010

11-
TEST(TEST_NAME, all_ok) {
12-
auto imuHandle = mock::imu.getHandle();
13-
auto flightcomputerHandle = mock::flightcomputer.getHandle();
14-
auto remoteHandle = mock::remote.getHandle();
15-
auto errorHandlerHandle = mock::error_handler.getHandle();
16-
17-
imuHandle.overrideFunc<imu_data_available>([]() { return true; });
18-
imuHandle.overrideFunc<imu_get_latest_data>([]() { return imu_data_t{.imu_ok = true}; });
19-
remoteHandle.overrideFunc<remote_data_available>([]() { return true; });
20-
remoteHandle.overrideFunc<remote_get_data>(
21-
[]() { return remote_data_t{.is_armed = true, .override_active = false, .remote_ok = true}; });
22-
flightcomputerHandle.overrideFunc<flightcomputer_setpoint_available>([]() { return true; });
23-
flightcomputerHandle.overrideFunc<flightcomputer_get_setpoint>([]() { return flightcomputer_setpoint_t{}; });
24-
25-
mode_handler_init();
26-
27-
imu_data_t imuData;
28-
remote_data_t remoteData;
29-
flightcomputer_setpoint_t flightcomputerSetpoint;
30-
31-
EXPECT_EQ(mode_handler_handle(&imuData, &remoteData, &flightcomputerSetpoint), MODE_FLIGHTCOMPUTER);
32-
}
33-
3411
TEST(TEST_NAME, imu_initial_timeout) {
3512
auto imuHandle = mock::imu.getHandle();
3613
auto flightcomputerHandle = mock::flightcomputer.getHandle();
@@ -380,3 +357,87 @@ TEST(TEST_NAME, fcp_timeout) {
380357
EXPECT_FALSE(errorHandlerHandle.functionGotCalled<error_handler_handle_warning>(MODE_HANDLER,
381358
MODE_HANDLER_ERROR_NO_FCP_DATA));
382359
}
360+
361+
TEST(TEST_NAME, modeselection) {
362+
auto imuHandle = mock::imu.getHandle();
363+
auto flightcomputerHandle = mock::flightcomputer.getHandle();
364+
auto remoteHandle = mock::remote.getHandle();
365+
auto errorHandlerHandle = mock::error_handler.getHandle();
366+
367+
imuHandle.overrideFunc<imu_data_available>([]() { return true; });
368+
remoteHandle.overrideFunc<remote_data_available>([]() { return true; });
369+
flightcomputerHandle.overrideFunc<flightcomputer_get_setpoint>([]() { return flightcomputer_setpoint_t{}; });
370+
371+
struct availability_values {
372+
bool imu, remote, fcp, override, arm;
373+
};
374+
375+
const std::vector<std::pair<availability_values, mode_handler_mode_t>> decisionTable{
376+
{{false, false, false, false, false}, MODE_FAILSAVE},
377+
{{false, false, false, false, true}, MODE_FAILSAVE},
378+
{{false, false, false, true, false}, MODE_FAILSAVE},
379+
{{false, false, false, true, true}, MODE_FAILSAVE},
380+
{{false, false, true, false, false}, MODE_FAILSAVE},
381+
{{false, false, true, false, true}, MODE_FAILSAVE},
382+
{{false, false, true, true, false}, MODE_FAILSAVE},
383+
{{false, false, true, true, true}, MODE_FAILSAVE},
384+
{{false, true, false, false, false}, MODE_REMOTE},
385+
{{false, true, false, false, true}, MODE_REMOTE},
386+
{{false, true, false, true, false}, MODE_REMOTE},
387+
{{false, true, false, true, true}, MODE_REMOTE},
388+
{{false, true, true, false, false}, MODE_REMOTE},
389+
{{false, true, true, false, true}, MODE_REMOTE},
390+
{{false, true, true, true, false}, MODE_REMOTE},
391+
{{false, true, true, true, true}, MODE_REMOTE},
392+
{{true, false, false, false, false}, MODE_STABILISED_FAILSAVE},
393+
{{true, false, false, false, true}, MODE_STABILISED_FAILSAVE},
394+
{{true, false, false, true, false}, MODE_STABILISED_FAILSAVE},
395+
{{true, false, false, true, true}, MODE_STABILISED_FAILSAVE},
396+
{{true, false, true, false, false}, MODE_STABILISED_FAILSAVE},
397+
{{true, false, true, false, true}, MODE_STABILISED_FAILSAVE},
398+
{{true, false, true, true, false}, MODE_STABILISED_FAILSAVE},
399+
{{true, false, true, true, true}, MODE_STABILISED_FAILSAVE},
400+
{{true, true, false, false, false}, MODE_REMOTE},
401+
{{true, true, false, false, true}, MODE_REMOTE},
402+
{{true, true, false, true, false}, MODE_REMOTE},
403+
{{true, true, false, true, true}, MODE_REMOTE},
404+
{{true, true, true, false, false}, MODE_STABILISED_FAILSAVE},
405+
{{true, true, true, false, true}, MODE_FLIGHTCOMPUTER},
406+
{{true, true, true, true, false}, MODE_REMOTE},
407+
{{true, true, true, true, true}, MODE_REMOTE},
408+
};
409+
410+
for (auto [availability_value, expected_mode] : decisionTable) {
411+
mode_handler_init();
412+
imuHandle.overrideFunc<imu_get_latest_data>(
413+
[availability_value]() { return imu_data_t{.imu_ok = availability_value.imu}; });
414+
remoteHandle.overrideFunc<remote_get_data>([availability_value]() {
415+
return remote_data_t{.is_armed = availability_value.arm,
416+
.override_active = availability_value.override,
417+
.remote_ok = availability_value.remote};
418+
});
419+
flightcomputerHandle.overrideFunc<flightcomputer_setpoint_available>(
420+
[availability_value]() { return availability_value.fcp; });
421+
422+
imu_data_t imuData;
423+
remote_data_t remoteData;
424+
flightcomputer_setpoint_t flightcomputerSetpoint;
425+
EXPECT_EQ(mode_handler_handle(&imuData, &remoteData, &flightcomputerSetpoint), expected_mode);
426+
if (!availability_value.remote) {
427+
EXPECT_TRUE(errorHandlerHandle.functionGotCalled<error_handler_handle_warning>(
428+
MODE_HANDLER, MODE_HANDLER_ERROR_NO_REMOTE_DATA));
429+
}
430+
if (!availability_value.imu) {
431+
EXPECT_TRUE(errorHandlerHandle.functionGotCalled<error_handler_handle_warning>(
432+
MODE_HANDLER, MODE_HANDLER_ERROR_NO_IMU_DATA));
433+
}
434+
if (!availability_value.fcp) {
435+
EXPECT_TRUE(errorHandlerHandle.functionGotCalled<error_handler_handle_warning>(
436+
MODE_HANDLER, MODE_HANDLER_ERROR_NO_FCP_DATA));
437+
}
438+
}
439+
}
440+
441+
TEST(TEST_NAME, fill_out_vars) {
442+
EXPECT_FALSE(true);
443+
}

Tests/LowLevel/Mock/Lib/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ project(MockLib)
22

33
add_library(${PROJECT_NAME} INTERFACE)
44
target_include_directories(${PROJECT_NAME} INTERFACE ..)
5-
target_link_libraries(${PROJECT_NAME} PUBLIC gtest gmock pthread)
5+
target_link_libraries(${PROJECT_NAME} INTERFACE gtest gmock pthread)

0 commit comments

Comments
 (0)