Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
da82c1a
ecu protocol init
EugeneShilin Mar 20, 2026
f439e1c
rename script to uvh170
EugeneShilin Mar 23, 2026
0df0ba8
subsystems implemented
EugeneShilin Mar 23, 2026
c5edb1c
CAN agl removed
EugeneShilin Mar 23, 2026
a4caa76
agl fixed
EugeneShilin Mar 24, 2026
ac5e0c1
pu tested
EugeneShilin Mar 24, 2026
0ece5ce
ecu fixed
EugeneShilin Mar 24, 2026
806e758
fix ecu processor
EugeneShilin Mar 24, 2026
9eb9ded
refactor
EugeneShilin Mar 24, 2026
e39d443
vesc functions
EugeneShilin Mar 24, 2026
e7adf08
various fixes
EugeneShilin Mar 25, 2026
479982c
user var changed
EugeneShilin Mar 25, 2026
a3acb36
fix user variables
EugeneShilin Mar 25, 2026
d94e013
ECU script separated
EugeneShilin Apr 22, 2026
bc47b05
ecu script fix
EugeneShilin Apr 23, 2026
ff67bb1
script for fuel sensor
EugeneShilin Apr 23, 2026
2177777
comment
EugeneShilin Apr 23, 2026
e001368
map thr from 0..1 to -1..1
EugeneShilin Apr 23, 2026
b588892
fuel pressure added
EugeneShilin Apr 23, 2026
83c165f
anti glitch logic for rpm value
EugeneShilin Apr 23, 2026
bd3bb7a
fuel script merged to main script
EugeneShilin May 18, 2026
24c02d5
fix ECU vcp message
EugeneShilin May 19, 2026
50b428b
fix ignition field in message
EugeneShilin May 19, 2026
b60d48c
eng starter procedure implemented
EugeneShilin May 19, 2026
7e2181e
starter procedure optimized
EugeneShilin May 19, 2026
0bdb372
ECU values refactored
EugeneShilin May 21, 2026
37cf26c
change user variables
EugeneShilin May 22, 2026
1c1520f
starter time decreased
EugeneShilin May 22, 2026
92b33f4
starter time 3sec
EugeneShilin May 22, 2026
4d2145c
throttle during start moved to config
EugeneShilin May 22, 2026
c7af2aa
power unit user variables
EugeneShilin May 25, 2026
227c889
user variables changed
EugeneShilin May 26, 2026
35d7c8f
pu hold mechanism
EugeneShilin May 28, 2026
32c4e98
rotor rpm variable changed
EugeneShilin May 28, 2026
b069c80
change ecu port id to work with plugin
EugeneShilin Jun 3, 2026
f4fbc53
ECU variables updated
EugeneShilin Aug 25, 2026
0133009
main script updated
EugeneShilin Aug 25, 2026
8cb5676
scripts moved to vehicles
EugeneShilin Aug 25, 2026
42fe19b
files renamed to represent nodes
EugeneShilin Aug 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 149 additions & 0 deletions vehicles/heli/uvh170/ifc.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
#include <apx.h>

const uint8_t PORT_ID{8};
const uint8_t PACK_SIZE_CAN{12};
const uint8_t TASK_ECU_MS{10};

const uint16_t CAN_BASE_ADDR{1520};
const uint8_t OFFSET_CAN_ID_CURRENT_THROTTLE{71};
const uint16_t CAN_ID_CURRENT_THROTTLE = CAN_BASE_ADDR + OFFSET_CAN_ID_CURRENT_THROTTLE;

//u2 u3 u4 u10 are already used in adc & gpio
//ECU values
using m_ego = Mandala<mandala::est::env::usrf::f1>;
using m_clt = Mandala<mandala::est::env::usrf::f2>;
using m_baro = Mandala<mandala::est::env::usrf::f3>;
using m_map = Mandala<mandala::est::env::usrf::f4>;
using m_tps = Mandala<mandala::est::env::usrf::f5>;
using m_vbat = Mandala<mandala::est::env::usrf::f6>;
using m_mat = Mandala<mandala::est::env::usrf::f7>;

using m_egt_1 = Mandala<mandala::est::env::usrw::w1>;
using m_egt_2 = Mandala<mandala::est::env::usrw::w2>;
using m_egt_3 = Mandala<mandala::est::env::usrw::w3>;
using m_egt_4 = Mandala<mandala::est::env::usrw::w4>;

using m_rpm = Mandala<mandala::est::env::usrw::w5>;

using m_eng_ctr = Mandala<mandala::ctr::nav::eng::thr>;
using m_pwr_ign = Mandala<mandala::ctr::env::pwr::eng>;

int main()
{
schedule_periodic(task("on_ecu"), TASK_ECU_MS);

m_pwr_ign(); //subscribe
m_eng_ctr();

receive(PORT_ID, "on_serial");
}

void setThrottleIgn()
{
uint8_t data[13];
data[0] = CAN_ID_CURRENT_THROTTLE & 0xFF;
data[1] = (CAN_ID_CURRENT_THROTTLE >> 8) & 0xFF;
data[2] = (CAN_ID_CURRENT_THROTTLE >> 16) & 0xFF;
data[3] = (CAN_ID_CURRENT_THROTTLE >> 24) & 0xFF;

float ch_throttle = m_eng_ctr::value(); // 0 ... +1.0
//printf("thr:%.2f", ch_throttle);
memcpy(&data[4], &ch_throttle, 4); // copy float bytes to data

uint8_t power_eng = (bool) m_pwr_ign::value(); // 0 / 1
data[8] = power_eng;
send(PORT_ID, data, 9, true);
}

EXPORT void on_ecu()
{
setThrottleIgn();
}

EXPORT void on_serial(const uint8_t *data, size_t size)
{
//printf("%d", size);
if (size != PACK_SIZE_CAN) {
//return;
}

uint32_t can_id = (uint32_t) (data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24));
can_id &= 0x7FFFFFFF; // 32nd bit is ext/std flag
//printf("can_id:%d\n", can_id - 1520);

uint8_t can_data[8] = {};
for (uint8_t i = 0; i < 8; i++) {
can_data[i] = data[4 + i]; // 4 is data position
}

//CAN ID 0XFFFF
switch (can_id & 0xFFFF) {
// baro, map, mat, clt
case CAN_BASE_ADDR + 2: {
float baro = ((int16_t) data[4] << 8 | data[5]) / 10.f; // kPa
float map = ((int16_t) data[6] << 8 | data[7]) / 10.f; // kPa
float mat_F = ((int16_t) data[8] << 8 | data[9]) / 10.f; // deg F
float clt_F = ((int16_t) data[10] << 8 | data[11]) / 10.f; // deg F

float mat_C = (mat_F - 32.0f) * 5.0f / 9.0f;
float clt_C = (clt_F - 32.0f) * 5.0f / 9.0f;

m_mat::publish(mat_C); // manifold air temperature [deg C]
m_clt::publish(clt_C); // Coolant temperature [deg C]
m_baro::publish(baro); // Barometric pressure [kPa]
m_map::publish(map); // Manifold absolute pressure [kPa]
break;
}

case CAN_BASE_ADDR + 15: {
// oil_press.not used
break;
}

// egt
case CAN_BASE_ADDR + 22: {
//printf("egt");
float egt[4];
for (uint8_t i = 0; i < 4; i++) {
uint8_t idx = i * 2 + 4;
uint16_t raw_egt = (uint16_t) (data[idx] << 8) + data[idx + 1]; // EGT1 deg F s
egt[i] = float(raw_egt);
}

m_egt_1::publish(egt[0] / 10.f); //EGT1
m_egt_2::publish(egt[1] / 10.f); //EGT2
m_egt_3::publish(egt[2] / 10.f); //EGT3
m_egt_4::publish(egt[3] / 10.f); //EGT4
break;
}

//pw1 pw2 rpm
case CAN_BASE_ADDR + 0: {
//uint16_t seconds = data[4] << 8 | data[5];
//uint16_t pw1 = ((uint16_t) data[6] << 8 | data[7]); //us
//uint16_t pw2 = ((uint16_t) data[8] << 8 | data[9]); //us
uint16_t rpm = data[10] << 8 | data[11];
m_rpm::publish((uint32_t) rpm); // engine rpm

break;
}

//tps, Vbat
case CAN_BASE_ADDR + 3: {
float tps = ((int16_t) (data[4] << 8) | data[5]) / 10.f; // %
float vbat = ((int16_t) data[6] << 8 | data[7]) / 10.f; // V
float ego = ((int16_t) (data[8] << 8) | data[9]) / 10.f; // lambda
//printf("ego: %.2f", ego);

m_tps::publish(tps); // Throttle position [%]
m_vbat::publish(vbat); // Battery voltage [V]
m_ego::publish(ego); // Exhaust gas oxygen sensor [lambda]
break;
}
//??
case CAN_BASE_ADDR + 72: {
//not used
break;
}
}
}
Loading