diff --git a/scripts/logdecoder/General/logdecoder.cpp b/scripts/logdecoder/General/logdecoder.cpp index 73451409ca657ab5d9168ba86829dfd049c4cba4..c2639f17f9dc77a5cce605effb5cb22d7846d97d 100644 --- a/scripts/logdecoder/General/logdecoder.cpp +++ b/scripts/logdecoder/General/logdecoder.cpp @@ -106,13 +106,17 @@ void registerTypes(Deserializer& ds) // RIGv2 ds.registerType<RIGv2::ADC1Data>(); + ds.registerType<RIGv2::ADC2Data>(); ds.registerType<RIGv2::TC1Data>(); - ds.registerType<RIGv2::VesselWeightData>(); - ds.registerType<RIGv2::TankWeightData>(); - ds.registerType<RIGv2::VesselPressureData>(); - ds.registerType<RIGv2::FillingPressureData>(); - ds.registerType<RIGv2::TopTankPressureData>(); - ds.registerType<RIGv2::BottomTankPressureData>(); + ds.registerType<RIGv2::OxVesselWeightData>(); + ds.registerType<RIGv2::OxTankWeightData>(); + ds.registerType<RIGv2::OxVesselPressureData>(); + ds.registerType<RIGv2::OxFillingPressureData>(); + ds.registerType<RIGv2::N2Vessel1PressureData>(); + ds.registerType<RIGv2::N2Vessel2PressureData>(); + ds.registerType<RIGv2::N2FillingPressureData>(); + ds.registerType<RIGv2::OxTankTopPressureData>(); + ds.registerType<RIGv2::OxTankBottomPressureData>(); ds.registerType<RIGv2::ActuatorsData>(); ds.registerType<RIGv2::GroundModeManagerData>(); ds.registerType<RIGv2::TarsActionData>(); diff --git a/scripts/logdecoder/RIGv2/logdecoder.cpp b/scripts/logdecoder/RIGv2/logdecoder.cpp index 6709b7eca9046bf014350cc9b2a115683a9757ed..666ae2f71b2185ac68989df5efbef11f8dccdc98 100644 --- a/scripts/logdecoder/RIGv2/logdecoder.cpp +++ b/scripts/logdecoder/RIGv2/logdecoder.cpp @@ -54,13 +54,17 @@ void registerTypes(Deserializer& ds) // Custom types ds.registerType<ADC1Data>(); + ds.registerType<ADC2Data>(); ds.registerType<TC1Data>(); - ds.registerType<VesselWeightData>(); - ds.registerType<TankWeightData>(); - ds.registerType<VesselPressureData>(); - ds.registerType<FillingPressureData>(); - ds.registerType<TopTankPressureData>(); - ds.registerType<BottomTankPressureData>(); + ds.registerType<OxVesselWeightData>(); + ds.registerType<OxTankWeightData>(); + ds.registerType<OxVesselPressureData>(); + ds.registerType<OxFillingPressureData>(); + ds.registerType<N2Vessel1PressureData>(); + ds.registerType<N2Vessel2PressureData>(); + ds.registerType<N2FillingPressureData>(); + ds.registerType<OxTankTopPressureData>(); + ds.registerType<OxTankBottomPressureData>(); ds.registerType<ActuatorsData>(); ds.registerType<GroundModeManagerData>(); ds.registerType<TarsActionData>(); diff --git a/src/RIGv2/CanHandler/CanHandler.cpp b/src/RIGv2/CanHandler/CanHandler.cpp index 055ae6e57bae3043a192eaaa1f7e61c2606e7efc..42494b83b2c866f4996629dfe1c0957cd47b9342 100644 --- a/src/RIGv2/CanHandler/CanHandler.cpp +++ b/src/RIGv2/CanHandler/CanHandler.cpp @@ -205,7 +205,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg) { CanPressureData data = pressureDataFromCanMessage(msg); sdLogger.log(data); - sensors->setCanCCPress(data); + sensors->setCanCombustionChamberPressure(data); break; } @@ -213,7 +213,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg) { CanPressureData data = pressureDataFromCanMessage(msg); sdLogger.log(data); - sensors->setCanTopTankPress(data); + sensors->setCanOxTankTopPressure(data); break; } @@ -221,7 +221,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg) { CanPressureData data = pressureDataFromCanMessage(msg); sdLogger.log(data); - sensors->setCanBottomTankPress(data); + sensors->setCanOxTankBottomPressure(data); break; } @@ -229,7 +229,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg) { CanTemperatureData data = temperatureDataFromCanMessage(msg); sdLogger.log(data); - sensors->setCanTankTemp(data); + sensors->setCanOxTankTemperature(data); break; } diff --git a/src/RIGv2/Configs/SensorsConfig.h b/src/RIGv2/Configs/SensorsConfig.h index 21dfeeb7d51eb4257853d9417d1cce5bbe876564..397a5bd8ac3759b9bd86a8d95dfbab42d4be0ea9 100644 --- a/src/RIGv2/Configs/SensorsConfig.h +++ b/src/RIGv2/Configs/SensorsConfig.h @@ -1,5 +1,5 @@ /* Copyright (c) 2024 Skyward Experimental Rocketry - * Authors: Davide Mor + * Authors: Davide Mor, Niccolò Betto * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -42,31 +42,11 @@ namespace Sensors namespace ADS131M08 { - -constexpr Boardcore::ADS131M08Defs::OversamplingRatio OSR = - Boardcore::ADS131M08Defs::OversamplingRatio::OSR_8192; +constexpr auto OSR = Boardcore::ADS131M08Defs::OversamplingRatio::OSR_8192; constexpr bool GLOBAL_CHOP_MODE_EN = true; -constexpr float CH1_SHUNT_RESISTANCE = 29.4048; -constexpr float CH2_SHUNT_RESISTANCE = 29.5830; -constexpr float CH3_SHUNT_RESISTANCE = 29.4973; -constexpr float CH4_SHUNT_RESISTANCE = 29.8849; - -// ADC channels definitions for various sensors -constexpr Boardcore::ADS131M08Defs::Channel VESSEL_PT_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_0; -constexpr Boardcore::ADS131M08Defs::Channel FILLING_PT_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_1; -constexpr Boardcore::ADS131M08Defs::Channel BOTTOM_PT_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_2; -constexpr Boardcore::ADS131M08Defs::Channel TOP_PT_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_3; -constexpr Boardcore::ADS131M08Defs::Channel SERVO_CURRENT_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_4; -constexpr Boardcore::ADS131M08Defs::Channel VESSEL_LC_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_5; -constexpr Boardcore::ADS131M08Defs::Channel TANK_LC_CHANNEL = - Boardcore::ADS131M08Defs::Channel::CHANNEL_6; +constexpr Hertz PERIOD = 100_hz; +constexpr bool ENABLED = true; // Servo current sensor calibration data // - A: 0.0 V: 2.520 @@ -78,11 +58,39 @@ constexpr Boardcore::ADS131M08Defs::Channel TANK_LC_CHANNEL = // - A: 5.2 V: 2.441 constexpr float SERVO_CURRENT_SCALE = 4.5466; constexpr float SERVO_CURRENT_ZERO = 2.520 / SERVO_CURRENT_SCALE; - -constexpr Hertz PERIOD = 100_hz; -constexpr bool ENABLED = true; } // namespace ADS131M08 +namespace ADC_1 +{ +using Channel = Boardcore::ADS131M08Defs::Channel; + +constexpr auto OX_VESSEL_PT_CHANNEL = Channel::CHANNEL_0; +constexpr auto OX_FILLING_PT_CHANNEL = Channel::CHANNEL_1; +constexpr auto N2_VESSEL_1_PT_CHANNEL = Channel::CHANNEL_2; +constexpr auto N2_VESSEL_2_PT_CHANNEL = Channel::CHANNEL_3; +constexpr auto SERVO_CURRENT_CHANNEL = Channel::CHANNEL_4; +constexpr auto OX_VESSEL_LC_CHANNEL = Channel::CHANNEL_5; +constexpr auto OX_TANK_LC_CHANNEL = Channel::CHANNEL_6; +constexpr auto N2_FILLING_PT_CHANNEL = Channel::CHANNEL_7; + +constexpr float CH0_SHUNT_RESISTANCE = 29.4048; // TODO: check +constexpr float CH1_SHUNT_RESISTANCE = 29.5830; // TODO: check +constexpr float CH2_SHUNT_RESISTANCE = 29.4973; // TODO: check +constexpr float CH3_SHUNT_RESISTANCE = 29.8849; // TODO: check +constexpr float CH7_SHUNT_RESISTANCE = 29.0; // TODO: measure +} // namespace ADC_1 + +namespace ADC_2 +{ +using Channel = Boardcore::ADS131M08Defs::Channel; + +constexpr auto OX_TANK_TOP_PT_CHANNEL = Channel::CHANNEL_0; +constexpr auto OX_TANK_BOTTOM_PT_CHANNEL = Channel::CHANNEL_1; + +constexpr float CH0_SHUNT_RESISTANCE = 29.0; // TODO: measure +constexpr float CH1_SHUNT_RESISTANCE = 29.0; // TODO: measure +} // namespace ADC_2 + namespace MAX31856 { constexpr Hertz PERIOD = 10_hz; @@ -91,18 +99,25 @@ constexpr bool ENABLED = true; namespace Trafag { -constexpr float FILLING_SHUNT_RESISTANCE = ADS131M08::CH2_SHUNT_RESISTANCE; -constexpr float TANK_TOP_SHUNT_RESISTANCE = ADS131M08::CH4_SHUNT_RESISTANCE; -constexpr float TANK_BOTTOM_SHUNT_RESISTANCE = ADS131M08::CH3_SHUNT_RESISTANCE; -constexpr float VESSEL_SHUNT_RESISTANCE = ADS131M08::CH1_SHUNT_RESISTANCE; +constexpr float OX_VESSEL_SHUNT_RESISTANCE = ADC_1::CH0_SHUNT_RESISTANCE; +constexpr float OX_FILLING_SHUNT_RESISTANCE = ADC_1::CH1_SHUNT_RESISTANCE; +constexpr float N2_VESSEL1_SHUNT_RESISTANCE = ADC_1::CH2_SHUNT_RESISTANCE; +constexpr float N2_VESSEL2_SHUNT_RESISTANCE = ADC_1::CH3_SHUNT_RESISTANCE; +constexpr float N2_FILLING_SHUNT_RESISTANCE = ADC_1::CH7_SHUNT_RESISTANCE; +constexpr float OX_TANK_TOP_SHUNT_RESISTANCE = ADC_2::CH0_SHUNT_RESISTANCE; +constexpr float OX_TANK_BOTTOM_SHUNT_RESISTANCE = ADC_2::CH1_SHUNT_RESISTANCE; constexpr float MIN_CURRENT = 4; constexpr float MAX_CURRENT = 20; -constexpr float FILLING_MAX_PRESSURE = 250; // bar -constexpr float TANK_TOP_MAX_PRESSURE = 250; // bar -constexpr float TANK_BOTTOM_MAX_PRESSURE = 100; // bar -constexpr float VESSEL_MAX_PRESSURE = 100; // bar +// TODO: check depending on which trafags are used +constexpr float OX_VESSEL_MAX_PRESSURE = 100; // bar +constexpr float OX_FILLING_MAX_PRESSURE = 250; // bar +constexpr float N2_VESSEL1_MAX_PRESSURE = 400; // bar +constexpr float N2_VESSEL2_MAX_PRESSURE = 400; // bar +constexpr float N2_FILLING_MAX_PRESSURE = 400; // bar +constexpr float OX_TANK_TOP_MAX_PRESSURE = 250; // bar +constexpr float OX_TANK_BOTTOM_MAX_PRESSURE = 100; // bar } // namespace Trafag namespace LoadCell @@ -152,8 +167,7 @@ constexpr float VESSEL_P1_MASS = 8.720; namespace InternalADC { -constexpr Boardcore::InternalADC::Channel BATTERY_VOLTAGE_CHANNEL = - Boardcore::InternalADC::CH14; +constexpr auto BATTERY_VOLTAGE_CHANNEL = Boardcore::InternalADC::CH14; constexpr float BATTERY_VOLTAGE_SCALE = 4.7917; constexpr Hertz PERIOD = 10_hz; diff --git a/src/RIGv2/Radio/Radio.cpp b/src/RIGv2/Radio/Radio.cpp index 4e6b17fbfdbd187712ec007641aa21fad607d7c4..d35a38d320976c5db850cdb0160b87ef4697b56c 100644 --- a/src/RIGv2/Radio/Radio.cpp +++ b/src/RIGv2/Radio/Radio.cpp @@ -546,26 +546,19 @@ bool Radio::enqueueSystemTm(uint8_t tmId) tm.timestamp = TimestampTimer::getTimestamp(); // Sensors - tm.rocket_mass = sensors->getTankWeightLastSample().load; - tm.n2o_vessel_mass = sensors->getVesselWeightLastSample().load; - - // TODO: methods below have mismatching names - tm.n2o_filling_pressure = - sensors->getVesselPressLastSample().pressure; - tm.n2_filling_pressure = - sensors->getFillingPressLastSample().pressure; - tm.n2o_vessel_pressure = - sensors->getBottomTankPressLastSample().pressure; - tm.n2_vessel_1_pressure = - sensors->getTopTankPressLastSample().pressure; - - tm.n2_vessel_2_pressure = -1.f; // TODO - - tm.battery_voltage = sensors->getBatteryVoltageLastSample().voltage; - tm.current_consumption = - sensors->getServoCurrentLastSample().current; + tm.rocket_mass = sensors->getOxTankWeight().load; + tm.n2o_vessel_mass = sensors->getOxVesselWeight().load; + + tm.n2o_vessel_pressure = sensors->getOxVesselPressure().pressure; + tm.n2o_filling_pressure = sensors->getOxFillingPressure().pressure; + tm.n2_filling_pressure = sensors->getN2FillingPressure().pressure; + tm.n2_vessel_1_pressure = sensors->getN2Vessel1Pressure().pressure; + tm.n2_vessel_2_pressure = sensors->getN2Vessel2Pressure().pressure; + + tm.battery_voltage = sensors->getBatteryVoltage().voltage; + tm.current_consumption = sensors->getServoCurrent().current; tm.umbilical_current_consumption = - sensors->getUmbilicalCurrentLastSample().current; + sensors->getUmbilicalCurrent().current; // Log data LoggerStats stats = sdLogger.getStats(); @@ -641,15 +634,13 @@ bool Radio::enqueueSystemTm(uint8_t tmId) tm.timestamp = TimestampTimer::getTimestamp(); // Sensors (either CAN or local) - tm.top_tank_pressure = - sensors->getTopTankPressLastSample().pressure; + tm.top_tank_pressure = sensors->getOxTankTopPressure().pressure; tm.bottom_tank_pressure = - sensors->getBottomTankPressLastSample().pressure; + sensors->getOxTankBottomPressure().pressure; tm.combustion_chamber_pressure = - sensors->getCCPressLastSample().pressure; - tm.tank_temperature = sensors->getTankTempLastSample().temperature; - tm.battery_voltage = - sensors->getMotorBatteryVoltageLastSample().voltage; + sensors->getCombustionChamberPressure().pressure; + tm.tank_temperature = sensors->getOxTankTemperature().temperature; + tm.battery_voltage = sensors->getMotorBatteryVoltage().voltage; // Valve states tm.main_valve_state = @@ -708,12 +699,39 @@ bool Radio::enqueueSensorTm(uint8_t tmId) tm.channel_7 = data.getVoltage(ADS131M08Defs::Channel::CHANNEL_7).voltage; tm.timestamp = data.timestamp; - strcpy(tm.sensor_name, "ADS131M08"); + strcpy(tm.sensor_name, "ADS131M08_1"); mavlink_msg_adc_tm_encode(Config::Radio::MAV_SYSTEM_ID, Config::Radio::MAV_COMPONENT_ID, &msg, &tm); enqueuePacket(msg); + + data = getModule<Sensors>()->getADC2LastSample(); + + tm.channel_0 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_0).voltage; + tm.channel_1 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_1).voltage; + tm.channel_2 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_2).voltage; + tm.channel_3 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_3).voltage; + tm.channel_4 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_4).voltage; + tm.channel_5 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_5).voltage; + tm.channel_6 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_6).voltage; + tm.channel_7 = + data.getVoltage(ADS131M08Defs::Channel::CHANNEL_7).voltage; + tm.timestamp = data.timestamp; + strcpy(tm.sensor_name, "ADS131M08_2"); + + mavlink_msg_adc_tm_encode(Config::Radio::MAV_SYSTEM_ID, + Config::Radio::MAV_COMPONENT_ID, &msg, + &tm); + enqueuePacket(msg); + return true; } @@ -722,8 +740,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_pressure_tm_t tm; - PressureData data = - getModule<Sensors>()->getVesselPressLastSample(); + PressureData data = getModule<Sensors>()->getOxVesselPressure(); tm.timestamp = data.pressureTimestamp; tm.pressure = data.pressure; @@ -741,8 +758,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_pressure_tm_t tm; - PressureData data = - getModule<Sensors>()->getFillingPressLastSample(); + PressureData data = getModule<Sensors>()->getOxFillingPressure(); tm.timestamp = data.pressureTimestamp; tm.pressure = data.pressure; @@ -760,8 +776,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_pressure_tm_t tm; - PressureData data = - getModule<Sensors>()->getBottomTankPressLastSample(); + PressureData data = getModule<Sensors>()->getOxTankBottomPressure(); tm.timestamp = data.pressureTimestamp; tm.pressure = data.pressure; @@ -779,8 +794,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_pressure_tm_t tm; - PressureData data = - getModule<Sensors>()->getTopTankPressLastSample(); + PressureData data = getModule<Sensors>()->getOxTankTopPressure(); tm.timestamp = data.pressureTimestamp; tm.pressure = data.pressure; @@ -816,8 +830,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_load_tm_t tm; - LoadCellData data = - getModule<Sensors>()->getVesselWeightLastSample(); + LoadCellData data = getModule<Sensors>()->getOxVesselWeight(); tm.timestamp = data.loadTimestamp; tm.load = data.load; @@ -835,7 +848,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_load_tm_t tm; - LoadCellData data = getModule<Sensors>()->getTankWeightLastSample(); + LoadCellData data = getModule<Sensors>()->getOxTankWeight(); tm.timestamp = data.loadTimestamp; tm.load = data.load; @@ -853,8 +866,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId) mavlink_message_t msg; mavlink_voltage_tm_t tm; - VoltageData data = - getModule<Sensors>()->getBatteryVoltageLastSample(); + VoltageData data = getModule<Sensors>()->getBatteryVoltage(); tm.timestamp = data.voltageTimestamp; tm.voltage = data.voltage; diff --git a/src/RIGv2/Sensors/Sensors.cpp b/src/RIGv2/Sensors/Sensors.cpp index cf83ecd54f1cdb5b89c415926e450b47b1970b13..a6f3aed8463e97951d09bc7171b119663598069a 100644 --- a/src/RIGv2/Sensors/Sensors.cpp +++ b/src/RIGv2/Sensors/Sensors.cpp @@ -1,5 +1,5 @@ /* Copyright (c) 2024 Skyward Experimental Rocketry - * Authors: Davide Mor + * Authors: Davide Mor, Niccolò Betto * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -40,12 +40,13 @@ bool Sensors::start() if (Config::Sensors::ADS131M08::ENABLED) { adc1Init(); - vesselPressureInit(); - fillingPressureInit(); - topTankPressureInit(); - bottomTankPressureInit(); - vesselWeightInit(); - tankWeightInit(); + adc2Init(); + oxVesselPressureInit(); + oxFillingPressureInit(); + oxTankTopPressureInit(); + oxTankBottomPressureInit(); + oxVesselWeightInit(); + oxTankWeightInit(); } if (Config::Sensors::MAX31856::ENABLED) @@ -71,99 +72,123 @@ ADS131M08Data Sensors::getADC1LastSample() return adc1 ? adc1->getLastSample() : ADS131M08Data{}; } +ADS131M08Data Sensors::getADC2LastSample() +{ + return adc2 ? adc2->getLastSample() : ADS131M08Data{}; +} + MAX31856Data Sensors::getTc1LastSample() { return tc1 ? tc1->getLastSample() : MAX31856Data{}; } -PressureData Sensors::getVesselPressLastSample() +PressureData Sensors::getOxVesselPressure() +{ + return oxVesselPressure ? oxVesselPressure->getLastSample() + : PressureData{}; +} + +PressureData Sensors::getOxFillingPressure() { - return vesselPressure ? vesselPressure->getLastSample() : PressureData{}; + return oxFillingPressure ? oxFillingPressure->getLastSample() + : PressureData{}; } -PressureData Sensors::getFillingPressLastSample() +PressureData Sensors::getN2Vessel1Pressure() { - return fillingPressure ? fillingPressure->getLastSample() : PressureData{}; + return n2Vessel1Pressure ? n2Vessel1Pressure->getLastSample() + : PressureData{}; } -PressureData Sensors::getTopTankPressLastSample() +PressureData Sensors::getN2Vessel2Pressure() +{ + return n2Vessel2Pressure ? n2Vessel2Pressure->getLastSample() + : PressureData{}; +} + +PressureData Sensors::getN2FillingPressure() +{ + return n2FillingPressure ? n2FillingPressure->getLastSample() + : PressureData{}; +} + +PressureData Sensors::getOxTankTopPressure() { if (useCanData) { - return getCanTopTankPressLastSample(); + return getCanOxTankTopPressure(); } else { - return topTankPressure ? topTankPressure->getLastSample() - : PressureData{}; + return oxTankTopPressure ? oxTankTopPressure->getLastSample() + : PressureData{}; } } -PressureData Sensors::getBottomTankPressLastSample() +PressureData Sensors::getOxTankBottomPressure() { if (useCanData) { - return getCanBottomTankPressLastSample(); + return getCanOxTankBottomPressure(); } else { - return bottomTankPressure ? bottomTankPressure->getLastSample() - : PressureData{}; + return oxTankBottomPressure ? oxTankBottomPressure->getLastSample() + : PressureData{}; } } -PressureData Sensors::getCCPressLastSample() +PressureData Sensors::getCombustionChamberPressure() { if (useCanData) - return getCanCCPressLastSample(); + return getCanCombustionChamberPressure(); else return PressureData{}; } -TemperatureData Sensors::getTankTempLastSample() +TemperatureData Sensors::getOxTankTemperature() { if (useCanData) - return getCanTankTempLastSample(); + return getCanTankTemperature(); else return getTc1LastSample(); } -LoadCellData Sensors::getVesselWeightLastSample() +LoadCellData Sensors::getOxVesselWeight() { - if (vesselWeight) - return vesselWeight->getLastSample(); + if (oxVesselWeight) + return oxVesselWeight->getLastSample(); else return {}; } -LoadCellData Sensors::getTankWeightLastSample() +LoadCellData Sensors::getOxTankWeight() { - if (tankWeight) - return tankWeight->getLastSample(); + if (oxTankWeight) + return oxTankWeight->getLastSample(); else return {}; } -CurrentData Sensors::getUmbilicalCurrentLastSample() +CurrentData Sensors::getUmbilicalCurrent() { - // TODO: Implement this + // TODO: Implement umbilical current return {}; } -CurrentData Sensors::getServoCurrentLastSample() +CurrentData Sensors::getServoCurrent() { auto sample = getADC1LastSample(); float current = - (sample - .voltage[(int)Config::Sensors::ADS131M08::SERVO_CURRENT_CHANNEL] - + (sample.voltage[(int)Config::Sensors::ADC_1::SERVO_CURRENT_CHANNEL] - Config::Sensors::ADS131M08::SERVO_CURRENT_ZERO) * Config::Sensors::ADS131M08::SERVO_CURRENT_SCALE; // Current reading are flipped return {sample.timestamp, -current / 5.0f * 50.0f}; } -VoltageData Sensors::getBatteryVoltageLastSample() +VoltageData Sensors::getBatteryVoltage() { auto sample = getInternalADCLastSample(); @@ -174,66 +199,66 @@ VoltageData Sensors::getBatteryVoltageLastSample() return {sample.timestamp, voltage}; } -VoltageData Sensors::getMotorBatteryVoltageLastSample() +VoltageData Sensors::getMotorBatteryVoltage() { if (useCanData) - return getCanMotorBatteryVoltageLastSample(); + return getCanMotorBatteryVoltage(); else return VoltageData{}; } -PressureData Sensors::getCanTopTankPressLastSample() +PressureData Sensors::getCanOxTankTopPressure() { Lock<FastMutex> lock{canMutex}; - return canTopTankPressure; + return canOxTankBottomPressure; } -PressureData Sensors::getCanBottomTankPressLastSample() +PressureData Sensors::getCanOxTankBottomPressure() { Lock<FastMutex> lock{canMutex}; - return canBottomTankPressure; + return canOxTankTopPressure; } -PressureData Sensors::getCanCCPressLastSample() +PressureData Sensors::getCanCombustionChamberPressure() { Lock<FastMutex> lock{canMutex}; - return canCCPressure; + return canCombustionChamberPressure; } -TemperatureData Sensors::getCanTankTempLastSample() +TemperatureData Sensors::getCanTankTemperature() { Lock<FastMutex> lock{canMutex}; - return canTankTemperature; + return canOxTankTemperature; } -VoltageData Sensors::getCanMotorBatteryVoltageLastSample() +VoltageData Sensors::getCanMotorBatteryVoltage() { Lock<FastMutex> lock{canMutex}; return canMotorBatteryVoltage; } -void Sensors::setCanTopTankPress(PressureData data) +void Sensors::setCanOxTankTopPressure(PressureData data) { Lock<FastMutex> lock{canMutex}; - canTopTankPressure = data; + canOxTankBottomPressure = data; } -void Sensors::setCanBottomTankPress(PressureData data) +void Sensors::setCanOxTankBottomPressure(PressureData data) { Lock<FastMutex> lock{canMutex}; - canBottomTankPressure = data; + canOxTankTopPressure = data; } -void Sensors::setCanCCPress(PressureData data) +void Sensors::setCanCombustionChamberPressure(PressureData data) { Lock<FastMutex> lock{canMutex}; - canCCPressure = data; + canCombustionChamberPressure = data; } -void Sensors::setCanTankTemp(TemperatureData data) +void Sensors::setCanOxTankTemperature(TemperatureData data) { Lock<FastMutex> lock{canMutex}; - canTankTemperature = data; + canOxTankTemperature = data; } void Sensors::setCanMotorBatteryVoltage(VoltageData data) @@ -246,20 +271,20 @@ void Sensors::switchToCanSensors() { useCanData = true; } void Sensors::calibrate() { - Stats vesselStats, tankStats; + Stats oxVesselStats, oxTankStats; for (unsigned int i = 0; i < Config::Sensors::LoadCell::CALIBRATE_SAMPLE_COUNT; i++) { // Tank readings WITHOUT offsets - vesselStats.add(vesselWeight->getLastSample().load); - tankStats.add(tankWeight->getLastSample().load); + oxVesselStats.add(oxVesselWeight->getLastSample().load); + oxTankStats.add(oxTankWeight->getLastSample().load); Thread::sleep(Config::Sensors::LoadCell::CALIBRATE_SAMPLE_PERIOD); } - vesselWeight->updateOffset(vesselStats.getStats().mean); - tankWeight->updateOffset(tankStats.getStats().mean); + oxVesselWeight->updateOffset(oxVesselStats.getStats().mean); + oxTankWeight->updateOffset(oxTankStats.getStats().mean); } std::vector<SensorInfo> Sensors::getSensorInfos() @@ -268,32 +293,25 @@ std::vector<SensorInfo> Sensors::getSensorInfos() { std::vector<SensorInfo> infos{}; - if (vesselWeight) - infos.push_back(manager->getSensorInfo(vesselWeight.get())); - - if (tankWeight) - infos.push_back(manager->getSensorInfo(tankWeight.get())); - - if (vesselPressure) - infos.push_back(manager->getSensorInfo(vesselPressure.get())); - - if (fillingPressure) - infos.push_back(manager->getSensorInfo(fillingPressure.get())); - - if (topTankPressure) - infos.push_back(manager->getSensorInfo(topTankPressure.get())); - - if (bottomTankPressure) - infos.push_back(manager->getSensorInfo(bottomTankPressure.get())); - - if (internalAdc) - infos.push_back(manager->getSensorInfo(internalAdc.get())); - - if (adc1) - infos.push_back(manager->getSensorInfo(adc1.get())); - - if (tc1) - infos.push_back(manager->getSensorInfo(tc1.get())); +#define PUSH_SENSOR_INFO(instance, name) \ + if (instance) \ + infos.push_back(manager->getSensorInfo(instance.get())); \ + else \ + infos.push_back(SensorInfo { #name, 0, nullptr, false }) + + PUSH_SENSOR_INFO(adc1, "ADC1"); + PUSH_SENSOR_INFO(adc2, "ADC2"); + PUSH_SENSOR_INFO(tc1, "TC1"); + PUSH_SENSOR_INFO(internalAdc, "InternalADC"); + PUSH_SENSOR_INFO(oxVesselPressure, "OxVesselPressure"); + PUSH_SENSOR_INFO(oxFillingPressure, "OxFillingPressure"); + PUSH_SENSOR_INFO(n2Vessel1Pressure, "N2Vessel1Pressure"); + PUSH_SENSOR_INFO(n2Vessel2Pressure, "N2Vessel2Pressure"); + PUSH_SENSOR_INFO(n2FillingPressure, "N2FillingPressure"); + PUSH_SENSOR_INFO(oxTankTopPressure, "OxTankTopPressure"); + PUSH_SENSOR_INFO(oxTankBottomPressure, "OxTankBotPressure"); + PUSH_SENSOR_INFO(oxVesselWeight, "OxVesselWeight"); + PUSH_SENSOR_INFO(oxTankWeight, "OxTankWeight"); return infos; } @@ -333,65 +351,101 @@ void Sensors::adc1Init() Config::Sensors::ADS131M08::GLOBAL_CHOP_MODE_EN; // Disable all channels - config.channelsConfig[0].enabled = false; - config.channelsConfig[1].enabled = false; - config.channelsConfig[2].enabled = false; - config.channelsConfig[3].enabled = false; - config.channelsConfig[4].enabled = false; - config.channelsConfig[5].enabled = false; - config.channelsConfig[6].enabled = false; - config.channelsConfig[7].enabled = false; + for (auto& channel : config.channelsConfig) + channel.enabled = false; // Configure all required channels - config.channelsConfig[(int)Config::Sensors::ADS131M08::VESSEL_PT_CHANNEL] = + config.channelsConfig[(int)Config::Sensors::ADC_1::OX_VESSEL_PT_CHANNEL] = { + .enabled = true, + .pga = ADS131M08Defs::PGA::PGA_1, + .offset = 0, + .gain = 1.0}; + + config.channelsConfig[(int)Config::Sensors::ADC_1::OX_FILLING_PT_CHANNEL] = + {.enabled = true, + .pga = ADS131M08Defs::PGA::PGA_1, + .offset = 0, + .gain = 1.0}; + + config.channelsConfig[(int)Config::Sensors::ADC_1::N2_VESSEL_1_PT_CHANNEL] = {.enabled = true, .pga = ADS131M08Defs::PGA::PGA_1, .offset = 0, .gain = 1.0}; - config.channelsConfig[(int)Config::Sensors::ADS131M08::FILLING_PT_CHANNEL] = + config.channelsConfig[(int)Config::Sensors::ADC_1::N2_VESSEL_2_PT_CHANNEL] = {.enabled = true, .pga = ADS131M08Defs::PGA::PGA_1, .offset = 0, .gain = 1.0}; - config.channelsConfig[(int)Config::Sensors::ADS131M08::BOTTOM_PT_CHANNEL] = + config.channelsConfig[(int)Config::Sensors::ADC_1::SERVO_CURRENT_CHANNEL] = {.enabled = true, .pga = ADS131M08Defs::PGA::PGA_1, .offset = 0, .gain = 1.0}; - config.channelsConfig[(int)Config::Sensors::ADS131M08::TOP_PT_CHANNEL] = { + config.channelsConfig[(int)Config::Sensors::ADC_1::OX_VESSEL_LC_CHANNEL] = { .enabled = true, - .pga = ADS131M08Defs::PGA::PGA_1, + .pga = ADS131M08Defs::PGA::PGA_32, .offset = 0, .gain = 1.0}; - config.channelsConfig[( - int)Config::Sensors::ADS131M08::SERVO_CURRENT_CHANNEL] = { + config.channelsConfig[(int)Config::Sensors::ADC_1::OX_TANK_LC_CHANNEL] = { .enabled = true, - .pga = ADS131M08Defs::PGA::PGA_1, + .pga = ADS131M08Defs::PGA::PGA_32, .offset = 0, .gain = 1.0}; - config.channelsConfig[(int)Config::Sensors::ADS131M08::VESSEL_LC_CHANNEL] = + config.channelsConfig[(int)Config::Sensors::ADC_1::N2_FILLING_PT_CHANNEL] = {.enabled = true, - .pga = ADS131M08Defs::PGA::PGA_32, + .pga = ADS131M08Defs::PGA::PGA_1, .offset = 0, .gain = 1.0}; - config.channelsConfig[(int)Config::Sensors::ADS131M08::TANK_LC_CHANNEL] = { + adc1 = std::make_unique<ADS131M08>(getModule<Buses>()->getADS131M08_1(), + sensors::ADS131_1::cs::getPin(), + spiConfig, config); +} + +void Sensors::adc1Callback() { sdLogger.log(ADC1Data{getADC1LastSample()}); } + +void Sensors::adc2Init() +{ + SPIBusConfig spiConfig = {}; + spiConfig.mode = SPI::Mode::MODE_0; + spiConfig.clockDivider = SPI::ClockDivider::DIV_32; + + ADS131M08::Config config = {}; + // Setup global configurations + config.oversamplingRatio = Config::Sensors::ADS131M08::OSR; + config.globalChopModeEnabled = + Config::Sensors::ADS131M08::GLOBAL_CHOP_MODE_EN; + + // Disable all channels + for (auto& channel : config.channelsConfig) + channel.enabled = false; + + // Configure all required channels + config.channelsConfig[(int)Config::Sensors::ADC_2::OX_TANK_TOP_PT_CHANNEL] = + {.enabled = true, + .pga = ADS131M08Defs::PGA::PGA_1, + .offset = 0, + .gain = 1.0}; + + config.channelsConfig[( + int)Config::Sensors::ADC_2::OX_TANK_BOTTOM_PT_CHANNEL] = { .enabled = true, - .pga = ADS131M08Defs::PGA::PGA_32, + .pga = ADS131M08Defs::PGA::PGA_1, .offset = 0, .gain = 1.0}; - adc1 = std::make_unique<ADS131M08>(getModule<Buses>()->getADS131M08_1(), - sensors::ADS131_1::cs::getPin(), + adc2 = std::make_unique<ADS131M08>(getModule<Buses>()->getADS131M08_2(), + sensors::ADS131_2::cs::getPin(), spiConfig, config); } -void Sensors::adc1Callback() { sdLogger.log(ADC1Data{getADC1LastSample()}); } +void Sensors::adc2Callback() { sdLogger.log(ADC2Data{getADC2LastSample()}); } void Sensors::tc1Init() { @@ -405,94 +459,155 @@ void Sensors::tc1Init() void Sensors::tc1Callback() { sdLogger.log(TC1Data{getTc1LastSample()}); } -void Sensors::vesselPressureInit() +void Sensors::oxVesselPressureInit() { - vesselPressure = std::make_unique<TrafagPressureSensor>( + oxVesselPressure = std::make_unique<TrafagPressureSensor>( [this]() { auto sample = getADC1LastSample(); return sample.getVoltage( - Config::Sensors::ADS131M08::VESSEL_PT_CHANNEL); + Config::Sensors::ADC_1::OX_VESSEL_PT_CHANNEL); }, - Config::Sensors::Trafag::VESSEL_SHUNT_RESISTANCE, - Config::Sensors::Trafag::VESSEL_MAX_PRESSURE, + Config::Sensors::Trafag::OX_VESSEL_SHUNT_RESISTANCE, + Config::Sensors::Trafag::OX_VESSEL_MAX_PRESSURE, Config::Sensors::Trafag::MIN_CURRENT, Config::Sensors::Trafag::MAX_CURRENT); } -void Sensors::vesselPressureCallback() +void Sensors::oxVesselPressureCallback() { - sdLogger.log(VesselPressureData{getVesselPressLastSample()}); + sdLogger.log(OxVesselPressureData{getOxVesselPressure()}); } -void Sensors::fillingPressureInit() +void Sensors::oxFillingPressureInit() { - fillingPressure = std::make_unique<TrafagPressureSensor>( + oxFillingPressure = std::make_unique<TrafagPressureSensor>( [this]() { auto sample = getADC1LastSample(); return sample.getVoltage( - Config::Sensors::ADS131M08::FILLING_PT_CHANNEL); + Config::Sensors::ADC_1::OX_FILLING_PT_CHANNEL); }, - Config::Sensors::Trafag::FILLING_SHUNT_RESISTANCE, - Config::Sensors::Trafag::FILLING_MAX_PRESSURE, + Config::Sensors::Trafag::OX_FILLING_SHUNT_RESISTANCE, + Config::Sensors::Trafag::OX_FILLING_MAX_PRESSURE, Config::Sensors::Trafag::MIN_CURRENT, Config::Sensors::Trafag::MAX_CURRENT); } -void Sensors::fillingPressureCallback() +void Sensors::oxFillingPressureCallback() { - sdLogger.log(FillingPressureData{getFillingPressLastSample()}); + sdLogger.log(OxFillingPressureData{getOxFillingPressure()}); } -void Sensors::topTankPressureInit() +void Sensors::n2Vessel1PressureInit() { - topTankPressure = std::make_unique<TrafagPressureSensor>( + n2Vessel1Pressure = std::make_unique<TrafagPressureSensor>( [this]() { auto sample = getADC1LastSample(); return sample.getVoltage( - Config::Sensors::ADS131M08::TOP_PT_CHANNEL); + Config::Sensors::ADC_1::N2_VESSEL_1_PT_CHANNEL); }, - Config::Sensors::Trafag::TANK_TOP_SHUNT_RESISTANCE, - Config::Sensors::Trafag::TANK_TOP_MAX_PRESSURE, + Config::Sensors::Trafag::N2_VESSEL1_SHUNT_RESISTANCE, + Config::Sensors::Trafag::N2_VESSEL1_MAX_PRESSURE, Config::Sensors::Trafag::MIN_CURRENT, Config::Sensors::Trafag::MAX_CURRENT); } -void Sensors::topTankPressureCallback() +void Sensors::n2Vessel1PressureCallback() { - sdLogger.log(TopTankPressureData{topTankPressure->getLastSample()}); + sdLogger.log(N2Vessel1PressureData{getN2Vessel1Pressure()}); } -void Sensors::bottomTankPressureInit() +void Sensors::n2Vessel2PressureInit() { - bottomTankPressure = std::make_unique<TrafagPressureSensor>( + n2Vessel2Pressure = std::make_unique<TrafagPressureSensor>( [this]() { auto sample = getADC1LastSample(); return sample.getVoltage( - Config::Sensors::ADS131M08::BOTTOM_PT_CHANNEL); + Config::Sensors::ADC_1::N2_VESSEL_2_PT_CHANNEL); + }, + Config::Sensors::Trafag::N2_VESSEL2_SHUNT_RESISTANCE, + Config::Sensors::Trafag::N2_VESSEL2_MAX_PRESSURE, + Config::Sensors::Trafag::MIN_CURRENT, + Config::Sensors::Trafag::MAX_CURRENT); +} + +void Sensors::n2Vessel2PressureCallback() +{ + sdLogger.log(N2Vessel2PressureData{getN2Vessel2Pressure()}); +} + +void Sensors::n2FillingPressureInit() +{ + n2FillingPressure = std::make_unique<TrafagPressureSensor>( + [this]() + { + auto sample = getADC1LastSample(); + return sample.getVoltage( + Config::Sensors::ADC_1::N2_FILLING_PT_CHANNEL); + }, + Config::Sensors::Trafag::N2_FILLING_SHUNT_RESISTANCE, + Config::Sensors::Trafag::N2_FILLING_MAX_PRESSURE, + Config::Sensors::Trafag::MIN_CURRENT, + Config::Sensors::Trafag::MAX_CURRENT); +} + +void Sensors::n2FillingPressureCallback() +{ + sdLogger.log(N2FillingPressureData{getN2FillingPressure()}); +} + +void Sensors::oxTankTopPressureInit() +{ + oxTankTopPressure = std::make_unique<TrafagPressureSensor>( + [this]() + { + auto sample = getADC2LastSample(); + return sample.getVoltage( + Config::Sensors::ADC_2::OX_TANK_TOP_PT_CHANNEL); }, - Config::Sensors::Trafag::TANK_BOTTOM_SHUNT_RESISTANCE, - Config::Sensors::Trafag::TANK_BOTTOM_MAX_PRESSURE, + Config::Sensors::Trafag::OX_TANK_TOP_SHUNT_RESISTANCE, + Config::Sensors::Trafag::OX_TANK_TOP_MAX_PRESSURE, Config::Sensors::Trafag::MIN_CURRENT, Config::Sensors::Trafag::MAX_CURRENT); } -void Sensors::bottomTankPressureCallback() +void Sensors::oxTankTopPressureCallback() { - sdLogger.log(BottomTankPressureData{bottomTankPressure->getLastSample()}); + sdLogger.log(OxTankTopPressureData{oxTankTopPressure->getLastSample()}); } -void Sensors::vesselWeightInit() +void Sensors::oxTankBottomPressureInit() { - vesselWeight = std::make_unique<TwoPointAnalogLoadCell>( + oxTankBottomPressure = std::make_unique<TrafagPressureSensor>( + [this]() + { + auto sample = getADC2LastSample(); + return sample.getVoltage( + Config::Sensors::ADC_2::OX_TANK_BOTTOM_PT_CHANNEL); + }, + Config::Sensors::Trafag::OX_TANK_BOTTOM_SHUNT_RESISTANCE, + Config::Sensors::Trafag::OX_TANK_BOTTOM_MAX_PRESSURE, + Config::Sensors::Trafag::MIN_CURRENT, + Config::Sensors::Trafag::MAX_CURRENT); +} + +void Sensors::oxTankBottomPressureCallback() +{ + sdLogger.log( + OxTankBottomPressureData{oxTankBottomPressure->getLastSample()}); +} + +void Sensors::oxVesselWeightInit() +{ + oxVesselWeight = std::make_unique<TwoPointAnalogLoadCell>( [this]() { auto sample = getADC1LastSample(); return sample.getVoltage( - Config::Sensors::ADS131M08::VESSEL_LC_CHANNEL); + Config::Sensors::ADC_1::OX_VESSEL_LC_CHANNEL); }, Config::Sensors::LoadCell::VESSEL_P0_VOLTAGE, Config::Sensors::LoadCell::VESSEL_P0_MASS, @@ -500,19 +615,19 @@ void Sensors::vesselWeightInit() Config::Sensors::LoadCell::VESSEL_P1_MASS); } -void Sensors::vesselWeightCallback() +void Sensors::oxVesselWeightCallback() { - sdLogger.log(VesselWeightData{getVesselWeightLastSample()}); + sdLogger.log(OxVesselWeightData{getOxVesselWeight()}); } -void Sensors::tankWeightInit() +void Sensors::oxTankWeightInit() { - tankWeight = std::make_unique<TwoPointAnalogLoadCell>( + oxTankWeight = std::make_unique<TwoPointAnalogLoadCell>( [this]() { auto sample = getADC1LastSample(); return sample.getVoltage( - Config::Sensors::ADS131M08::TANK_LC_CHANNEL); + Config::Sensors::ADC_1::OX_TANK_LC_CHANNEL); }, Config::Sensors::LoadCell::TANK_P0_VOLTAGE, Config::Sensors::LoadCell::TANK_P0_MASS, @@ -520,9 +635,9 @@ void Sensors::tankWeightInit() Config::Sensors::LoadCell::TANK_P1_MASS); } -void Sensors::tankWeightCallback() +void Sensors::oxTankWeightCallback() { - sdLogger.log(TankWeightData{getTankWeightLastSample()}); + sdLogger.log(OxTankWeightData{getOxTankWeight()}); } bool Sensors::sensorManagerInit() @@ -534,7 +649,7 @@ bool Sensors::sensorManagerInit() if (internalAdc) { - SensorInfo info("InternalAdc", Config::Sensors::InternalADC::PERIOD, + SensorInfo info("InternalADC", Config::Sensors::InternalADC::PERIOD, [this]() { internalAdcCallback(); }); map.emplace(internalAdc.get(), info); } @@ -546,6 +661,13 @@ bool Sensors::sensorManagerInit() map.emplace(std::make_pair(adc1.get(), info)); } + if (adc2) + { + SensorInfo info("ADS131M08_2", Config::Sensors::ADS131M08::PERIOD, + [this]() { adc2Callback(); }); + map.emplace(std::make_pair(adc2.get(), info)); + } + if (tc1) { SensorInfo info("MAX31856_1", Config::Sensors::MAX31856::PERIOD, @@ -553,47 +675,67 @@ bool Sensors::sensorManagerInit() map.emplace(std::make_pair(tc1.get(), info)); } - if (vesselPressure) + if (oxVesselPressure) + { + SensorInfo info("OxVesselPressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { oxVesselPressureCallback(); }); + map.emplace(std::make_pair(oxVesselPressure.get(), info)); + } + + if (oxFillingPressure) + { + SensorInfo info("OxFillingPressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { oxFillingPressureCallback(); }); + map.emplace(std::make_pair(oxFillingPressure.get(), info)); + } + + if (n2Vessel1Pressure) + { + SensorInfo info("N2Vessel1Pressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { n2Vessel1PressureCallback(); }); + map.emplace(std::make_pair(n2Vessel1Pressure.get(), info)); + } + + if (n2Vessel2Pressure) { - SensorInfo info("VesselPressure", Config::Sensors::ADS131M08::PERIOD, - [this]() { vesselPressureCallback(); }); - map.emplace(std::make_pair(vesselPressure.get(), info)); + SensorInfo info("N2Vessel2Pressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { n2Vessel2PressureCallback(); }); + map.emplace(std::make_pair(n2Vessel2Pressure.get(), info)); } - if (fillingPressure) + if (n2FillingPressure) { - SensorInfo info("FillingPressure", Config::Sensors::ADS131M08::PERIOD, - [this]() { fillingPressureCallback(); }); - map.emplace(std::make_pair(fillingPressure.get(), info)); + SensorInfo info("N2FillingPressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { n2FillingPressureCallback(); }); + map.emplace(std::make_pair(n2FillingPressure.get(), info)); } - if (topTankPressure) + if (oxTankTopPressure) { - SensorInfo info("TopTankPressure", Config::Sensors::ADS131M08::PERIOD, - [this]() { topTankPressureCallback(); }); - map.emplace(std::make_pair(topTankPressure.get(), info)); + SensorInfo info("OxTankTopPressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { oxTankTopPressureCallback(); }); + map.emplace(std::make_pair(oxTankTopPressure.get(), info)); } - if (bottomTankPressure) + if (oxTankBottomPressure) { - SensorInfo info("BottomTankPressure", - Config::Sensors::ADS131M08::PERIOD, - [this]() { bottomTankPressureCallback(); }); - map.emplace(std::make_pair(bottomTankPressure.get(), info)); + SensorInfo info("OxTankBotPressure", Config::Sensors::ADS131M08::PERIOD, + [this]() { oxTankBottomPressureCallback(); }); + map.emplace(std::make_pair(oxTankBottomPressure.get(), info)); } - if (vesselWeight) + if (oxVesselWeight) { - SensorInfo info("VesselWeight", Config::Sensors::ADS131M08::PERIOD, - [this]() { vesselWeightCallback(); }); - map.emplace(std::make_pair(vesselWeight.get(), info)); + SensorInfo info("OxVesselWeight", Config::Sensors::ADS131M08::PERIOD, + [this]() { oxVesselWeightCallback(); }); + map.emplace(std::make_pair(oxVesselWeight.get(), info)); } - if (tankWeight) + if (oxTankWeight) { - SensorInfo info("TankWeight", Config::Sensors::ADS131M08::PERIOD, - [this]() { tankWeightCallback(); }); - map.emplace(std::make_pair(tankWeight.get(), info)); + SensorInfo info("OxTankWeight", Config::Sensors::ADS131M08::PERIOD, + [this]() { oxTankWeightCallback(); }); + map.emplace(std::make_pair(oxTankWeight.get(), info)); } manager = std::make_unique<SensorManager>(map, &scheduler); diff --git a/src/RIGv2/Sensors/Sensors.h b/src/RIGv2/Sensors/Sensors.h index c349b48b95fc2b8e668de38f629501d4cd6d3866..06a5ceb1f46d841d454c63717cfd155ad9a94bd5 100644 --- a/src/RIGv2/Sensors/Sensors.h +++ b/src/RIGv2/Sensors/Sensors.h @@ -1,5 +1,5 @@ /* Copyright (c) 2024 Skyward Experimental Rocketry - * Authors: Davide Mor + * Authors: Davide Mor, Niccolò Betto * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -55,55 +55,70 @@ public: // Getters for raw data coming from sensors Boardcore::InternalADCData getInternalADCLastSample(); Boardcore::ADS131M08Data getADC1LastSample(); + Boardcore::ADS131M08Data getADC2LastSample(); Boardcore::MAX31856Data getTc1LastSample(); // Getters for processed data - Boardcore::PressureData getVesselPressLastSample(); - Boardcore::PressureData getFillingPressLastSample(); - Boardcore::PressureData getTopTankPressLastSample(); - Boardcore::PressureData getBottomTankPressLastSample(); - Boardcore::PressureData getCCPressLastSample(); - Boardcore::TemperatureData getTankTempLastSample(); - Boardcore::LoadCellData getVesselWeightLastSample(); - Boardcore::LoadCellData getTankWeightLastSample(); - Boardcore::CurrentData getUmbilicalCurrentLastSample(); - Boardcore::CurrentData getServoCurrentLastSample(); - Boardcore::VoltageData getBatteryVoltageLastSample(); - Boardcore::VoltageData getMotorBatteryVoltageLastSample(); - - Boardcore::PressureData getCanTopTankPressLastSample(); - Boardcore::PressureData getCanBottomTankPressLastSample(); - Boardcore::PressureData getCanCCPressLastSample(); - Boardcore::TemperatureData getCanTankTempLastSample(); - Boardcore::VoltageData getCanMotorBatteryVoltageLastSample(); + Boardcore::PressureData getOxVesselPressure(); + Boardcore::PressureData getOxFillingPressure(); + Boardcore::PressureData getN2Vessel1Pressure(); + Boardcore::PressureData getN2Vessel2Pressure(); + Boardcore::PressureData getN2FillingPressure(); + Boardcore::PressureData getOxTankTopPressure(); + Boardcore::PressureData getOxTankBottomPressure(); + Boardcore::PressureData getCombustionChamberPressure(); + + Boardcore::TemperatureData getOxTankTemperature(); + Boardcore::LoadCellData getOxVesselWeight(); + Boardcore::LoadCellData getOxTankWeight(); + + Boardcore::CurrentData getUmbilicalCurrent(); + Boardcore::CurrentData getServoCurrent(); + Boardcore::VoltageData getBatteryVoltage(); + Boardcore::VoltageData getMotorBatteryVoltage(); + + Boardcore::PressureData getCanOxTankTopPressure(); + Boardcore::PressureData getCanOxTankBottomPressure(); + Boardcore::PressureData getCanCombustionChamberPressure(); + Boardcore::TemperatureData getCanTankTemperature(); + Boardcore::VoltageData getCanMotorBatteryVoltage(); std::vector<Boardcore::SensorInfo> getSensorInfos(); - void setCanTopTankPress(Boardcore::PressureData data); - void setCanBottomTankPress(Boardcore::PressureData data); - void setCanCCPress(Boardcore::PressureData data); - void setCanTankTemp(Boardcore::TemperatureData data); + void setCanOxTankTopPressure(Boardcore::PressureData data); + void setCanOxTankBottomPressure(Boardcore::PressureData data); + void setCanCombustionChamberPressure(Boardcore::PressureData data); + void setCanOxTankTemperature(Boardcore::TemperatureData data); void setCanMotorBatteryVoltage(Boardcore::VoltageData data); void switchToCanSensors(); private: - void vesselPressureInit(); - void vesselPressureCallback(); + void oxVesselPressureInit(); + void oxVesselPressureCallback(); - void fillingPressureInit(); - void fillingPressureCallback(); + void oxFillingPressureInit(); + void oxFillingPressureCallback(); - void topTankPressureInit(); - void topTankPressureCallback(); + void n2Vessel1PressureInit(); + void n2Vessel1PressureCallback(); - void bottomTankPressureInit(); - void bottomTankPressureCallback(); + void n2Vessel2PressureInit(); + void n2Vessel2PressureCallback(); - void vesselWeightInit(); - void vesselWeightCallback(); + void n2FillingPressureInit(); + void n2FillingPressureCallback(); - void tankWeightInit(); - void tankWeightCallback(); + void oxTankTopPressureInit(); + void oxTankTopPressureCallback(); + + void oxTankBottomPressureInit(); + void oxTankBottomPressureCallback(); + + void oxVesselWeightInit(); + void oxVesselWeightCallback(); + + void oxTankWeightInit(); + void oxTankWeightCallback(); void internalAdcInit(); void internalAdcCallback(); @@ -111,6 +126,9 @@ private: void adc1Init(); void adc1Callback(); + void adc2Init(); + void adc2Callback(); + void tc1Init(); void tc1Callback(); @@ -123,22 +141,28 @@ private: std::atomic<bool> useCanData{false}; miosix::FastMutex canMutex; - Boardcore::PressureData canCCPressure; - Boardcore::PressureData canBottomTankPressure; - Boardcore::PressureData canTopTankPressure; - Boardcore::TemperatureData canTankTemperature; + + Boardcore::PressureData canOxTankTopPressure; + Boardcore::PressureData canOxTankBottomPressure; + Boardcore::PressureData canCombustionChamberPressure; + // TODO: N2 tank pressure from CAN + Boardcore::TemperatureData canOxTankTemperature; Boardcore::VoltageData canMotorBatteryVoltage; // Analog sensors - std::unique_ptr<Boardcore::TrafagPressureSensor> vesselPressure; - std::unique_ptr<Boardcore::TrafagPressureSensor> fillingPressure; - std::unique_ptr<Boardcore::TrafagPressureSensor> topTankPressure; - std::unique_ptr<Boardcore::TrafagPressureSensor> bottomTankPressure; - std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> vesselWeight; - std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> tankWeight; + std::unique_ptr<Boardcore::TrafagPressureSensor> oxVesselPressure; + std::unique_ptr<Boardcore::TrafagPressureSensor> oxFillingPressure; + std::unique_ptr<Boardcore::TrafagPressureSensor> n2Vessel1Pressure; + std::unique_ptr<Boardcore::TrafagPressureSensor> n2Vessel2Pressure; + std::unique_ptr<Boardcore::TrafagPressureSensor> n2FillingPressure; + std::unique_ptr<Boardcore::TrafagPressureSensor> oxTankTopPressure; + std::unique_ptr<Boardcore::TrafagPressureSensor> oxTankBottomPressure; + std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> oxVesselWeight; + std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> oxTankWeight; // Digital sensors std::unique_ptr<Boardcore::ADS131M08> adc1; + std::unique_ptr<Boardcore::ADS131M08> adc2; std::unique_ptr<Boardcore::MAX31856> tc1; std::unique_ptr<Boardcore::InternalADC> internalAdc; std::unique_ptr<Boardcore::SensorManager> manager; diff --git a/src/RIGv2/Sensors/SensorsData.h b/src/RIGv2/Sensors/SensorsData.h index 5f418da1ef30262444e114f47359ae3954a11428..c598c0a2a0f9d87e8fc19f7e0df682450a0a194b 100644 --- a/src/RIGv2/Sensors/SensorsData.h +++ b/src/RIGv2/Sensors/SensorsData.h @@ -1,5 +1,5 @@ /* Copyright (c) 2024 Skyward Experimental Rocketry - * Authors: Davide Mor + * Authors: Davide Mor, Niccolò Betto * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -39,6 +39,16 @@ struct ADC1Data : Boardcore::ADS131M08Data ADC1Data() {} }; +struct ADC2Data : Boardcore::ADS131M08Data +{ + explicit ADC2Data(const Boardcore::ADS131M08Data& data) + : Boardcore::ADS131M08Data(data) + { + } + + ADC2Data() {} +}; + struct TC1Data : Boardcore::MAX31856Data { explicit TC1Data(const Boardcore::MAX31856Data& data) @@ -49,64 +59,94 @@ struct TC1Data : Boardcore::MAX31856Data TC1Data() {} }; -struct VesselWeightData : Boardcore::LoadCellData +struct OxVesselWeightData : Boardcore::LoadCellData { - explicit VesselWeightData(const Boardcore::LoadCellData& data) + explicit OxVesselWeightData(const Boardcore::LoadCellData& data) : Boardcore::LoadCellData(data) { } - VesselWeightData() {} + OxVesselWeightData() {} }; -struct TankWeightData : Boardcore::LoadCellData +struct OxTankWeightData : Boardcore::LoadCellData { - explicit TankWeightData(const Boardcore::LoadCellData& data) + explicit OxTankWeightData(const Boardcore::LoadCellData& data) : Boardcore::LoadCellData(data) { } - TankWeightData() {} + OxTankWeightData() {} +}; + +struct OxVesselPressureData : Boardcore::PressureData +{ + explicit OxVesselPressureData(const Boardcore::PressureData& data) + : Boardcore::PressureData(data) + { + } + + OxVesselPressureData() {} +}; + +struct OxFillingPressureData : Boardcore::PressureData +{ + explicit OxFillingPressureData(const Boardcore::PressureData& data) + : Boardcore::PressureData(data) + { + } + + OxFillingPressureData() {} +}; + +struct N2Vessel1PressureData : Boardcore::PressureData +{ + explicit N2Vessel1PressureData(const Boardcore::PressureData& data) + : Boardcore::PressureData(data) + { + } + + N2Vessel1PressureData() {} }; -struct VesselPressureData : Boardcore::PressureData +struct N2Vessel2PressureData : Boardcore::PressureData { - explicit VesselPressureData(const Boardcore::PressureData& data) + explicit N2Vessel2PressureData(const Boardcore::PressureData& data) : Boardcore::PressureData(data) { } - VesselPressureData() {} + N2Vessel2PressureData() {} }; -struct FillingPressureData : Boardcore::PressureData +struct N2FillingPressureData : Boardcore::PressureData { - explicit FillingPressureData(const Boardcore::PressureData& data) + explicit N2FillingPressureData(const Boardcore::PressureData& data) : Boardcore::PressureData(data) { } - FillingPressureData() {} + N2FillingPressureData() {} }; -struct TopTankPressureData : Boardcore::PressureData +struct OxTankTopPressureData : Boardcore::PressureData { - explicit TopTankPressureData(const Boardcore::PressureData& data) + explicit OxTankTopPressureData(const Boardcore::PressureData& data) : Boardcore::PressureData(data) { } - TopTankPressureData() {} + OxTankTopPressureData() {} }; -struct BottomTankPressureData : Boardcore::PressureData +struct OxTankBottomPressureData : Boardcore::PressureData { - explicit BottomTankPressureData(const Boardcore::PressureData& data) + explicit OxTankBottomPressureData(const Boardcore::PressureData& data) : Boardcore::PressureData(data) { } - BottomTankPressureData() {} + OxTankBottomPressureData() {} }; } // namespace RIGv2 diff --git a/src/RIGv2/StateMachines/TARS1/TARS1.cpp b/src/RIGv2/StateMachines/TARS1/TARS1.cpp index 50a1f90d7c405769b4f0a03bf1a42ec5f420ca55..b6806abf3b158366ba876131d98024c2cbd8c86a 100644 --- a/src/RIGv2/StateMachines/TARS1/TARS1.cpp +++ b/src/RIGv2/StateMachines/TARS1/TARS1.cpp @@ -257,8 +257,8 @@ void TARS1::sample() { Sensors* sensors = getModule<Sensors>(); - pressureFilter.add(sensors->getBottomTankPressLastSample().pressure); - massFilter.add(sensors->getTankWeightLastSample().load); + pressureFilter.add(sensors->getOxTankBottomPressure().pressure); + massFilter.add(sensors->getOxTankWeight().load); medianSamples++; if (medianSamples == Config::TARS1::MEDIAN_SAMPLE_NUMBER) diff --git a/src/RIGv2/rig-v2-entry.cpp b/src/RIGv2/rig-v2-entry.cpp index ebc6174462b608020ed3757a216a2adaf8dbbdb6..b8ec84e95f5c374fc1cbf0caed1bce28ce6375f1 100644 --- a/src/RIGv2/rig-v2-entry.cpp +++ b/src/RIGv2/rig-v2-entry.cpp @@ -208,8 +208,12 @@ int main() std::cout << "Sensor status:" << std::endl; for (auto info : sensors->getSensorInfos()) { + auto statusStr = !info.isEnabled ? "Disabled" + : info.isInitialized ? "Ok" + : "Error"; + std::cout << "\t" << std::setw(16) << std::left << info.id << " " - << (info.isInitialized ? "Ok" : "Error") << std::endl; + << statusStr << std::endl; } // Periodic statistics