Skip to content

Commit

Permalink
uh
Browse files Browse the repository at this point in the history
  • Loading branch information
RCMast3r committed Feb 6, 2024
1 parent 8ab0ad2 commit c162461
Show file tree
Hide file tree
Showing 10 changed files with 81 additions and 80 deletions.
25 changes: 10 additions & 15 deletions lib/interfaces/include/AnalogSensorsInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,15 @@
#include <algorithm>
#include <SysClock.h>

enum AnalogSensorStatus_e
{
ANALOG_SENSOR_GOOD = 0,
ANALOG_SENSOR_CLAMPED = 1,
};

struct AnalogConversion_s
struct AnalogSensorReadingAndStatus_s
{
int raw;
float conversion;
AnalogSensorStatus_e status;
float convertedReading;
bool dataIsClamped;
};

template <int N>
struct AnalogConversionPacket_s
struct AnalogDataPacket_s
{
AnalogSensorReadingAndStatus_s conversions[N];
};
Expand Down Expand Up @@ -54,13 +48,14 @@ class AnalogChannel
{
float conversion = lastSample * scale + offset;
float clampedConversion = std::min(std::max(conversion, clampLow), clampHigh);
AnalogSensorStatus_e returnStatus = ANALOG_SENSOR_GOOD;
bool clamped = false;

if (clamp && (conversion > clampHigh || conversion < clampLow))
returnStatus = ANALOG_SENSOR_CLAMPED;
clamped = true;
return {
lastSample,
clamp ? clampedConversion : conversion,
returnStatus
clamped
};
}
};
Expand All @@ -72,15 +67,15 @@ class AnalogMultiSensor
public:
// Data
AnalogChannel channels[N];
AnalogConversionPacket_s<N> data;
AnalogDataPacket_s<N> data;
// Functions
/// @brief Called by the main loop. Allows AnalogMultiSensor devices not owned by a single system to self-actualize sampling & conversion.
/// @param tick
void tick(const SysTick_s &tick);

/// @brief Used by systems to get data out of this device when it's self-actualizing sampling & conversion.
/// @return Const ref to last data conversion.
const AnalogConversionPacket_s<N>& get();
const AnalogDataPacket_s<N>& get();

/// @brief Performs unit conversions on all channels
void convert()
Expand Down
24 changes: 12 additions & 12 deletions lib/interfaces/include/TelemetryInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,25 @@ class TelemetryInterface
/* Update CAN messages (main loop) */
// Interfaces
void update_pedal_readings_CAN_msg(
const AnalogConversion_s &accel1,
const AnalogConversion_s &accel2,
const AnalogConversion_s &brake1,
const AnalogConversion_s &brake2
const AnalogSensorReadingAndStatus_s &accel1,
const AnalogSensorReadingAndStatus_s &accel2,
const AnalogSensorReadingAndStatus_s &brake1,
const AnalogSensorReadingAndStatus_s &brake2
);
void update_load_cells_CAN_msg(
const AnalogConversion_s &lc_fl,
const AnalogConversion_s &lc_fr
const AnalogSensorReadingAndStatus_s &lc_fl,
const AnalogSensorReadingAndStatus_s &lc_fr
);
void update_potentiometers_CAN_msg(
const AnalogConversion_s &pots_fl,
const AnalogConversion_s &pots_fr
const AnalogSensorReadingAndStatus_s &pots_fl,
const AnalogSensorReadingAndStatus_s &pots_fr
);
void update_analog_readings_CAN_msg(
const SteeringEncoderConversion_s &steer1,
const AnalogConversion_s &steer2,
const AnalogConversion_s &current,
const AnalogConversion_s &reference,
const AnalogConversion_s &glv
const AnalogSensorReadingAndStatus_s &steer2,
const AnalogSensorReadingAndStatus_s &current,
const AnalogSensorReadingAndStatus_s &reference,
const AnalogSensorReadingAndStatus_s &glv
);

/* Enqueue outbound telemetry CAN messages */
Expand Down
24 changes: 12 additions & 12 deletions lib/interfaces/src/TelemetryInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,28 +56,28 @@ void TelemetryInterface::enqueue_CAN_mcu_analog_readings() {
/* Update CAN messages */
// Main loop
// MCP3208 returns structure
void TelemetryInterface::update_pedal_readings_CAN_msg(const AnalogConversion_s &accel1,
const AnalogConversion_s &accel2,
const AnalogConversion_s &brake1,
const AnalogConversion_s &brake2) {
void TelemetryInterface::update_pedal_readings_CAN_msg(const AnalogSensorReadingAndStatus_s &accel1,
const AnalogSensorReadingAndStatus_s &accel2,
const AnalogSensorReadingAndStatus_s &brake1,
const AnalogSensorReadingAndStatus_s &brake2) {
// do sth with mcu_pedal_readings_
mcu_pedal_readings_.set_accelerator_pedal_1(accel1.raw);
mcu_pedal_readings_.set_accelerator_pedal_2(accel2.raw);
mcu_pedal_readings_.set_brake_pedal_1(brake1.raw);
mcu_pedal_readings_.set_brake_pedal_2(brake2.raw);
}
// MCP3204 returns structure
void TelemetryInterface::update_load_cells_CAN_msg(const AnalogConversion_s &lc_fl,
const AnalogConversion_s &lc_fr) {
void TelemetryInterface::update_load_cells_CAN_msg(const AnalogSensorReadingAndStatus_s &lc_fl,
const AnalogSensorReadingAndStatus_s &lc_fr) {
// do sth with mcu_load_cells_
mcu_load_cells_.set_RL_load_cell(lc_fl.raw);
mcu_load_cells_.set_RR_load_cell(lc_fr.raw);
// mcu_load_cells_.set_FL_load_cell(lc_rl.raw);
// mcu_load_cells_.set_FR_load_cell(lc_rr.raw);
}
// MCP3204 returns structure
void TelemetryInterface::update_potentiometers_CAN_msg(const AnalogConversion_s &pots_fl,
const AnalogConversion_s &pots_fr) {
void TelemetryInterface::update_potentiometers_CAN_msg(const AnalogSensorReadingAndStatus_s &pots_fl,
const AnalogSensorReadingAndStatus_s &pots_fr) {
// do sth with mcu_front_potentiometers_
mcu_front_potentiometers_.set_pot1(pots_fl.raw);
mcu_front_potentiometers_.set_pot3(pots_fr.raw);
Expand All @@ -88,10 +88,10 @@ void TelemetryInterface::update_potentiometers_CAN_msg(const AnalogConversion_s
}
// SteeringDual and MCP3208 return structures
void TelemetryInterface::update_analog_readings_CAN_msg(const SteeringEncoderConversion_s &steer1,
const AnalogConversion_s &steer2,
const AnalogConversion_s &current,
const AnalogConversion_s &reference,
const AnalogConversion_s &glv) {
const AnalogSensorReadingAndStatus_s &steer2,
const AnalogSensorReadingAndStatus_s &current,
const AnalogSensorReadingAndStatus_s &reference,
const AnalogSensorReadingAndStatus_s &glv) {
// do sth with mcu_analog_readings_
mcu_analog_readings_.set_steering_1(steer1.angle);
mcu_analog_readings_.set_steering_2(steer2.raw);
Expand Down
4 changes: 2 additions & 2 deletions lib/state_machine/include/MCUStateMachine.tpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ void MCUStateMachine<DrivetrainSysType>::tick_state_machine(unsigned long curren
case CAR_STATE::TRACTIVE_SYSTEM_ACTIVE:
{

PedalsSystemData_s data;
auto data = pedals_->evaluate_pedals();
if (!drivetrain_->hv_over_threshold_on_drivetrain())
{
set_state_(CAR_STATE::TRACTIVE_SYSTEM_NOT_ACTIVE, current_millis);
break;
}
if (dashboard_->start_button_pressed() && pedals_->mech_brake_active(data))
if (dashboard_->startButtonPressed() && pedals_->mech_brake_active(data))
{
set_state_(CAR_STATE::ENABLING_INVERTERS, current_millis);
break;
Expand Down
29 changes: 14 additions & 15 deletions lib/systems/include/PedalsSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,7 @@
#define PEDALSSYSTEM
#include <math.h>
#include <tuple>

struct PedalsDriverInterface
{
int accelPedalPosition1;
int accelPedalPosition2;
int brakePedalPosition1;
int brakePedalPosition2;
};
#include "AnalogSensorsInterface.h"

struct PedalsSystemInterface
{
Expand All @@ -20,7 +13,7 @@ struct PedalsSystemInterface
int requestedTorque;
};

/// @brief Pedals params struct that will hold min / max that will be used for evaluateion.
/// @brief Pedals params struct that will hold min / max that will be used for evaluateion.
// NOTE: min and max may be need to be flipped depending on the sensor. (looking at you brake pedal sensor 2)
struct PedalsParams
{
Expand All @@ -32,31 +25,37 @@ struct PedalsParams
int start_sense_2;
int end_sense_1;
int end_sense_2;
};
};

class PedalsSystem
{
public:
PedalsSystem(){
PedalsSystem()
{
implausibilityStartTime_ = 0;
// Setting of min and maxes for pedals via config file
};
PedalsSystemInterface evaluate_pedals(
const PedalsDriverInterface &pedal_data, unsigned long curr_time);
const AnalogSensorReadingAndStatus_s &accel_pedal1,
const AnalogSensorReadingAndStatus_s &accel_pedal2,
const AnalogSensorReadingAndStatus_s &brake_pedal1,
const AnalogSensorReadingAndStatus_s &brake_pedal2,
unsigned long curr_time);

bool max_duration_of_implausibility_exceeded(unsigned long curr_time);

bool mech_brake_active();

private:
std::tuple<int, int> linearize_accel_pedal_values_(int accel1, int accel2);

bool evaluate_pedal_implausibilities_(int sense_1, int sense_2, const PedalsParams &params, float max_percent_differnce);

bool evaluate_brake_and_accel_pressed_(const PedalsDriverInterface &data);
bool pedal_is_active_(int sense1, int sense_2, const PedalsParams& pedalParams, float percent_threshold);
bool pedal_is_active_(int sense1, int sense_2, const PedalsParams &pedalParams, float percent_threshold);
PedalsParams accelParams_;
PedalsParams brakeParams_;
unsigned long implausibilityStartTime_;
};


#endif /* PEDALSSYSTEM */
2 changes: 1 addition & 1 deletion lib/systems/include/SteeringSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class SteeringSystem
/// @return SteeringSystemOutput_s contains steering angle and SteeringSystemStatus_e
void tick(
const SysTick_s &tick,
const AnalogConversion_s &secondaryConversion
const AnalogSensorReadingAndStatus_s &secondaryConversion
);

/// @brief Get a reference to the steering system's data
Expand Down
8 changes: 4 additions & 4 deletions lib/systems/include/TorqueControllerMux.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ class TorqueControllerMux
const DrivetrainDynamicReport_s& drivetrainData,
const PedalsSystemData_s& pedalsData,
const SteeringSystemData_s& steeringData,
const AnalogConversion_s& loadFLData,
const AnalogConversion_s& loadFRData,
const AnalogConversion_s& loadRLData,
const AnalogConversion_s& loadRRData,
const AnalogSensorReadingAndStatus_s& loadFLData,
const AnalogSensorReadingAndStatus_s& loadFRData,
const AnalogSensorReadingAndStatus_s& loadRLData,
const AnalogSensorReadingAndStatus_s& loadRRData,
DialMode_e dashboardDialMode,
bool dashboardTorqueModeButtonPressed
);
Expand Down
25 changes: 16 additions & 9 deletions lib/systems/src/PedalsSystem.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
#include "PedalsSystem.h"

// TODO parameterize percentages in constructor
PedalsSystemInterface PedalsSystem::evaluate_pedals(const PedalsDriverInterface &data, unsigned long curr_time)
PedalsSystemInterface PedalsSystem::evaluate_pedals(const AnalogSensorReadingAndStatus_s &accel_pedal1,
const AnalogSensorReadingAndStatus_s &accel_pedal2,
const AnalogSensorReadingAndStatus_s &brake_pedal1,
const AnalogSensorReadingAndStatus_s &brake_pedal2,
unsigned long curr_time)
{
PedalsSystemInterface out;
out.accelImplausible = evaluate_pedal_implausibilities_(data.accelPedalPosition1, data.accelPedalPosition2, accelParams_, 0.1);
out.accelImplausible = evaluate_pedal_implausibilities_(accel_pedal1.convertedReading, data.accelPedalPosition2, accelParams_, 0.1);
out.brakeImplausible = evaluate_pedal_implausibilities_(data.brakePedalPosition1, data.brakePedalPosition2, brakeParams_, 0.25);
out.brakeAndAccelPressedImplausibility = evaluate_brake_and_accel_pressed_(data);
bool implausibility = (out.brakeAndAccelPressedImplausibility || out.brakeImplausible || out.accelImplausible);

if (implausibility && (implausibilityStartTime_ == 0)){
if (implausibility && (implausibilityStartTime_ == 0))
{
implausibilityStartTime_ = curr_time;
} else if (!implausibility)
}
else if (!implausibility)
{
implausibilityStartTime_ = 0;
}
Expand All @@ -22,12 +28,14 @@ PedalsSystemInterface PedalsSystem::evaluate_pedals(const PedalsDriverInterface
// TODO parameterize duration in constructor
bool PedalsSystem::max_duration_of_implausibility_exceeded(unsigned long curr_time)
{
if(implausibilityStartTime_ !=0){
if (implausibilityStartTime_ != 0)
{
return ((curr_time - implausibilityStartTime_) > 100);
} else {
}
else
{
return false;
}

}

bool PedalsSystem::evaluate_pedal_implausibilities_(int sense_1, int sense_2, const PedalsParams &params, float max_percent_diff)
Expand Down Expand Up @@ -68,9 +76,8 @@ bool PedalsSystem::evaluate_brake_and_accel_pressed_(const PedalsDriverInterface

bool accel_pressed = pedal_is_active_(data.accelPedalPosition1, data.accelPedalPosition2, accelParams_, 0.1);
bool brake_pressed = pedal_is_active_(data.brakePedalPosition1, data.brakePedalPosition2, brakeParams_, 0.05);

return (accel_pressed && brake_pressed);

return (accel_pressed && brake_pressed);
}

bool PedalsSystem::pedal_is_active_(int sense_1, int sense_2, const PedalsParams &pedalParams, float percent_threshold)
Expand Down
12 changes: 6 additions & 6 deletions lib/systems/src/SteeringSystem.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "SteeringSystem.h"

void SteeringSystem::tick(const SysTick_s &tick, const AnalogConversion_s &secondaryConversion)
void SteeringSystem::tick(const SysTick_s &tick, const AnalogSensorReadingAndStatus_s &secondaryConversion)
{
// System works at 100hz
// 1. Polls upper steering sensor
Expand All @@ -14,7 +14,7 @@ void SteeringSystem::tick(const SysTick_s &tick, const AnalogConversion_s &secon
// Compute internal state

// Both sensors are nominal
if ((primaryConversion_.status == STEERING_ENCODER_NOMINAL) && (secondaryConversion.status == ANALOG_SENSOR_GOOD))
if ((primaryConversion_.status == STEERING_ENCODER_NOMINAL) && (!secondaryConversion.dataIsClamped))
{
data_ = {
.angle = primaryConversion_.angle,
Expand All @@ -24,19 +24,19 @@ void SteeringSystem::tick(const SysTick_s &tick, const AnalogConversion_s &secon
// One or both sensors are marginal
// Sensors disagree by STEERING_DIVERGENCE_WARN_THRESHOLD degrees and less than STEERING_DIVERGENCE_ERROR_THRESHOLD degrees
else if ((primaryConversion_.status == STEERING_ENCODER_MARGINAL)
|| (secondaryConversion.status == ANALOG_SENSOR_CLAMPED)
|| ((std::abs(primaryConversion_.angle - secondaryConversion.conversion) > STEERING_DIVERGENCE_WARN_THRESHOLD) && (std::abs(primaryConversion_.angle - secondaryConversion.conversion) < STEERING_DIVERGENCE_ERROR_THRESHOLD)))
|| (secondaryConversion.dataIsClamped)
|| ((std::abs(primaryConversion_.angle - secondaryConversion.convertedReading) > STEERING_DIVERGENCE_WARN_THRESHOLD) && (std::abs(primaryConversion_.angle - secondaryConversion.convertedReading) < STEERING_DIVERGENCE_ERROR_THRESHOLD)))
{
data_ = {
.angle = primaryConversion_.angle,
.status = STEERING_SYSTEM_MARGINAL
};
}
// Upper steering sensor reports error, lower sensor is nominal
else if ((primaryConversion_.status == STEERING_ENCODER_ERROR) && (secondaryConversion.status == ANALOG_SENSOR_GOOD))
else if ((primaryConversion_.status == STEERING_ENCODER_ERROR) && (!secondaryConversion.dataIsClamped))
{
data_ = {
.angle = secondaryConversion.conversion,
.angle = secondaryConversion.convertedReading,
.status = STEERING_SYSTEM_DEGRADED
};
}
Expand Down
8 changes: 4 additions & 4 deletions lib/systems/src/TorqueControllerMux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ void TorqueControllerMux::tick(
const DrivetrainDynamicReport_s& drivetrainData,
const PedalsSystemData_s& pedalsData,
const SteeringSystemData_s& steeringData,
const AnalogConversion_s& loadFLData,
const AnalogConversion_s& loadFRData,
const AnalogConversion_s& loadRLData,
const AnalogConversion_s& loadRRData,
const AnalogSensorReadingAndStatus_s& loadFLData,
const AnalogSensorReadingAndStatus_s& loadFRData,
const AnalogSensorReadingAndStatus_s& loadRLData,
const AnalogSensorReadingAndStatus_s& loadRRData,
DialMode_e dashboardDialMode,
bool dashboardTorqueModeButtonPressed
)
Expand Down

0 comments on commit c162461

Please sign in to comment.