auto-sync

This commit is contained in:
rusEfi 2015-01-13 13:03:46 -06:00
parent 055fe76dd2
commit d576b87617
8 changed files with 61 additions and 74 deletions

View File

@ -57,10 +57,9 @@ void Engine::init() {
initLogging(&logger, "engine");
}
static bool stopPin(io_pin_e pin) {
NamedOutputPin *output = &outputs[(int)pin];
static bool stopPin(NamedOutputPin *output) {
if (output->getLogicValue()) {
doSetOutputPinValue2(output, false);
output->setValue(false);
scheduleMsg(&logger, "turning off %s", output->name);
return true;
}
@ -71,9 +70,9 @@ 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(pin);
result |= stopPin(&outputs[(int)pin]);
pin = (io_pin_e) ((int) SPARKOUT_1_OUTPUT + i);
result |= stopPin(pin);
result |= stopPin(&outputs[(int)pin]);
}
return result;
}

View File

@ -105,7 +105,7 @@ public:
TriggerShape triggerShape;
float angleExtra[IGNITION_PIN_COUNT];
io_pin_e ignitionPin[IGNITION_PIN_COUNT];
NamedOutputPin *ignitionPin[IGNITION_PIN_COUNT];
void onTriggerEvent(uint64_t nowNt);
EngineState engineState;

View File

@ -43,7 +43,7 @@ typedef struct {
typedef struct IgnitionEvent_struct IgnitionEvent;
struct IgnitionEvent_struct {
io_pin_e io_pin;
NamedOutputPin *output;
scheduling_s signalTimerUp;
scheduling_s signalTimerDown;
event_trigger_position_s dwellPosition;

View File

@ -43,9 +43,50 @@ static Logging logger;
extern NamedOutputPin outputs[IO_PIN_COUNT];
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 *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";
}
}
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);
}
//uint32_t dbgStart;
@ -77,6 +118,7 @@ void turnPinHigh(NamedOutputPin *output) {
}
void turnPinLow(NamedOutputPin *output) {
efiAssertVoid(output!=NULL, "NULL turnPinLow");
#if EFI_GPIO
// turn off the output
doSetOutputPinValue2(output, false);

View File

@ -103,15 +103,15 @@ void initializeIgnitionActions(angle_t advance, angle_t dwellAngle, IgnitionEven
for (int i = 0; i < CONFIG(cylindersCount); i++) {
float localAdvance = advance + ENGINE(angleExtra[i]);
io_pin_e pin = ENGINE(ignitionPin[i]);
NamedOutputPin *output = ENGINE(ignitionPin[i]);
IgnitionEvent *event = list->add();
if (!isPinAssigned(&outputs[(pin)])) {
if (!isPinAssigned(output)) {
// todo: extact method for this index math
warning(OBD_PCM_Processor_Fault, "no_pin_cl #%d", (int) pin - (int) SPARKOUT_1_OUTPUT + 1);
warning(OBD_PCM_Processor_Fault, "no_pin_cl #%s", output->name);
}
event->io_pin = pin;
event->output = output;
event->advance = localAdvance;
findTriggerPosition(&event->dwellPosition, localAdvance - dwellAngle PASS_ENGINE_PARAMETER);
@ -296,26 +296,25 @@ int getCylinderId(firing_order_e firingOrder, int index) {
return -1;
}
io_pin_e getIgnitionPinForIndex(int i DECLARE_ENGINE_PARAMETER_S) {
static NamedOutputPin * getIgnitionPinForIndex(int i DECLARE_ENGINE_PARAMETER_S) {
switch (CONFIG(ignitionMode)) {
case IM_ONE_COIL:
return SPARKOUT_1_OUTPUT;
return &outputs[(int)SPARKOUT_1_OUTPUT];
break;
case IM_WASTED_SPARK: {
int wastedIndex = i % (CONFIG(cylindersCount) / 2);
int id = getCylinderId(CONFIG(firingOrder), wastedIndex) - 1;
return (io_pin_e) (SPARKOUT_1_OUTPUT + id);
return &outputs[(int)(SPARKOUT_1_OUTPUT + id)];
}
break;
case IM_INDIVIDUAL_COILS:
return (io_pin_e) ((int) SPARKOUT_1_OUTPUT + getCylinderId(CONFIG(firingOrder), i) - 1);
return &outputs[ ((int) SPARKOUT_1_OUTPUT + getCylinderId(CONFIG(firingOrder), i) - 1)];
break;
default:
firmwareError("unsupported ignitionMode %d in initializeIgnitionActions()", engineConfiguration->ignitionMode);
return SPARKOUT_1_OUTPUT;
return &outputs[(int)SPARKOUT_1_OUTPUT];
}
}
#if EFI_ENGINE_CONTROL || defined(__DOXYGEN__)

View File

@ -208,7 +208,7 @@ static ALWAYS_INLINE void handleSparkEvent(uint32_t eventIndex, IgnitionEvent *i
/**
* The start of charge is always within the current trigger event range, so just plain time-based scheduling
*/
scheduleTask("spark up", sUp, sparkDelayUs, (schfunc_t) &turnPinHigh, &outputs[(int)iEvent->io_pin]);
scheduleTask("spark up", sUp, sparkDelayUs, (schfunc_t) &turnPinHigh, iEvent->output);
/**
* Spark event is often happening during a later trigger event timeframe
* TODO: improve precision
@ -222,7 +222,7 @@ static ALWAYS_INLINE void handleSparkEvent(uint32_t eventIndex, IgnitionEvent *i
*/
float timeTillIgnitionUs = engine->rpmCalculator.oneDegreeUs * iEvent->sparkPosition.angleOffset;
scheduleTask("spark 1down", sDown, (int) timeTillIgnitionUs, (schfunc_t) &turnPinLow, &outputs[(int)iEvent->io_pin]);
scheduleTask("spark 1down", sDown, (int) timeTillIgnitionUs, (schfunc_t) &turnPinLow, iEvent->output);
} else {
/**
* Spark should be scheduled in relation to some future trigger event, this way we get better firing precision
@ -257,7 +257,7 @@ static ALWAYS_INLINE void handleSpark(uint32_t eventIndex, int rpm,
float timeTillIgnitionUs = engine->rpmCalculator.oneDegreeUs * current->sparkPosition.angleOffset;
scheduleTask("spark 2down", sDown, (int) timeTillIgnitionUs, (schfunc_t) &turnPinLow,
(void*) current->io_pin);
current->output);
}
}

View File

@ -142,6 +142,7 @@ static char timeBuffer[10];
* @brief Register an event for digital sniffer
*/
void WaveChart::addWaveChartEvent3(const char *name, const char * msg) {
efiAssertVoid(name!=NULL, "WC: NULL name");
if(!engineConfiguration->isDigitalChartEnabled) {
return;
}

View File

@ -97,61 +97,9 @@ void initPrimaryPins(void) {
outputPinRegister("LED_ERROR", &enginePins.errorLedPin, LED_ERROR_PORT, LED_ERROR_PIN);
}
static void getPinValue(const char *name) {
io_pin_e pin = getPinByName(name);
if (pin == IO_INVALID) {
return;
}
OutputPin * outputPin = &outputs[pin];
int value = outputPin->getLogicValue();
scheduleMsg(&logger, "pin_value %s %d", name, value);
}
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 *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";
}
}
void initOutputPins(void) {
initLogging(&logger, "io_pins");
for (int i = 0; i < IO_PIN_COUNT;i++)
outputs[i].name = getPinName((io_pin_e)i);
/**
* want to make sure it's all zeros so that we can compare in initOutputPinExt() method
*/
@ -210,8 +158,6 @@ void initOutputPins(void) {
ledRegister(LED_HUGE_19, GPIOE, 3);
ledRegister(LED_HUGE_20, GPIOE, 1);
*/
addConsoleActionS("get_pin_value", getPinValue);
}
#if EFI_GPIO