diff --git a/include/IOManagement.h b/include/IOManagement.h index 5f22850..400804d 100644 --- a/include/IOManagement.h +++ b/include/IOManagement.h @@ -3,17 +3,42 @@ #include #include "STM32TimerInterrupt_Generic.h" +#include "adc.h" + +// Inputs +#define BATT_NEG_CONT_MCU PB3 +#define ESTOP_MCU PA9 +#define BATT_POS_CONT_MCU PA10 +#define PPC1_SUPP_INVALID PA12 +#define PPC1_DCDC_INVALID PB0 +#define MPPT_CONT_MCU PB5 +#define MC_CONT_MCU PB4 + +// Outputs +#define MCU_BATT_EN PA8 + +#define IO_UPDATE_PERIOD 100000 // us -// TODO: add macros for digital pins struct Digital_Data { - // TODO: add the digital signals - bool batt_neg_cont : 1; + bool batt_neg_cont : 1; // input + bool estop_mcu : 1; // input + bool batt_pos_cont : 1; // input + bool ppc1_supp_invalid : 1; // input + bool ppc1_dcdc_invalid : 1; // input + bool mcu_batt_en : 1; // output + bool mppt_cont_mcu : 1; // input + bool mc_cont_mcu : 1; // input }; extern volatile Digital_Data digital_data; -// TODO: add extern volatile floats for analog signals. +// Analog signals +extern volatile float i_12v; +extern volatile float v_12v; +extern volatile float supp_i; +extern volatile float batt_i; +extern volatile float supp_v; // initialize digital and analog pins void initIO(); @@ -22,6 +47,6 @@ void initIO(); void readIO(); // Set the value of output pins -// TODO: add setter functions for output pins. +void set_mcu_batt_en(bool batt_en); #endif diff --git a/src/IOManagement.cpp b/src/IOManagement.cpp index 54953f8..518fdff 100644 --- a/src/IOManagement.cpp +++ b/src/IOManagement.cpp @@ -2,13 +2,53 @@ volatile Digital_Data digital_data; +volatile float i_12v = 0; +volatile float v_12v = 0; +volatile float supp_i = 0; +volatile float batt_i = 0; +volatile float supp_v = 0; + // Ticker to poll input readings at fixed rate STM32TimerInterrupt IOTimer(TIM2); void initIO() { + // Initalize digital pins + pinMode(BATT_NEG_CONT_MCU, INPUT); + pinMode(ESTOP_MCU, INPUT); + pinMode(BATT_POS_CONT_MCU, INPUT); + pinMode(PPC1_SUPP_INVALID, INPUT); + pinMode(PPC1_DCDC_INVALID, INPUT); + pinMode(MCU_BATT_EN, OUTPUT); + pinMode(MPPT_CONT_MCU, INPUT); + pinMode(MC_CONT_MCU, INPUT); + + // Initialize analog pins + initADC(ADC1); + if (IOTimer.attachInterruptInterval(IO_UPDATE_PERIOD, readIO)) { + printf("IO timer started\n"); + } else { + printf("Failed to start IO timer\n"); + } } void readIO() { + digital_data.batt_neg_cont = digitalRead(BATT_NEG_CONT_MCU); + digital_data.estop_mcu = digitalRead(ESTOP_MCU); + digital_data.batt_pos_cont = digitalRead(BATT_POS_CONT_MCU); + digital_data.ppc1_supp_invalid = digitalRead(PPC1_SUPP_INVALID); + digital_data.ppc1_dcdc_invalid = digitalRead(PPC1_DCDC_INVALID); + digital_data.mppt_cont_mcu = digitalRead(MPPT_CONT_MCU); + digital_data.mc_cont_mcu = digitalRead(MC_CONT_MCU); + + i_12v = readADC(ADC_CHANNEL_12); // PA7 + v_12v = readADC(ADC_CHANNEL_11); // PA6 + supp_i = readADC(ADC_CHANNEL_9); // PA4 + batt_i = readADC(ADC_CHANNEL_6); // PA1 + supp_v = readADC(ADC_CHANNEL_5); // PA0 +} +void set_mcu_batt_en(bool batt_en) { + digitalWrite(MCU_BATT_EN, batt_en); + digital_data.mcu_batt_en = batt_en; } \ No newline at end of file diff --git a/src/canPowertrain.cpp b/src/canPowertrain.cpp index 688efa7..a663583 100644 --- a/src/canPowertrain.cpp +++ b/src/canPowertrain.cpp @@ -2,10 +2,26 @@ CANPowertrain::CANPowertrain(CAN_TypeDef* canPort, CAN_PINS pins, int frequency) : CANManager(canPort, pins, frequency) {}; -void CANPowertrain::readHandler(CAN_message_t msg) { +//volatile bool mcu_battery_enable = false; +void CANPowertrain::readHandler(CAN_message_t msg) { + /*uint8_t *data = msg.buf; + switch(msg.id){ + case POWERTRAIN_BOOLS: + mcu_battery_enable = (data[0] >> 5) & 1; + break; + default: + break; + }*/ } void CANPowertrain::sendPowertrainData() { // TODO: send messages with their respective CAN IDs + this->sendMessage(0x500, (void*)&i_out_12v, sizeof(float)); + this->sendMessage(0x501, (void*)&v_out_12v, sizeof(float)); + this->sendMessage(0x502, (void*)&supp_i, sizeof(float)); + this->sendMessage(0x503, (void*)&batt_i, sizeof(float)); + this->sendMessage(0x504, (void*)&supp_v, sizeof(float)); + this->sendMessage(0x505, (void*)&digital_data, sizeof(digital_data)); + } \ No newline at end of file