rusefi-1/firmware/controllers/core/EfiWave.cpp

99 lines
2.1 KiB
C++
Raw Normal View History

2015-07-10 06:01:56 -07:00
/**
* @file EfiWave.cpp
*
* @date May 18, 2014
2018-01-20 17:55:31 -08:00
* @author Andrey Belomutskiy, (c) 2012-2018
2015-07-10 06:01:56 -07:00
*/
2018-09-16 19:26:57 -07:00
#include "global.h"
2015-07-10 06:01:56 -07:00
#include "EfiWave.h"
#include "trigger_structure.h"
2018-12-25 05:27:52 -08:00
SingleWave::SingleWave() {
2015-07-10 06:01:56 -07:00
init(NULL);
}
2018-12-25 05:27:52 -08:00
SingleWave::SingleWave(pin_state_t *ps) {
2015-07-10 06:01:56 -07:00
init(ps);
}
2018-12-25 05:27:52 -08:00
void SingleWave::init(pin_state_t *pinStates) {
2015-07-10 06:01:56 -07:00
this->pinStates = pinStates;
}
2018-12-25 05:27:52 -08:00
int SingleWave::getState(int index) {
2018-12-24 19:40:48 -08:00
return pinStates[index];
}
2018-12-25 05:27:52 -08:00
void SingleWave::setState(int index, int state) {
2018-12-24 19:40:48 -08:00
pinStates[index] = state;
}
2018-12-08 13:59:16 -08:00
void MultiWave::baseConstructor() {
2015-07-10 06:01:56 -07:00
waves = NULL;
switchTimes = NULL;
reset();
}
2018-12-08 13:59:16 -08:00
MultiWave::MultiWave() {
2015-07-10 06:01:56 -07:00
baseConstructor();
}
2018-12-25 05:27:52 -08:00
MultiWave::MultiWave(float *switchTimes, SingleWave *waves) {
2015-07-10 06:01:56 -07:00
baseConstructor();
init(switchTimes, waves);
}
2018-12-25 05:27:52 -08:00
void MultiWave::init(float *switchTimes, SingleWave *waves) {
2015-07-10 06:01:56 -07:00
this->switchTimes = switchTimes;
this->waves = waves;
}
2018-12-08 13:59:16 -08:00
void MultiWave::reset(void) {
2015-07-10 06:01:56 -07:00
waveCount = 0;
}
2018-12-08 13:59:16 -08:00
float MultiWave::getSwitchTime(int index) const {
2015-07-10 06:01:56 -07:00
return switchTimes[index];
}
2018-12-08 13:59:16 -08:00
void MultiWave::checkSwitchTimes(int size) {
2015-07-10 06:01:56 -07:00
if (switchTimes[size - 1] != 1) {
2018-01-23 09:05:14 -08:00
firmwareError(CUSTOM_ERR_WAVE_1, "last switch time has to be 1 not %.2f", switchTimes[size - 1]);
2015-07-10 06:01:56 -07:00
return;
}
for (int i = 0; i < size - 1; i++) {
if (switchTimes[i] >= switchTimes[i + 1]) {
2018-01-23 09:05:14 -08:00
firmwareError(CUSTOM_ERR_WAVE_2, "invalid switchTimes @%d: %.2f/%.2f", i, switchTimes[i], switchTimes[i + 1]);
2015-07-10 06:01:56 -07:00
}
}
}
2018-12-08 13:38:44 -08:00
2018-12-08 13:59:16 -08:00
int MultiWave::getChannelState(int channelIndex, int phaseIndex) const {
2018-12-08 13:38:44 -08:00
return waves[channelIndex].pinStates[phaseIndex];
}
/**
* returns the index at which given value would need to be inserted into sorted array
*/
2018-12-08 13:59:16 -08:00
int MultiWave::findInsertionAngle(float angle, int size) const {
2018-12-08 13:38:44 -08:00
for (int i = size - 1; i >= 0; i--) {
if (angle > switchTimes[i])
return i + 1;
}
return 0;
}
2018-12-08 13:59:16 -08:00
int MultiWave::findAngleMatch(float angle, int size) const {
2018-12-08 13:38:44 -08:00
for (int i = 0; i < size; i++) {
if (isSameF(switchTimes[i], angle))
return i;
}
return EFI_ERROR_CODE;
}
2018-12-08 13:59:16 -08:00
void MultiWave::setSwitchTime(int index, float value) {
2018-12-08 13:38:44 -08:00
efiAssertVoid(CUSTOM_ERR_6690, switchTimes != NULL, "switchTimes");
switchTimes[index] = value;
}