static void printGpsInfo(void) { scheduleMsg(&logging, "GPS RX %s", hwPortname(boardConfiguration->gps_rx_pin)); scheduleMsg(&logging, "GPS TX %s", hwPortname(boardConfiguration->gps_tx_pin)); scheduleMsg(&logging, "m=%d,e=%d: vehicle speed = %f\r\n", gpsMesagesCount, uartErrors, getCurrentSpeed()); float sec = currentTimeMillis() / 1000.0; scheduleMsg(&logging, "communication speed: %f", gpsMesagesCount / sec); print("GPS latitude = %f\r\n", GPSdata.latitude); print("GPS longitude = %f\r\n", GPSdata.longitude); }
static void printOutputs(engine_configuration_s *engineConfiguration) { // engine_configuration2_s *engineConfiguration2 scheduleMsg(&logger, "injectionPins: mode %s", getPin_output_mode_e(boardConfiguration->injectionPinMode)); for (int i = 0; i < engineConfiguration->specs.cylindersCount; i++) { brain_pin_e brainPin = boardConfiguration->injectionPins[i]; scheduleMsg(&logger, "injection #%d @ %s", (1 + i), hwPortname(brainPin)); } scheduleMsg(&logger, "ignitionPins: mode %s", getPin_output_mode_e(boardConfiguration->ignitionPinMode)); for (int i = 0; i < engineConfiguration->specs.cylindersCount; i++) { brain_pin_e brainPin = boardConfiguration->ignitionPins[i]; scheduleMsg(&logger, "ignition #%d @ %s", (1 + i), hwPortname(brainPin)); } scheduleMsg(&logger, "idlePin: mode %s @ %s freq=%d", getPin_output_mode_e(boardConfiguration->idle.solenoidPinMode), hwPortname(boardConfiguration->idle.solenoidPin), boardConfiguration->idle.solenoidFrequency); scheduleMsg(&logger, "malfunctionIndicatorn: %s mode=%s", hwPortname(boardConfiguration->malfunctionIndicatorPin), getPin_output_mode_e(boardConfiguration->malfunctionIndicatorPinMode)); scheduleMsg(&logger, "fuelPumpPin: mode %s @ %s", getPin_output_mode_e(boardConfiguration->fuelPumpPinMode), hwPortname(boardConfiguration->fuelPumpPin)); scheduleMsg(&logger, "fanPin: mode %s @ %s", getPin_output_mode_e(boardConfiguration->fanPinMode), hwPortname(boardConfiguration->fanPin)); scheduleMsg(&logger, "mainRelay: mode %s @ %s", getPin_output_mode_e(boardConfiguration->mainRelayPinMode), hwPortname(boardConfiguration->mainRelayPin)); scheduleMsg(&logger, "alternator field: mode %s @ %s", getPin_output_mode_e(boardConfiguration->alternatorControlPinMode), hwPortname(boardConfiguration->alternatorControlPin)); }
static void canInfo(void) { if (!engineConfiguration->isCanEnabled) { scheduleMsg(&logger, "CAN is not enabled, please enable & restart"); return; } scheduleMsg(&logger, "CAN TX %s", hwPortname(boardConfiguration->canTxPin)); scheduleMsg(&logger, "CAN RX %s", hwPortname(boardConfiguration->canRxPin)); scheduleMsg(&logger, "type=%d canReadEnabled=%s canWriteEnabled=%s period=%d", engineConfiguration->canNbcType, boolToString(engineConfiguration->canReadEnabled), boolToString(engineConfiguration->canWriteEnabled), engineConfiguration->canSleepPeriod); scheduleMsg(&logger, "CAN rx count %d/tx ok %d/tx not ok %d", canReadCounter, canWriteOk, canWriteNotOk); }
static void showHipInfo(void) { if (!CONFIGB(isHip9011Enabled)) { scheduleMsg(logger, "hip9011 driver not active"); return; } printSpiState(logger, boardConfiguration); scheduleMsg(logger, "enabled=%s state=%s bore=%.2fmm freq=%.2fkHz PaSDO=%d", boolToString(CONFIGB(isHip9011Enabled)), getHip_state_e(instance.state), engineConfiguration->cylinderBore, getHIP9011Band(PASS_HIP_PARAMS), engineConfiguration->hip9011PrescalerAndSDO); char *outputName = getPinNameByAdcChannel("hip", engineConfiguration->hipOutputChannel, hipPinNameBuffer); scheduleMsg(logger, "band_index=%d gain %.2f/index=%d output=%s", instance.currentBandIndex, engineConfiguration->hip9011Gain, instance.currentGainIndex, outputName); scheduleMsg(logger, "integrator index=%d knockVThreshold=%.2f knockCount=%d maxKnockSubDeg=%.2f", instance.currentIntergratorIndex, engineConfiguration->knockVThreshold, engine->knockCount, engineConfiguration->maxKnockSubDeg); const char * msg = instance.invalidHip9011ResponsesCount > 0 ? "NOT GOOD" : "ok"; scheduleMsg(logger, "spi=%s IntHold@%s/%d response count=%d incorrect response=%d %s", getSpi_device_e(engineConfiguration->hip9011SpiDevice), hwPortname(CONFIGB(hip9011IntHoldPin)), CONFIGB(hip9011IntHoldPinMode), instance.correctResponsesCount, instance.invalidHip9011ResponsesCount, msg); scheduleMsg(logger, "CS@%s updateCount=%d", hwPortname(CONFIGB(hip9011CsPin)), instance.settingUpdateCount); #if EFI_PROD_CODE scheduleMsg(logger, "hip %.2fv/last=%.2f@%s/max=%.2f adv=%d", engine->knockVolts, getVoltage("hipinfo", engineConfiguration->hipOutputChannel), getPinNameByAdcChannel("hip", engineConfiguration->hipOutputChannel, pinNameBuffer), hipValueMax, CONFIGB(useTpicAdvancedMode)); scheduleMsg(logger, "mosi=%s", hwPortname(getMosiPin(engineConfiguration->hip9011SpiDevice))); scheduleMsg(logger, "miso=%s", hwPortname(getMisoPin(engineConfiguration->hip9011SpiDevice))); scheduleMsg(logger, "sck=%s", hwPortname(getSckPin(engineConfiguration->hip9011SpiDevice))); #endif /* EFI_PROD_CODE */ scheduleMsg(logger, "start %.2f end %.2f", engineConfiguration->knockDetectionWindowStart, engineConfiguration->knockDetectionWindowEnd); hipValueMax = 0; engine->printKnockState(); }
static void runBench(brain_pin_e brainPin, OutputPin *output, float delayMs, float onTimeMs, float offTimeMs, int count) { int delaySt = MS2ST(delayMs); int onTimeSt = MS2ST(onTimeMs); int offTimeSt = MS2ST(offTimeMs); if (delaySt < 0) { scheduleMsg(logger, "Invalid delay %f", delayMs); return; } if (onTimeSt <= 0) { scheduleMsg(logger, "Invalid onTime %f", onTimeMs); return; } if (offTimeSt <= 0) { scheduleMsg(logger, "Invalid offTime %f", offTimeMs); return; } scheduleMsg(logger, "Running bench: ON_TIME=%f ms OFF_TIME=%fms Counter=%d", onTimeMs, offTimeMs, count); scheduleMsg(logger, "output on %s", hwPortname(brainPin)); if (delaySt != 0) { chThdSleep(delaySt); } isRunningBench = true; for (int i = 0; i < count; i++) { output->setValue(true); chThdSleep(onTimeSt); output->setValue(false); chThdSleep(offTimeSt); } scheduleMsg(logger, "Done!"); isRunningBench = false; }
static void unregister(brain_pin_e currentPin, OutputPin *output) { if (currentPin == GPIO_UNASSIGNED) return; scheduleMsg(logger, "unregistering %s", hwPortname(currentPin)); unmarkPin(currentPin); output->unregister(); }
static void printMAPInfo(void) { #if EFI_ANALOG_SENSORS || defined(__DOXYGEN__) scheduleMsg(logger, "instant value=%fkPa", getRawMap()); if (engineConfiguration->hasFrequencyReportingMapSensor) { scheduleMsg(logger, "instant value=%fHz @ %s", mapFreq, hwPortname(boardConfiguration->frequencyReportingMapInputPin)); } else { scheduleMsg(logger, "map type=%d/%s MAP=%fkPa", engineConfiguration->map.sensor.type, getAir_pressure_sensor_type_e(engineConfiguration->map.sensor.type), getMap()); if (engineConfiguration->map.sensor.type == MT_CUSTOM) { scheduleMsg(logger, "at0=%f at5=%f", engineConfiguration->map.sensor.valueAt0, engineConfiguration->map.sensor.valueAt5); } } if (hasBaroSensor(PASS_ENGINE_PARAMETER_F)) { scheduleMsg(logger, "baro type=%d value=%f", engineConfiguration->baroSensor.type, getBaroPressure()); if (engineConfiguration->baroSensor.type == MT_CUSTOM) { scheduleMsg(logger, "min=%f max=%f", engineConfiguration->baroSensor.valueAt0, engineConfiguration->baroSensor.valueAt5); } } #endif /* EFI_ANALOG_SENSORS */ }
static void speedInfo(void) { scheduleMsg(logger, "VSS@%s c=%f eventCounter=%d speed=%f", hwPortname(boardConfiguration->vehicleSpeedSensorInputPin), engineConfiguration->vehicleSpeedCoef, vssCounter, getVehicleSpeed()); scheduleMsg(logger, "vss diff %d", vssDiff); }
void printBoardTestState(void) { print("Current index=%d\r\n", currentIndex); print("'n' for next step and 'set X' to return to step X\r\n"); print("ADC count: slow %d/fast %d\r\n", slowAdc.size(), fastAdc.size()); if (currentPin != GPIO_UNASSIGNED) { print("Blinking %s\r\n", hwPortname(currentPin)); } }
static void turnOffTriggerInputPin(brain_pin_e hwPin) { ICUDriver *driver = getInputCaptureDriver(hwPin); if (driver != NULL) { icuDisable(driver); icuStop(driver); scheduleMsg(logger, "turnOffTriggerInputPin %s", hwPortname(hwPin)); unmarkPin(hwPin); } }
static void triggerInfo(Engine *engine) { #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) trigger_shape_s *ts = &engine->triggerShape; scheduleMsg(&logger, "Template %s/%d trigger %d", getConfigurationName(engineConfiguration->engineType), engineConfiguration->engineType, engineConfiguration->triggerConfig.triggerType); scheduleMsg(&logger, "trigger event counters %d/%d/%d/%d", triggerCentral.getHwEventCounter(0), triggerCentral.getHwEventCounter(1), triggerCentral.getHwEventCounter(2), triggerCentral.getHwEventCounter(3)); scheduleMsg(&logger, "expected cycle events %d/%d/%d", ts->expectedEventCount[0], engine->triggerShape.expectedEventCount[1], ts->expectedEventCount[2]); scheduleMsg(&logger, "trigger type=%d/need2ndChannel=%s", engineConfiguration->triggerConfig.triggerType, boolToString(engineConfiguration->needSecondTriggerInput)); scheduleMsg(&logger, "expected duty #0=%f/#1=%f", ts->dutyCycle[0], ts->dutyCycle[1]); scheduleMsg(&logger, "isError %s/total errors=%d ord_err=%d/total revolutions=%d/self=%s", boolToString(isTriggerDecoderError()), triggerCentral.triggerState.totalTriggerErrorCounter, triggerCentral.triggerState.orderingErrorCounter, triggerCentral.triggerState.getTotalRevolutionCounter(), boolToString(engineConfiguration->directSelfStimulation)); #endif #if EFI_PROD_CODE scheduleMsg(&logger, "sn=%s ignitionMathTime=%d schTime=%d triggerMaxDuration=%d", boolToString(ts->isSynchronizationNeeded), engine->ignitionMathTime, engine->ignitionSchTime, triggerMaxDuration); triggerMaxDuration = 0; scheduleMsg(&logger, "maxLockTime=%d / maxTriggerReentraint=%d", maxLockTime, maxTriggerReentraint); scheduleMsg(&logger, "maxEventQueueTime=%d", maxEventQueueTime); scheduleMsg(&logger, "primary trigger simulator: %s %s freq=%d", hwPortname(boardConfiguration->triggerSimulatorPins[0]), pinModeToString(boardConfiguration->triggerSimulatorPinModes[0]), boardConfiguration->triggerSimulatorFrequency); scheduleMsg(&logger, "secondary trigger simulator: %s %s phase=%d", hwPortname(boardConfiguration->triggerSimulatorPins[1]), pinModeToString(boardConfiguration->triggerSimulatorPinModes[1]), triggerSignal.safe.phaseIndex); scheduleMsg(&logger, "3rd trigger simulator: %s %s", hwPortname(boardConfiguration->triggerSimulatorPins[2]), pinModeToString(boardConfiguration->triggerSimulatorPinModes[2])); scheduleMsg(&logger, "trigger error extra LED: %s %s", hwPortname(boardConfiguration->triggerErrorPin), pinModeToString(boardConfiguration->triggerErrorPinMode)); scheduleMsg(&logger, "primary trigger input: %s", hwPortname(boardConfiguration->triggerInputPins[0])); scheduleMsg(&logger, "secondary trigger input: %s", hwPortname(boardConfiguration->triggerInputPins[1])); scheduleMsg(&logger, "primary logic input: %s", hwPortname(boardConfiguration->logicAnalyzerPins[0])); scheduleMsg(&logger, "secondary logic input: %s", hwPortname(boardConfiguration->logicAnalyzerPins[1])); #endif /* EFI_PROD_CODE */ }
static void showIdleInfo(void) { scheduleMsg(logger, "idleMode=%s position=%f isStepper=%s", getIdle_mode_e(engineConfiguration->idleMode), getIdlePosition(), boolToString(boardConfiguration->useStepperIdle)); if (boardConfiguration->useStepperIdle) { scheduleMsg(logger, "direction=%s reactionTime=%f", hwPortname(boardConfiguration->idle.stepperDirectionPin), engineConfiguration->idleStepperReactionTime); scheduleMsg(logger, "step=%s steps=%d", hwPortname(boardConfiguration->idle.stepperStepPin), engineConfiguration->idleStepperTotalSteps); scheduleMsg(logger, "enable=%s", hwPortname(engineConfiguration->stepperEnablePin)); } else { scheduleMsg(logger, "idle valve freq=%d on %s", boardConfiguration->idle.solenoidFrequency, hwPortname(boardConfiguration->idle.solenoidPin)); } scheduleMsg(logger, "idleControl=%s", getIdle_control_e(engineConfiguration->idleControl)); scheduleMsg(logger, "idle P=%f I=%f D=%f dT=%d", engineConfiguration->idleRpmPid.pFactor, engineConfiguration->idleRpmPid.iFactor, engineConfiguration->idleRpmPid.dFactor, engineConfiguration->idleDT); }
static void setIndividualPin(const char *pinName, brain_pin_e *targetPin, const char *name) { brain_pin_e pin = parseBrainPin(pinName); if (pin == GPIO_INVALID) { scheduleMsg(&logger, "invalid pin name [%s]", pinName); return; } scheduleMsg(&logger, "setting %s pin to %s please save&restart", name, hwPortname(pin)); *targetPin = pin; applyNewConfiguration(); }
static void printTemperatureInfo(void) { #if EFI_ANALOG_SENSORS || defined(__DOXYGEN__) printThermistor("CLT", &engineConfiguration->clt, &engine->engineState.cltCurve); if (!isValidCoolantTemperature(getCoolantTemperature(PASS_ENGINE_PARAMETER_F))) { scheduleMsg(&logger, "CLT sensing error"); } printThermistor("IAT", &engineConfiguration->iat, &engine->engineState.iatCurve); if (!isValidIntakeAirTemperature(getIntakeAirTemperature(PASS_ENGINE_PARAMETER_F))) { scheduleMsg(&logger, "IAT sensing error"); } scheduleMsg(&logger, "fan=%s @ %s", boolToString(enginePins.fanRelay.getLogicValue()), hwPortname(boardConfiguration->fanPin)); scheduleMsg(&logger, "A/C relay=%s @ %s", boolToString(enginePins.acRelay.getLogicValue()), hwPortname(boardConfiguration->acRelayPin)); #endif }
static void speedInfo(void) { scheduleMsg(logger, "VSS %s at %s", boolToString(engineConfiguration->hasVehicleSpeedSensor), hwPortname(boardConfiguration->vehicleSpeedSensorInputPin)); scheduleMsg(logger, "c=%f eventCounter=%d speed=%f", engineConfiguration->vehicleSpeedCoef, vssCounter, getVehicleSpeed()); scheduleMsg(logger, "vss diff %d", vssDiff); }
static void speedInfo(void) { scheduleMsg(logger, "VSS input at %s", hwPortname(CONFIGB(vehicleSpeedSensorInputPin))); scheduleMsg(logger, "c=%.2f eventCounter=%d speed=%.2f", engineConfiguration->vehicleSpeedCoef, engine->engineState.vssEventCounter, getVehicleSpeed()); scheduleMsg(logger, "vss diff %d", vssDiff); }
static void showHipInfo(void) { if (!boardConfiguration->isHip9011Enabled) { scheduleMsg(logger, "hip9011 driver not active"); return; } printSpiState(logger, boardConfiguration); scheduleMsg(logger, "enabled=%s state=%d bore=%fmm freq=%fkHz PaSDO=%d", boolToString(boardConfiguration->isHip9011Enabled), state, engineConfiguration->cylinderBore, getBand(), engineConfiguration->hip9011PrescalerAndSDO); scheduleMsg(logger, "band_index=%d gain %f/index=%d", currentBandIndex, boardConfiguration->hip9011Gain, currentGainIndex); scheduleMsg(logger, "integrator index=%d knockVThreshold=%f knockCount=%d maxKnockSubDeg=%f", currentIntergratorIndex, engineConfiguration->knockVThreshold, engine->knockCount, engineConfiguration->maxKnockSubDeg); scheduleMsg(logger, "spi=%s IntHold@%s response count=%d incorrect response=%d", getSpi_device_e(hipSpiDevice), hwPortname(boardConfiguration->hip9011IntHoldPin), correctResponse, invalidResponse); scheduleMsg(logger, "CS@%s updateCount=%d", hwPortname(boardConfiguration->hip9011CsPin), settingUpdateCount); scheduleMsg(logger, "hip %fv/last=%f@%s/max=%f spiCount=%d adv=%d", engine->knockVolts, getVoltage("hipinfo", engineConfiguration->hipOutputChannel), getPinNameByAdcChannel("hip", engineConfiguration->hipOutputChannel, pinNameBuffer), hipValueMax, spiCount, boardConfiguration->useTpicAdvancedMode); scheduleMsg(logger, "mosi=%s", hwPortname(getMosiPin(hipSpiDevice))); scheduleMsg(logger, "miso=%s", hwPortname(getMisoPin(hipSpiDevice))); scheduleMsg(logger, "sck=%s", hwPortname(getSckPin(hipSpiDevice))); scheduleMsg(logger, "start %f end %f", engineConfiguration->knockDetectionWindowStart, engineConfiguration->knockDetectionWindowEnd); hipValueMax = 0; engine->printKnockState(); }
static void showEgtInfo(void) { #if EFI_PROD_CODE printSpiState(logger, boardConfiguration); scheduleMsg(logger, "EGT spi: %d", boardConfiguration->max31855spiDevice); for (int i = 0; i < EGT_CHANNEL_COUNT; i++) { if (boardConfiguration->max31855_cs[i] != GPIO_UNASSIGNED) { scheduleMsg(logger, "%d ETG @ %s", i, hwPortname(boardConfiguration->max31855_cs[i])); } } #endif }
static void showEthInfo(void) { static char pinNameBuffer[16]; scheduleMsg(&logger, "etbAutoTune=%d", engine->etbAutoTune); scheduleMsg(&logger, "throttlePedal=%.2f %.2f/%.2f @%s", getPedalPosition(), engineConfiguration->throttlePedalUpVoltage, engineConfiguration->throttlePedalWOTVoltage, getPinNameByAdcChannel("tPedal", engineConfiguration->throttlePedalPositionAdcChannel, pinNameBuffer)); scheduleMsg(&logger, "TPS=%.2f", getTPS()); scheduleMsg(&logger, "dir=%d DC=%f", etb1.dcMotor.isOpenDirection(), etb1.dcMotor.Get()); scheduleMsg(&logger, "etbControlPin1=%s duty=%.2f freq=%d", hwPortname(CONFIGB(etb1.controlPin1)), currentEtbDuty, engineConfiguration->etbFreq); scheduleMsg(&logger, "close dir=%s", hwPortname(CONFIGB(etb1.directionPin2))); pid.showPidStatus(&logger, "ETB"); }
static void setEgtCSPin(const char *indexStr, const char *pinName, board_configuration_s * board_configuration_s) { int index = atoi(indexStr); if (index < 0 || index >= EGT_CHANNEL_COUNT || absI(index) == ERROR_CODE) return; brain_pin_e pin = parseBrainPin(pinName); if (pin == GPIO_INVALID) { scheduleMsg(&logger, "invalid pin name [%s]", pinName); return; } scheduleMsg(&logger, "setting EGT CS pin[%d] to %s please save&restart", index, hwPortname(pin)); boardConfiguration->max31855_cs[index] = pin; applyNewConfiguration(); }
//getHwPin(boardConfiguration->HD44780_db7) static void lcdInfo(void) { scheduleMsg(logger, "HD44780 RS=%s", hwPortname(boardConfiguration->HD44780_rs)); scheduleMsg(logger, "HD44780 E=%s", hwPortname(boardConfiguration->HD44780_e)); scheduleMsg(logger, "HD44780 D4=%s", hwPortname(boardConfiguration->HD44780_db4)); scheduleMsg(logger, "HD44780 D5=%s", hwPortname(boardConfiguration->HD44780_db5)); scheduleMsg(logger, "HD44780 D6=%s", hwPortname(boardConfiguration->HD44780_db6)); scheduleMsg(logger, "HD44780 D7=%s", hwPortname(boardConfiguration->HD44780_db7)); }
static void setInjectionPin(const char *indexStr, const char *pinName) { int index = atoi(indexStr) - 1; // convert from human index into software index if (index < 0 || index >= INJECTION_PIN_COUNT) return; brain_pin_e pin = parseBrainPin(pinName); // todo: extract method - code duplication with other 'set_xxx_pin' methods? if (pin == GPIO_INVALID) { scheduleMsg(&logger, "invalid pin name [%s]", pinName); return; } scheduleMsg(&logger, "setting injection pin[%d] to %s please save&restart", index, hwPortname(pin)); boardConfiguration->injectionPins[index] = pin; applyNewConfiguration(); }
static void setTriggerInputPin(const char *indexStr, const char *pinName) { int index = atoi(indexStr); if (index < 0 || index > 2) return; brain_pin_e pin = parseBrainPin(pinName); // todo: extract method - code duplication with other 'set_xxx_pin' methods? if (pin == GPIO_INVALID) { scheduleMsg(&logger, "invalid pin name [%s]", pinName); return; } scheduleMsg(&logger, "setting trigger pin[%d] to %s please save&restart", index, hwPortname(pin)); boardConfiguration->triggerInputPins[index] = pin; applyNewConfiguration(); }
static void setFsioPin(const char *indexStr, const char *pinName) { int index = atoi(indexStr) - 1; if (index < 0 || index >= LE_COMMAND_COUNT) { scheduleMsg(logger, "invalid index %d", index); return; } brain_pin_e pin = parseBrainPin(pinName); // todo: extract method - code duplication with other 'set_xxx_pin' methods? if (pin == GPIO_INVALID) { scheduleMsg(logger, "invalid pin name [%s]", pinName); return; } boardConfiguration->fsioPins[index] = pin; scheduleMsg(logger, "FSIO pin #%d [%s]", (index + 1), hwPortname(pin)); }
//Nullable ICUDriver * getInputCaptureDriver(const char *msg, brain_pin_e hwPin) { if (hwPin == GPIO_UNASSIGNED || hwPin == GPIO_INVALID) { return NULL; } #if STM32_ICU_USE_TIM1 if (hwPin == GPIOA_8 || hwPin == GPIOA_9 || hwPin == GPIOE_9 || hwPin == GPIOE_11) { return &ICUD1; } #endif #if STM32_ICU_USE_TIM2 if (hwPin == GPIOA_1 || hwPin == GPIOA_5 || hwPin == GPIOA_15 || hwPin == GPIOB_3) { return &ICUD2; } #endif #if STM32_ICU_USE_TIM3 if (hwPin == GPIOA_6 || hwPin == GPIOA_7 || hwPin == GPIOB_4 || hwPin == GPIOB_5 || hwPin == GPIOC_6 || hwPin == GPIOC_7) { return &ICUD3; } #endif #if STM32_ICU_USE_TIM8 if (hwPin == GPIOC_6 || hwPin == GPIOC_7) { return &ICUD8; } #endif #if STM32_ICU_USE_TIM9 if (hwPin == GPIOA_2 || hwPin == GPIOA_3 || hwPin == GPIOE_5 || hwPin == GPIOE_6) { return &ICUD9; } #endif firmwareError(CUSTOM_ERR_NOT_INPUT_PIN, "%s: Not input pin %s", msg, hwPortname(hwPin)); return (ICUDriver *) NULL; }
static ICUDriver *turnOnTriggerInputPin(brain_pin_e hwPin) { // configure pin turnOnCapturePin(hwPin); shaft_icucfg.channel = ICU_CHANNEL_1; ICUDriver *driver = getInputCaptureDriver(hwPin); scheduleMsg(logger, "turnOnTriggerInputPin %s", hwPortname(hwPin)); // todo: reuse 'setWaveReaderMode' method here? if (driver != NULL) { bool_t needWidthCallback = !CONFIG(useOnlyFrontForTrigger) || TRIGGER_SHAPE(useRiseEdge); shaft_icucfg.width_cb = needWidthCallback ? shaft_icu_width_callback : NULL; bool_t needPeriodCallback = !CONFIG(useOnlyFrontForTrigger) || !TRIGGER_SHAPE(useRiseEdge); shaft_icucfg.period_cb = needPeriodCallback ? shaft_icu_period_callback : NULL; efiIcuStart(driver, &shaft_icucfg); icuEnable(driver); } return driver; }
static void runBench(brain_pin_e brainPin, io_pin_e pin, float delayMs, float onTimeMs, float offTimeMs, int count) { scheduleMsg(&logger, "Running bench: ON_TIME=%f ms OFF_TIME=%fms Counter=%d", onTimeMs, offTimeMs, count); scheduleMsg(&logger, "output on %s", hwPortname(brainPin)); int delaySt = (int) (delayMs * CH_FREQUENCY / 1000); if (delaySt != 0) { chThdSleep(delaySt); } for (int i = 0; i < count; i++) { setOutputPinValue(pin, TRUE); chThdSleep((int) (onTimeMs * CH_FREQUENCY / 1000)); setOutputPinValue(pin, FALSE); int offTimeSt = (int) (offTimeMs * CH_FREQUENCY / 1000); if (offTimeSt > 0) { chThdSleep(offTimeSt); } } scheduleMsg(&logger, "Done!"); }
static void initWave(const char *name, int index) { brain_pin_e brainPin = CONFIGB(logicAnalyzerPins)[index]; if (brainPin == GPIO_UNASSIGNED) return; bool mode = CONFIGB(logicAnalyzerMode)[index]; waveReaderCount++; efiAssertVoid(CUSTOM_ERR_6655, index < MAX_ICU_COUNT, "too many ICUs"); WaveReader *reader = &readers[index]; reader->name = name; reader->hw = addWaveAnalyzerDriver("wave input", brainPin); if (reader->hw != NULL) { reader->hw->widthListeners.registerCallback((VoidInt)(void*) waAnaWidthCallback, (void*) reader); reader->hw->periodListeners.registerCallback((VoidInt)(void*) waIcuPeriodCallback, (void*) reader); } print("wave%d input on %s\r\n", index, hwPortname(brainPin)); startInputDriver("wave", reader->hw, mode); }
static void printOutPin(const char *pinName, brain_pin_e hwPin) { appendPrintf(&logger, "outpin%s%s@%s%s", DELIMETER, pinName, hwPortname(hwPin), DELIMETER); }
icuchannel_t getInputCaptureChannel(brain_pin_e hwPin) { switch (hwPin) { case GPIOA_2: // TIM9 case GPIOA_5: // TIM2 stm32f4discovery/Frankenso default case GPIOA_6: // TIM3 case GPIOA_8: // TIM1 case GPIOA_15: // TIM2 case GPIOC_6: // TIM3 or TIM8 stm32f4discovery/Frankenso default case GPIOE_5: // TIM9 case GPIOE_9: // TIM1 return ICU_CHANNEL_1; case GPIOA_1: // TIM2 case GPIOA_3: // TIM9 case GPIOA_7: // TIM3 case GPIOA_9: // TIM1 case GPIOB_3: // TIM2 case GPIOB_5: // TIM2 case GPIOC_7: // TIM3 or TIM8 case GPIOE_6: // TIM9 case GPIOE_11: // TIM1 return ICU_CHANNEL_2; default: firmwareError(CUSTOM_ERR_ICU_PIN, "Unexpected hw pin in getInputCaptureChannel %s", hwPortname(hwPin)); return ICU_CHANNEL_1; } }