fome-fw/firmware/controllers/trigger/decoders/trigger_honda.cpp

354 lines
8.4 KiB
C++
Raw Normal View History

2016-05-27 19:02:56 -07:00
/*
* @file trigger_honda.cpp
*
* @date May 27, 2016
2020-01-13 18:57:43 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2016-05-27 19:02:56 -07:00
*/
#include "trigger_honda.h"
2017-02-13 21:02:59 -08:00
#include "trigger_universal.h"
2016-05-27 19:02:56 -07:00
#define S24 (720.0f / 24 / 2)
static float addAccordPair(TriggerWaveform *s, float sb, trigger_wheel_e const channelIndex) {
2018-12-25 08:51:49 -08:00
s->addEvent720(sb, channelIndex, TV_RISE);
2016-05-27 19:02:56 -07:00
sb += S24;
2018-12-25 08:51:49 -08:00
s->addEvent720(sb, channelIndex, TV_FALL);
2016-05-27 19:02:56 -07:00
sb += S24;
return sb;
}
#define DIP 7.5f
static float addAccordPair3(TriggerWaveform *s, float sb) {
2016-05-27 19:02:56 -07:00
sb += DIP;
2018-12-25 08:51:49 -08:00
s->addEvent720(sb, T_CHANNEL_3, TV_RISE);
2016-05-27 19:02:56 -07:00
sb += DIP;
2018-12-25 08:51:49 -08:00
s->addEvent720(sb, T_CHANNEL_3, TV_FALL);
2016-05-27 19:02:56 -07:00
sb += 2 * DIP;
return sb;
}
/**
* Thank you Dip!
* http://forum.pgmfi.org/viewtopic.php?f=2&t=15570start=210#p139007
*/
void configureHondaAccordCDDip(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2016-05-27 19:02:56 -07:00
s->initialState[T_SECONDARY] = TV_RISE;
float sb = 0;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(90, T_SECONDARY, TV_FALL);
2016-05-27 19:02:56 -07:00
sb = 90;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(180, T_SECONDARY, TV_RISE);
2016-05-27 19:02:56 -07:00
sb = 180;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(270, T_SECONDARY, TV_FALL);
2016-05-27 19:02:56 -07:00
sb = 270;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(360.0f - DIP, T_PRIMARY, TV_RISE);
s->addEvent720(360, T_SECONDARY, TV_RISE);
2016-05-27 19:02:56 -07:00
sb = 360;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(450, T_SECONDARY, TV_FALL);
2016-05-27 19:02:56 -07:00
sb = 450;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(540, T_SECONDARY, TV_RISE);
2016-05-27 19:02:56 -07:00
sb = 540;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(630, T_SECONDARY, TV_FALL);
2016-05-27 19:02:56 -07:00
sb = 630;
2018-12-25 17:09:35 -08:00
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
sb = addAccordPair3(s, sb);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(720.0f - DIP, T_PRIMARY, TV_FALL);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
// s->addEvent720(720.0f - 12 * sb, T_SECONDARY, TV_FALL);
// s->addEvent720(720.0f, T_SECONDARY, TV_FALL);
2016-05-27 19:02:56 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(720.0f, T_SECONDARY, TV_RISE);
2016-05-27 19:02:56 -07:00
s->isSynchronizationNeeded = false;
2016-06-11 21:00:15 -07:00
s->useOnlyPrimaryForSync = true;
2016-05-27 19:02:56 -07:00
}
2017-02-13 21:02:59 -08:00
/**
* '1' is conditional
* '4' is conditional
* '24' is always secondary channel
*/
void configureHonda_1_4_24(TriggerWaveform *s, bool withOneEventSignal, bool withFourEventSignal,
2016-05-27 19:02:56 -07:00
trigger_wheel_e const oneEventWave,
trigger_wheel_e const fourEventWave,
2018-12-25 17:09:35 -08:00
float prefix) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2016-05-27 19:02:56 -07:00
2017-02-13 21:02:59 -08:00
2016-05-27 19:02:56 -07:00
float sb = 5.0f + prefix;
float tdcWidth = 0.1854 * 720 / 4;
s->isSynchronizationNeeded = false;
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withOneEventSignal)
2018-12-25 08:51:49 -08:00
s->addEvent720(sb - S24 / 2, oneEventWave, TV_RISE);
2016-05-27 19:02:56 -07:00
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withOneEventSignal)
2018-12-25 08:51:49 -08:00
s->addEvent720(sb - S24 / 2, oneEventWave, TV_FALL);
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withFourEventSignal) {
2018-12-25 08:51:49 -08:00
s->addEvent720(1 * 180.0f + prefix - tdcWidth, fourEventWave, TV_RISE);
2016-05-27 19:02:56 -07:00
}
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withFourEventSignal) {
2018-12-25 08:51:49 -08:00
s->addEvent720(1 * 180.0f + prefix, fourEventWave, TV_FALL);
2016-05-27 19:02:56 -07:00
}
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb,T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withFourEventSignal) {
2018-12-25 08:51:49 -08:00
s->addEvent720(2 * 180.0f + prefix - tdcWidth, fourEventWave, TV_RISE);
2016-05-27 19:02:56 -07:00
}
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withFourEventSignal) {
2018-12-25 08:51:49 -08:00
s->addEvent720(2 * 180.0f + prefix, fourEventWave, TV_FALL);
2016-05-27 19:02:56 -07:00
}
for (int i = 3; i <= 4; i++) {
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withFourEventSignal) {
2018-12-25 08:51:49 -08:00
s->addEvent720(i * 180.0f + prefix - tdcWidth, fourEventWave, TV_RISE);
2016-05-27 19:02:56 -07:00
}
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
2016-05-27 19:02:56 -07:00
if (withFourEventSignal) {
2018-12-25 08:51:49 -08:00
s->addEvent720(i * 180.0f + prefix, fourEventWave, TV_FALL);
2016-05-27 19:02:56 -07:00
}
}
2016-06-11 21:00:15 -07:00
s->useOnlyPrimaryForSync = true;
2016-05-27 19:02:56 -07:00
}
void configureHondaCbr600(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2019-07-23 16:22:40 -07:00
s->useOnlyPrimaryForSync = true;
s->isSynchronizationNeeded = true;
s->setTriggerSynchronizationGap(6);
int totalTeethCount = 24;
int skippedCount = 0;
addSkippedToothTriggerEvents(T_SECONDARY, s, totalTeethCount, skippedCount, 0.5, 0, 720,
0, 349);
s->addEvent720(350.0f, T_PRIMARY, TV_FALL);
s->addEvent720(360.0f, T_PRIMARY, TV_RISE);
s->addEvent720(360 + 0.2, T_SECONDARY, TV_FALL);
addSkippedToothTriggerEvents(T_SECONDARY, s, totalTeethCount, skippedCount, 0.5, 0, 720,
361, 649);
s->addEvent720(650.0f, T_PRIMARY, TV_FALL);
s->addEvent720(660.0f, T_PRIMARY, TV_RISE);
s->addEvent720(660 + 0.2, T_SECONDARY, TV_FALL);
addSkippedToothTriggerEvents(T_SECONDARY, s, totalTeethCount, skippedCount, 0.5, 0, 720,
661, 709);
// exit(-1);
s->addEvent720(710.0f, T_PRIMARY, TV_FALL);
s->addEvent720(720.0f - 1, T_SECONDARY, TV_FALL);
2016-05-27 19:02:56 -07:00
2019-07-23 16:22:40 -07:00
s->addEvent720(720.0f, T_PRIMARY, TV_RISE);
2016-05-27 19:02:56 -07:00
}
void configureHondaCbr600custom(TriggerWaveform *s) {
2016-07-09 11:02:36 -07:00
2019-07-23 16:22:40 -07:00
// w = 15
2016-07-09 11:02:36 -07:00
float w = 720 / 2 / 24;
// s->initialize(FOUR_STROKE_CAM_SENSOR);
s->initialize(FOUR_STROKE_CAM_SENSOR);
2016-07-09 11:02:36 -07:00
s->useOnlyPrimaryForSync = true;
s->isSynchronizationNeeded = true;
2016-07-12 06:03:22 -07:00
s->setTriggerSynchronizationGap2(0.7, 1.1);
2016-07-09 11:02:36 -07:00
float a = 0;
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a - 1, T_SECONDARY, TV_FALL); // 30
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
s->addEvent720(52.4, T_PRIMARY, TV_FALL);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a - 1, T_SECONDARY, TV_FALL); // 60
2016-07-09 11:02:36 -07:00
for (int i = 0;i<10;i++) {
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_FALL);
2016-07-09 11:02:36 -07:00
}
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(381.34f, T_PRIMARY, TV_RISE);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a - 1, T_SECONDARY, TV_FALL);
2016-07-09 11:02:36 -07:00
for (int i = 0;i<1;i++) {
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_FALL);
2016-07-09 11:02:36 -07:00
}
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(449.1f, T_PRIMARY, TV_FALL);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_FALL);
2016-07-09 11:02:36 -07:00
for (int i = 0;i<8;i++) {
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_FALL);
2016-07-09 11:02:36 -07:00
}
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a, T_SECONDARY, TV_RISE);
2016-07-09 11:02:36 -07:00
a += w;
2018-12-25 08:51:49 -08:00
s->addEvent720(a - 1, T_SECONDARY, TV_FALL);
2016-07-09 11:02:36 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(720.0f, T_PRIMARY, TV_RISE);
2016-07-09 11:02:36 -07:00
}
void configureHondaAccordShifted(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2016-10-15 20:03:28 -07:00
float sb = S24;
2016-10-28 19:03:00 -07:00
// like this there is no issue
2018-12-25 08:51:49 -08:00
// s->addEvent720(S24 + 0.001, T_PRIMARY, TV_RISE);
// s->addEvent720(S24 + 0.1, T_SECONDARY, TV_RISE);
2016-10-28 19:03:00 -07:00
2018-12-25 08:51:49 -08:00
s->addEvent720(S24 + 0.001, T_SECONDARY, TV_RISE);
s->addEvent720(S24 + 0.1, T_PRIMARY, TV_RISE);
2016-10-28 19:03:00 -07:00
2016-10-15 20:03:28 -07:00
sb += S24;
2018-12-25 08:51:49 -08:00
s->addEvent720(sb, T_SECONDARY, TV_FALL);
2016-10-15 20:03:28 -07:00
sb += S24;
2018-12-25 08:51:49 -08:00
s->addEvent720(S24 + 22, T_PRIMARY, TV_FALL);
2016-07-09 11:02:36 -07:00
2016-05-27 19:02:56 -07:00
2016-10-31 19:02:12 -07:00
for (int i = 0;i<23;i++) {
2018-12-25 17:09:35 -08:00
sb = addAccordPair(s, sb, T_SECONDARY);
2016-10-31 19:02:12 -07:00
}
2016-10-15 20:03:28 -07:00
s->useOnlyPrimaryForSync = true;
s->isSynchronizationNeeded = false;
}
2020-04-25 19:23:53 -07:00
void configureOnePlus16(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2017-02-13 21:02:59 -08:00
int totalTeethCount = 16;
int skippedCount = 0;
2018-12-25 08:51:49 -08:00
s->addEvent720(2, T_PRIMARY, TV_RISE);
2018-12-25 16:42:27 -08:00
addSkippedToothTriggerEvents(T_SECONDARY, s, totalTeethCount, skippedCount, 0.5, 0, 360, 2, 20);
2018-12-25 08:51:49 -08:00
s->addEvent720(20, T_PRIMARY, TV_FALL);
2018-12-25 16:42:27 -08:00
addSkippedToothTriggerEvents(T_SECONDARY, s, totalTeethCount, skippedCount, 0.5, 0, 360, 20, NO_RIGHT_FILTER);
2017-02-13 21:02:59 -08:00
addSkippedToothTriggerEvents(T_SECONDARY, s, totalTeethCount, skippedCount, 0.5, 360, 360, NO_LEFT_FILTER,
2018-12-25 16:42:27 -08:00
NO_RIGHT_FILTER);
2017-02-13 21:02:59 -08:00
s->isSynchronizationNeeded = false;
s->useOnlyPrimaryForSync = true;
}
2020-04-19 11:23:01 -07:00
// TT_HONDA_K_12_1
void configureHondaK_12_1(TriggerWaveform *s) {
s->initialize(FOUR_STROKE_CRANK_SENSOR);
s->setTriggerSynchronizationGap(3);
int count = 12;
float tooth = s->getCycleDuration() / count; // hint: tooth = 30
float width = 4; // for VR we only handle rises so width does not matter much
s->addEventAngle(20 - width, T_PRIMARY, TV_RISE);
s->addEventAngle(20, T_PRIMARY, TV_FALL);
for (int i = 1; i <= count; i++) {
s->addEventAngle(tooth * i - width, T_PRIMARY, TV_RISE);
s->addEventAngle(tooth * i, T_PRIMARY, TV_FALL);
}
}
2017-02-13 21:02:59 -08:00