Skip to content

Commit

Permalink
Merge pull request #257 from adrienthebo/operator-override-hysteresis
Browse files Browse the repository at this point in the history
 operator override: Add time component to detection
  • Loading branch information
cotos committed Feb 2, 2018
2 parents bb5e952 + 162a2c9 commit 2a55959
Show file tree
Hide file tree
Showing 15 changed files with 66 additions and 24 deletions.
8 changes: 7 additions & 1 deletion firmware/brake/kia_soul_ev_niro/src/brake_control.cpp
Expand Up @@ -27,6 +27,7 @@ static void read_brake_pedal_position_sensor(
void check_for_faults( void )
{
static condition_state_s grounded_fault_state = CONDITION_STATE_INIT;
static condition_state_s operator_override_state = CONDITION_STATE_INIT;

brake_pedal_position_s brake_pedal_position;

Expand All @@ -38,6 +39,11 @@ void check_for_faults( void )
uint32_t brake_pedal_position_average =
(brake_pedal_position.low + brake_pedal_position.high) / 2;

bool operator_overridden = condition_exceeded_duration(
brake_pedal_position_average >= BRAKE_PEDAL_OVERRIDE_THRESHOLD,
FAULT_HYSTERESIS,
&operator_override_state);

bool inputs_grounded = check_voltage_grounded(
brake_pedal_position.high,
brake_pedal_position.low,
Expand All @@ -56,7 +62,7 @@ void check_for_faults( void )

DEBUG_PRINTLN( "Bad value read from brake pedal position sensor" );
}
else if ( brake_pedal_position_average >= BRAKE_PEDAL_OVERRIDE_THRESHOLD )
else if ( operator_overridden == true )
{
disable_control( );

Expand Down
Expand Up @@ -18,7 +18,7 @@ Feature: Checking for faults
Scenario Outline: Operator override
Given brake control is enabled

When the operator applies <sensor_val> to the accelerator
When the operator applies <sensor_val> to the brake pedal for 200 ms

Then control should be disabled
And a fault report should be published
Expand Down
Expand Up @@ -3,23 +3,26 @@ WHEN("^a sensor becomes permanently disconnected$")
g_mock_arduino_analog_read_return[0] = 0;
g_mock_arduino_analog_read_return[1] = 0;

g_mock_arduino_millis_return = 1;
check_for_faults();

// must call function enough times to exceed the fault limit
g_mock_arduino_millis_return = 105;

g_mock_arduino_millis_return += FAULT_HYSTERESIS * 2;
check_for_faults();
}


WHEN("^the operator applies (.*) to the accelerator$")
WHEN("^the operator applies (.*) to the brake pedal for (\\d+) ms$")
{
REGEX_PARAM(int, brake_sensor_val);
REGEX_PARAM(int, duration);

g_mock_arduino_analog_read_return[0] = brake_sensor_val;
g_mock_arduino_analog_read_return[1] = brake_sensor_val;

g_mock_arduino_millis_return = 1;
check_for_faults();

g_mock_arduino_millis_return += duration;
check_for_faults();
}

Expand Down
Expand Up @@ -12,6 +12,7 @@
#include "can_protocols/fault_can_protocol.h"
#include "can_protocols/brake_can_protocol.h"
#include "globals.h"
#include "vehicles.h"

using namespace cgreen;

Expand Down
2 changes: 2 additions & 0 deletions firmware/brake/kia_soul_petrol/CMakeLists.txt
Expand Up @@ -9,6 +9,7 @@ generate_arduino_firmware(
${CMAKE_SOURCE_DIR}/common/libs/serial/oscc_serial.cpp
${CMAKE_SOURCE_DIR}/common/libs/can/oscc_can.cpp
${CMAKE_SOURCE_DIR}/common/libs/timer/oscc_timer.cpp
${CMAKE_SOURCE_DIR}/common/libs/fault_check/oscc_check.cpp
src/main.cpp
src/globals.cpp
src/accumulator.cpp
Expand All @@ -30,6 +31,7 @@ target_include_directories(
${CMAKE_SOURCE_DIR}/common/libs/serial
${CMAKE_SOURCE_DIR}/common/libs/can
${CMAKE_SOURCE_DIR}/common/libs/timer
${CMAKE_SOURCE_DIR}/common/libs/fault_check
${CMAKE_SOURCE_DIR}/../api/include)

add_subdirectory(utils)
16 changes: 13 additions & 3 deletions firmware/brake/kia_soul_petrol/src/brake_control.cpp
Expand Up @@ -18,7 +18,7 @@
#include "master_cylinder.h"
#include "oscc_pid.h"
#include "vehicles.h"

#include "oscc_check.h"

/*
* @brief Number of consecutive faults that can occur when reading the
Expand Down Expand Up @@ -100,15 +100,25 @@ void disable_control( void )

void check_for_operator_override( void )
{
static condition_state_s operator_override_state = CONDITION_STATE_INIT;

if( g_brake_control_state.enabled == true
|| g_brake_control_state.operator_override == true )
{
master_cylinder_pressure_s master_cylinder_pressure;

master_cylinder_read_pressure( &master_cylinder_pressure );

if ( ( master_cylinder_pressure.sensor_1_pressure >= BRAKE_OVERRIDE_PEDAL_THRESHOLD_IN_DECIBARS ) ||
( master_cylinder_pressure.sensor_2_pressure >= BRAKE_OVERRIDE_PEDAL_THRESHOLD_IN_DECIBARS ) )
bool override_detected =
( master_cylinder_pressure.sensor_1_pressure >= BRAKE_OVERRIDE_PEDAL_THRESHOLD_IN_DECIBARS ) ||
( master_cylinder_pressure.sensor_2_pressure >= BRAKE_OVERRIDE_PEDAL_THRESHOLD_IN_DECIBARS );

bool operator_overridden = condition_exceeded_duration(
override_detected,
FAULT_HYSTERESIS,
&operator_override_state);

if ( operator_overridden == true )
{
disable_control( );

Expand Down
2 changes: 2 additions & 0 deletions firmware/brake/kia_soul_petrol/tests/CMakeLists.txt
Expand Up @@ -11,6 +11,7 @@ add_library(
../src/helper.cpp
${CMAKE_SOURCE_DIR}/common/libs/can/oscc_can.cpp
${CMAKE_SOURCE_DIR}/common/libs/pid/oscc_pid.cpp
${CMAKE_SOURCE_DIR}/common/libs/fault_check/oscc_check.cpp
${CMAKE_SOURCE_DIR}/common/testing/mocks/Arduino_mock.cpp
${CMAKE_SOURCE_DIR}/common/testing/mocks/mcp_can_mock.cpp
${CMAKE_SOURCE_DIR}/common/testing/mocks/DAC_MCP49xx_mock.cpp)
Expand All @@ -22,6 +23,7 @@ target_include_directories(
${CMAKE_SOURCE_DIR}/common/include
${CMAKE_SOURCE_DIR}/common/libs/can
${CMAKE_SOURCE_DIR}/common/libs/pid
${CMAKE_SOURCE_DIR}/common/libs/fault_check
${CMAKE_SOURCE_DIR}/common/libs/signal_smoothing
${CMAKE_SOURCE_DIR}/common/testing/mocks
${CMAKE_SOURCE_DIR}/../api/include)
Expand Down
Expand Up @@ -27,7 +27,7 @@ Feature: Timeouts and overrides
Scenario Outline: Operator override
Given brake control is enabled

When the operator applies <sensor_val> to the brake pedal
When the operator applies <sensor_val> to the brake pedal for 200 ms

Then control should be disabled
And a fault report should be published
Expand Down
Expand Up @@ -3,10 +3,10 @@ WHEN("^a sensor becomes temporarily disconnected$")
g_mock_arduino_analog_read_return[0] = 0;
g_mock_arduino_analog_read_return[1] = 0;

g_mock_arduino_millis_return = 1;
check_for_sensor_faults();

check_for_sensor_faults();

g_mock_arduino_millis_return += FAULT_HYSTERESIS / 2;
check_for_sensor_faults();
}

Expand All @@ -16,23 +16,27 @@ WHEN("^a sensor becomes permanently disconnected$")
g_mock_arduino_analog_read_return[0] = 0;
g_mock_arduino_analog_read_return[1] = 0;

// must call function enough times to exceed the fault limit
for( int i = 0; i < 100; ++i )
{
check_for_sensor_faults();
}
g_mock_arduino_millis_return = 1;
check_for_sensor_faults();

g_mock_arduino_millis_return += FAULT_HYSTERESIS * 2;
check_for_sensor_faults();
}


WHEN("^the operator applies (.*) to the brake pedal$")
WHEN("^the operator applies (.*) to the brake pedal for (\\d+) ms$")
{
REGEX_PARAM(int, pedal_val);
REGEX_PARAM(int, duration);

g_mock_arduino_analog_read_return[10] = pedal_val;
g_mock_arduino_analog_read_return[11] = pedal_val;

g_mock_arduino_millis_return = 1;
check_for_operator_override();

g_mock_arduino_millis_return += duration;
check_for_operator_override();
}


Expand Down
Expand Up @@ -17,6 +17,7 @@
using namespace cgreen;

extern unsigned long g_mock_arduino_micros_return;
extern unsigned long g_mock_arduino_millis_return;

extern uint8_t g_mock_arduino_digital_write_pins[100];
extern uint8_t g_mock_arduino_digital_write_val[100];
Expand Down
Expand Up @@ -9,6 +9,7 @@ generate_arduino_firmware(
${CMAKE_SOURCE_DIR}/common/libs/serial/oscc_serial.cpp
${CMAKE_SOURCE_DIR}/common/libs/can/oscc_can.cpp
${CMAKE_SOURCE_DIR}/common/libs/timer/oscc_timer.cpp
${CMAKE_SOURCE_DIR}/common/libs/fault_check/oscc_check.cpp
../../src/globals.cpp
../../src/accumulator.cpp
../../src/helper.cpp
Expand All @@ -29,4 +30,5 @@ target_include_directories(
${CMAKE_SOURCE_DIR}/common/libs/serial
${CMAKE_SOURCE_DIR}/common/libs/can
${CMAKE_SOURCE_DIR}/common/libs/timer
${CMAKE_SOURCE_DIR}/common/libs/fault_check
${CMAKE_SOURCE_DIR}/../api/include)
8 changes: 7 additions & 1 deletion firmware/throttle/src/throttle_control.cpp
Expand Up @@ -25,6 +25,7 @@ static void read_accelerator_position_sensor(
void check_for_faults( void )
{
static condition_state_s grounded_fault_state = CONDITION_STATE_INIT;
static condition_state_s operator_override_state = CONDITION_STATE_INIT;

accelerator_position_s accelerator_position;

Expand All @@ -36,6 +37,11 @@ void check_for_faults( void )
uint32_t accelerator_position_average =
(accelerator_position.low + accelerator_position.high) / 2;

bool operator_overridden = condition_exceeded_duration(
accelerator_position_average >= ACCELERATOR_OVERRIDE_THRESHOLD,
FAULT_HYSTERESIS,
&operator_override_state);

bool inputs_grounded = check_voltage_grounded(
accelerator_position.high,
accelerator_position.low,
Expand All @@ -55,7 +61,7 @@ void check_for_faults( void )

DEBUG_PRINTLN( "Bad value read from accelerator position sensor" );
}
else if ( accelerator_position_average >= ACCELERATOR_OVERRIDE_THRESHOLD
else if ( operator_overridden == true
&& g_throttle_control_state.operator_override == false )
{
disable_control( );
Expand Down
2 changes: 1 addition & 1 deletion firmware/throttle/tests/features/checking_faults.feature
Expand Up @@ -17,7 +17,7 @@ Feature: Checking for faults
Scenario Outline: Operator override
Given throttle control is enabled

When the operator applies <sensor_val> to the accelerator
When the operator applies <sensor_val> to the accelerator for 200 ms

Then control should be disabled
And a fault report should be published
Expand Down
Expand Up @@ -3,22 +3,26 @@ WHEN("^a sensor becomes permanently disconnected$")
g_mock_arduino_analog_read_return[0] = 0;
g_mock_arduino_analog_read_return[1] = 0;

g_mock_arduino_millis_return = 1;
check_for_faults();

// must call function enough times to exceed the fault limit
g_mock_arduino_millis_return = 105;

g_mock_arduino_millis_return += FAULT_HYSTERESIS * 2;
check_for_faults();
}


WHEN("^the operator applies (.*) to the accelerator$")
WHEN("^the operator applies (.*) to the accelerator for (\\d+) ms$")
{
REGEX_PARAM(int, throttle_sensor_val);
REGEX_PARAM(int, duration);

g_mock_arduino_analog_read_return[0] = throttle_sensor_val;
g_mock_arduino_analog_read_return[1] = throttle_sensor_val;

g_mock_arduino_millis_return = 1;
check_for_faults();

g_mock_arduino_millis_return += duration;
check_for_faults();
}

Expand Down
Expand Up @@ -12,6 +12,7 @@
#include "can_protocols/fault_can_protocol.h"
#include "can_protocols/throttle_can_protocol.h"
#include "globals.h"
#include "vehicles.h"

using namespace cgreen;

Expand Down

0 comments on commit 2a55959

Please sign in to comment.