Skip to content

Commit

Permalink
Finish steering update (#229)
Browse files Browse the repository at this point in the history
  • Loading branch information
romistaro authored Nov 18, 2023
1 parent 20e82bb commit ada36c0
Show file tree
Hide file tree
Showing 14 changed files with 233 additions and 455 deletions.
8 changes: 4 additions & 4 deletions libraries/codegen/boards/steering.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Messages:
motor_controller:
watchdog: 0
signals:
digital_input:
length: 8
analog_input:
length: 8
input_cc:
length: 8 # (cc_toggle | cc_increade | cc_decrease)
input_lights:
length: 8
4 changes: 2 additions & 2 deletions libraries/ms-common/src/x86/adc.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ StatusCode adc_get_channel(GpioAddress address, uint8_t *adc_channel) {
*adc_channel += 10;
break;
case NUM_GPIO_PORTS: // for special channels BAT/REF/TEMP
if (address.pin != ADC_Channel_Vrefint || address.pin != ADC_Channel_TempSensor) {
if (address.pin != ADC_Channel_Vrefint && address.pin != ADC_Channel_TempSensor) {
return status_code(STATUS_CODE_INVALID_ARGS);
}
break;
Expand Down Expand Up @@ -125,7 +125,7 @@ StatusCode adc_init(void) {

adc_add_channel(ADC_REF);

s_adc_readings[s_adc_ranks[ADC_Channel_TempSensor] - 1] = MOCK_VREFINT;
s_adc_readings[s_adc_ranks[ADC_Channel_Vrefint] - 1] = MOCK_VREFINT;

// Initialize static variables
sem_init(&s_adc_status.converting, 1, 0);
Expand Down
8 changes: 4 additions & 4 deletions projects/power_distribution/src/lights_fsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ static void prv_lights_signal_blinker(SoftTimerId id) {

static void prv_init_state_input(Fsm *fsm, void *context) {
// can transition to LEFT, RIGHT, HAZARD
EELightType light_event = get_steering_info_analog_input();
EELightType light_event = get_steering_info_input_lights();
HazardStatus hazard_status = get_power_info_hazard_state();

if (hazard_status == HAZARD_ON) {
Expand All @@ -56,7 +56,7 @@ static void prv_init_state_output(void *context) {

static void prv_left_signal_input(Fsm *fsm, void *context) {
// can transition to INIT, RIGHT, HAZARD
EELightType light_event = get_steering_info_analog_input();
EELightType light_event = get_steering_info_input_lights();
HazardStatus hazard_status = get_power_info_hazard_state();

if (hazard_status == HAZARD_ON) {
Expand All @@ -77,7 +77,7 @@ static void prv_left_signal_output(void *context) {

static void prv_right_signal_input(Fsm *fsm, void *context) {
// can transition to INIT, LEFT, HAZARD
EELightType light_event = get_steering_info_analog_input();
EELightType light_event = get_steering_info_input_lights();
HazardStatus hazard_status = get_power_info_hazard_state();

if (hazard_status == HAZARD_ON) {
Expand All @@ -98,7 +98,7 @@ static void prv_right_signal_output(void *context) {

static void prv_hazard_input(Fsm *fsm, void *context) {
// can transition to INIT, BPS_FAULT
EELightType light_event = get_steering_info_analog_input();
EELightType light_event = get_steering_info_input_lights();

if (light_event == EE_LIGHT_TYPE_OFF) {
fsm_transition(fsm, INIT_STATE);
Expand Down
2 changes: 1 addition & 1 deletion projects/power_distribution/test/test_lights_fsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include "unity.h"

#define HAZARD_SIGNAL_MSG g_rx_struct.power_info_hazard_state
#define STEERING_ANALOG_SIGNAL_MSG g_rx_struct.steering_info_analog_input
#define STEERING_ANALOG_SIGNAL_MSG g_rx_struct.steering_info_input_lights

void setup_test(void) {
log_init();
Expand Down
29 changes: 0 additions & 29 deletions projects/steering/inc/steering_analog_task.h

This file was deleted.

66 changes: 0 additions & 66 deletions projects/steering/inc/steering_digital_task.h

This file was deleted.

51 changes: 51 additions & 0 deletions projects/steering/inc/steering_task.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#pragma once

#include "adc.h"
#include "can.h"
#include "gpio.h"
#include "gpio_it.h"
#include "gpio_mcu.h"
#include "log.h"
#include "status.h"
#include "steering_setters.h"

#define VOLTAGE_TOLERANCE_MV 20
// turn signal voltages
#define TURN_LEFT_SIGNAL_VOLTAGE_MV 1200
#define TURN_RIGHT_SIGNAL_VOLTAGE_MV 2130
#define NEUTRAL_SIGNAL_VOLTAGE_MV 2610
// cruise control voltages
#define CRUISE_CONTROl_STALK_SPEED_INCREASE_VOLTAGE_MV 1650
#define CRUISE_CONTROl_STALK_SPEED_DECREASE_VOLTAGE_MV 790
#define CRUISE_CONTROl_STALK_NEUTRAL_VOLTAGE_MV 3300

#define TURN_SIGNAL_GPIO \
{ .port = GPIO_PORT_A, .pin = 5 }

#define CC_CHANGE_GPIO \
{ .port = GPIO_PORT_A, .pin = 6 }

#define CC_TOGGLE_GPIO \
{ .port = GPIO_PORT_A, .pin = 7 }

#define CC_TOGGLE_EVENT 0x0

// TurnSignal Values for each state
typedef enum TurnSignalState {
TURN_SIGNAL_OFF = 0,
TURN_SIGNAL_LEFT,
TURN_SIGNAL_RIGHT,
} TurnSignalState;

// CruiseControl Mask Values for each state
typedef enum {
CC_DECREASE_MASK = 0x01,
CC_INCREASE_MASK = 0x02,
CC_TOGGLE_MASK = 0x04,
} CruiseControlMask;
// Initializes the ADC input for the ctrl stalk as well as the gpio interrupt for the toggle
// Must be called before adc_init()
StatusCode steering_init();
// Reads the analog input, determines a light state, and sets the requisite value in the can message
// Also reads the toggle notification state and sets the requisite value in the can message
void steering_input();
9 changes: 3 additions & 6 deletions projects/steering/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
#include "gpio_mcu.h"
#include "log.h"
#include "master_task.h"
#include "steering_analog_task.h"
#include "steering_digital_task.h"
#include "steering_task.h"
#include "tasks.h"

#define DEVICE_ID 0x02
Expand All @@ -32,8 +31,7 @@ void run_medium_cycle() {
wait_tasks(1);

adc_run();
steering_analog_input();
steering_digital_input();
steering_input();

run_can_tx_cycle();
wait_tasks(1);
Expand All @@ -48,9 +46,8 @@ int main() {
gpio_it_init();

// Setup analog inputs and initialize adc
steering_analog_adc_init();
steering_init();
adc_init();
steering_digital_input_init(get_master_task());

can_init(&s_can_storage, &can_settings);
init_master_task();
Expand Down
65 changes: 65 additions & 0 deletions projects/steering/src/steering.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#include "steering_task.h"

#define CC_INPUT g_tx_struct.steering_info_input_cc

static const GpioAddress turn_signal_address = TURN_SIGNAL_GPIO;
static const GpioAddress cc_address = CC_CHANGE_GPIO;
static const GpioAddress cc_toggle_address = CC_TOGGLE_GPIO;
static Event STEERING_EVENT;

StatusCode steering_init(Task *task) {
// Initialize Pins
gpio_init_pin(&turn_signal_address, GPIO_ANALOG, GPIO_STATE_LOW);
gpio_init_pin(&cc_address, GPIO_ANALOG, GPIO_STATE_LOW);
gpio_init_pin(&cc_toggle_address, GPIO_ANALOG, GPIO_STATE_LOW);
// Set up ADC
adc_add_channel(turn_signal_address);
adc_add_channel(cc_address);
// Initialize interrupt settings
InterruptSettings it_settings = {
.priority = INTERRUPT_PRIORITY_NORMAL,
.type = INTERRUPT_TYPE_INTERRUPT,
.edge = INTERRUPT_EDGE_FALLING,
};
// Initialize interrupt
gpio_it_register_interrupt(&cc_toggle_address, &it_settings, CC_TOGGLE_EVENT, task);
return STATUS_CODE_OK;
}

void steering_input(uint32_t notification) {
uint16_t control_stalk_data;
set_steering_info_input_cc(0);
// Read ADC of pin set by turn signal lights
adc_read_converted(turn_signal_address, &control_stalk_data);
// Determine if it's a left, right or off signal
if (control_stalk_data > TURN_LEFT_SIGNAL_VOLTAGE_MV - VOLTAGE_TOLERANCE_MV &&
control_stalk_data < TURN_LEFT_SIGNAL_VOLTAGE_MV + VOLTAGE_TOLERANCE_MV) {
set_steering_info_input_lights(TURN_SIGNAL_LEFT);
} else if (control_stalk_data > TURN_RIGHT_SIGNAL_VOLTAGE_MV - VOLTAGE_TOLERANCE_MV &&
control_stalk_data < TURN_RIGHT_SIGNAL_VOLTAGE_MV + VOLTAGE_TOLERANCE_MV) {
set_steering_info_input_lights(TURN_SIGNAL_RIGHT);
} else {
set_steering_info_input_lights(TURN_SIGNAL_OFF);
}
// Read ADC of pin set by cruise control
// Determine if it read an increase or decrease signal
adc_read_converted(cc_address, &control_stalk_data);
if (control_stalk_data > CRUISE_CONTROl_STALK_SPEED_INCREASE_VOLTAGE_MV - VOLTAGE_TOLERANCE_MV &&
control_stalk_data < CRUISE_CONTROl_STALK_SPEED_INCREASE_VOLTAGE_MV + VOLTAGE_TOLERANCE_MV) {
// toggle second bit to 1
set_steering_info_input_cc(CC_INCREASE_MASK | CC_INPUT);
} else if (control_stalk_data >
CRUISE_CONTROl_STALK_SPEED_DECREASE_VOLTAGE_MV - VOLTAGE_TOLERANCE_MV &&
control_stalk_data <
CRUISE_CONTROl_STALK_SPEED_DECREASE_VOLTAGE_MV + VOLTAGE_TOLERANCE_MV) {
// toggle first bit to 1
set_steering_info_input_cc(CC_DECREASE_MASK | CC_INPUT);
}
if (notify_get(&notification) == STATUS_CODE_OK) {
while (event_from_notification(&notification, &STEERING_EVENT) == STATUS_CODE_INCOMPLETE) {
if (STEERING_EVENT == CC_TOGGLE_EVENT) {
set_steering_info_input_cc(CC_TOGGLE_MASK | CC_INPUT);
}
}
}
}
29 changes: 0 additions & 29 deletions projects/steering/src/steering_analog.c

This file was deleted.

Loading

0 comments on commit ada36c0

Please sign in to comment.