From d0a77bd898d14cfef1b009ec7bc00680be8edadf Mon Sep 17 00:00:00 2001 From: Andrey Gusakov Date: Tue, 9 May 2023 00:22:49 +0300 Subject: [PATCH] CAN: MS Simplified Dash Bradcasting --- firmware/controllers/can/can_dash_ms.cpp | 130 +++++++++++++++++++++++ firmware/controllers/controllers.mk | 1 + 2 files changed, 131 insertions(+) create mode 100644 firmware/controllers/can/can_dash_ms.cpp diff --git a/firmware/controllers/can/can_dash_ms.cpp b/firmware/controllers/can/can_dash_ms.cpp new file mode 100644 index 0000000000..0133d378a2 --- /dev/null +++ b/firmware/controllers/can/can_dash_ms.cpp @@ -0,0 +1,130 @@ +/** + * @file can_dash_ms.cpp + * + * This file implements MegaSquirt CAN realtime data broadcasting format + * + * @date May 8, 2023 + * @author AndreyGusakov, (c) 2023 + */ + +#include "pch.h" + +#if EFI_CAN_SUPPORT +#include "can.h" +#include "can_msg_tx.h" + +#include "rusefi_types.h" +#include "rtc_helper.h" +#include "fuel_math.h" + +/* TODO: + * use engine->outputChannels instead of Sensor::getOrZero as it cheaper */ + +struct ms1512 { + /* kPa */ + scaled_channel Map; + /* RPM */ + scaled_channel Rpm; + /* Fahrenheit! */ + scaled_channel Clt; + /* % */ + scaled_channel Tps; +}; + +static void populateFrame(ms1512& msg) +{ + msg.Map = Sensor::getOrZero(SensorType::Map); + msg.Rpm = Sensor::getOrZero(SensorType::Rpm); + /* Celsius to Fahrenheit */ + msg.Clt = Sensor::getOrZero(SensorType::Clt) * 9 / 5 + 32; + msg.Tps = Sensor::getOrZero(SensorType::Tps1); +} + +struct ms1513 { + /* mS */ + scaled_channel pw1; + scaled_channel pw2; + scaled_channel mat; + scaled_channel adv_deg; +}; + +static void populateFrame(ms1513& msg) +{ + /* TODO: per-bank */ + msg.pw1 = msg.pw2 = engine->engineState.injectionDuration; + /* Celsius to Fahrenheit */ + msg.mat = Sensor::getOrZero(SensorType::Iat) * 9 / 5 + 32; + float timing = engine->engineState.timingAdvance[0]; + msg.adv_deg = timing > 360 ? timing - 720 : timing; +} + +struct ms1514 { + scaled_channel afrtgt1; + scaled_channel AFR1; + scaled_channel EGOcor1; + scaled_channel egt1; + scaled_channel pwseq1; +}; + +static void populateFrame(ms1514& msg) +{ + msg.afrtgt1 = (float)engine->fuelComputer.targetLambda * STOICH_RATIO; + msg.AFR1 = Sensor::getOrZero(SensorType::Lambda1) * STOICH_RATIO; + /* TODO: banks? */ + msg.EGOcor1 = engine->stftCorrection[0]; + /* TODO */ + msg.egt1 = 0; + msg.pwseq1 = engine->engineState.injectionDuration; +} + +struct ms1515 { + scaled_channel Vbat; + scaled_channel sensor1; + scaled_channel sensor2; + scaled_channel knk_rtd; + uint8_t unused; /* do we need this? */ +}; + +static void populateFrame(ms1515& msg) +{ + msg.Vbat = Sensor::getOrZero(SensorType::BatteryVoltage); + /* TODO */ + msg.sensor1 = 0; + msg.sensor2 = 0; + msg.knk_rtd = engine->outputChannels.knockLevel; + msg.unused = 0; +} + +struct ms1516 { + scaled_channel VSS1; + scaled_channel tc_retard; + scaled_channel launch_timing; + uint16_t unsused; +}; + +static void populateFrame(ms1516& msg) +{ + /* ms-1 ??? */ + msg.VSS1 = Sensor::getOrZero(SensorType::VehicleSpeed); + /* TODO */ + msg.tc_retard = 0; + msg.launch_timing = 0; + msg.unsused = 0; +} + +void canDashboardTS(CanCycle cycle) { + /* TODO: get from settings */ + uint32_t baseId = 1512; /* 0x5e8 */ + + if (!cycle.isInterval(CI::_10ms)) { + return; + } + + transmitStruct(CanCategory::NBC, baseId + 0, false); + transmitStruct(CanCategory::NBC, baseId + 1, false); + transmitStruct(CanCategory::NBC, baseId + 2, false); + transmitStruct(CanCategory::NBC, baseId + 3, false); + transmitStruct(CanCategory::NBC, baseId + 4, false); +} + +#endif /* EFI_CAN_SUPPORT */ diff --git a/firmware/controllers/controllers.mk b/firmware/controllers/controllers.mk index aff02568b3..5ae11a61c1 100644 --- a/firmware/controllers/controllers.mk +++ b/firmware/controllers/controllers.mk @@ -50,6 +50,7 @@ CONTROLLERS_SRC_CPP = \ $(CONTORLLERS_DIR)/can/rusefi_wideband.cpp \ $(CONTROLLERS_DIR)/can/can_tx.cpp \ $(CONTROLLERS_DIR)/can/can_dash.cpp \ + $(CONTROLLERS_DIR)/can/can_dash_ms.cpp \ $(CONTROLLERS_DIR)/can/can_vss.cpp \ $(CONTROLLERS_DIR)/engine_controller.cpp \ $(CONTROLLERS_DIR)/engine_controller_misc.cpp \