From 0b09380a8b4dea962d5fe5c75fd82a3112efef1f Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 10 Jan 2023 11:07:22 -0800 Subject: [PATCH 1/6] tooth log converter (#4960) --- misc/tooth_log_converter/.gitignore | 3 ++ misc/tooth_log_converter/build.sh | 3 ++ misc/tooth_log_converter/log_convert.cpp | 46 ++++++++++++++++++++++++ misc/tooth_log_converter/readme.md | 11 ++++++ 4 files changed, 63 insertions(+) create mode 100644 misc/tooth_log_converter/.gitignore create mode 100755 misc/tooth_log_converter/build.sh create mode 100644 misc/tooth_log_converter/log_convert.cpp create mode 100644 misc/tooth_log_converter/readme.md diff --git a/misc/tooth_log_converter/.gitignore b/misc/tooth_log_converter/.gitignore new file mode 100644 index 0000000000..36dd5a9d2a --- /dev/null +++ b/misc/tooth_log_converter/.gitignore @@ -0,0 +1,3 @@ +*.teeth +*.csv +log_convert diff --git a/misc/tooth_log_converter/build.sh b/misc/tooth_log_converter/build.sh new file mode 100755 index 0000000000..739e820806 --- /dev/null +++ b/misc/tooth_log_converter/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +g++ -O2 -lstdc++ log_convert.cpp -o log_convert diff --git a/misc/tooth_log_converter/log_convert.cpp b/misc/tooth_log_converter/log_convert.cpp new file mode 100644 index 0000000000..375c539e3a --- /dev/null +++ b/misc/tooth_log_converter/log_convert.cpp @@ -0,0 +1,46 @@ +#include +#include +#include + +typedef struct __attribute__ ((packed)) { + // the whole order of all packet bytes is reversed, not just the 'endian-swap' integers + uint32_t timestamp; + // unfortunately all these fields are required by TS... + bool priLevel : 1; + bool secLevel : 1; + bool trigger : 1; + bool sync : 1; + bool coil : 1; + bool injector : 1; +} composite_logger_s; + +static_assert(sizeof(composite_logger_s) == 5); + +static inline uint32_t SWAP_UINT32(uint32_t x) +{ + return (((x >> 24) & 0x000000ff) | ((x << 8) & 0x00ff0000) | + ((x >> 8) & 0x0000ff00) | ((x << 24) & 0xff000000)); +} + +static constexpr double ticksPerSecond = 1e6; + +int main(int argc, char** argv) +{ + std::ifstream src(argv[1], std::ios::binary); + std::ofstream dst(argv[2], std::ios::binary); + + dst << std::setprecision(10); + + dst << "timestamp,pri,sec" << std::endl; + + while (!src.eof()) + { + composite_logger_s entry; + + src.read(reinterpret_cast(&entry), sizeof(composite_logger_s)); + + double sec = SWAP_UINT32(entry.timestamp) / ticksPerSecond; + + dst << sec << "," << entry.priLevel << "," << entry.secLevel << std::endl; + } +} diff --git a/misc/tooth_log_converter/readme.md b/misc/tooth_log_converter/readme.md new file mode 100644 index 0000000000..1edf156ddc --- /dev/null +++ b/misc/tooth_log_converter/readme.md @@ -0,0 +1,11 @@ +# SD Tooth Log Converter + +This program converts SD stored tooth logs to csv for analysis or replay as part of a unit test. + +Create a log by setting "SD logger mode" to "trigger", then restart the ECU with an SD card present (but without USB connected), then crank/run/etc the engine to save a log. Restart again with USB to pull the log off. + +# Usage + +`./build.sh` + +`./log_convert myToothLog.teeth convertedCsv.csv` From 1f0953aec01a33bc3580b2d6c98c003a364f4316 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 10 Jan 2023 11:08:59 -0800 Subject: [PATCH 2/6] don't print "sim_warning %s" (#4959) --- firmware/controllers/core/error_handling.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/firmware/controllers/core/error_handling.cpp b/firmware/controllers/core/error_handling.cpp index 39f43d7f06..4bdd736f43 100644 --- a/firmware/controllers/core/error_handling.cpp +++ b/firmware/controllers/core/error_handling.cpp @@ -139,10 +139,6 @@ bool warning(obd_code_e code, const char *fmt, ...) { if (hasFirmwareErrorFlag) return true; -#if EFI_SIMULATOR - printf("sim_warning %s\r\n", fmt); -#endif /* EFI_SIMULATOR */ - #if EFI_SIMULATOR || EFI_PROD_CODE // we just had this same warning, let's not spam if (engine->engineState.warnings.isWarningNow(code) || !warningEnabled) { From 38bd9f1a1eef733dd70e59aa666651e414666bc2 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 10 Jan 2023 11:10:30 -0800 Subject: [PATCH 3/6] support Toyota ETCS-i tps/pps (#4898) * cfg * cfg * configurable "ford tps" mode for TPS + PPS * comments * comment * fix deinit RedundantFordTps unregister sensor in case useFordRedundant* changes, avoiding ECU config error * better validation * use activeConfiguration on deinit path * use define * use smaller unused hole * s Co-authored-by: Nathan Schulte --- firmware/init/sensor/init_tps.cpp | 52 +++++++++++++++++++------- firmware/integration/rusefi_config.txt | 7 ++-- firmware/tunerstudio/rusefi.input | 4 ++ 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/firmware/init/sensor/init_tps.cpp b/firmware/init/sensor/init_tps.cpp index 0beebb9c32..cff857b167 100644 --- a/firmware/init/sensor/init_tps.cpp +++ b/firmware/init/sensor/init_tps.cpp @@ -41,7 +41,7 @@ public: return m_sens.Register(); } - void unsubscribe() { + void deinit() { AdcSubscription::UnsubscribeSensor(m_sens); } @@ -101,7 +101,7 @@ public: { } - void init(bool isFordTps, RedundantFordTps* fordTps, const TpsConfig& primary, const TpsConfig& secondary) { + void init(bool isFordTps, RedundantFordTps* fordTps, float secondaryMaximum, const TpsConfig& primary, const TpsConfig& secondary) { bool hasFirst = m_pri.init(primary); if (!hasFirst) { // no input if we have no first channel @@ -125,7 +125,7 @@ public: if (isFordTps && fordTps) { // we have a secondary - fordTps->configure(5.0f, 52.6f); + fordTps->configure(MAX_TPS_PPS_DISCREPANCY, secondaryMaximum); fordTps->Register(); } else { // not ford TPS @@ -137,9 +137,16 @@ printf("init m_redund.Register() %s\n", getSensorType(m_redund.type())); } } - void unsubscribe() { - m_pri.unsubscribe(); - m_sec.unsubscribe(); + void deinit(bool isFordTps, RedundantFordTps* fordTps) { + m_pri.deinit(); + m_sec.deinit(); + + if (isFordTps && fordTps) { + fordTps->unregister(); + } else { + m_redund.unregister(); + } + } private: @@ -161,6 +168,7 @@ static RedundantPair tps2(tps2p, tps2s, SensorType::Tps2); // Used only in case of weird Ford-style ETB TPS static RedundantFordTps fordTps1(SensorType::Tps1, SensorType::Tps1Primary, SensorType::Tps1Secondary); static RedundantFordTps fordTps2(SensorType::Tps2, SensorType::Tps2Primary, SensorType::Tps2Secondary); +static RedundantFordTps fordPps(SensorType::AcceleratorPedal, SensorType::AcceleratorPedalPrimary, SensorType::AcceleratorPedalSecondary); // Pedal sensors and redundancy static FuncSensPair pedalPrimary(1, SensorType::AcceleratorPedalPrimary); @@ -181,19 +189,32 @@ void initTps() { if (!engineConfiguration->consumeObdSensors) { bool isFordTps = engineConfiguration->useFordRedundantTps; + bool isFordPps = engineConfiguration->useFordRedundantPps; - tps1.init(isFordTps, &fordTps1, + float tpsSecondaryMaximum = engineConfiguration->tpsSecondaryMaximum; + if (tpsSecondaryMaximum < 20) { + // don't allow <20% split point + tpsSecondaryMaximum = 20; + } + + tps1.init(isFordTps, &fordTps1, tpsSecondaryMaximum, { engineConfiguration->tps1_1AdcChannel, (float)engineConfiguration->tpsMin, (float)engineConfiguration->tpsMax, min, max }, { engineConfiguration->tps1_2AdcChannel, (float)engineConfiguration->tps1SecondaryMin, (float)engineConfiguration->tps1SecondaryMax, min, max } ); - tps2.init(isFordTps, &fordTps2, + tps2.init(isFordTps, &fordTps2, tpsSecondaryMaximum, { engineConfiguration->tps2_1AdcChannel, (float)engineConfiguration->tps2Min, (float)engineConfiguration->tps2Max, min, max }, { engineConfiguration->tps2_2AdcChannel, (float)engineConfiguration->tps2SecondaryMin, (float)engineConfiguration->tps2SecondaryMax, min, max } ); + float ppsSecondaryMaximum = engineConfiguration->ppsSecondaryMaximum; + if (ppsSecondaryMaximum < 20) { + // don't allow <20% split point + ppsSecondaryMaximum = 20; + } + // Pedal sensors - pedal.init(false, nullptr, + pedal.init(isFordPps, &fordPps, ppsSecondaryMaximum, { engineConfiguration->throttlePedalPositionAdcChannel, engineConfiguration->throttlePedalUpVoltage, engineConfiguration->throttlePedalWOTVoltage, min, max }, { engineConfiguration->throttlePedalPositionSecondAdcChannel, engineConfiguration->throttlePedalSecondaryUpVoltage, engineConfiguration->throttlePedalSecondaryWOTVoltage, min, max } ); @@ -214,10 +235,13 @@ void initTps() { } void deinitTps() { - tps1.unsubscribe(); - tps2.unsubscribe(); - pedal.unsubscribe(); + bool isFordTps = activeConfiguration.useFordRedundantTps; + bool isFordPps = activeConfiguration.useFordRedundantPps; - wastegate.unsubscribe(); - idlePos.unsubscribe(); + tps1.deinit(isFordTps, &fordTps1); + tps2.deinit(isFordTps, &fordTps2); + pedal.deinit(isFordTps, &fordPps); + + wastegate.deinit(); + idlePos.deinit(); } diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 8feee2c43b..6fb4092082 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -446,7 +446,7 @@ end_struct injector_s injector bit isForcedInduction;Does the vehicle have a turbo or supercharger? -bit useFordRedundantTps;On Ford vehicles one of the sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor. +bit useFordRedundantTps;On some Ford and Toyota vehicles one of the throttle sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor. bit isVerboseAuxPid1 bit overrideTriggerGaps bit enableFan1WithAc;Turn on this fan when AC is on. @@ -475,7 +475,7 @@ bit enableMapEstimationTableFallback;If enabled, the MAP estimate table will be bit usescriptTableForCanSniffingFiltering bit verboseCan,"Print all","Do not print";Print incoming and outgoing first bus CAN messages in rusEFI console bit artificialTestMisfire,"Danger Mode","No thank you";Experimental setting that will cause a misfire\nDO NOT ENABLE. -bit issue_294_31,"si_example","nada_example" +bit useFordRedundantPps;On some Ford and Toyota vehicles one of the pedal sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor. !todo: extract these two fields into a structure @@ -1560,7 +1560,8 @@ uint8_t alsEtbPosition;;"", 1, 0, 0, 20000, 0 uint8_t ALSMaxDriverThrottleIntent;;"%", 1, 0, 0, 10, 0 pin_input_mode_e ALSActivatePinMode; -uint8_t[2] unusedHereForYou + uint8_t autoscale tpsSecondaryMaximum;For Ford TPS, use 53%. For Toyota ETCS-i, use 65%;"%", 0.5, 0, 0, 100, 1 + uint8_t autoscale ppsSecondaryMaximum;For Toyota ETCS-i, use xxx%;"%", 0.5, 0, 0, 100, 1 pin_input_mode_e[LUA_DIGITAL_INPUT_COUNT iterate] luaDigitalInputPinModes; uint8_t[96] mainUnusedEnd;;"units", 1, 0, 0, 1, 0 diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 99c34e89dd..a6a84fc337 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -4293,6 +4293,10 @@ dialog = tcuControls, "Transmission Settings" field = "showHumanReadableWarning (affects Burn)", showHumanReadableWarning field = "Warning Message", warning_message field = "Ford redundant TPS mode", useFordRedundantTps + field = "Secondary TPS maximum", tpsSecondaryMaximum, {useFordRedundantTps} + field = "Ford redundant PPS mode", useFordRedundantPps + field = "Secondary PPS maximum", ppsSecondaryMaximum, {useFordRedundantPps} + field = "consumeObdSensors", consumeObdSensors, { canReadEnabled == 1 && canWriteEnabled == 1} field = "Artificial Misfire", artificialTestMisfire field = "Always use instant RPM", alwaysInstantRpm From bb3cc57d53b999fd09edf8e67c86f494e1dd751d Mon Sep 17 00:00:00 2001 From: GitHub gen-configs Action Date: Tue, 10 Jan 2023 20:00:00 +0000 Subject: [PATCH 4/6] Auto-generated configs and docs --- .../controllers/generated/signature_48way.h | 4 ++-- .../controllers/generated/signature_all.h | 4 ++-- .../generated/signature_alphax-2chan.h | 4 ++-- .../generated/signature_alphax-4chan.h | 4 ++-- .../generated/signature_alphax-8chan.h | 4 ++-- .../controllers/generated/signature_atlas.h | 4 ++-- .../controllers/generated/signature_core8.h | 4 ++-- .../controllers/generated/signature_cypress.h | 4 ++-- .../generated/signature_f407-discovery.h | 4 ++-- .../generated/signature_f429-discovery.h | 4 ++-- .../generated/signature_frankenso_na6.h | 4 ++-- .../generated/signature_harley81.h | 4 ++-- .../generated/signature_hellen-gm-e67.h | 4 ++-- .../generated/signature_hellen-nb1.h | 4 ++-- .../generated/signature_hellen121nissan.h | 4 ++-- .../generated/signature_hellen121vag.h | 4 ++-- .../generated/signature_hellen128.h | 4 ++-- .../generated/signature_hellen154hyundai.h | 4 ++-- .../generated/signature_hellen72.h | 4 ++-- .../generated/signature_hellen81.h | 4 ++-- .../generated/signature_hellen88bmw.h | 4 ++-- .../generated/signature_hellenNA6.h | 4 ++-- .../generated/signature_hellenNA8_96.h | 4 ++-- .../controllers/generated/signature_kin.h | 4 ++-- .../controllers/generated/signature_m74_9.h | 4 ++-- .../controllers/generated/signature_mre_f4.h | 4 ++-- .../controllers/generated/signature_mre_f7.h | 4 ++-- .../generated/signature_prometheus_405.h | 4 ++-- .../generated/signature_prometheus_469.h | 4 ++-- .../generated/signature_proteus_f4.h | 4 ++-- .../generated/signature_proteus_f7.h | 4 ++-- .../generated/signature_proteus_h7.h | 4 ++-- .../controllers/generated/signature_s105.h | 4 ++-- .../generated/signature_subaru_eg33_f7.h | 4 ++-- .../generated/signature_tdg-pdm8.h | 4 ++-- .../lua/generated/value_lookup_generated.cpp | 22 +++++++++++++++---- .../lua/generated/value_lookup_generated.md | 12 +++++++--- 37 files changed, 97 insertions(+), 77 deletions(-) diff --git a/firmware/controllers/generated/signature_48way.h b/firmware/controllers/generated/signature_48way.h index 903680faf0..bf68a38365 100644 --- a/firmware/controllers/generated/signature_48way.h +++ b/firmware/controllers/generated/signature_48way.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_63942 -#define TS_SIGNATURE "rusEFI 2023.01.10.48way.snap_63942" +#define SIGNATURE_HASH snap_22196 +#define TS_SIGNATURE "rusEFI 2023.01.10.48way.snap_22196" diff --git a/firmware/controllers/generated/signature_all.h b/firmware/controllers/generated/signature_all.h index f688b7cf03..78d69d40db 100644 --- a/firmware/controllers/generated/signature_all.h +++ b/firmware/controllers/generated/signature_all.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_61833 -#define TS_SIGNATURE "rusEFI 2023.01.10.all.snap_61833" +#define SIGNATURE_HASH snap_24315 +#define TS_SIGNATURE "rusEFI 2023.01.10.all.snap_24315" diff --git a/firmware/controllers/generated/signature_alphax-2chan.h b/firmware/controllers/generated/signature_alphax-2chan.h index cd45b4a2be..de049de8a0 100644 --- a/firmware/controllers/generated/signature_alphax-2chan.h +++ b/firmware/controllers/generated/signature_alphax-2chan.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_27877 -#define TS_SIGNATURE "rusEFI 2023.01.10.alphax-2chan.snap_27877" +#define SIGNATURE_HASH snap_50071 +#define TS_SIGNATURE "rusEFI 2023.01.10.alphax-2chan.snap_50071" diff --git a/firmware/controllers/generated/signature_alphax-4chan.h b/firmware/controllers/generated/signature_alphax-4chan.h index 29ac8f114f..bb119defe9 100644 --- a/firmware/controllers/generated/signature_alphax-4chan.h +++ b/firmware/controllers/generated/signature_alphax-4chan.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_57504 -#define TS_SIGNATURE "rusEFI 2023.01.10.alphax-4chan.snap_57504" +#define SIGNATURE_HASH snap_20434 +#define TS_SIGNATURE "rusEFI 2023.01.10.alphax-4chan.snap_20434" diff --git a/firmware/controllers/generated/signature_alphax-8chan.h b/firmware/controllers/generated/signature_alphax-8chan.h index a55714ea9a..2bec27fea4 100644 --- a/firmware/controllers/generated/signature_alphax-8chan.h +++ b/firmware/controllers/generated/signature_alphax-8chan.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_28165 -#define TS_SIGNATURE "rusEFI 2023.01.10.alphax-8chan.snap_28165" +#define SIGNATURE_HASH snap_49527 +#define TS_SIGNATURE "rusEFI 2023.01.10.alphax-8chan.snap_49527" diff --git a/firmware/controllers/generated/signature_atlas.h b/firmware/controllers/generated/signature_atlas.h index af941ad1b6..5810fc1c85 100644 --- a/firmware/controllers/generated/signature_atlas.h +++ b/firmware/controllers/generated/signature_atlas.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_1198 -#define TS_SIGNATURE "rusEFI 2023.01.10.atlas.snap_1198" +#define SIGNATURE_HASH snap_43996 +#define TS_SIGNATURE "rusEFI 2023.01.10.atlas.snap_43996" diff --git a/firmware/controllers/generated/signature_core8.h b/firmware/controllers/generated/signature_core8.h index c598a5afe9..76726030fc 100644 --- a/firmware/controllers/generated/signature_core8.h +++ b/firmware/controllers/generated/signature_core8.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_41072 -#define TS_SIGNATURE "rusEFI 2023.01.10.core8.snap_41072" +#define SIGNATURE_HASH snap_3842 +#define TS_SIGNATURE "rusEFI 2023.01.10.core8.snap_3842" diff --git a/firmware/controllers/generated/signature_cypress.h b/firmware/controllers/generated/signature_cypress.h index 0ee5a753f6..3cf9ca67e7 100644 --- a/firmware/controllers/generated/signature_cypress.h +++ b/firmware/controllers/generated/signature_cypress.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat by SignatureConsumer // -#define SIGNATURE_HASH snap_61833 -#define TS_SIGNATURE "rusEFI 2023.01.10.cypress.snap_61833" +#define SIGNATURE_HASH snap_24315 +#define TS_SIGNATURE "rusEFI 2023.01.10.cypress.snap_24315" diff --git a/firmware/controllers/generated/signature_f407-discovery.h b/firmware/controllers/generated/signature_f407-discovery.h index fd45eff3a8..6150b4157d 100644 --- a/firmware/controllers/generated/signature_f407-discovery.h +++ b/firmware/controllers/generated/signature_f407-discovery.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_61833 -#define TS_SIGNATURE "rusEFI 2023.01.10.f407-discovery.snap_61833" +#define SIGNATURE_HASH snap_24315 +#define TS_SIGNATURE "rusEFI 2023.01.10.f407-discovery.snap_24315" diff --git a/firmware/controllers/generated/signature_f429-discovery.h b/firmware/controllers/generated/signature_f429-discovery.h index 40292efc23..b97754c295 100644 --- a/firmware/controllers/generated/signature_f429-discovery.h +++ b/firmware/controllers/generated/signature_f429-discovery.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_61833 -#define TS_SIGNATURE "rusEFI 2023.01.10.f429-discovery.snap_61833" +#define SIGNATURE_HASH snap_24315 +#define TS_SIGNATURE "rusEFI 2023.01.10.f429-discovery.snap_24315" diff --git a/firmware/controllers/generated/signature_frankenso_na6.h b/firmware/controllers/generated/signature_frankenso_na6.h index cd4176e5a2..6c5160d60f 100644 --- a/firmware/controllers/generated/signature_frankenso_na6.h +++ b/firmware/controllers/generated/signature_frankenso_na6.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_3405 -#define TS_SIGNATURE "rusEFI 2023.01.10.frankenso_na6.snap_3405" +#define SIGNATURE_HASH snap_41535 +#define TS_SIGNATURE "rusEFI 2023.01.10.frankenso_na6.snap_41535" diff --git a/firmware/controllers/generated/signature_harley81.h b/firmware/controllers/generated/signature_harley81.h index ddfa5e96ff..f2591b69d7 100644 --- a/firmware/controllers/generated/signature_harley81.h +++ b/firmware/controllers/generated/signature_harley81.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_46966 -#define TS_SIGNATURE "rusEFI 2023.01.10.harley81.snap_46966" +#define SIGNATURE_HASH snap_6148 +#define TS_SIGNATURE "rusEFI 2023.01.10.harley81.snap_6148" diff --git a/firmware/controllers/generated/signature_hellen-gm-e67.h b/firmware/controllers/generated/signature_hellen-gm-e67.h index 5c5ce85bd9..64bde1166b 100644 --- a/firmware/controllers/generated/signature_hellen-gm-e67.h +++ b/firmware/controllers/generated/signature_hellen-gm-e67.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_37517 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen-gm-e67.snap_37517" +#define SIGNATURE_HASH snap_15871 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen-gm-e67.snap_15871" diff --git a/firmware/controllers/generated/signature_hellen-nb1.h b/firmware/controllers/generated/signature_hellen-nb1.h index 455af8f9a0..4d434aebb7 100644 --- a/firmware/controllers/generated/signature_hellen-nb1.h +++ b/firmware/controllers/generated/signature_hellen-nb1.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_49221 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen-nb1.snap_49221" +#define SIGNATURE_HASH snap_28471 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen-nb1.snap_28471" diff --git a/firmware/controllers/generated/signature_hellen121nissan.h b/firmware/controllers/generated/signature_hellen121nissan.h index f9de851b9a..eca4ae01c5 100644 --- a/firmware/controllers/generated/signature_hellen121nissan.h +++ b/firmware/controllers/generated/signature_hellen121nissan.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_3099 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen121nissan.snap_3099" +#define SIGNATURE_HASH snap_41833 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen121nissan.snap_41833" diff --git a/firmware/controllers/generated/signature_hellen121vag.h b/firmware/controllers/generated/signature_hellen121vag.h index 22c6aef2ff..90ca1e7379 100644 --- a/firmware/controllers/generated/signature_hellen121vag.h +++ b/firmware/controllers/generated/signature_hellen121vag.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_26260 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen121vag.snap_26260" +#define SIGNATURE_HASH snap_51686 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen121vag.snap_51686" diff --git a/firmware/controllers/generated/signature_hellen128.h b/firmware/controllers/generated/signature_hellen128.h index 864b928f0b..bcb766aa7f 100644 --- a/firmware/controllers/generated/signature_hellen128.h +++ b/firmware/controllers/generated/signature_hellen128.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_36018 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen128.snap_36018" +#define SIGNATURE_HASH snap_9152 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen128.snap_9152" diff --git a/firmware/controllers/generated/signature_hellen154hyundai.h b/firmware/controllers/generated/signature_hellen154hyundai.h index 0044390e35..b8349fe92f 100644 --- a/firmware/controllers/generated/signature_hellen154hyundai.h +++ b/firmware/controllers/generated/signature_hellen154hyundai.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_52074 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen154hyundai.snap_52074" +#define SIGNATURE_HASH snap_25624 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen154hyundai.snap_25624" diff --git a/firmware/controllers/generated/signature_hellen72.h b/firmware/controllers/generated/signature_hellen72.h index 565b51bedf..3ff1f4bc42 100644 --- a/firmware/controllers/generated/signature_hellen72.h +++ b/firmware/controllers/generated/signature_hellen72.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_65282 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen72.snap_65282" +#define SIGNATURE_HASH snap_20592 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen72.snap_20592" diff --git a/firmware/controllers/generated/signature_hellen81.h b/firmware/controllers/generated/signature_hellen81.h index c9f1fc768b..f6b208a0c1 100644 --- a/firmware/controllers/generated/signature_hellen81.h +++ b/firmware/controllers/generated/signature_hellen81.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_28660 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen81.snap_28660" +#define SIGNATURE_HASH snap_49286 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen81.snap_49286" diff --git a/firmware/controllers/generated/signature_hellen88bmw.h b/firmware/controllers/generated/signature_hellen88bmw.h index d9f615df4e..90477fb45d 100644 --- a/firmware/controllers/generated/signature_hellen88bmw.h +++ b/firmware/controllers/generated/signature_hellen88bmw.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_57925 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellen88bmw.snap_57925" +#define SIGNATURE_HASH snap_19767 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellen88bmw.snap_19767" diff --git a/firmware/controllers/generated/signature_hellenNA6.h b/firmware/controllers/generated/signature_hellenNA6.h index 1a14c0be1c..a9e84a942a 100644 --- a/firmware/controllers/generated/signature_hellenNA6.h +++ b/firmware/controllers/generated/signature_hellenNA6.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_16574 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellenNA6.snap_16574" +#define SIGNATURE_HASH snap_61388 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellenNA6.snap_61388" diff --git a/firmware/controllers/generated/signature_hellenNA8_96.h b/firmware/controllers/generated/signature_hellenNA8_96.h index d92d4cc0e7..42649a1a6e 100644 --- a/firmware/controllers/generated/signature_hellenNA8_96.h +++ b/firmware/controllers/generated/signature_hellenNA8_96.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_16481 -#define TS_SIGNATURE "rusEFI 2023.01.10.hellenNA8_96.snap_16481" +#define SIGNATURE_HASH snap_61203 +#define TS_SIGNATURE "rusEFI 2023.01.10.hellenNA8_96.snap_61203" diff --git a/firmware/controllers/generated/signature_kin.h b/firmware/controllers/generated/signature_kin.h index f6124d979a..0d7fe17d8a 100644 --- a/firmware/controllers/generated/signature_kin.h +++ b/firmware/controllers/generated/signature_kin.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on kinetis_gen_config.bat by SignatureConsumer // -#define SIGNATURE_HASH snap_21317 -#define TS_SIGNATURE "rusEFI 2023.01.10.kin.snap_21317" +#define SIGNATURE_HASH snap_64567 +#define TS_SIGNATURE "rusEFI 2023.01.10.kin.snap_64567" diff --git a/firmware/controllers/generated/signature_m74_9.h b/firmware/controllers/generated/signature_m74_9.h index 1688b4b330..2ce155b3f2 100644 --- a/firmware/controllers/generated/signature_m74_9.h +++ b/firmware/controllers/generated/signature_m74_9.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_11442 -#define TS_SIGNATURE "rusEFI 2023.01.10.m74_9.snap_11442" +#define SIGNATURE_HASH snap_33728 +#define TS_SIGNATURE "rusEFI 2023.01.10.m74_9.snap_33728" diff --git a/firmware/controllers/generated/signature_mre_f4.h b/firmware/controllers/generated/signature_mre_f4.h index d0b4d182b9..d29bf911c4 100644 --- a/firmware/controllers/generated/signature_mre_f4.h +++ b/firmware/controllers/generated/signature_mre_f4.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_38537 -#define TS_SIGNATURE "rusEFI 2023.01.10.mre_f4.snap_38537" +#define SIGNATURE_HASH snap_14843 +#define TS_SIGNATURE "rusEFI 2023.01.10.mre_f4.snap_14843" diff --git a/firmware/controllers/generated/signature_mre_f7.h b/firmware/controllers/generated/signature_mre_f7.h index f0d122c84b..02c6fb772a 100644 --- a/firmware/controllers/generated/signature_mre_f7.h +++ b/firmware/controllers/generated/signature_mre_f7.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_38537 -#define TS_SIGNATURE "rusEFI 2023.01.10.mre_f7.snap_38537" +#define SIGNATURE_HASH snap_14843 +#define TS_SIGNATURE "rusEFI 2023.01.10.mre_f7.snap_14843" diff --git a/firmware/controllers/generated/signature_prometheus_405.h b/firmware/controllers/generated/signature_prometheus_405.h index 5ad85f0274..2ac0538c60 100644 --- a/firmware/controllers/generated/signature_prometheus_405.h +++ b/firmware/controllers/generated/signature_prometheus_405.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_10351 -#define TS_SIGNATURE "rusEFI 2023.01.10.prometheus_405.snap_10351" +#define SIGNATURE_HASH snap_34589 +#define TS_SIGNATURE "rusEFI 2023.01.10.prometheus_405.snap_34589" diff --git a/firmware/controllers/generated/signature_prometheus_469.h b/firmware/controllers/generated/signature_prometheus_469.h index a89e85bb60..e19803dcf6 100644 --- a/firmware/controllers/generated/signature_prometheus_469.h +++ b/firmware/controllers/generated/signature_prometheus_469.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_10351 -#define TS_SIGNATURE "rusEFI 2023.01.10.prometheus_469.snap_10351" +#define SIGNATURE_HASH snap_34589 +#define TS_SIGNATURE "rusEFI 2023.01.10.prometheus_469.snap_34589" diff --git a/firmware/controllers/generated/signature_proteus_f4.h b/firmware/controllers/generated/signature_proteus_f4.h index dbea04085f..b597dcb0e6 100644 --- a/firmware/controllers/generated/signature_proteus_f4.h +++ b/firmware/controllers/generated/signature_proteus_f4.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_14905 -#define TS_SIGNATURE "rusEFI 2023.01.10.proteus_f4.snap_14905" +#define SIGNATURE_HASH snap_38219 +#define TS_SIGNATURE "rusEFI 2023.01.10.proteus_f4.snap_38219" diff --git a/firmware/controllers/generated/signature_proteus_f7.h b/firmware/controllers/generated/signature_proteus_f7.h index 86bda8d216..8abc1d749b 100644 --- a/firmware/controllers/generated/signature_proteus_f7.h +++ b/firmware/controllers/generated/signature_proteus_f7.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_14905 -#define TS_SIGNATURE "rusEFI 2023.01.10.proteus_f7.snap_14905" +#define SIGNATURE_HASH snap_38219 +#define TS_SIGNATURE "rusEFI 2023.01.10.proteus_f7.snap_38219" diff --git a/firmware/controllers/generated/signature_proteus_h7.h b/firmware/controllers/generated/signature_proteus_h7.h index 56ae82433c..3e9de7d47b 100644 --- a/firmware/controllers/generated/signature_proteus_h7.h +++ b/firmware/controllers/generated/signature_proteus_h7.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_14905 -#define TS_SIGNATURE "rusEFI 2023.01.10.proteus_h7.snap_14905" +#define SIGNATURE_HASH snap_38219 +#define TS_SIGNATURE "rusEFI 2023.01.10.proteus_h7.snap_38219" diff --git a/firmware/controllers/generated/signature_s105.h b/firmware/controllers/generated/signature_s105.h index 974daac4f4..d81778bbd0 100644 --- a/firmware/controllers/generated/signature_s105.h +++ b/firmware/controllers/generated/signature_s105.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_50164 -#define TS_SIGNATURE "rusEFI 2023.01.10.s105.snap_50164" +#define SIGNATURE_HASH snap_27782 +#define TS_SIGNATURE "rusEFI 2023.01.10.s105.snap_27782" diff --git a/firmware/controllers/generated/signature_subaru_eg33_f7.h b/firmware/controllers/generated/signature_subaru_eg33_f7.h index 44521d45d0..665e816a66 100644 --- a/firmware/controllers/generated/signature_subaru_eg33_f7.h +++ b/firmware/controllers/generated/signature_subaru_eg33_f7.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on config/boards/subaru_eg33/config/gen_subaru_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_10323 -#define TS_SIGNATURE "rusEFI 2023.01.10.subaru_eg33_f7.snap_10323" +#define SIGNATURE_HASH snap_34593 +#define TS_SIGNATURE "rusEFI 2023.01.10.subaru_eg33_f7.snap_34593" diff --git a/firmware/controllers/generated/signature_tdg-pdm8.h b/firmware/controllers/generated/signature_tdg-pdm8.h index 032d8145ff..aa5392235b 100644 --- a/firmware/controllers/generated/signature_tdg-pdm8.h +++ b/firmware/controllers/generated/signature_tdg-pdm8.h @@ -2,5 +2,5 @@ // was generated automatically by rusEFI tool ConfigDefinition.jar based on gen_config.sh by SignatureConsumer // -#define SIGNATURE_HASH snap_16349 -#define TS_SIGNATURE "rusEFI 2023.01.10.tdg-pdm8.snap_16349" +#define SIGNATURE_HASH snap_37039 +#define TS_SIGNATURE "rusEFI 2023.01.10.tdg-pdm8.snap_37039" diff --git a/firmware/controllers/lua/generated/value_lookup_generated.cpp b/firmware/controllers/lua/generated/value_lookup_generated.cpp index 958d303e2b..b950a5b06b 100644 --- a/firmware/controllers/lua/generated/value_lookup_generated.cpp +++ b/firmware/controllers/lua/generated/value_lookup_generated.cpp @@ -85,8 +85,8 @@ float getConfigValueByName(const char *name) { return engineConfiguration->verboseCan; case -1528619572: return engineConfiguration->artificialTestMisfire; - case -1571463185: - return engineConfiguration->issue_294_31; + case -1284359115: + return engineConfiguration->useFordRedundantPps; case 513872736: return engineConfiguration->tpsMin; case 513872482: @@ -1041,6 +1041,10 @@ float getConfigValueByName(const char *name) { return engineConfiguration->ALSSkipRatio; case 612659807: return engineConfiguration->ALSMaxDriverThrottleIntent; + case -1744146782: + return engineConfiguration->tpsSecondaryMaximum; + case -727657058: + return engineConfiguration->ppsSecondaryMaximum; } return EFI_ERROR_CODE; } @@ -1252,9 +1256,9 @@ void setConfigValueByName(const char *name, float value) { engineConfiguration->artificialTestMisfire = (int)value; return; } - case -1571463185: + case -1284359115: { - engineConfiguration->issue_294_31 = (int)value; + engineConfiguration->useFordRedundantPps = (int)value; return; } case 513872736: @@ -3641,6 +3645,16 @@ void setConfigValueByName(const char *name, float value) { { engineConfiguration->ALSMaxDriverThrottleIntent = (int)value; return; + } + case -1744146782: + { + engineConfiguration->tpsSecondaryMaximum = (int)value; + return; + } + case -727657058: + { + engineConfiguration->ppsSecondaryMaximum = (int)value; + return; } } } diff --git a/firmware/controllers/lua/generated/value_lookup_generated.md b/firmware/controllers/lua/generated/value_lookup_generated.md index 87a24e7e25..cb9ee3bf56 100644 --- a/firmware/controllers/lua/generated/value_lookup_generated.md +++ b/firmware/controllers/lua/generated/value_lookup_generated.md @@ -35,7 +35,7 @@ This is your injector flow at the fuel pressure used in the vehicle. cc/min, cub Does the vehicle have a turbo or supercharger? ### useFordRedundantTps -On Ford vehicles one of the sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor. +On some Ford and Toyota vehicles one of the throttle sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor. ### isVerboseAuxPid1 @@ -121,8 +121,8 @@ Print incoming and outgoing first bus CAN messages in rusEFI console ### artificialTestMisfire Experimental setting that will cause a misfire\nDO NOT ENABLE. -### issue_294_31 - +### useFordRedundantPps +On some Ford and Toyota vehicles one of the pedal sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor. ### tpsMin Closed throttle, 1 volt = 200 units.\nSee also tps1_1AdcChannel\nset tps_min X @@ -1555,3 +1555,9 @@ null ### ALSMaxDriverThrottleIntent +### tpsSecondaryMaximum +For Ford TPS, use 53%. For Toyota ETCS-i, use 65% + +### ppsSecondaryMaximum +For Toyota ETCS-i, use xxx% + From c86f75ec7818e98661ef5db74ce24322c9f9c34d Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 10 Jan 2023 12:31:04 -0800 Subject: [PATCH 5/6] Jammed ETB detection (#4873) * jammed ETB detection * autoscale * comment * cleanup * implement test, cleanup --- .../actuators/electronic_throttle.cpp | 45 +++++++++---- .../actuators/electronic_throttle.h | 3 +- .../actuators/electronic_throttle.txt | 4 ++ .../actuators/electronic_throttle_impl.h | 7 +- firmware/controllers/closed_loop_controller.h | 8 ++- unit_tests/mocks.h | 3 +- unit_tests/tests/actuators/test_etb.cpp | 66 +++++++++++++++---- 7 files changed, 102 insertions(+), 34 deletions(-) diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index cf6d872fbc..9460fd6743 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -269,7 +269,7 @@ expected EtbController::getSetpoint() { expected EtbController::getSetpointIdleValve() const { // VW ETB idle mode uses an ETB only for idle (a mini-ETB sets the lower stop, and a normal cable // can pull the throttle up off the stop.), so we directly control the throttle with the idle position. -#if EFI_TUNER_STUDIO +#if EFI_TUNER_STUDIO && (EFI_PROD_CODE || EFI_SIMULATOR) engine->outputChannels.etbTarget = m_idlePosition; #endif // EFI_TUNER_STUDIO return clampF(0, m_idlePosition, 100); @@ -637,20 +637,41 @@ void EtbController::update() { m_pid.iTermMin = engineConfiguration->etb_iTermMin; m_pid.iTermMax = engineConfiguration->etb_iTermMax; - ClosedLoopController::update(); + auto output = ClosedLoopController::update(); + + if (!output) { + return; + } + + checkOutput(output.Value); } -expected EtbController::getOutput() { - // total open + closed loop parts - expected output = ClosedLoopController::getOutput(); - if (!output) { - return output; - } - etbDutyAverage = m_dutyAverage.average(absF(output.Value)); +void EtbController::checkOutput(percent_t output) { + etbDutyAverage = m_dutyAverage.average(absF(output)); - etbDutyRateOfChange = m_dutyRocAverage.average(absF(output.Value - prevOutput)); - prevOutput = output.Value; - return output; + etbDutyRateOfChange = m_dutyRocAverage.average(absF(output - prevOutput)); + prevOutput = output; + + float integrator = absF(m_pid.getIntegration()); + auto integratorLimit = engineConfiguration->etbJamIntegratorLimit; + + if (integratorLimit != 0) { + auto nowNt = getTimeNowNt(); + + if (integrator > integratorLimit) { + if (m_jamDetectTimer.hasElapsedSec(engineConfiguration->etbJamTimeout)) { + // ETB is jammed! + jamDetected = true; + + // TODO: do something about it! + } + } else { + m_jamDetectTimer.reset(getTimeNowNt()); + jamDetected = false; + } + + jamTimer = m_jamDetectTimer.getElapsedSeconds(nowNt); + } } void EtbController::autoCalibrateTps() { diff --git a/firmware/controllers/actuators/electronic_throttle.h b/firmware/controllers/actuators/electronic_throttle.h index 96885e4af3..04d84e7d97 100644 --- a/firmware/controllers/actuators/electronic_throttle.h +++ b/firmware/controllers/actuators/electronic_throttle.h @@ -53,10 +53,9 @@ public: virtual void setIdlePosition(percent_t pos) = 0; virtual void setWastegatePosition(percent_t pos) = 0; virtual void update() = 0; - virtual expected getOutput() = 0; virtual void autoCalibrateTps() = 0; - virtual const pid_state_s* getPidState() const = 0; + virtual const pid_state_s& getPidState() const = 0; virtual void setLuaAdjustment(percent_t adjustment) = 0; }; diff --git a/firmware/controllers/actuators/electronic_throttle.txt b/firmware/controllers/actuators/electronic_throttle.txt index 009980d2c5..0f565e5d14 100644 --- a/firmware/controllers/actuators/electronic_throttle.txt +++ b/firmware/controllers/actuators/electronic_throttle.txt @@ -12,6 +12,8 @@ float luaAdjustment;"ETB: luaAdjustment" float etbCurrentAdjustedTarget;;"%", 1, 0, -10000, 10000, 3 bit etbRevLimitActive + bit jamDetected + float etbDutyRateOfChange float etbDutyAverage uint16_t etbTpsErrorCounter;"ETB TPS error counter" @@ -19,4 +21,6 @@ float luaAdjustment;"ETB: luaAdjustment" int8_t etbErrorCode + uint16_t autoscale jamTimer;ETB jam timer;"sec", 0.01, 0, 0, 100, 2 + end_struct \ No newline at end of file diff --git a/firmware/controllers/actuators/electronic_throttle_impl.h b/firmware/controllers/actuators/electronic_throttle_impl.h index a0613b29f1..d485716ec2 100644 --- a/firmware/controllers/actuators/electronic_throttle_impl.h +++ b/firmware/controllers/actuators/electronic_throttle_impl.h @@ -34,7 +34,6 @@ public: // Update the controller's state: read sensors, send output, etc void update() override; - expected getOutput() override; // Called when the configuration may have changed. Controller will // reset if necessary. @@ -57,8 +56,10 @@ public: void setOutput(expected outputValue) override; + void checkOutput(percent_t output); + // Used to inspect the internal PID controller's state - const pid_state_s* getPidState() const override { return &m_pid; }; + const pid_state_s& getPidState() const override { return m_pid; }; // Use the throttle to automatically calibrate the relevant throttle position sensor(s). void autoCalibrateTps() override; @@ -96,6 +97,8 @@ private: ExpAverage m_dutyRocAverage; ExpAverage m_dutyAverage; + Timer m_jamDetectTimer; + // Pedal -> target map const ValueProvider3D* m_pedalMap = nullptr; diff --git a/firmware/controllers/closed_loop_controller.h b/firmware/controllers/closed_loop_controller.h index 680de134d9..b73e57fbfa 100644 --- a/firmware/controllers/closed_loop_controller.h +++ b/firmware/controllers/closed_loop_controller.h @@ -9,12 +9,15 @@ template class ClosedLoopController { public: - void update() { + expected update() { expected outputValue = getOutput(); setOutput(outputValue); + + return outputValue; } - virtual expected getOutput() { +private: + expected getOutput() { expected setpoint = getSetpoint(); // If we don't know the setpoint, return failure. if (!setpoint) { @@ -41,7 +44,6 @@ public: return openLoopResult.Value + closedLoopResult.Value; } -private: // Get the setpoint: where should the controller put the plant? virtual expected getSetpoint() = 0; diff --git a/unit_tests/mocks.h b/unit_tests/mocks.h index b4d45c5034..011d19acc4 100644 --- a/unit_tests/mocks.h +++ b/unit_tests/mocks.h @@ -25,12 +25,11 @@ public: MOCK_METHOD(void, setIdlePosition, (percent_t pos), (override)); MOCK_METHOD(void, setWastegatePosition, (percent_t pos), (override)); MOCK_METHOD(void, autoCalibrateTps, (), (override)); - MOCK_METHOD(const pid_state_s*, getPidState, (), (const, override)); + MOCK_METHOD(const pid_state_s&, getPidState, (), (const, override)); MOCK_METHOD(void, setLuaAdjustment, (percent_t adjustment), (override)); // ClosedLoopController mocks - MOCK_METHOD(expected, getOutput, (), (override)); MOCK_METHOD(expected, getSetpoint, (), (override)); MOCK_METHOD(expected, observePlant, (), (const, override)); MOCK_METHOD(expected, getOpenLoop, (percent_t setpoint), (override)); diff --git a/unit_tests/tests/actuators/test_etb.cpp b/unit_tests/tests/actuators/test_etb.cpp index 2655788584..ceff7e9372 100644 --- a/unit_tests/tests/actuators/test_etb.cpp +++ b/unit_tests/tests/actuators/test_etb.cpp @@ -198,7 +198,6 @@ TEST(etb, initializationNoPrimarySensor) { Sensor::resetAllMocks(); EtbController dut; - EngineTestHelper eth(TEST_ENGINE); // Needs pedal for init Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); @@ -470,7 +469,6 @@ TEST(etb, setpointNoPedalMap) { } TEST(etb, setpointIdleValveController) { - EngineTestHelper eth(TEST_ENGINE); EtbController etb; etb.init(ETB_IdleValve, nullptr, nullptr, nullptr, false); @@ -490,7 +488,6 @@ TEST(etb, setpointIdleValveController) { } TEST(etb, setpointWastegateController) { - EngineTestHelper eth(TEST_ENGINE); EtbController etb; etb.init(ETB_Wastegate, nullptr, nullptr, nullptr, false); @@ -561,10 +558,6 @@ TEST(etb, setpointLuaAdder) { } TEST(etb, etbTpsSensor) { - static engine_configuration_s localConfig; -// huh? how is this breaking the test? EngineTestHelper eth(TEST_ENGINE); - engineConfiguration = &localConfig; - // Throw some distinct values on the TPS sensors so we can identify that we're getting the correct one Sensor::setMockValue(SensorType::Tps1, 25.0f, true); Sensor::setMockValue(SensorType::Tps2, 75.0f, true); @@ -601,7 +594,6 @@ TEST(etb, etbTpsSensor) { etb.init(ETB_IdleValve, nullptr, nullptr, nullptr, true); EXPECT_EQ(etb.observePlant().Value, 66.0f); } - engineConfiguration = nullptr; } TEST(etb, setOutputInvalid) { @@ -746,9 +738,6 @@ TEST(etb, setOutputLimpHome) { } TEST(etb, closedLoopPid) { - static engine_configuration_s localConfig; -// huh? how is this breaking the test? EngineTestHelper eth(TEST_ENGINE); - engineConfiguration = &localConfig; pid_s pid = {}; pid.pFactor = 5; pid.maxValue = 75; @@ -762,8 +751,6 @@ TEST(etb, closedLoopPid) { EtbController etb; etb.init(ETB_Throttle1, nullptr, &pid, nullptr, true); - // todo: second part dirty hack :( - engineConfiguration = nullptr; // Disable autotune for now Engine e; EngineTestHelperBase base(&e, nullptr, nullptr); @@ -779,6 +766,59 @@ TEST(etb, closedLoopPid) { EXPECT_FLOAT_EQ(etb.getClosedLoop(50, 30).value_or(-1), 75); } +extern int timeNowUs; + +TEST(etb, jamDetection) { + EngineTestHelper eth(TEST_ENGINE); + + pid_s pid = {}; + + // I-only since we're testing out the integrator + pid.pFactor = 0; + pid.iFactor = 1; + pid.dFactor = 0; + pid.maxValue = 50; + pid.minValue = -50; + + // Must have TPS & PPS initialized for ETB setup + Sensor::setMockValue(SensorType::Tps1Primary, 0); + Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); + + // Limit of 5%, 1 second + engineConfiguration->etbJamIntegratorLimit = 5; + engineConfiguration->etbJamTimeout = 1; + + EtbController etb; + etb.init(ETB_Throttle1, nullptr, &pid, nullptr, true); + + timeNowUs = 0; + + // Reset timer while under integrator limit + EXPECT_EQ(etb.getPidState().iTerm, 0); + etb.checkOutput(0); + EXPECT_EQ(etb.jamTimer, 0); + EXPECT_FALSE(etb.jamDetected); + + for (size_t i = 0; i < ETB_LOOP_FREQUENCY; i++) { + // Error of 10, should accumulate 10 integrator per second + etb.getClosedLoop(50, 40); + } + + EXPECT_NEAR(etb.getPidState().iTerm, 10.0f, 1e-3); + + // Just under time limit, no jam yet + timeNowUs = 0.9e6; + etb.checkOutput(0); + EXPECT_NEAR(etb.jamTimer, 0.9f, 1e-3); + EXPECT_FALSE(etb.jamDetected); + + // Above the time limit, jam detected! + timeNowUs = 1.1e6; + etb.checkOutput(0); + EXPECT_TRUE(etb.jamDetected); +} + TEST(etb, openLoopThrottle) { EngineTestHelper eth(TEST_ENGINE); From 54e711a705e002b1ea798826e1b9d328460de824 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 10 Jan 2023 13:07:17 -0800 Subject: [PATCH 6/6] detect and ignore doubled trigger edges (#4656) * isToothExpectedNow * s * s * kick ci * only warn at high enough RPM to detect non-smooth trigger * 4b11 test --- firmware/controllers/algo/obd_error_codes.h | 6 + .../controllers/trigger/trigger_central.cpp | 98 +- .../controllers/trigger/trigger_central.h | 4 +- .../controllers/trigger/trigger_central.txt | 2 + .../resources/4b11-running-doubled-edge.csv | 2050 +++++++++++++++++ unit_tests/tests/trigger/test_real_4b11.cpp | 34 + 6 files changed, 2170 insertions(+), 24 deletions(-) create mode 100644 unit_tests/tests/trigger/resources/4b11-running-doubled-edge.csv diff --git a/firmware/controllers/algo/obd_error_codes.h b/firmware/controllers/algo/obd_error_codes.h index 4399939957..54cba00e3f 100644 --- a/firmware/controllers/algo/obd_error_codes.h +++ b/firmware/controllers/algo/obd_error_codes.h @@ -2147,6 +2147,12 @@ typedef enum { CUSTOM_CAM_TOO_MANY_TEETH = 9004, CUSTOM_CAM_NOT_ENOUGH_TEETH = 9005, + // Where we expected one trigger edge, we got two in quick succession + CUSTOM_PRIMARY_DOUBLED_EDGE = 9006, + + // A trigger tooth arrived at an unexpected time + CUSTOM_PRIMARY_BAD_TOOTH_TIMING = 9007, + /** * This is not engine miss detection - this is only internal scheduler state validation * Should not happen diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index c7c85290a8..f224121d0e 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -639,6 +639,64 @@ void TriggerCentral::decodeMapCam(efitick_t timestamp, float currentPhase) { } } +bool TriggerCentral::isToothExpectedNow(efitick_t timestamp) { + // Check that the expected next phase (from the last tooth) is close to the actual current phase: + // basically, check that the tooth width is correct + auto estimatedCurrentPhase = getCurrentEnginePhase(timestamp); + auto lastToothPhase = m_lastToothPhaseFromSyncPoint; + + if (expectedNextPhase && estimatedCurrentPhase) { + float angleError = expectedNextPhase.Value - estimatedCurrentPhase.Value; + + // Wrap around correctly at the end of the cycle + float cycle = getEngineState()->engineCycle; + if (angleError < -cycle / 2) { + angleError += cycle; + } + + triggerToothAngleError = angleError; + + // Only perform checks if engine is spinning quickly + // All kinds of garbage happens while cranking + if (Sensor::getOrZero(SensorType::Rpm) > 1000) { + // Now compute how close we are to the last tooth decoded + float angleSinceLastTooth = estimatedCurrentPhase.Value - lastToothPhase; + if (angleSinceLastTooth < 0.5f) { + // This tooth came impossibly early, ignore it + // This rejects things like doubled edges, for example: + // |-| |---------------- + // | | | + // ____________| |_| + // 1 2 + // #1 will be decoded + // #2 will be ignored + // We're not sure which edge was the "real" one, but they were close enough + // together that it doesn't really matter. + warning(CUSTOM_PRIMARY_DOUBLED_EDGE, "doubled trigger edge after %.2f deg at #%d", angleSinceLastTooth, triggerState.currentCycle.current_index); + + return false; + } + + // Absolute error from last tooth + float absError = absF(angleError); + float isRpmEnough = Sensor::getOrZero(SensorType::Rpm) > 1000; + // TODO: configurable threshold + if (isRpmEnough && absError > 10 && absError < 180) { + // This tooth came at a very unexpected time, ignore it + warning(CUSTOM_PRIMARY_BAD_TOOTH_TIMING, "tooth #%d error of %.1f", triggerState.currentCycle.current_index, angleError); + + // TODO: this causes issues with some real engine logs, should it? + // return false; + } + } + } else { + triggerToothAngleError = 0; + } + + // We aren't ready to reject unexpected teeth, so accept this tooth + return true; +} + /** * This method is NOT invoked for VR falls. */ @@ -661,6 +719,11 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta } } + if (!isToothExpectedNow(timestamp)) { + triggerIgnoredToothCount++; + return; + } + isSpinningJustForWatchdog = true; m_lastEventTimer.reset(timestamp); @@ -697,20 +760,6 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta // Adjust so currentPhase is in engine-space angle, not trigger-space angle currentEngineDecodedPhase = wrapAngleMethod(currentPhaseFromSyncPoint - tdcPosition(), "currentEnginePhase", CUSTOM_ERR_6555); - // Check that the expected next phase (from the last tooth) is close to the actual current phase: - // basically, check that the tooth width is correct - auto estimatedCurrentPhase = getCurrentEnginePhase(timestamp); - if (estimatedCurrentPhase) { - float angleError = expectedNextPhase - estimatedCurrentPhase.Value; - - float cycle = getEngineState()->engineCycle; - while (angleError < -cycle / 2) { - angleError += cycle; - } - - triggerToothAngleError = angleError; - } - // Record precise time and phase of the engine. This is used for VVT decode, and to check that the // trigger pattern selected matches reality (ie, we check the next tooth is where we think it should be) { @@ -752,19 +801,20 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta wrapAngle(nextPhase, "nextEnginePhase", CUSTOM_ERR_6555); } while (nextPhase == currentEngineDecodedPhase); - expectedNextPhase = nextPhase + tdcPosition(); - wrapAngle(expectedNextPhase, "nextEnginePhase", CUSTOM_ERR_6555); + float expectNextPhase = nextPhase + tdcPosition(); + wrapAngle(expectNextPhase, "nextEnginePhase", CUSTOM_ERR_6555); + expectedNextPhase = expectNextPhase; #if EFI_CDM_INTEGRATION - if (trgEventIndex == 0 && isBrainPinValid(engineConfiguration->cdmInputPin)) { - int cdmKnockValue = getCurrentCdmValue(getTriggerCentral()->triggerState.getCrankSynchronizationCounter()); - engine->knockLogic(cdmKnockValue); - } + if (trgEventIndex == 0 && isBrainPinValid(engineConfiguration->cdmInputPin)) { + int cdmKnockValue = getCurrentCdmValue(getTriggerCentral()->triggerState.getCrankSynchronizationCounter()); + engine->knockLogic(cdmKnockValue); + } #endif /* EFI_CDM_INTEGRATION */ - if (engine->rpmCalculator.getCachedRpm() > 0 && triggerIndexForListeners == 0) { - engine->tpsAccelEnrichment.onEngineCycleTps(); - } + if (engine->rpmCalculator.getCachedRpm() > 0 && triggerIndexForListeners == 0) { + engine->tpsAccelEnrichment.onEngineCycleTps(); + } // Handle ignition and injection mainTriggerCallback(triggerIndexForListeners, timestamp, currentEngineDecodedPhase, nextPhase); @@ -774,6 +824,8 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta } else { // We don't have sync, but report to the wave chart anyway as index 0. reportEventToWaveChart(signal, 0, triggerShape.useOnlyRisingEdges); + + expectedNextPhase = unexpected; } } diff --git a/firmware/controllers/trigger/trigger_central.h b/firmware/controllers/trigger/trigger_central.h index 8db4862feb..c31cb7bc09 100644 --- a/firmware/controllers/trigger/trigger_central.h +++ b/firmware/controllers/trigger/trigger_central.h @@ -199,6 +199,8 @@ public: private: void decodeMapCam(efitick_t nowNt, float currentPhase); + bool isToothExpectedNow(efitick_t timestamp); + // Time since the last tooth Timer m_lastToothTimer; // Phase of the last tooth relative to the sync point @@ -206,7 +208,7 @@ private: // At what engine phase do we expect the next tooth to arrive? // Used for checking whether your trigger pattern is correct. - float expectedNextPhase; + expected expectedNextPhase = unexpected; }; void triggerInfo(void); diff --git a/firmware/controllers/trigger/trigger_central.txt b/firmware/controllers/trigger/trigger_central.txt index de3af2c99c..e975a9bd09 100644 --- a/firmware/controllers/trigger/trigger_central.txt +++ b/firmware/controllers/trigger/trigger_central.txt @@ -15,5 +15,7 @@ uint32_t vvtCamCounter float triggerToothAngleError;;"deg", 1, 0, -30, 30, 2 + uint8_t triggerIgnoredToothCount + end_struct diff --git a/unit_tests/tests/trigger/resources/4b11-running-doubled-edge.csv b/unit_tests/tests/trigger/resources/4b11-running-doubled-edge.csv new file mode 100644 index 0000000000..d9a0c9391c --- /dev/null +++ b/unit_tests/tests/trigger/resources/4b11-running-doubled-edge.csv @@ -0,0 +1,2050 @@ +Time[s], Channel 0, Channel 1 +5.217579750000000, 1, 1 +5.218129500000000, 0, 1 +5.218737249999999, 1, 1 +5.219288250000000, 0, 1 +5.219896250000000, 1, 1 +5.220446750000000, 0, 1 +5.221056500000000, 1, 1 +5.221608499999999, 0, 1 +5.222220750000000, 1, 1 +5.222381749999999, 1, 0 +5.222773999999999, 0, 0 +5.223388250000000, 1, 0 +5.223944749999999, 0, 0 +5.224562250000000, 1, 0 +5.225119500000000, 0, 0 +5.225736749999999, 1, 0 +5.226297750000000, 0, 0 +5.226915750000000, 1, 0 +5.227474500000000, 0, 0 +5.228093750000000, 1, 0 +5.228651000000000, 0, 0 +5.229271000000000, 1, 0 +5.229827750000000, 0, 0 +5.230447499999999, 1, 0 +5.231006000000000, 0, 0 +5.231626749999999, 1, 0 +5.232184500000000, 0, 0 +5.232806000000000, 1, 0 +5.233366000000000, 0, 0 +5.236180500000000, 1, 0 +5.236908000000000, 0, 0 +5.237527249999999, 1, 0 +5.238086249999999, 0, 0 +5.238705000000000, 1, 0 +5.239261500000000, 0, 0 +5.239879000000000, 1, 0 +5.240434250000000, 0, 0 +5.241050000000000, 1, 0 +5.241605250000000, 0, 0 +5.242222500000000, 1, 0 +5.242776000000000, 0, 0 +5.243393500000000, 1, 0 +5.243949250000000, 0, 0 +5.244568249999999, 1, 0 +5.245124250000000, 0, 0 +5.245745749999999, 1, 0 +5.246303000000000, 0, 0 +5.246924750000000, 1, 0 +5.247484000000000, 0, 0 +5.248106500000000, 1, 0 +5.248665750000000, 0, 0 +5.249288750000000, 1, 0 +5.249846750000000, 0, 0 +5.250470750000000, 1, 0 +5.251026000000000, 0, 0 +5.251645500000000, 1, 0 +5.252200500000000, 0, 0 +5.252816000000000, 1, 0 +5.253367000000000, 0, 0 +5.253979250000000, 1, 0 +5.254526750000000, 0, 0 +5.255135999999999, 1, 0 +5.255682500000000, 0, 0 +5.257223750000000, 1, 0 +5.257992000000000, 0, 0 +5.258595500000000, 1, 0 +5.259145000000000, 0, 0 +5.259752000000000, 1, 0 +5.260300249999999, 0, 0 +5.260907250000000, 1, 0 +5.261457750000000, 0, 0 +5.262066500000000, 1, 0 +5.262617250000000, 0, 0 +5.263228000000000, 1, 0 +5.263781000000000, 0, 0 +5.264394750000000, 1, 0 +5.264949500000000, 0, 0 +5.265412250000000, 0, 1 +5.265565500000000, 1, 1 +5.266123500000000, 0, 1 +5.266742750000000, 1, 1 +5.267301250000000, 0, 1 +5.267920500000000, 1, 1 +5.268483250000000, 0, 1 +5.269103500000000, 1, 1 +5.269663500000000, 0, 1 +5.270284750000000, 1, 1 +5.270843000000000, 0, 1 +5.271464750000000, 1, 1 +5.272021000000000, 0, 1 +5.272640249999999, 1, 1 +5.273196250000000, 0, 1 +5.273812250000000, 1, 1 +5.274363999999999, 0, 1 +5.274977250000000, 1, 1 +5.275527500000000, 0, 1 +5.278286500000000, 1, 1 +5.278994750000000, 0, 1 +5.279600500000000, 1, 1 +5.280147500000000, 0, 1 +5.280754250000000, 1, 1 +5.281299750000000, 0, 1 +5.281905999999999, 1, 1 +5.282451500000000, 0, 1 +5.283057250000000, 1, 1 +5.283603750000000, 0, 1 +5.284211750000000, 1, 1 +5.284758000000000, 0, 1 +5.285368249999999, 1, 1 +5.285916750000000, 0, 1 +5.286529250000000, 1, 1 +5.287078750000000, 0, 1 +5.287693750000000, 1, 1 +5.288245000000000, 0, 1 +5.288861000000000, 1, 1 +5.289414250000000, 0, 1 +5.290030499999999, 1, 1 +5.290583250000000, 0, 1 +5.291200000000000, 1, 1 +5.291752000000000, 0, 1 +5.292370000000000, 1, 1 +5.292921000000000, 0, 1 +5.293536500000000, 1, 1 +5.294090499999999, 0, 1 +5.294705500000000, 1, 1 +5.295258000000000, 0, 1 +5.295872000000000, 1, 1 +5.296421500000000, 0, 1 +5.297033000000000, 1, 1 +5.297581249999999, 0, 1 +5.299126500000000, 1, 1 +5.299893000000000, 0, 1 +5.300494749999999, 1, 1 +5.301041750000000, 0, 1 +5.301644749999999, 1, 1 +5.302189500000000, 0, 1 +5.302791000000000, 1, 1 +5.303336499999999, 0, 1 +5.303939000000000, 1, 1 +5.304483750000000, 0, 1 +5.305086999999999, 1, 1 +5.305633250000000, 0, 1 +5.306239000000000, 1, 1 +5.306398000000000, 1, 0 +5.306786250000000, 0, 0 +5.307393500000000, 1, 0 +5.307944249999999, 0, 0 +5.308555500000000, 1, 0 +5.309107500000000, 0, 0 +5.309719750000000, 1, 0 +5.310276249999999, 0, 0 +5.310889749999999, 1, 0 +5.311444499999999, 0, 0 +5.312060000000000, 1, 0 +5.312613499999999, 0, 0 +5.313229750000000, 1, 0 +5.313783250000000, 0, 0 +5.314399750000000, 1, 0 +5.314954750000000, 0, 0 +5.315572250000000, 1, 0 +5.316127499999999, 0, 0 +5.316746500000000, 1, 0 +5.317304249999999, 0, 0 +5.320113500000000, 1, 0 +5.320841000000000, 0, 0 +5.321460500000000, 1, 0 +5.322020750000000, 0, 0 +5.322640250000000, 1, 0 +5.323198500000000, 0, 0 +5.323817500000000, 1, 0 +5.324374000000000, 0, 0 +5.324991499999999, 1, 0 +5.325548250000000, 0, 0 +5.326167250000000, 1, 0 +5.326722250000000, 0, 0 +5.327341250000000, 1, 0 +5.327898500000000, 0, 0 +5.328519000000000, 1, 0 +5.329075500000000, 0, 0 +5.329698250000000, 1, 0 +5.330256250000000, 0, 0 +5.330879250000000, 1, 0 +5.331439749999999, 0, 0 +5.332062750000000, 1, 0 +5.332623250000000, 0, 0 +5.333247750000000, 1, 0 +5.333806249999999, 0, 0 +5.334432500000000, 1, 0 +5.334989500000000, 0, 0 +5.335611999999999, 1, 0 +5.336171999999999, 0, 0 +5.336792750000000, 1, 0 +5.337349250000000, 0, 0 +5.337967500000000, 1, 0 +5.338520500000000, 0, 0 +5.339136250000000, 1, 0 +5.339688000000000, 0, 0 +5.341241500000000, 1, 0 +5.342013500000000, 0, 0 +5.342619249999999, 1, 0 +5.343169749999999, 0, 0 +5.343777500000000, 1, 0 +5.344326000000000, 0, 0 +5.344931500000000, 1, 0 +5.345480750000000, 0, 0 +5.346087250000000, 1, 0 +5.346634500000000, 0, 0 +5.347241250000000, 1, 0 +5.347790499999999, 0, 0 +5.348400250000000, 1, 0 +5.348950500000000, 0, 0 +5.349412000000000, 0, 1 +5.349561749999999, 1, 1 +5.350115750000000, 0, 1 +5.350731250000000, 1, 1 +5.351287249999999, 0, 1 +5.351903999999999, 1, 1 +5.352465500000000, 0, 1 +5.353084249999999, 1, 1 +5.353644249999999, 0, 1 +5.354266000000000, 1, 1 +5.354824499999999, 0, 1 +5.355446250000000, 1, 1 +5.356003500000000, 0, 1 +5.356622750000000, 1, 1 +5.357178500000000, 0, 1 +5.357794250000000, 1, 1 +5.358346000000000, 0, 1 +5.358959500000000, 1, 1 +5.359510250000000, 0, 1 +5.362278250000000, 1, 1 +5.362992250000000, 0, 1 +5.363601750000000, 1, 1 +5.364152750000000, 0, 1 +5.364763249999999, 1, 1 +5.365312500000000, 0, 1 +5.365923000000000, 1, 1 +5.366471750000000, 0, 1 +5.367081250000000, 1, 1 +5.367630999999999, 0, 1 +5.368242749999999, 1, 1 +5.368791250000000, 0, 1 +5.369404250000000, 1, 1 +5.369955500000000, 0, 1 +5.370570000000000, 1, 1 +5.371121749999999, 0, 1 +5.371738500000000, 1, 1 +5.372292000000000, 0, 1 +5.372909750000000, 1, 1 +5.373464999999999, 0, 1 +5.374082749999999, 1, 1 +5.374637750000000, 0, 1 +5.375255750000000, 1, 1 +5.375809250000000, 0, 1 +5.376428250000000, 1, 1 +5.376980250000000, 0, 1 +5.377596500000000, 1, 1 +5.378150499999999, 0, 1 +5.378764500000000, 1, 1 +5.379316750000000, 0, 1 +5.379929499999999, 1, 1 +5.380477750000000, 0, 1 +5.381088000000000, 1, 1 +5.381635250000000, 0, 1 +5.383179500000000, 1, 1 +5.383943500000000, 0, 1 +5.384545250000000, 1, 1 +5.385091750000000, 0, 1 +5.385694750000000, 1, 1 +5.386239750000000, 0, 1 +5.386841749999999, 1, 1 +5.387387500000000, 0, 1 +5.387990750000000, 1, 1 +5.388535999999999, 0, 1 +5.389139999999999, 1, 1 +5.389686999999999, 0, 1 +5.390293750000000, 1, 1 +5.390449750000000, 1, 0 +5.390842000000000, 0, 0 +5.391450499999999, 1, 0 +5.392002250000000, 0, 0 +5.392614500000000, 1, 0 +5.393167249999999, 0, 0 +5.393780000000000, 1, 0 +5.393781000000000, 0, 0 +5.393782000000000, 1, 0 +5.394337000000000, 0, 0 +5.394951250000000, 1, 0 +5.395506000000000, 0, 0 +5.396121750000000, 1, 0 +5.396675750000000, 0, 0 +5.397292500000000, 1, 0 +5.397845999999999, 0, 0 +5.398463000000000, 1, 0 +5.399018499999999, 0, 0 +5.399636750000000, 1, 0 +5.400192500000000, 0, 0 +5.400812999999999, 1, 0 +5.401371500000000, 0, 0 +5.404192249999999, 1, 0 +5.404923500000000, 0, 0 +5.405546999999999, 1, 0 +5.406110750000000, 0, 0 +5.406734999999999, 1, 0 +5.407297250000000, 0, 0 +5.407920750000000, 1, 0 +5.408482250000000, 0, 0 +5.409104750000000, 1, 0 +5.409666500000000, 0, 0 +5.410291000000000, 1, 0 +5.410850750000000, 0, 0 +5.411474999999999, 1, 0 +5.412037250000000, 0, 0 +5.412662249999999, 1, 0 +5.413224000000000, 0, 0 +5.413850750000000, 1, 0 +5.414413750000000, 0, 0 +5.415041000000000, 1, 0 +5.415605250000000, 0, 0 +5.416232750000000, 1, 0 +5.416796499999999, 0, 0 +5.417424250000000, 1, 0 +5.417986500000000, 0, 0 +5.418615750000000, 1, 0 +5.419175999999999, 0, 0 +5.419801750000000, 1, 0 +5.420363500000000, 0, 0 +5.420986500000000, 1, 0 +5.421544500000000, 0, 0 +5.422164749999999, 1, 0 +5.422719499999999, 0, 0 +5.423337249999999, 1, 0 +5.423890500000000, 0, 0 +5.425451250000000, 1, 0 +5.426226000000000, 0, 0 +5.426835000000000, 1, 0 +5.427388250000000, 0, 0 +5.427999000000000, 1, 0 +5.428550250000000, 0, 0 +5.429159500000000, 1, 0 +5.429711750000000, 0, 0 +5.430321500000000, 1, 0 +5.430872750000000, 0, 0 +5.431483500000000, 1, 0 +5.432035750000000, 0, 0 +5.432648250000000, 1, 0 +5.433201000000000, 0, 0 +5.433670250000000, 0, 1 +5.433814250000000, 1, 1 +5.434369250000000, 0, 1 +5.434985250000000, 1, 1 +5.435540749999999, 0, 1 +5.436157000000000, 1, 1 +5.436717499999999, 0, 1 +5.437335249999999, 1, 1 +5.437893250000000, 0, 1 +5.438513250000000, 1, 1 +5.439070249999999, 0, 1 +5.439691000000000, 1, 1 +5.440247750000000, 0, 1 +5.440867250000000, 1, 1 +5.441424500000000, 0, 1 +5.442042750000000, 1, 1 +5.442597249999999, 0, 1 +5.443214250000000, 1, 1 +5.443768500000000, 0, 1 +5.446557750000000, 1, 1 +5.447277000000000, 0, 1 +5.447891500000000, 1, 1 +5.448446750000000, 0, 1 +5.449062250000000, 1, 1 +5.449616000000000, 0, 1 +5.450231250000000, 1, 1 +5.450784000000000, 0, 1 +5.451397750000000, 1, 1 +5.451951250000000, 0, 1 +5.452567250000000, 1, 1 +5.453119500000000, 0, 1 +5.453736250000000, 1, 1 +5.454291000000000, 0, 1 +5.454909499999999, 1, 1 +5.455464750000000, 0, 1 +5.456085750000000, 1, 1 +5.456642749999999, 0, 1 +5.457264500000000, 1, 1 +5.457823500000000, 0, 1 +5.458445750000000, 1, 1 +5.459004250000000, 0, 1 +5.459626750000000, 1, 1 +5.460184500000000, 0, 1 +5.460809250000000, 1, 1 +5.461366000000000, 0, 1 +5.461988000000000, 1, 1 +5.462548000000000, 0, 1 +5.463169750000000, 1, 1 +5.463728250000000, 0, 1 +5.464348999999999, 1, 1 +5.464904250000000, 0, 1 +5.465522249999999, 1, 1 +5.466076500000000, 0, 1 +5.467639000000000, 1, 1 +5.468412250000000, 0, 1 +5.469020000000000, 1, 1 +5.469572749999999, 0, 1 +5.470182250000000, 1, 1 +5.470732250000000, 0, 1 +5.471339500000000, 1, 1 +5.471889750000000, 0, 1 +5.472497499999999, 1, 1 +5.473046249999999, 0, 1 +5.473653500000000, 1, 1 +5.474203000000000, 0, 1 +5.474812249999999, 1, 1 +5.474976250000000, 1, 0 +5.475362250000000, 0, 0 +5.475972000000000, 1, 0 +5.476524749999999, 0, 0 +5.477137750000000, 1, 0 +5.477691249999999, 0, 0 +5.478305250000000, 1, 0 +5.478863000000000, 0, 0 +5.479479000000000, 1, 0 +5.480035000000000, 0, 0 +5.480652999999999, 1, 0 +5.481209000000000, 0, 0 +5.481828999999999, 1, 0 +5.482385250000000, 0, 0 +5.483005500000000, 1, 0 +5.483564500000000, 0, 0 +5.484186250000000, 1, 0 +5.484745250000000, 0, 0 +5.485367999999999, 1, 0 +5.485929749999999, 0, 0 +5.488760000000000, 1, 0 +5.489492250000000, 0, 0 +5.490116250000000, 1, 0 +5.490680500000000, 0, 0 +5.491305000000000, 1, 0 +5.491867249999999, 0, 0 +5.492490999999999, 1, 0 +5.493052000000000, 0, 0 +5.493674250000000, 1, 0 +5.494235250000000, 0, 0 +5.494858750000000, 1, 0 +5.495418000000000, 0, 0 +5.496041500000000, 1, 0 +5.496602999999999, 0, 0 +5.497227500000000, 1, 0 +5.497789000000000, 0, 0 +5.498416250000000, 1, 0 +5.498978500000000, 0, 0 +5.499605499999999, 1, 0 +5.500170000000000, 0, 0 +5.500797250000000, 1, 0 +5.501361500000000, 0, 0 +5.501989500000000, 1, 0 +5.502552000000000, 0, 0 +5.503181500000000, 1, 0 +5.503741750000000, 0, 0 +5.504366999999999, 1, 0 +5.504928250000000, 0, 0 +5.505550250000000, 1, 0 +5.506108250000000, 0, 0 +5.506727250000000, 1, 0 +5.507281000000000, 0, 0 +5.507897499999999, 1, 0 +5.508450000000000, 0, 0 +5.510009500000000, 1, 0 +5.510786500000000, 0, 0 +5.511397250000000, 1, 0 +5.511953000000000, 0, 0 +5.512567250000000, 1, 0 +5.513122500000000, 0, 0 +5.513736499999999, 1, 0 +5.514294250000000, 0, 0 +5.514910500000000, 1, 0 +5.515467999999999, 0, 0 +5.516086000000000, 1, 0 +5.516645749999999, 0, 0 +5.517266250000000, 1, 0 +5.517827250000000, 0, 0 +5.518291749999999, 0, 1 +5.518448999999999, 1, 1 +5.519012750000000, 0, 1 +5.519638250000000, 1, 1 +5.520202750000000, 0, 1 +5.520828250000000, 1, 1 +5.521396999999999, 0, 1 +5.522023500000000, 1, 1 +5.522590000000000, 0, 1 +5.523218249999999, 1, 1 +5.523782000000000, 0, 1 +5.524410000000000, 1, 1 +5.524972750000000, 0, 1 +5.525598500000000, 1, 1 +5.526160500000000, 0, 1 +5.526783500000000, 1, 1 +5.527340499999999, 0, 1 +5.527959750000000, 1, 1 +5.528515750000000, 0, 1 +5.531301249999999, 1, 1 +5.532018000000000, 0, 1 +5.532629249999999, 1, 1 +5.533180750000000, 0, 1 +5.533792249999999, 1, 1 +5.534342750000000, 0, 1 +5.534954250000000, 1, 1 +5.535504250000000, 0, 1 +5.536115500000000, 1, 1 +5.536666750000000, 0, 1 +5.537280500000000, 1, 1 +5.537831499999999, 0, 1 +5.538447000000000, 1, 1 +5.539001250000000, 0, 1 +5.539619249999999, 1, 1 +5.540174500000000, 0, 1 +5.540795999999999, 1, 1 +5.541353249999999, 0, 1 +5.541975499999999, 1, 1 +5.542535000000000, 0, 1 +5.543158000000000, 1, 1 +5.543717000000000, 0, 1 +5.544340249999999, 1, 1 +5.544897499999999, 0, 1 +5.545521750000000, 1, 1 +5.546076750000000, 0, 1 +5.546696499999999, 1, 1 +5.547253250000000, 0, 1 +5.547870750000000, 1, 1 +5.548424750000000, 0, 1 +5.549040499999999, 1, 1 +5.549590999999999, 0, 1 +5.550204000000000, 1, 1 +5.550754000000000, 0, 1 +5.552306250000000, 1, 1 +5.553076750000000, 0, 1 +5.553682999999999, 1, 1 +5.554234000000000, 0, 1 +5.554842250000000, 1, 1 +5.555391999999999, 0, 1 +5.555999250000000, 1, 1 +5.556550250000000, 0, 1 +5.557159250000000, 1, 1 +5.557709500000000, 0, 1 +5.558319750000000, 1, 1 +5.558871750000000, 0, 1 +5.559484250000000, 1, 1 +5.559642250000000, 1, 0 +5.560037500000000, 0, 0 +5.560651500000000, 1, 0 +5.561207749999999, 0, 0 +5.561825000000000, 1, 0 +5.562381999999999, 0, 0 +5.562999250000000, 1, 0 +5.563559750000000, 0, 0 +5.564177750000000, 1, 0 +5.564735750000000, 0, 0 +5.565354999999999, 1, 0 +5.565911750000000, 0, 0 +5.566532250000000, 1, 0 +5.567089000000000, 0, 0 +5.567710000000000, 1, 0 +5.568269250000000, 0, 0 +5.568891750000000, 1, 0 +5.569451500000000, 0, 0 +5.570075500000000, 1, 0 +5.570638250000000, 0, 0 +5.573481500000000, 1, 0 +5.574216000000000, 0, 0 +5.574843500000000, 1, 0 +5.575411500000000, 0, 0 +5.576040000000000, 1, 0 +5.576606750000000, 0, 0 +5.577235249999999, 1, 0 +5.577801249999999, 0, 0 +5.578428750000000, 1, 0 +5.578995500000000, 0, 0 +5.579625000000000, 1, 0 +5.580190249999999, 0, 0 +5.580819500000000, 1, 0 +5.581386999999999, 0, 0 +5.582018000000000, 1, 0 +5.582585000000000, 0, 0 +5.583218000000000, 1, 0 +5.583786250000000, 0, 0 +5.584419500000000, 1, 0 +5.584989500000000, 0, 0 +5.585622750000000, 1, 0 +5.586192500000000, 0, 0 +5.586826500000000, 1, 0 +5.587394000000000, 0, 0 +5.588029000000000, 1, 0 +5.588594250000000, 0, 0 +5.589224750000000, 1, 0 +5.589790499999999, 0, 0 +5.590417250000000, 1, 0 +5.590978499999999, 0, 0 +5.591602000000000, 1, 0 +5.592159500000000, 0, 0 +5.592780250000000, 1, 0 +5.593336750000000, 0, 0 +5.594905499999999, 1, 0 +5.595685000000000, 0, 0 +5.596297499999999, 1, 0 +5.596854749999999, 0, 0 +5.597469500000000, 1, 0 +5.598024500000000, 0, 0 +5.598637750000000, 1, 0 +5.599193750000000, 0, 0 +5.599807250000000, 1, 0 +5.600362250000000, 0, 0 +5.600976250000000, 1, 0 +5.601531749999999, 0, 0 +5.602148000000000, 1, 0 +5.602703500000000, 0, 0 +5.603174500000000, 0, 1 +5.603320000000000, 1, 1 +5.603877750000000, 0, 1 +5.604496999999999, 1, 1 +5.605055249999999, 0, 1 +5.605673749999999, 1, 1 +5.606236000000000, 0, 1 +5.606855500000000, 1, 1 +5.607414500000000, 0, 1 +5.608035249999999, 1, 1 +5.608592250000000, 0, 1 +5.609212500000000, 1, 1 +5.609768250000000, 0, 1 +5.610385750000000, 1, 1 +5.610940250000000, 0, 1 +5.611555000000000, 1, 1 +5.612105250000000, 0, 1 +5.612716750000000, 1, 1 +5.613266250000000, 0, 1 +5.616027750000000, 1, 1 +5.616741250000000, 0, 1 +5.617350500000000, 1, 1 +5.617901750000000, 0, 1 +5.618513249999999, 1, 1 +5.619064000000000, 0, 1 +5.619676500000000, 1, 1 +5.620227499999999, 0, 1 +5.620840500000000, 1, 1 +5.621393500000000, 0, 1 +5.622010000000000, 1, 1 +5.622563749999999, 0, 1 +5.623182500000000, 1, 1 +5.623740000000000, 0, 1 +5.624361749999999, 1, 1 +5.624920250000000, 0, 1 +5.625545250000000, 1, 1 +5.626105250000000, 0, 1 +5.626731250000000, 1, 1 +5.627293750000000, 0, 1 +5.627920000000000, 1, 1 +5.628482500000000, 0, 1 +5.629109000000000, 1, 1 +5.629669750000000, 0, 1 +5.630297250000000, 1, 1 +5.630856000000000, 0, 1 +5.631479000000000, 1, 1 +5.632039499999999, 0, 1 +5.632660500000000, 1, 1 +5.633217750000000, 0, 1 +5.633836500000000, 1, 1 +5.634390250000000, 0, 1 +5.635006499999999, 1, 1 +5.635559000000000, 0, 1 +5.637117000000000, 1, 1 +5.637891000000000, 0, 1 +5.638499250000000, 1, 1 +5.639052500000000, 0, 1 +5.639663250000000, 1, 1 +5.640214500000000, 0, 1 +5.640823500000000, 1, 1 +5.641376500000000, 0, 1 +5.641986750000000, 1, 1 +5.642538999999999, 0, 1 +5.643150500000000, 1, 1 +5.643703749999999, 0, 1 +5.644317249999999, 1, 1 +5.644477250000000, 1, 0 +5.644871250000000, 0, 0 +5.645485750000000, 1, 0 +5.646042500000000, 0, 0 +5.646659750000000, 1, 0 +5.647216750000000, 0, 0 +5.647834000000000, 1, 0 +5.648394250000000, 0, 0 +5.649012000000000, 1, 0 +5.649569750000000, 0, 0 +5.650189000000000, 1, 0 +5.650745750000000, 0, 0 +5.651365750000000, 1, 0 +5.651922500000000, 0, 0 +5.652542500000000, 1, 0 +5.653101749999999, 0, 0 +5.653723250000000, 1, 0 +5.654281999999999, 0, 0 +5.654904999999999, 1, 0 +5.655466250000000, 0, 0 +5.658294750000000, 1, 0 +5.659025750000000, 0, 0 +5.659649250000000, 1, 0 +5.660213000000000, 0, 0 +5.660837000000000, 1, 0 +5.661398999999999, 0, 0 +5.662022250000000, 1, 0 +5.662582749999999, 0, 0 +5.663204500000000, 1, 0 +5.663765250000000, 0, 0 +5.664388250000000, 1, 0 +5.664947000000000, 0, 0 +5.665570499999999, 1, 0 +5.666131500000000, 0, 0 +5.666755999999999, 1, 0 +5.667317250000000, 0, 0 +5.667943999999999, 1, 0 +5.668506499999999, 0, 0 +5.669133500000000, 1, 0 +5.669697750000000, 0, 0 +5.670325249999999, 1, 0 +5.670889250000000, 0, 0 +5.671517750000000, 1, 0 +5.672080250000000, 0, 0 +5.672709500000000, 1, 0 +5.673269749999999, 0, 0 +5.673894750000000, 1, 0 +5.674455249999999, 0, 0 +5.675076000000000, 1, 0 +5.675632750000000, 0, 0 +5.676250500000000, 1, 0 +5.676803000000000, 0, 0 +5.677417999999999, 1, 0 +5.677969249999999, 0, 0 +5.679524750000000, 1, 0 +5.680297250000000, 0, 0 +5.680905500000000, 1, 0 +5.681458750000000, 0, 0 +5.682070500000000, 1, 0 +5.682623000000000, 0, 0 +5.683234499999999, 1, 0 +5.683789500000000, 0, 0 +5.684402749999999, 1, 0 +5.684958000000000, 0, 0 +5.685573000000000, 1, 0 +5.686129999999999, 0, 0 +5.686748250000000, 1, 0 +5.687306749999999, 0, 0 +5.687770000000000, 0, 1 +5.687926750000000, 1, 1 +5.688488500000000, 0, 1 +5.689112499999999, 1, 1 +5.689674999999999, 0, 1 +5.690298750000000, 1, 1 +5.690866499999999, 0, 1 +5.691491750000000, 1, 1 +5.692056750000000, 0, 1 +5.692684000000000, 1, 1 +5.693246750000000, 0, 1 +5.693873500000000, 1, 1 +5.694434750000000, 0, 1 +5.695058250000000, 1, 1 +5.695618250000000, 0, 1 +5.696238500000000, 1, 1 +5.696793250000000, 0, 1 +5.697410250000000, 1, 1 +5.697963750000000, 0, 1 +5.700739250000000, 1, 1 +5.701454000000000, 0, 1 +5.702064000000000, 1, 1 +5.702615000000000, 0, 1 +5.703226000000000, 1, 1 +5.703776250000000, 0, 1 +5.704387500000000, 1, 1 +5.704937250000000, 0, 1 +5.705548750000000, 1, 1 +5.706100000000000, 0, 1 +5.706714000000000, 1, 1 +5.707264500000000, 0, 1 +5.707879750000000, 1, 1 +5.708433749999999, 0, 1 +5.709050749999999, 1, 1 +5.709604750000000, 0, 1 +5.710224750000000, 1, 1 +5.710780000000000, 0, 1 +5.711399999999999, 1, 1 +5.711957500000000, 0, 1 +5.712577500000000, 1, 1 +5.713134000000000, 0, 1 +5.713754250000000, 1, 1 +5.714309000000000, 0, 1 +5.714929750000000, 1, 1 +5.715482750000000, 0, 1 +5.716099750000000, 1, 1 +5.716654000000000, 0, 1 +5.717268250000000, 1, 1 +5.717819000000000, 0, 1 +5.718430250000000, 1, 1 +5.718977250000000, 0, 1 +5.719586250000000, 1, 1 +5.720132000000000, 0, 1 +5.721672499999999, 1, 1 +5.722438250000000, 0, 1 +5.723040500000000, 1, 1 +5.723588250000000, 0, 1 +5.724193500000000, 1, 1 +5.724739500000000, 0, 1 +5.725344000000000, 1, 1 +5.725892249999999, 0, 1 +5.726497999999999, 1, 1 +5.727046000000000, 0, 1 +5.727653500000000, 1, 1 +5.728203750000000, 0, 1 +5.728814000000000, 1, 1 +5.728976500000000, 1, 0 +5.729365500000000, 0, 0 +5.729977250000000, 1, 0 +5.730532000000000, 0, 0 +5.731147249999999, 1, 0 +5.731701999999999, 0, 0 +5.732317249999999, 1, 0 +5.732876000000000, 0, 0 +5.733492000000000, 1, 0 +5.734048000000000, 0, 0 +5.734665499999999, 1, 0 +5.735220249999999, 0, 0 +5.735838500000000, 1, 0 +5.736393500000000, 0, 0 +5.737012249999999, 1, 0 +5.737569499999999, 0, 0 +5.738189750000000, 1, 0 +5.738747000000000, 0, 0 +5.739368750000000, 1, 0 +5.739929500000000, 0, 0 +5.742758500000000, 1, 0 +5.743490000000000, 0, 0 +5.744114250000000, 1, 0 +5.744678500000000, 0, 0 +5.745303250000000, 1, 0 +5.745866250000000, 0, 0 +5.746490500000000, 1, 0 +5.747052999999999, 0, 0 +5.747676750000000, 1, 0 +5.748239750000000, 0, 0 +5.748865250000000, 1, 0 +5.749426499999999, 0, 0 +5.750052000000000, 1, 0 +5.750615250000000, 0, 0 +5.751241750000000, 1, 0 +5.751804500000000, 0, 0 +5.752432750000000, 1, 0 +5.752996749999999, 0, 0 +5.753625500000000, 1, 0 +5.754191000000000, 0, 0 +5.754819500000000, 1, 0 +5.755385000000000, 0, 0 +5.756014250000000, 1, 0 +5.756577750000000, 0, 0 +5.757208250000000, 1, 0 +5.757770000000000, 0, 0 +5.758397000000000, 1, 0 +5.758960750000000, 0, 0 +5.759586000000000, 1, 0 +5.760146750000000, 0, 0 +5.760769250000000, 1, 0 +5.761326500000000, 0, 0 +5.761947000000000, 1, 0 +5.762502500000000, 0, 0 +5.764070750000000, 1, 0 +5.764847500000000, 0, 0 +5.765458750000000, 1, 0 +5.766014250000000, 0, 0 +5.766627250000000, 1, 0 +5.767180750000000, 0, 0 +5.767792500000000, 1, 0 +5.768346750000000, 0, 0 +5.768959000000000, 1, 0 +5.769511749999999, 0, 0 +5.770124249999999, 1, 0 +5.770678250000000, 0, 0 +5.771292499999999, 1, 0 +5.771846750000000, 0, 0 +5.772313000000000, 0, 1 +5.772461750000000, 1, 1 +5.773018250000000, 0, 1 +5.773635750000000, 1, 1 +5.774192750000000, 0, 1 +5.774810000000000, 1, 1 +5.775371000000000, 0, 1 +5.775988750000000, 1, 1 +5.776547000000000, 0, 1 +5.777166250000000, 1, 1 +5.777723000000000, 0, 1 +5.778342500000000, 1, 1 +5.778897750000000, 0, 1 +5.779515249999999, 1, 1 +5.780070750000000, 0, 1 +5.780686500000000, 1, 1 +5.781238000000000, 0, 1 +5.781850749999999, 1, 1 +5.782400750000000, 0, 1 +5.785156750000000, 1, 1 +5.785868250000000, 0, 1 +5.786475500000000, 1, 1 +5.787023250000000, 0, 1 +5.787631500000000, 1, 1 +5.788179250000000, 0, 1 +5.788788750000000, 1, 1 +5.789337000000000, 0, 1 +5.789946500000000, 1, 1 +5.790497250000000, 0, 1 +5.791110750000000, 1, 1 +5.791661749999999, 0, 1 +5.792277749999999, 1, 1 +5.792833000000000, 0, 1 +5.793452250000000, 1, 1 +5.794008499999999, 0, 1 +5.794631499999999, 1, 1 +5.795189750000000, 0, 1 +5.795813500000000, 1, 1 +5.796374250000000, 0, 1 +5.796998749999999, 1, 1 +5.797559250000000, 0, 1 +5.798184000000000, 1, 1 +5.798743249999999, 0, 1 +5.799369250000000, 1, 1 +5.799926250000000, 0, 1 +5.800548000000000, 1, 1 +5.801106000000000, 0, 1 +5.801724500000000, 1, 1 +5.802279250000000, 0, 1 +5.802895250000000, 1, 1 +5.803446500000000, 0, 1 +5.804060250000000, 1, 1 +5.804610500000000, 0, 1 +5.806162500000000, 1, 1 +5.806933500000000, 0, 1 +5.807539750000000, 1, 1 +5.808091249999999, 0, 1 +5.808700249999999, 1, 1 +5.809250250000000, 0, 1 +5.809858250000000, 1, 1 +5.810409249999999, 0, 1 +5.811018000000000, 1, 1 +5.811569000000000, 0, 1 +5.812179250000000, 1, 1 +5.812731250000000, 0, 1 +5.813343750000000, 1, 1 +5.813498750000000, 1, 0 +5.813896750000000, 0, 0 +5.814510500000000, 1, 0 +5.815066250000000, 0, 0 +5.815683000000000, 1, 0 +5.816238999999999, 0, 0 +5.816854999999999, 1, 0 +5.817414749999999, 0, 0 +5.818031250000000, 1, 0 +5.818588249999999, 0, 0 +5.819206250000000, 1, 0 +5.819761250000000, 0, 0 +5.820380000000000, 1, 0 +5.820934250000000, 0, 0 +5.821552250000000, 1, 0 +5.822108249999999, 0, 0 +5.822726750000000, 1, 0 +5.823282750000000, 0, 0 +5.823901999999999, 1, 0 +5.824459750000000, 0, 0 +5.827267000000000, 1, 0 +5.827992249999999, 0, 0 +5.828609500000000, 1, 0 +5.829167249999999, 0, 0 +5.829784750000000, 1, 0 +5.830339749999999, 0, 0 +5.830955500000000, 1, 0 +5.831508749999999, 0, 0 +5.832123000000000, 1, 0 +5.832676750000000, 0, 0 +5.833292250000000, 1, 0 +5.833844249999999, 0, 0 +5.834460249999999, 1, 0 +5.835014250000000, 0, 0 +5.835630999999999, 1, 0 +5.836185250000000, 0, 0 +5.836804500000000, 1, 0 +5.837360250000000, 0, 0 +5.837981000000000, 1, 0 +5.838539249999999, 0, 0 +5.839160499999999, 1, 0 +5.839718500000000, 0, 0 +5.840340500000000, 1, 0 +5.840897500000000, 0, 0 +5.841521250000000, 1, 0 +5.842076749999999, 0, 0 +5.842696750000000, 1, 0 +5.843254000000000, 0, 0 +5.843872000000000, 1, 0 +5.844426250000000, 0, 0 +5.845041999999999, 1, 0 +5.845592750000000, 0, 0 +5.846207000000000, 1, 0 +5.846757250000000, 0, 0 +5.848311250000000, 1, 0 +5.849084500000000, 0, 0 +5.849692500000000, 1, 0 +5.850245750000000, 0, 0 +5.850856750000000, 1, 0 +5.851409250000000, 0, 0 +5.852020000000000, 1, 0 +5.852574250000000, 0, 0 +5.853186500000000, 1, 0 +5.853740500000000, 0, 0 +5.854354000000000, 1, 0 +5.854909500000000, 0, 0 +5.855525500000000, 1, 0 +5.856081750000000, 0, 0 +5.856543500000000, 0, 1 +5.856698750000000, 1, 1 +5.857257499999999, 0, 1 +5.857877750000000, 1, 1 +5.858436999999999, 0, 1 +5.859056250000000, 1, 1 +5.859619500000000, 0, 1 +5.860240249999999, 1, 1 +5.860800500000000, 0, 1 +5.861422250000000, 1, 1 +5.861980500000000, 0, 1 +5.862602000000000, 1, 1 +5.863157999999999, 0, 1 +5.863776000000000, 1, 1 +5.864331000000000, 0, 1 +5.864945500000000, 1, 1 +5.865495999999999, 0, 1 +5.866107250000000, 1, 1 +5.866656750000000, 0, 1 +5.869410750000000, 1, 1 +5.870120000000000, 0, 1 +5.870725500000000, 1, 1 +5.871272750000000, 0, 1 +5.871879250000000, 1, 1 +5.872425000000000, 0, 1 +5.873031750000000, 1, 1 +5.873577750000000, 0, 1 +5.874184500000000, 1, 1 +5.874731499999999, 0, 1 +5.875341000000000, 1, 1 +5.875887750000000, 0, 1 +5.876498750000000, 1, 1 +5.877049250000000, 0, 1 +5.877663000000000, 1, 1 +5.878213750000000, 0, 1 +5.878830000000000, 1, 1 +5.879382750000000, 0, 1 +5.880000000000000, 1, 1 +5.880554500000000, 0, 1 +5.881171500000000, 1, 1 +5.881725250000000, 0, 1 +5.882342500000000, 1, 1 +5.882894500000000, 0, 1 +5.883512500000000, 1, 1 +5.884061750000000, 0, 1 +5.884675750000000, 1, 1 +5.885226250000000, 0, 1 +5.885836750000000, 1, 1 +5.886384749999999, 0, 1 +5.886993250000000, 1, 1 +5.887538250000000, 0, 1 +5.888145000000000, 1, 1 +5.888689250000000, 0, 1 +5.890224750000000, 1, 1 +5.890988999999999, 0, 1 +5.891589499999999, 1, 1 +5.892135250000000, 0, 1 +5.892738250000000, 1, 1 +5.893282500000000, 0, 1 +5.893885000000000, 1, 1 +5.894430499999999, 0, 1 +5.895033499999999, 1, 1 +5.895578749999999, 0, 1 +5.896182749999999, 1, 1 +5.896729750000000, 0, 1 +5.897336500000000, 1, 1 +5.897503250000000, 1, 0 +5.897884500000000, 0, 0 +5.898492750000000, 1, 0 +5.899043499999999, 0, 0 +5.899611000000000, 0, 1 +5.899611250000000, 0, 0 +5.899655249999999, 1, 0 +5.900206750000000, 0, 0 +5.900818000000000, 1, 0 +5.901373500000000, 0, 0 +5.901985250000000, 1, 0 +5.902537750000000, 0, 0 +5.903151500000000, 1, 0 +5.903702249999999, 0, 0 +5.904316000000000, 1, 0 +5.904866999999999, 0, 0 +5.905480750000000, 1, 0 +5.906034000000000, 0, 0 +5.906649000000000, 1, 0 +5.907202000000000, 0, 0 +5.907818750000000, 1, 0 +5.908373750000000, 0, 0 +5.911174500000000, 1, 0 +5.911897750000000, 0, 0 +5.912515000000000, 1, 0 +5.913072750000000, 0, 0 +5.913690250000000, 1, 0 +5.914245999999999, 0, 0 +5.914862500000000, 1, 0 +5.915417000000000, 0, 0 +5.916032000000000, 1, 0 +5.916586250000000, 0, 0 +5.917202250000000, 1, 0 +5.917755000000000, 0, 0 +5.918371749999999, 1, 0 +5.918926250000000, 0, 0 +5.919544000000000, 1, 0 +5.920098250000000, 0, 0 +5.920717250000000, 1, 0 +5.921272750000000, 0, 0 +5.921892250000000, 1, 0 +5.922449500000000, 0, 0 +5.923069250000000, 1, 0 +5.923626000000000, 0, 0 +5.924246249999999, 1, 0 +5.924801250000000, 0, 0 +5.925422500000000, 1, 0 +5.925975999999999, 0, 0 +5.926594250000000, 1, 0 +5.927149000000000, 0, 0 +5.927764499999999, 1, 0 +5.928317250000000, 0, 0 +5.928930750000000, 1, 0 +5.929479750000000, 0, 0 +5.930090750000000, 1, 0 +5.930638249999999, 0, 0 +5.932181750000000, 1, 0 +5.932947500000000, 0, 0 +5.933549250000000, 1, 0 +5.934096250000000, 0, 0 +5.934699999999999, 1, 0 +5.935244750000000, 0, 0 +5.935847000000000, 1, 0 +5.936392499999999, 0, 0 +5.936995000000000, 1, 0 +5.937539249999999, 0, 0 +5.938142000000000, 1, 0 +5.938687000000000, 0, 0 +5.939291750000000, 1, 0 +5.939837499999999, 0, 0 +5.940298500000000, 0, 1 +5.940443500000000, 1, 1 +5.940992250000000, 0, 1 +5.941601500000000, 1, 1 +5.942151750000000, 0, 1 +5.942762249999999, 1, 1 +5.943317500000000, 0, 1 +5.943930000000000, 1, 1 +5.944484500000000, 0, 1 +5.945100249999999, 1, 1 +5.945653750000000, 0, 1 +5.946270750000000, 1, 1 +5.946824500000000, 0, 1 +5.947441000000000, 1, 1 +5.947995750000000, 0, 1 +5.948611000000000, 1, 1 +5.949162750000000, 0, 1 +5.949776249999999, 1, 1 +5.950327250000000, 0, 1 +5.953094750000000, 1, 1 +5.953808749999999, 0, 1 +5.954418250000000, 1, 1 +5.954968249999999, 0, 1 +5.955578000000000, 1, 1 +5.956126500000000, 0, 1 +5.956735750000000, 1, 1 +5.957283500000000, 0, 1 +5.957891500000000, 1, 1 +5.958439750000000, 0, 1 +5.959048999999999, 1, 1 +5.959595750000000, 0, 1 +5.960205750000000, 1, 1 +5.960754750000000, 0, 1 +5.961366249999999, 1, 1 +5.961914999999999, 0, 1 +5.962529249999999, 1, 1 +5.963079500000000, 0, 1 +5.963693999999999, 1, 1 +5.964246500000000, 0, 1 +5.964861500000000, 1, 1 +5.965414000000000, 0, 1 +5.966029499999999, 1, 1 +5.966580500000000, 0, 1 +5.967197500000000, 1, 1 +5.967747000000000, 0, 1 +5.968360499999999, 1, 1 +5.968911749999999, 0, 1 +5.969523250000000, 1, 1 +5.970072500000000, 0, 1 +5.970682000000000, 1, 1 +5.971228249999999, 0, 1 +5.971835749999999, 1, 1 +5.972380500000000, 0, 1 +5.973916000000000, 1, 1 +5.974679000000000, 0, 1 +5.975278749999999, 1, 1 +5.975823999999999, 0, 1 +5.976426000000000, 1, 1 +5.976969749999999, 0, 1 +5.977570750000000, 1, 1 +5.978115750000000, 0, 1 +5.978718000000000, 1, 1 +5.979262749999999, 0, 1 +5.979865999999999, 1, 1 +5.980412750000000, 0, 1 +5.981018750000000, 1, 1 +5.981177000000000, 1, 0 +5.981566000000000, 0, 0 +5.982173500000000, 1, 0 +5.982724000000000, 0, 0 +5.983334999999999, 1, 0 +5.983886249999999, 0, 0 +5.984497250000000, 1, 0 +5.985052749999999, 0, 0 +5.985664750000000, 1, 0 +5.986218000000000, 0, 0 +5.986831749999999, 1, 0 +5.987383250000000, 0, 0 +5.987998000000000, 1, 0 +5.988550000000000, 0, 0 +5.989165000000000, 1, 0 +5.989719249999999, 0, 0 +5.990336000000000, 1, 0 +5.990890500000000, 0, 0 +5.991508749999999, 1, 0 +5.992066749999999, 0, 0 +5.994883499999999, 1, 0 +5.995614250000000, 0, 0 +5.996237000000000, 1, 0 +5.996800749999999, 0, 0 +5.997424750000000, 1, 0 +5.997986500000000, 0, 0 +5.998609750000000, 1, 0 +5.999171000000000, 0, 0 +5.999792750000000, 1, 0 +6.000354000000000, 0, 0 +6.000977250000000, 1, 0 +6.001537500000000, 0, 0 +6.002161249999999, 1, 0 +6.002723250000000, 0, 0 +6.003348750000000, 1, 0 +6.003909750000000, 0, 0 +6.004537000000000, 1, 0 +6.005099749999999, 0, 0 +6.005727250000000, 1, 0 +6.006291500000000, 0, 0 +6.006918750000000, 1, 0 +6.007482749999999, 0, 0 +6.008110750000000, 1, 0 +6.008672499999999, 0, 0 +6.009301250000000, 1, 0 +6.009860499999999, 0, 0 +6.010484750000000, 1, 0 +6.011044500000000, 0, 0 +6.011665250000000, 1, 0 +6.012221750000000, 0, 0 +6.012839500000000, 1, 0 +6.013392250000000, 0, 0 +6.014007749999999, 1, 0 +6.014559750000000, 0, 0 +6.016115500000000, 1, 0 +6.016888750000000, 0, 0 +6.017495750000000, 1, 0 +6.018047999999999, 0, 0 +6.018657000000000, 1, 0 +6.019207499999999, 0, 0 +6.019814999999999, 1, 0 +6.020365750000000, 0, 0 +6.020974250000000, 1, 0 +6.021523750000000, 0, 0 +6.022132249999999, 1, 0 +6.022682500000000, 0, 0 +6.023292500000000, 1, 0 +6.023842999999999, 0, 0 +6.024305750000000, 0, 1 +6.024453750000000, 1, 1 +6.025006500000000, 0, 1 +6.025620000000000, 1, 1 +6.026172750000000, 0, 1 +6.026785500000000, 1, 1 +6.027342249999999, 0, 1 +6.027955749999999, 1, 1 +6.028509499999999, 0, 1 +6.029124250000000, 1, 1 +6.029676500000000, 0, 1 +6.030291500000000, 1, 1 +6.030842499999999, 0, 1 +6.031455999999999, 1, 1 +6.032007999999999, 0, 1 +6.032620250000000, 1, 1 +6.033169500000000, 0, 1 +6.033780250000000, 1, 1 +6.034329250000000, 0, 1 +6.037086250000000, 1, 1 +6.037800499999999, 0, 1 +6.038409000000000, 1, 1 +6.038958750000000, 0, 1 +6.039568999999999, 1, 1 +6.040118250000000, 0, 1 +6.040728750000000, 1, 1 +6.041278500000000, 0, 1 +6.041889500000000, 1, 1 +6.042440999999999, 0, 1 +6.043055250000000, 1, 1 +6.043606250000000, 0, 1 +6.044222000000000, 1, 1 +6.044776499999999, 0, 1 +6.045394750000000, 1, 1 +6.045949750000000, 0, 1 +6.046571000000000, 1, 1 +6.047128000000000, 0, 1 +6.047750250000000, 1, 1 +6.048309250000000, 0, 1 +6.048931749999999, 1, 1 +6.049490250000000, 0, 1 +6.050113000000000, 1, 1 +6.050670250000000, 0, 1 +6.051294500000000, 1, 1 +6.051850500000000, 0, 1 +6.052472000000000, 1, 1 +6.053030499999999, 0, 1 +6.053650500000000, 1, 1 +6.054207250000000, 0, 1 +6.054825999999999, 1, 1 +6.055380000000000, 0, 1 +6.055996500000000, 1, 1 +6.056550000000000, 0, 1 +6.058108499999999, 1, 1 +6.058882250000000, 0, 1 +6.059489750000000, 1, 1 +6.060042250000000, 0, 1 +6.060651500000000, 1, 1 +6.061201500000000, 0, 1 +6.061809250000000, 1, 1 +6.062359750000000, 0, 1 +6.062967749999999, 1, 1 +6.063517249999999, 0, 1 +6.064126000000000, 1, 1 +6.064676250000000, 0, 1 +6.065286500000000, 1, 1 +6.065446750000000, 1, 0 +6.065837500000000, 0, 0 +6.066449000000000, 1, 0 +6.067002500000000, 0, 0 +6.067616999999999, 1, 0 +6.068170750000000, 0, 0 +6.068785249999999, 1, 0 +6.069343249999999, 0, 0 +6.069958499999999, 1, 0 +6.070514250000000, 0, 0 +6.071131250000000, 1, 0 +6.071685749999999, 0, 0 +6.072303750000000, 1, 0 +6.072858750000000, 0, 0 +6.073477500000000, 1, 0 +6.074034750000000, 0, 0 +6.074654750000000, 1, 0 +6.075212250000000, 0, 0 +6.075834250000000, 1, 0 +6.076394500000000, 0, 0 +6.079221250000000, 1, 0 +6.079954250000000, 0, 0 +6.080578999999999, 1, 0 +6.081143500000000, 0, 0 +6.081768750000000, 1, 0 +6.082332000000000, 0, 0 +6.082957000000000, 1, 0 +6.083519000000000, 0, 0 +6.084142500000000, 1, 0 +6.084705000000000, 0, 0 +6.085330000000000, 1, 0 +6.085890750000000, 0, 0 +6.086516000000000, 1, 0 +6.087078750000000, 0, 0 +6.087704749999999, 1, 0 +6.088267249999999, 0, 0 +6.088895249999999, 1, 0 +6.089458749999999, 0, 0 +6.090087250000000, 1, 0 +6.090652749999999, 0, 0 +6.091281250000000, 1, 0 +6.091846500000000, 0, 0 +6.092474999999999, 1, 0 +6.093038500000000, 0, 0 +6.093668249999999, 1, 0 +6.094228250000000, 0, 0 +6.094852250000000, 1, 0 +6.095413000000000, 0, 0 +6.096033750000000, 1, 0 +6.096590000000000, 0, 0 +6.097207750000000, 1, 0 +6.097760000000000, 0, 0 +6.098374750000000, 1, 0 +6.098926250000000, 0, 0 +6.100482500000000, 1, 0 +6.101255000000000, 0, 0 +6.101863000000000, 1, 0 +6.102416499999999, 0, 0 +6.103027750000000, 1, 0 +6.103580500000000, 0, 0 +6.104191999999999, 1, 0 +6.104746749999999, 0, 0 +6.105360249999999, 1, 0 +6.105915250000000, 0, 0 +6.106530750000000, 1, 0 +6.107088000000000, 0, 0 +6.107706500000000, 1, 0 +6.108265500000000, 0, 0 +6.108731250000000, 0, 1 +6.108886500000000, 1, 1 +6.109448500000000, 0, 1 +6.110072750000000, 1, 1 +6.110636250000000, 0, 1 +6.111260750000000, 1, 1 +6.111828500000000, 0, 1 +6.112454250000000, 1, 1 +6.113019749999999, 0, 1 +6.113646999999999, 1, 1 +6.114211249999999, 0, 1 +6.114839249999999, 1, 1 +6.115402250000000, 0, 1 +6.116028750000000, 1, 1 +6.116592250000000, 0, 1 +6.117217249999999, 1, 1 +6.117777750000000, 0, 1 +6.118400500000000, 1, 1 +6.118959250000000, 0, 1 +6.121757750000000, 1, 1 +6.122477249999999, 0, 1 +6.123090500000000, 1, 1 +6.123644250000000, 0, 1 +6.124257249999999, 1, 1 +6.124809000000000, 0, 1 +6.125421500000000, 1, 1 +6.125972249999999, 0, 1 +6.126583999999999, 1, 1 +6.127136000000000, 0, 1 +6.127750000000000, 1, 1 +6.128301250000000, 0, 1 +6.128917000000000, 1, 1 +6.129471499999999, 0, 1 +6.130089750000000, 1, 1 +6.130644999999999, 0, 1 +6.131266500000000, 1, 1 +6.131824000000000, 0, 1 +6.132446250000000, 1, 1 +6.133006249999999, 0, 1 +6.133629500000000, 1, 1 +6.134189000000000, 0, 1 +6.134812500000000, 1, 1 +6.135371000000000, 0, 1 +6.135996500000000, 1, 1 +6.136553250000000, 0, 1 +6.137175500000000, 1, 1 +6.137735250000000, 0, 1 +6.138356750000000, 1, 1 +6.138915000000000, 0, 1 +6.139535500000000, 1, 1 +6.140091000000000, 0, 1 +6.140709500000000, 1, 1 +6.141263749999999, 0, 1 +6.142826500000000, 1, 1 +6.143600999999999, 0, 1 +6.144209750000000, 1, 1 +6.144763500000000, 0, 1 +6.145374250000000, 1, 1 +6.145925750000000, 0, 1 +6.146535500000000, 1, 1 +6.147088750000000, 0, 1 +6.147699250000000, 1, 1 +6.148251750000000, 0, 1 +6.148863749999999, 1, 1 +6.149417250000000, 0, 1 +6.150031500000000, 1, 1 +6.150192250000000, 1, 0 +6.150586250000000, 0, 0 +6.151202000000000, 1, 0 +6.151760749999999, 0, 0 +6.152304249999999, 0, 1 +6.152304500000000, 0, 0 +6.152380249999999, 1, 0 +6.152940000000000, 0, 0 +6.153560250000000, 1, 0 +6.154124250000000, 0, 0 +6.154745750000000, 1, 0 +6.155307000000000, 0, 0 +6.155930250000000, 1, 0 +6.156490499999999, 0, 0 +6.157114750000000, 1, 0 +6.157674999999999, 0, 0 +6.158299500000000, 1, 0 +6.158862249999999, 0, 0 +6.159488000000000, 1, 0 +6.160050750000000, 0, 0 +6.160677499999999, 1, 0 +6.161242499999999, 0, 0 +6.164091750000000, 1, 0 +6.164826499999999, 0, 0 +6.165454749999999, 1, 0 +6.166022000000000, 0, 0 +6.166650250000000, 1, 0 +6.167215750000000, 0, 0 +6.167843000000000, 1, 0 +6.168407500000000, 0, 0 +6.169033250000000, 1, 0 +6.169597500000000, 0, 0 +6.170224750000000, 1, 0 +6.170787750000000, 0, 0 +6.171415499999999, 1, 0 +6.171980500000000, 0, 0 +6.172609000000000, 1, 0 +6.173173250000000, 0, 0 +6.173802999999999, 1, 0 +6.174368749999999, 0, 0 +6.174999499999999, 1, 0 +6.175567000000000, 0, 0 +6.176197999999999, 1, 0 +6.176765500000000, 0, 0 +6.177397000000000, 1, 0 +6.177963000000000, 0, 0 +6.178596750000000, 1, 0 +6.179161000000000, 0, 0 +6.179791499999999, 1, 0 +6.180358500000000, 0, 0 +6.180987500000000, 1, 0 +6.181552000000000, 0, 0 +6.182179000000000, 1, 0 +6.182740750000000, 0, 0 +6.183365750000000, 1, 0 +6.183926000000000, 0, 0 +6.185505000000000, 1, 0 +6.186288500000000, 0, 0 +6.186903999999999, 1, 0 +6.187463250000000, 0, 0 +6.188080250000000, 1, 0 +6.188637000000000, 0, 0 +6.189252000000000, 1, 0 +6.189809250000000, 0, 0 +6.190424000000000, 1, 0 +6.190979500000000, 0, 0 +6.191594750000000, 1, 0 +6.192151500000000, 0, 0 +6.192768750000000, 1, 0 +6.193326500000000, 0, 0 +6.193793749999999, 0, 1 +6.193945250000000, 1, 1 +6.194506250000000, 0, 1 +6.195129250000000, 1, 1 +6.195691500000000, 0, 1 +6.196315500000000, 1, 1 +6.196883750000000, 0, 1 +6.197510250000000, 1, 1 +6.198077250000000, 0, 1 +6.198707000000000, 1, 1 +6.199273250000000, 0, 1 +6.199904249999999, 1, 1 +6.200470000000000, 0, 1 +6.201099500000000, 1, 1 +6.201665500000000, 0, 1 +6.202292500000000, 1, 1 +6.202854749999999, 0, 1 +6.203479499999999, 1, 1 +6.204040500000000, 0, 1 +6.206856250000000, 1, 1 +6.207581750000000, 0, 1 +6.208201750000000, 1, 1 +6.208760750000000, 0, 1 +6.209380749999999, 1, 1 +6.209939250000000, 0, 1 +6.210559249999999, 1, 1 +6.211117000000000, 0, 1 +6.211736500000000, 1, 1 +6.212295000000000, 0, 1 +6.212916500000000, 1, 1 +6.213474000000000, 0, 1 +6.214096000000000, 1, 1 +6.214656250000000, 0, 1 +6.215280750000000, 1, 1 +6.215841250000000, 0, 1 +6.216468250000000, 1, 1 +6.217030500000000, 0, 1 +6.217658750000000, 1, 1 +6.218223000000000, 0, 1 +6.218850750000000, 1, 1 +6.219415000000000, 0, 1 +6.220043500000000, 1, 1 +6.220605750000000, 0, 1 +6.221235000000000, 1, 1 +6.221795750000000, 0, 1 +6.222421250000000, 1, 1 +6.222983750000000, 0, 1 +6.223606750000000, 1, 1 +6.224166250000000, 0, 1 +6.224787249999999, 1, 1 +6.225343500000000, 0, 1 +6.225962500000000, 1, 1 +6.226517749999999, 0, 1 +6.228082000000000, 1, 1 +6.228860249999999, 0, 1 +6.229470750000000, 1, 1 +6.230026000000000, 0, 1 +6.230639000000000, 1, 1 +6.231192500000000, 0, 1 +6.231804250000000, 1, 1 +6.232359250000000, 0, 1 +6.232972250000000, 1, 1 +6.233527000000000, 0, 1 +6.234141500000000, 1, 1 +6.234698250000000, 0, 1 +6.235315500000000, 1, 1 +6.235474500000000, 1, 0 +6.235873750000000, 0, 0 +6.236492999999999, 1, 0 +6.237054250000000, 0, 0 +6.237677499999999, 1, 0 +6.238239750000000, 0, 0 +6.238862999999999, 1, 0 +6.239429250000000, 0, 0 +6.240053750000000, 1, 0 +6.240616999999999, 0, 0 +6.241242499999999, 1, 0 +6.241804500000000, 0, 0 +6.242430499999999, 1, 0 +6.242992000000000, 0, 0 +6.243617500000000, 1, 0 +6.244180999999999, 0, 0 +6.244807750000000, 1, 0 +6.245370250000000, 0, 0 +6.245997000000000, 1, 0 +6.246561750000000, 0, 0 +6.249396500000000, 1, 0 +6.250128500000000, 0, 0 +6.250750999999999, 1, 0 +6.251313000000000, 0, 0 +6.251935250000000, 1, 0 +6.252494749999999, 0, 0 +6.253115999999999, 1, 0 +6.253673750000000, 0, 0 +6.254292749999999, 1, 0 +6.254850999999999, 0, 0 +6.255471000000000, 1, 0 +6.256027749999999, 0, 0 +6.256648750000000, 1, 0 +6.257207500000000, 0, 0 +6.257829750000000, 1, 0 +6.258388249999999, 0, 0 +6.259012750000000, 1, 0 +6.259573250000000, 0, 0 +6.260198500000000, 1, 0 +6.260761250000000, 0, 0 +6.261387500000000, 1, 0 +6.261950250000000, 0, 0 +6.262577749999999, 1, 0 +6.263140000000000, 0, 0 +6.263769500000000, 1, 0 +6.264330500000000, 0, 0 +6.264956750000000, 1, 0 +6.265519749999999, 0, 0 +6.266144000000000, 1, 0 +6.266704000000000, 0, 0 +6.267326499999999, 1, 0 +6.267882999999999, 0, 0 +6.268503000000000, 1, 0 +6.269058750000000, 0, 0 +6.270624750000000, 1, 0 +6.271406499999999, 0, 0 +6.272019500000000, 1, 0 +6.272577000000000, 0, 0 +6.273193249999999, 1, 0 +6.273749500000000, 0, 0 +6.274365000000000, 1, 0 +6.274923250000000, 0, 0 +6.275540250000000, 1, 0 +6.276098250000000, 0, 0 +6.276716250000000, 1, 0 +6.277276000000000, 0, 0 +6.277896999999999, 1, 0 +6.278457500000000, 0, 0 +6.278934000000000, 0, 1 +6.279079749999999, 1, 1 +6.279643249999999, 0, 1 +6.280268749999999, 1, 1 +6.280833250000000, 0, 1 +6.281459249999999, 1, 1 +6.282027750000000, 0, 1 +6.282654249999999, 1, 1 +6.283220750000000, 0, 1 +6.283849000000000, 1, 1 +6.284413250000000, 0, 1 +6.285041000000000, 1, 1 +6.285604250000000, 0, 1 +6.286230000000000, 1, 1 +6.286792750000000, 0, 1 +6.287416749999999, 1, 1 +6.287974999999999, 0, 1 +6.288595000000000, 1, 1 +6.289152750000000, 0, 1 +6.291942000000000, 1, 1 +6.292661250000000, 0, 1 +6.293273500000000, 1, 1 +6.293826250000000, 0, 1 +6.294438749999999, 1, 1 +6.294989750000000, 0, 1 +6.295602000000000, 1, 1 +6.296152500000000, 0, 1 +6.296763500000000, 1, 1 +6.297315250000000, 0, 1 +6.297929500000000, 1, 1 +6.298480750000000, 0, 1 +6.299096749999999, 1, 1 +6.299651250000000, 0, 1 +6.300269999999999, 1, 1 +6.300825499999999, 0, 1 +6.301447749999999, 1, 1 +6.302005749999999, 0, 1 +6.302629000000000, 1, 1 +6.303189250000000, 0, 1 +6.303813250000000, 1, 1 +6.304373000000000, 0, 1 +6.304997250000000, 1, 1 +6.305555999999999, 0, 1 +6.306182000000000, 1, 1 +6.306738750000000, 0, 1 +6.307360750000000, 1, 1 +6.307919750000000, 0, 1 +6.308539499999999, 1, 1 +6.309095500000000, 0, 1 +6.309712999999999, 1, 1 +6.310265999999999, 0, 1 +6.310881750000000, 1, 1 +6.311433750000000, 0, 1 +6.312992250000000, 1, 1 +6.313765500000000, 0, 1 +6.314373750000000, 1, 1 +6.314927500000000, 0, 1 +6.315538249999999, 1, 1 +6.316090000000000, 0, 1 +6.316699750000000, 1, 1 +6.317253000000000, 0, 1 +6.317863750000000, 1, 1 +6.318416249999999, 0, 1 +6.319027999999999, 1, 1 +6.319582250000000, 0, 1 +6.320196500000000, 1, 1 +6.320360249999999, 1, 0 +6.320751500000000, 0, 0 +6.321367000000000, 1, 0 +6.321924750000000, 0, 0 +6.322543500000000, 1, 0 +6.323102000000000, 0, 0 +6.323720499999999, 1, 0 +6.324282750000000, 0, 0 +6.324902499999999, 1, 0 +6.325461499999999, 0, 0 +6.326082250000000, 1, 0 +6.326640250000000, 0, 0 +6.327262250000000, 1, 0 +6.327820249999999, 0, 0 +6.328442750000000, 1, 0 +6.329003750000000, 0, 0 +6.329628000000000, 1, 0 +6.330189750000000, 0, 0 +6.330815500000000, 1, 0 +6.331379999999999, 0, 0 +6.334228250000000, 1, 0 +6.334968500000000, 0, 0 +6.335598500000000, 1, 0 +6.336167499999999, 0, 0 +6.336798500000000, 1, 0 +6.337367000000000, 0, 0 +6.337998000000000, 1, 0 +6.338565750000000, 0, 0 +6.339195500000000, 1, 0 +6.339764250000000, 0, 0 +6.340395249999999, 1, 0 +6.340962999999999, 0, 0 +6.341595000000000, 1, 0 +6.342164500000000, 0, 0 +6.342797750000000, 1, 0 +6.343367000000000, 0, 0 +6.344002250000000, 1, 0 +6.344572500000000, 0, 0 +6.345208250000000, 1, 0 +6.345780000000000, 0, 0 +6.346415749999999, 1, 0 +6.346987250000000, 0, 0 +6.347623749999999, 1, 0 +6.348193999999999, 0, 0 +6.348831750000000, 1, 0 +6.349399750000000, 0, 0 +6.350033499999999, 1, 0 +6.350603250000000, 0, 0 +6.351234499999999, 1, 0 +6.351800750000000, 0, 0 +6.352429250000000, 1, 0 +6.352991250000000, 0, 0 +6.353616750000000, 1, 0 +6.354177249999999, 0, 0 +6.355757499999999, 1, 0 +6.356543500000000, 0, 0 +6.357160749999999, 1, 0 +6.357721750000000, 0, 0 +6.358340500000000, 1, 0 +6.358899249999999, 0, 0 +6.359516750000000, 1, 0 +6.360076500000000, 0, 0 +6.360694250000000, 1, 0 +6.361252500000000, 0, 0 +6.361871000000000, 1, 0 +6.362430000000000, 0, 0 +6.363049750000000, 1, 0 +6.363609250000000, 0, 0 +6.364073500000000, 0, 1 +6.364229500000000, 1, 1 +6.364791250000000, 0, 1 +6.365414500000000, 1, 1 +6.365976750000000, 0, 1 +6.366599250000000, 1, 1 +6.367165500000000, 0, 1 +6.367789000000000, 1, 1 +6.368351750000000, 0, 1 +6.368976500000000, 1, 1 +6.369537500000000, 0, 1 +6.370162000000000, 1, 1 +6.370722250000000, 0, 1 +6.371344750000000, 1, 1 +6.371905000000000, 0, 1 +6.372526250000000, 1, 1 +6.373082500000000, 0, 1 +6.373701250000000, 1, 1 +6.374256000000000, 0, 1 +6.377038250000000, 1, 1 +6.377755000000000, 0, 1 +6.378367250000000, 1, 1 +6.378920000000000, 0, 1 +6.379533749999999, 1, 1 +6.380086500000000, 0, 1 +6.380701250000000, 1, 1 +6.381254500000000, 0, 1 +6.381870500000000, 1, 1 +6.382426000000000, 0, 1 +6.383045000000000, 1, 1 +6.383601250000000, 0, 1 +6.384222500000000, 1, 1 +6.384782250000000, 0, 1 +6.385406750000000, 1, 1 +6.385967750000000, 0, 1 +6.386595499999999, 1, 1 +6.387159000000000, 0, 1 +6.387788250000000, 1, 1 +6.388354000000000, 0, 1 +6.388984250000000, 1, 1 +6.389550250000000, 0, 1 +6.390181249999999, 1, 1 +6.390746249999999, 0, 1 +6.391379499999999, 1, 1 +6.391942999999999, 0, 1 +6.392572749999999, 1, 1 +6.393139250000000, 0, 1 +6.393767250000000, 1, 1 +6.394331250000000, 0, 1 +6.394957250000000, 1, 1 +6.395517750000000, 0, 1 +6.396141000000000, 1, 1 +6.396700000000000, 0, 1 +6.398274499999999, 1, 1 +6.399055750000000, 0, 1 +6.399669250000000, 1, 1 +6.400227500000000, 0, 1 +6.400843249999999, 1, 1 +6.401398749999999, 0, 1 +6.402012750000000, 1, 1 +6.402569499999999, 0, 1 +6.403184749999999, 1, 1 +6.403741000000000, 0, 1 +6.404357500000000, 1, 1 +6.404915500000000, 0, 1 +6.405534250000000, 1, 1 +6.405693500000000, 1, 0 +6.406092999999999, 0, 0 +6.406713000000000, 1, 0 +6.407274750000000, 0, 0 +6.407897750000000, 1, 0 +6.408460000000000, 0, 0 +6.409082750000000, 1, 0 +6.409648750000000, 0, 0 +6.410272000000000, 1, 0 +6.410835250000000, 0, 0 +6.411460500000000, 1, 0 +6.412021750000000, 0, 0 +6.412647499999999, 1, 0 +6.413208500000000, 0, 0 +6.413833500000000, 1, 0 +6.414396249999999, 0, 0 +6.415021749999999, 1, 0 +6.415583000000000, 0, 0 +6.416208000000000, 1, 0 +6.416770499999999, 0, 0 +6.419593500000000, 1, 0 +6.420321250000000, 0, 0 +6.420941500000000, 1, 0 +6.421501000000000, 0, 0 +6.422120749999999, 1, 0 +6.422677999999999, 0, 0 +6.423296750000000, 1, 0 +6.423853250000000, 0, 0 +6.424470250000000, 1, 0 +6.425027249999999, 0, 0 +6.425646749999999, 1, 0 +6.426202750000000, 0, 0 +6.426823499999999, 1, 0 +6.427383000000000, 0, 0 +6.428006500000000, 1, 0 +6.428566500000000, 0, 0 +6.429193250000000, 1, 0 +6.429755750000000, 0, 0 +6.430383750000000, 1, 0 +6.430949000000000, 0, 0 +6.431577750000000, 1, 0 +6.432142750000000, 0, 0 +6.432772249999999, 1, 0 +6.433336000000000, 0, 0 +6.433966750000000, 1, 0 +6.434528500000000, 0, 0 +6.435155500000000, 1, 0 +6.435719000000000, 0, 0 +6.436343249999999, 1, 0 +6.436903750000000, 0, 0 +6.437526000000000, 1, 0 +6.438082750000000, 0, 0 +6.438702500000000, 1, 0 +6.439258250000000, 0, 0 +6.440824750000000, 1, 0 +6.441605249999999, 0, 0 +6.442217749999999, 1, 0 +6.442774750000000, 0, 0 +6.443390249999999, 1, 0 +6.443945750000000, 0, 0 +6.444560249999999, 1, 0 +6.445117750000000, 0, 0 +6.445733499999999, 1, 0 +6.446290749999999, 0, 0 +6.446908250000000, 1, 0 +6.447466749999999, 0, 0 +6.448086750000000, 1, 0 +6.448646500000000, 0, 0 +6.449120750000000, 0, 1 +6.449267750000000, 1, 1 +6.449830749999999, 0, 1 +6.450455499999999, 1, 1 +6.451019000000000, 0, 1 +6.451643750000000, 1, 1 +6.452211500000000, 0, 1 +6.452836500000000, 1, 1 +6.453402000000000, 0, 1 +6.454028750000000, 1, 1 +6.454591750000000, 0, 1 +6.455217999999999, 1, 1 +6.455779499999999, 0, 1 +6.456403500000000, 1, 1 +6.456963500000000, 0, 1 +6.457584250000000, 1, 1 +6.458139249999999, 0, 1 +6.458756500000000, 1, 1 +6.459310250000000, 0, 1 +6.462087250000000, 1, 1 +6.462803249999999, 0, 1 +6.463414500000000, 1, 1 +6.463966000000000, 0, 1 +6.464577999999999, 1, 1 +6.465128500000000, 0, 1 +6.465740250000000, 1, 1 +6.466290750000000, 0, 1 +6.466902750000000, 1, 1 +6.467454500000000, 0, 1 +6.468069750000000, 1, 1 +6.468621250000000, 0, 1 +6.469238000000000, 1, 1 +6.469793249999999, 0, 1 +6.470412500000000, 1, 1 +6.470968249999999, 0, 1 +6.471590500000000, 1, 1 +6.472148000000000, 0, 1 +6.472770250000000, 1, 1 +6.473330000000000, 0, 1 +6.473952250000000, 1, 1 +6.474511000000000, 0, 1 +6.475133250000000, 1, 1 +6.475690500000000, 0, 1 +6.476314500000000, 1, 1 +6.476870500000000, 0, 1 +6.477492000000000, 1, 1 +6.478051250000000, 0, 1 +6.478672250000000, 1, 1 +6.479230250000000, 0, 1 +6.479851000000000, 1, 1 +6.480406500000000, 0, 1 +6.481025000000000, 1, 1 +6.481579500000000, 0, 1 +6.483141250000000, 1, 1 +6.483915000000000, 0, 1 +6.484522999999999, 1, 1 +6.485075500000000, 0, 1 +6.485685500000000, 1, 1 +6.486235750000000, 0, 1 +6.486843749999999, 1, 1 +6.487394500000000, 0, 1 +6.488003000000000, 1, 1 +6.488553000000000, 0, 1 +6.489162250000000, 1, 1 +6.489713750000000, 0, 1 +6.490324999999999, 1, 1 +6.490487750000000, 1, 0 +6.490877750000000, 0, 0 +6.491491249999999, 1, 0 +6.492047500000000, 0, 0 +6.492665000000000, 1, 0 +6.493222250000000, 0, 0 +6.493840749999999, 1, 0 +6.494402500000000, 0, 0 +6.495022250000000, 1, 0 +6.495582000000000, 0, 0 +6.496204499999999, 1, 0 +6.496763000000000, 0, 0 +6.497386000000000, 1, 0 +6.497945499999999, 0, 0 +6.498568750000000, 1, 0 +6.499130249999999, 0, 0 +6.499755000000000, 1, 0 +6.500316750000000, 0, 0 +6.500942750000000, 1, 0 +6.501507500000000, 0, 0 +6.504356250000000, 1, 0 +6.505093500000000, 0, 0 +6.505723499999999, 1, 0 +6.506292500000000, 0, 0 \ No newline at end of file diff --git a/unit_tests/tests/trigger/test_real_4b11.cpp b/unit_tests/tests/trigger/test_real_4b11.cpp index 758dcbbb9d..32de9a2c2d 100644 --- a/unit_tests/tests/trigger/test_real_4b11.cpp +++ b/unit_tests/tests/trigger/test_real_4b11.cpp @@ -40,3 +40,37 @@ TEST(real4b11, running) { ASSERT_EQ(0, eth.recentWarnings()->getCount()); } + +TEST(real4b11, runningDoubledEdge) { + CsvReader reader(1, /* vvtCount */ 0); + + // This log has an extra duplicate edge at 5.393782 seconds (hand added) + reader.open("tests/trigger/resources/4b11-running-doubled-edge.csv"); + EngineTestHelper eth(TEST_ENGINE); + engineConfiguration->isFasterEngineSpinUpEnabled = true; + engineConfiguration->alwaysInstantRpm = true; + + eth.setTriggerType(TT_36_2_1); + + int eventCount = 0; + bool gotRpm = false; + + while (reader.haveMore()) { + reader.processLine(ð); + eventCount++; + engine->rpmCalculator.onSlowCallback(); + + auto rpm = Sensor::getOrZero(SensorType::Rpm); + if (!gotRpm && rpm) { + gotRpm = true; + + // We should get first RPM on exactly the first sync point - this means the instant RPM pre-sync event copy all worked OK + EXPECT_EQ(eventCount, 30); + EXPECT_NEAR(rpm, 1436.23f, 0.1); + } + } + + // Should get a warning for the doubled edge, but NOT one for a trigger error! + ASSERT_EQ(1, eth.recentWarnings()->getCount()); + ASSERT_EQ(CUSTOM_PRIMARY_DOUBLED_EDGE, eth.recentWarnings()->get(0).Code); +}