auto-sync

This commit is contained in:
rusEfi 2015-01-13 14:03:49 -06:00
parent c648dd05c7
commit b74dd359f9
10 changed files with 41 additions and 91 deletions

View File

@ -66,7 +66,6 @@
#endif
extern engine_pins_s enginePins;
extern NamedOutputPin outputs[IO_PIN_COUNT];
// this 'true' value is needed for simulator
static volatile bool fullLog = true;
@ -274,13 +273,9 @@ static void printInfo(Engine *engine, systime_t nowSeconds) {
#endif
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
// todo: extract method?
io_pin_e pin = (io_pin_e) ((int) SPARKOUT_1_OUTPUT + i);
printOutPin(enginePins.coils[i].name, boardConfiguration->ignitionPins[i]);
printOutPin(outputs[(int)pin].name, boardConfiguration->ignitionPins[i]);
pin = (io_pin_e) ((int) INJECTOR_1_OUTPUT + i);
printOutPin(outputs[(int)pin].name, boardConfiguration->injectionPins[i]);
printOutPin(enginePins.injectors[i].name, boardConfiguration->injectionPins[i]);
}
#endif

View File

@ -23,7 +23,7 @@
static Logging logger;
extern NamedOutputPin outputs[IO_PIN_COUNT];
extern engine_pins_s enginePins;
EXTERN_ENGINE
;
@ -69,10 +69,8 @@ static bool stopPin(NamedOutputPin *output) {
bool Engine::stopPins() {
bool result = false;
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = (io_pin_e) ((int) INJECTOR_1_OUTPUT + i);
result |= stopPin(&outputs[(int)pin]);
pin = (io_pin_e) ((int) SPARKOUT_1_OUTPUT + i);
result |= stopPin(&outputs[(int)pin]);
result |= stopPin(&enginePins.coils[i]);
result |= stopPin(&enginePins.injectors[i]);
}
return result;
}

View File

@ -12,7 +12,7 @@
#define GPIO_NULL NULL
#define NAMED_PIN_COUNT 24
#define ENGINE_CHANNEL_COUNT 12
typedef enum {
INJECTOR_1,
@ -96,8 +96,6 @@ typedef enum {
} io_pin_e;
#define IO_PIN_COUNT 24
void initPrimaryPins(void);
void initOutputPins(void);

View File

@ -39,54 +39,26 @@ EXTERN_ENGINE;
extern WaveChart waveChart;
#endif
#include "efiGpio.h"
static Logging logger;
extern NamedOutputPin outputs[IO_PIN_COUNT];
extern engine_pins_s enginePins;
static const char *namedPinsArray[NAMED_PIN_COUNT] = { "spa1", "spa2", "spa3", "spa4", "spa5", "spa6", "spa7", "spa8",
"spa9", "spa10", "spa11", "spa12", "inj1", "inj2", "inj3", "inj4", "inj5", "inj6", "inj7", "inj8", "inj9",
"inj10", "inj11", "inj12", };
static const char *sparkNames[ENGINE_CHANNEL_COUNT] = { "spa1", "spa2", "spa3", "spa4", "spa5", "spa6", "spa7", "spa8",
"spa9", "spa10", "spa11", "spa12"};
static const char *getPinName(io_pin_e io_pin) {
switch (io_pin) {
// todo: refactor this hell - introduce arrays & checks?
case SPARKOUT_1_OUTPUT:
case SPARKOUT_2_OUTPUT:
case SPARKOUT_3_OUTPUT:
case SPARKOUT_4_OUTPUT:
case SPARKOUT_5_OUTPUT:
case SPARKOUT_6_OUTPUT:
case SPARKOUT_7_OUTPUT:
case SPARKOUT_8_OUTPUT:
case SPARKOUT_9_OUTPUT:
case SPARKOUT_10_OUTPUT:
case SPARKOUT_11_OUTPUT:
case SPARKOUT_12_OUTPUT:
case INJECTOR_1_OUTPUT:
case INJECTOR_2_OUTPUT:
case INJECTOR_3_OUTPUT:
case INJECTOR_4_OUTPUT:
case INJECTOR_5_OUTPUT:
case INJECTOR_6_OUTPUT:
case INJECTOR_7_OUTPUT:
case INJECTOR_8_OUTPUT:
case INJECTOR_9_OUTPUT:
case INJECTOR_10_OUTPUT:
case INJECTOR_11_OUTPUT:
case INJECTOR_12_OUTPUT:
return namedPinsArray[io_pin];
default:
return "Pin needs name";
}
}
static const char *injectorNames[ENGINE_CHANNEL_COUNT] = { "inj1", "inj2", "inj3", "inj4", "inj5", "inj6", "inj7", "inj8", "inj9",
"inj10", "inj11", "inj12"};
void initSignalExecutor(void) {
initLogging(&logger, "s exec");
initSignalExecutorImpl();
for (int i = 0; i < IO_PIN_COUNT;i++)
outputs[i].name = getPinName((io_pin_e)i);
for (int i = 0; i < ENGINE_CHANNEL_COUNT;i++) {
enginePins.coils[i].name = sparkNames[i];
enginePins.injectors[i].name = injectorNames[i];
}
}
//uint32_t dbgStart;

View File

@ -42,13 +42,11 @@ static bool_t isRunningBench = false;
static int is_injector_enabled[MAX_INJECTOR_COUNT];
extern NamedOutputPin outputs[IO_PIN_COUNT];
extern engine_pins_s enginePins;
void initIgnitionCentral(void) {
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = (io_pin_e)((int)SPARKOUT_1_OUTPUT + i);
NamedOutputPin *output = &outputs[(int)pin];
NamedOutputPin *output = &enginePins.coils[i];
outputPinRegisterExt2(output->name, output, boardConfiguration->ignitionPins[i], &boardConfiguration->ignitionPinMode);
}
}
@ -147,8 +145,7 @@ static void fuelbench2(const char *delayStr, const char *indexStr, const char *
return;
}
brain_pin_e b = boardConfiguration->injectionPins[index - 1];
io_pin_e p = (io_pin_e) ((int) INJECTOR_1_OUTPUT - 1 + index);
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &outputs[(int)p], b);
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &enginePins.injectors[index - 1], b);
}
void fanBench(void) {
@ -203,8 +200,7 @@ static void sparkbench2(const char *delayStr, const char *indexStr, const char *
return;
}
brain_pin_e b = boardConfiguration->ignitionPins[index - 1];
io_pin_e p = (io_pin_e) ((int) SPARKOUT_1_OUTPUT - 1 + index);
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &outputs[(int)p], b);
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &enginePins.coils[index - 1], b);
}
/**
@ -245,7 +241,7 @@ void initInjectorCentral(Engine *engine) {
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = (io_pin_e) ((int) INJECTOR_1_OUTPUT + i);
NamedOutputPin *output = &outputs[(int)pin];
NamedOutputPin *output = &enginePins.coils[i];
outputPinRegisterExt2(output->name, output, boardConfiguration->injectionPins[i],
&boardConfiguration->injectionPinMode);

View File

@ -32,7 +32,7 @@
EXTERN_ENGINE
;
extern NamedOutputPin outputs[IO_PIN_COUNT];
extern engine_pins_s enginePins;
/**
* this cache allows us to find a close-enough (with one degree precision) trigger wheel index by
@ -161,10 +161,10 @@ void FuelSchedule::addFuelEvents(injection_mode_e mode DECLARE_ENGINE_PARAMETER_
switch (mode) {
case IM_SEQUENTIAL:
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = INJECTOR_PIN_BY_INDEX(getCylinderId(engineConfiguration->firingOrder, i) - 1);
int index = getCylinderId(engineConfiguration->firingOrder, i) - 1;
float angle = baseAngle
+ (float) engineConfiguration->engineCycle * i / engineConfiguration->cylindersCount;
registerInjectionEvent(&outputs[(pin)], angle, false PASS_ENGINE_PARAMETER);
registerInjectionEvent(&enginePins.injectors[index], angle, false PASS_ENGINE_PARAMETER);
}
break;
case IM_SIMULTANEOUS:
@ -182,16 +182,15 @@ void FuelSchedule::addFuelEvents(injection_mode_e mode DECLARE_ENGINE_PARAMETER_
case IM_BATCH:
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
int index = i % (engineConfiguration->cylindersCount / 2);
io_pin_e pin = INJECTOR_PIN_BY_INDEX(index);
float angle = baseAngle
+ i * (float) engineConfiguration->engineCycle / engineConfiguration->cylindersCount;
registerInjectionEvent(&outputs[(pin)], angle, false PASS_ENGINE_PARAMETER);
registerInjectionEvent(&enginePins.injectors[index], angle, false PASS_ENGINE_PARAMETER);
/**
* also fire the 2nd half of the injectors so that we can implement a batch mode on individual wires
*/
pin = INJECTOR_PIN_BY_INDEX(index + (engineConfiguration->cylindersCount / 2));
registerInjectionEvent(&outputs[(pin)], angle, false PASS_ENGINE_PARAMETER);
index = index + (engineConfiguration->cylindersCount / 2);
registerInjectionEvent(&enginePins.injectors[index], angle, false PASS_ENGINE_PARAMETER);
}
break;
default:
@ -299,21 +298,21 @@ int getCylinderId(firing_order_e firingOrder, int index) {
static NamedOutputPin * getIgnitionPinForIndex(int i DECLARE_ENGINE_PARAMETER_S) {
switch (CONFIG(ignitionMode)) {
case IM_ONE_COIL:
return &outputs[(int)SPARKOUT_1_OUTPUT];
return &enginePins.coils[0];
break;
case IM_WASTED_SPARK: {
int wastedIndex = i % (CONFIG(cylindersCount) / 2);
int id = getCylinderId(CONFIG(firingOrder), wastedIndex) - 1;
return &outputs[(int)(SPARKOUT_1_OUTPUT + id)];
int id = getCylinderId(CONFIG(firingOrder), wastedIndex);
return &enginePins.coils[id];
}
break;
case IM_INDIVIDUAL_COILS:
return &outputs[ ((int) SPARKOUT_1_OUTPUT + getCylinderId(CONFIG(firingOrder), i) - 1)];
return &enginePins.coils[getCylinderId(CONFIG(firingOrder), i)];
break;
default:
firmwareError("unsupported ignitionMode %d in initializeIgnitionActions()", engineConfiguration->ignitionMode);
return &outputs[(int)SPARKOUT_1_OUTPUT];
return &enginePins.coils[0];
}
}

View File

@ -13,7 +13,6 @@
pin_output_mode_e OUTPUT_MODE_DEFAULT = OM_DEFAULT;
// todo: clean this mess, this should become 'static'/private
NamedOutputPin outputs[IO_PIN_COUNT];
engine_pins_s enginePins;
NamedOutputPin::NamedOutputPin() : OutputPin() {

View File

@ -50,6 +50,9 @@ typedef struct {
OutputPin o2heater;
OutputPin alternatorField;
OutputPin errorLedPin;
NamedOutputPin injectors[ENGINE_CHANNEL_COUNT];
NamedOutputPin coils[ENGINE_CHANNEL_COUNT];
} engine_pins_s;
/**

View File

@ -57,10 +57,10 @@
EXTERN_ENGINE
;
extern bool hasFirmwareErrorFlag;
extern NamedOutputPin outputs[IO_PIN_COUNT];
static LocalVersionHolder localVersion;
extern engine_pins_s enginePins;
static MainTriggerCallback mainTriggerCallbackInstance;
/**
@ -89,13 +89,13 @@ static Logging logger;
static void startSimultaniousInjection(Engine *engine) {
for (int i = 0; i < engine->engineConfiguration->cylindersCount; i++) {
turnPinHigh(&outputs[(int)INJECTOR_PIN_BY_INDEX(i)]);
turnPinHigh(&enginePins.injectors[i]);
}
}
static void endSimultaniousInjection(Engine *engine) {
for (int i = 0; i < engine->engineConfiguration->cylindersCount; i++) {
turnPinLow(&outputs[(int)INJECTOR_PIN_BY_INDEX(i)]);
turnPinLow(&enginePins.injectors[i]);
}
}

View File

@ -27,7 +27,6 @@ static Logging logger;
static OutputPin sdCsPin;
extern NamedOutputPin outputs[IO_PIN_COUNT];
extern engine_pins_s enginePins;
#if defined(STM32F4XX)
@ -162,24 +161,15 @@ void initOutputPins(void) {
#if EFI_GPIO
static io_pin_e TO_BE_TURNED_OFF_ON_ERROR[] = { SPARKOUT_1_OUTPUT, SPARKOUT_2_OUTPUT, SPARKOUT_3_OUTPUT,
SPARKOUT_4_OUTPUT, SPARKOUT_5_OUTPUT, SPARKOUT_6_OUTPUT, SPARKOUT_7_OUTPUT, SPARKOUT_8_OUTPUT,
SPARKOUT_9_OUTPUT, SPARKOUT_10_OUTPUT, SPARKOUT_11_OUTPUT, SPARKOUT_12_OUTPUT,
INJECTOR_1_OUTPUT, INJECTOR_2_OUTPUT, INJECTOR_3_OUTPUT, INJECTOR_4_OUTPUT, INJECTOR_5_OUTPUT,
INJECTOR_6_OUTPUT, INJECTOR_7_OUTPUT, INJECTOR_8_OUTPUT, INJECTOR_9_OUTPUT, INJECTOR_10_OUTPUT,
INJECTOR_11_OUTPUT, INJECTOR_12_OUTPUT };
/**
* This method is part of fatal error handling.
* Please note that worst case scenario the pins might get re-enabled by some other code :(
* The whole method is pretty naive, but that's at least something.
*/
void turnAllPinsOff(void) {
int l = sizeof(TO_BE_TURNED_OFF_ON_ERROR) / sizeof(io_pin_e);
for (int i = 0; i < l; i++) {
OutputPin *output = &outputs[TO_BE_TURNED_OFF_ON_ERROR[l]];
output->setValue(false);
for (int i = 0; i < ENGINE_CHANNEL_COUNT; i++) {
enginePins.coils[i].setValue(false);
enginePins.injectors[i].setValue(false);
}
}
#endif