diff --git a/ECU.ino b/ECU.ino index fa17d87..c3ff20c 100644 --- a/ECU.ino +++ b/ECU.ino @@ -19,11 +19,11 @@ void setup() { digitalWrite(pin_coil1, LOW); digitalWrite(pin_coil2, LOW); + // Injector Outputs pinMode(pin_injector1, OUTPUT); pinMode(pin_injector2, OUTPUT); pinMode(pin_injector3, OUTPUT); pinMode(pin_injector4, OUTPUT); - digitalWrite(pin_injector1, LOW); digitalWrite(pin_injector2, LOW); digitalWrite(pin_injector3, LOW); diff --git a/cas.ino b/cas.ino index d86e7e4..39deddd 100644 --- a/cas.ino +++ b/cas.ino @@ -46,8 +46,12 @@ void cas_process() // We'll drop sparks until we're back and log it if(cylinder_next_seq[cylinder_tdc] != 1) { + // Don't output if it's already happened once + if(cas_sync_fail == 0) + cas_sync_fail_log=1; + + // Log fail so we abandon time sensitive stuff cas_sync_fail=1; - cas_sync_fail_log=1; } else { diff --git a/debug.ino b/debug.ino index 3586627..56460e7 100644 --- a/debug.ino +++ b/debug.ino @@ -1,48 +1,20 @@ +byte debug_live_index = 0; +byte debug_rpm = 0; + void debug_setup() { Serial.begin(115200); + // Flush Serial.println(""); Serial.println(""); - Serial.print("DAT: "); - Serial.print("map_current_index"); - Serial.print(","); - Serial.print("rpm_current_index"); - Serial.print(","); - Serial.print("battery_voltage_index"); - Serial.print(","); - Serial.print("map_current_value"); - Serial.print(","); - Serial.print("rpm_current_value"); - Serial.print(","); - Serial.print("battery_voltage_value"); - Serial.print(","); - Serial.print("throttle_current_value"); - Serial.println(""); - // Now we have init we can do real loop task_debug = 1; } void task_debug_run() { - Serial.print("DAT: "); - Serial.print(map_current_index); - Serial.print(","); - Serial.print(rpm_current_index); - Serial.print(","); - Serial.print(battery_voltage_index); - Serial.print(","); - Serial.print(map_current_value); - Serial.print(","); - Serial.print(rpm_current_value); - Serial.print(","); - Serial.print(battery_voltage_value); - Serial.print(","); - Serial.print(throttle_current_value); - Serial.println(""); - // Log if we're out of sync timing-wise if(cas_sync_fail_log > 0) { @@ -56,6 +28,156 @@ void task_debug_run() Serial.println("ERR: RPM limit"); rpm_limited_log = 0; } + + // If we're outputting live index - print it + if(debug_live_index == 1) + { + Serial.print("IDX: "); + Serial.println(rpm_current_index + (map_current_index << 4)); + } + + // If we're currently outputting RPM - print it + if(debug_rpm == 1) + { + Serial.print("RPM: "); + Serial.println(rpm_current_value); + } + + // If we're being asked for something + if (Serial.available() > 0) + { + // Kills ignition and injection until CAS re-sync (for safety in long I/O) + task_debug_safekill(); + + // Read the first char (the command) + char readbyte = Serial.read(); + + + if(readbyte == 't') // Dump table + { + readbyte = Serial.read(); + + // i for ignition and f for fel + if(readbyte == 'f') + task_debug_dumpfueltable(); + else if(readbyte == 'i') + task_debug_dumpignitiontable(); + } + else if(readbyte == 'T') // Ammend table + { + // Up to the first comma is the table (as on a read) + String table = ""; + while(1) + { + readbyte = Serial.read(); + if(readbyte == ',') + break; + else + table += readbyte; + } + + // The next parameter is the index in the table (TODO: bounds check?) + String index = ""; + while(1) + { + readbyte = Serial.read(); + if(readbyte == ',') + break; + else + index += readbyte; + } + + // The final section is the value in decimal (TODO: bounds check?) + String value = ""; + while(1) + { + readbyte = Serial.read(); + if(readbyte == '\n') + break; + else + value += readbyte; + } + + // Update the value + if(table == "i") + { + table_ignition[index.toInt()] = value.toInt(); + }else if(table == "f") + { + table_pulsewidth[index.toInt()] = value.toInt(); + } + }else if(readbyte == 'i') // Disable index output + { + debug_live_index = 0; + }else if(readbyte == 'I') // Enable index output + { + debug_live_index = 1; + }else if(readbyte == 'r') // Disable RPM output + { + debug_rpm = 0; + }else if(readbyte == 'R') // Enable RPM output + { + debug_rpm = 1; + } + } } +// Outputs the fuel table as JSON +void task_debug_dumpfueltable() +{ + Serial.print("TBF: ["); + for(int i=0; i <= 255; i++) + { + Serial.print(table_pulsewidth[i]); + if(i != 255) + Serial.print(","); + } + Serial.print("]\n"); +} + +// Ignition table as json +void task_debug_dumpignitiontable() +{ + Serial.print("TBI: ["); + for(int i=0; i <= 255; i++) + { + Serial.print(table_ignition[i]); + if(i != 255) + Serial.print(","); + } + Serial.print("]\n"); +} + +// Stops charging all coils, closes all injectors +// Marks CAS as out of sync to prevent anything changing +void task_debug_safekill() +{ + // Stop charging coils + task_coilx_fire_run(pin_coil1); + task_coilx_fire_run(pin_coil2); + + // Close all injectors + task_injectorx_close_run(pin_injector1); + task_injectorx_close_run(pin_injector2); + task_injectorx_close_run(pin_injector3); + task_injectorx_close_run(pin_injector4); + + // Cancel all scheduled timing-sensitive events + task_coil1_charge = 0; + task_coil1_fire = 0; + task_coil2_charge = 0; + task_coil2_fire = 0; + task_injector1_open = 0; + task_injector1_close = 0; + task_injector2_open = 0; + task_injector2_close = 0; + task_injector3_open = 0; + task_injector3_close = 0; + task_injector4_open = 0; + task_injector4_close = 0; + + // And dont schedule any more until we're back in sync (two Cly1 TDC events matching predictions) + cas_sync_fail=1; + cas_sync_fail_log=0; +} diff --git a/tables.h b/tables.h index 7babf1b..0229544 100644 --- a/tables.h +++ b/tables.h @@ -1,8 +1,16 @@ // X = RPM 0 - 7200 -// Y = kPA 250 - 20 +// Y = kPA 20 - 250 // Index = [rpm_current_index + (map_current_index << 4)] // Value = injector base pulse width int table_pulsewidth[] = { + 2010, 2020, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2030, 2040, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 3000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 4000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, @@ -10,19 +18,11 @@ int table_pulsewidth[] = { 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000 + 2050, 2060, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2070, 2080 }; -// X = RPM 0 - 7200 -// Y = kPA 250 - 20 +// X = RPM 0 - 15 (0 - 7200) +// Y = kPA 0 - 15 (20 - 250) // Index = [rpm_current_index + (map_current_index << 4)] // Value = degrees byte table_ignition[] = { @@ -44,14 +44,14 @@ byte table_ignition[] = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -// X = Voltage 7-16 +// X = Voltage 0 - 9 (7-16) // Index = [battery_voltage_index] // Value = additional dwell in usec const int table_dwell_voltage[] = { 2000, 2000, 2000, 2000, 1000, 0, 0, 0, 0, 0 }; -// X = RPM 0 - 7200 +// X = RPM 0 - 15 (0 - 7200) // Index = [rpm_current_index] // Value = additional dwell in usec const int table_dwell_rpm[] = {