Merge remote-tracking branch 'upstream/master' into mock-airmass

This commit is contained in:
Matthew Kennedy 2020-07-28 13:26:19 -07:00
commit 9076e5b523
59 changed files with 273 additions and 127 deletions

View File

@ -18,6 +18,7 @@ jobs:
# Board configurations # Board configurations
- build-target: frankenso_na6 - build-target: frankenso_na6
folder: frankenso folder: frankenso
ini-file: rusefi_frankenso_na6.ini
- build-target: kinetis - build-target: kinetis
folder: kinetis folder: kinetis
@ -28,7 +29,7 @@ jobs:
- build-target: mre_f4_hardware_QC_special_build - build-target: mre_f4_hardware_QC_special_build
folder: microrusefi folder: microrusefi
ini-file: rusefi_microrusefi.ini ini-file: rusefi_mre_f4.ini
- build-target: mre_f7 - build-target: mre_f7
folder: microrusefi folder: microrusefi

View File

@ -166,6 +166,14 @@ static void setupDefaultSensorInputs() {
// iat = "23 - AN temp 2" // iat = "23 - AN temp 2"
engineConfiguration->iat.adcChannel = EFI_ADC_1; engineConfiguration->iat.adcChannel = EFI_ADC_1;
engineConfiguration->iat.config.bias_resistor = 2700; engineConfiguration->iat.config.bias_resistor = 2700;
setCommonNTCSensor(&engineConfiguration->auxTempSensor1, 2700);
setCommonNTCSensor(&engineConfiguration->auxTempSensor2, 2700);
#if HW_CHECK_MODE
engineConfiguration->auxTempSensor1.adcChannel = EFI_ADC_2;
engineConfiguration->auxTempSensor2.adcChannel = EFI_ADC_3;
#endif // HW_CHECK_MODE
} }
void setPinConfigurationOverrides(void) { void setPinConfigurationOverrides(void) {

View File

@ -898,10 +898,12 @@ int tunerStudioHandleCrcCommand(ts_channel_s *tsChannel, char *data, int incomin
break; break;
#endif /* ENABLE_PERF_TRACE */ #endif /* ENABLE_PERF_TRACE */
case TS_GET_CONFIG_ERROR: { case TS_GET_CONFIG_ERROR: {
#if HW_CHECK_MODE
#define configError "FACTORY_MODE_PLEASE_CONTACT_SUPPORT"
#else
char * configError = getFirmwareError(); char * configError = getFirmwareError();
#if HW_CHECK_MODE
// analog input errors are returned as firmware error in QC mode
if (!hasFirmwareError()) {
strcpy(configError, "FACTORY_MODE_PLEASE_CONTACT_SUPPORT");
}
#endif // HW_CHECK_MODE #endif // HW_CHECK_MODE
sr5SendResponse(tsChannel, TS_CRC, reinterpret_cast<const uint8_t*>(configError), strlen(configError)); sr5SendResponse(tsChannel, TS_CRC, reinterpret_cast<const uint8_t*>(configError), strlen(configError));
break; break;

View File

@ -323,7 +323,7 @@ static void showFuelInfo2(float rpm, float engineLoad) {
#if EFI_ENGINE_CONTROL #if EFI_ENGINE_CONTROL
static void showFuelInfo(void) { static void showFuelInfo(void) {
showFuelInfo2((float) GET_RPM(), getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE)); showFuelInfo2((float) GET_RPM(), getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE));
} }
#endif #endif

View File

@ -315,7 +315,7 @@ void TpsAccelEnrichment::onEngineCycleTps(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
} }
void LoadAccelEnrichment::onEngineCycle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { void LoadAccelEnrichment::onEngineCycle(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
onNewValue(getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE) PASS_ENGINE_PARAMETER_SUFFIX); onNewValue(getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE) PASS_ENGINE_PARAMETER_SUFFIX);
} }
AccelEnrichment::AccelEnrichment() { AccelEnrichment::AccelEnrichment() {

View File

@ -130,6 +130,14 @@ static void cylinderCleanupControl(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
#endif #endif
} }
#if HW_CHECK_MODE
static void assertCloseTo(const char * msg, float actual, float expected) {
if (actual < 0.9 * expected || actual > 1.1 * expected) {
firmwareError(OBD_PCM_Processor_Fault, "%s analog input validation failed %f vs %f", msg, actual, expected);
}
}
#endif // HW_CHECK_MODE
void Engine::periodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) { void Engine::periodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
ScopePerf perf(PE::EnginePeriodicSlowCallback); ScopePerf perf(PE::EnginePeriodicSlowCallback);
@ -163,7 +171,14 @@ void Engine::periodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
} }
#endif #endif
slowCallBackWasInvoked = TRUE; slowCallBackWasInvoked = true;
#if HW_CHECK_MODE
assertCloseTo("clt", Sensor::get(SensorType::Clt).Value, 49.3);
assertCloseTo("iat", Sensor::get(SensorType::Iat).Value, 73.2);
assertCloseTo("aut1", Sensor::get(SensorType::AuxTemp1).Value, 13.8);
assertCloseTo("aut2", Sensor::get(SensorType::AuxTemp2).Value, 6.2);
#endif // HW_CHECK_MODE
} }

View File

@ -123,7 +123,7 @@ static void handleGetDataRequest(const CANRxFrame& rx) {
obdSendValue(1, pid, 2, (2<<8)|(0)); // 2 = "Closed loop, using oxygen sensor feedback to determine fuel mix" obdSendValue(1, pid, 2, (2<<8)|(0)); // 2 = "Closed loop, using oxygen sensor feedback to determine fuel mix"
break; break;
case PID_ENGINE_LOAD: case PID_ENGINE_LOAD:
obdSendValue(1, pid, 1, getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE) * 2.55f); obdSendValue(1, pid, 1, getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE) * 2.55f);
break; break;
case PID_COOLANT_TEMP: case PID_COOLANT_TEMP:
obdSendValue(1, pid, 1, Sensor::get(SensorType::Clt).value_or(0) + 40.0f); obdSendValue(1, pid, 1, Sensor::get(SensorType::Clt).value_or(0) + 40.0f);

View File

@ -1,2 +1,2 @@
#pragma once #pragma once
#define VCS_DATE 20200727 #define VCS_DATE 20200728

View File

@ -324,6 +324,8 @@ static void printAnalogInfo(void) {
printAnalogChannelInfo("pPS", engineConfiguration->throttlePedalPositionAdcChannel); printAnalogChannelInfo("pPS", engineConfiguration->throttlePedalPositionAdcChannel);
printAnalogChannelInfo("CLT", engineConfiguration->clt.adcChannel); printAnalogChannelInfo("CLT", engineConfiguration->clt.adcChannel);
printAnalogChannelInfo("IAT", engineConfiguration->iat.adcChannel); printAnalogChannelInfo("IAT", engineConfiguration->iat.adcChannel);
printAnalogChannelInfo("AuxT1", engineConfiguration->auxTempSensor1.adcChannel);
printAnalogChannelInfo("AuxT2", engineConfiguration->auxTempSensor2.adcChannel);
printAnalogChannelInfo("MAF", engineConfiguration->mafAdcChannel); printAnalogChannelInfo("MAF", engineConfiguration->mafAdcChannel);
for (int i = 0; i < FSIO_ANALOG_INPUT_COUNT ; i++) { for (int i = 0; i < FSIO_ANALOG_INPUT_COUNT ; i++) {
adc_channel_e ch = engineConfiguration->fsioAdc[i]; adc_channel_e ch = engineConfiguration->fsioAdc[i];

View File

@ -528,7 +528,7 @@ void updatePrimeInjectionPulseState(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
static void showMainInfo(Engine *engine) { static void showMainInfo(Engine *engine) {
#if EFI_PROD_CODE #if EFI_PROD_CODE
int rpm = GET_RPM(); int rpm = GET_RPM();
float el = getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE); float el = getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE);
scheduleMsg(logger, "rpm %d engine_load %.2f", rpm, el); scheduleMsg(logger, "rpm %d engine_load %.2f", rpm, el);
scheduleMsg(logger, "fuel %.2fms timing %.2f", getInjectionDuration(rpm PASS_ENGINE_PARAMETER_SUFFIX), engine->engineState.timingAdvance); scheduleMsg(logger, "fuel %.2fms timing %.2f", getInjectionDuration(rpm PASS_ENGINE_PARAMETER_SUFFIX), engine->engineState.timingAdvance);
#endif /* EFI_PROD_CODE */ #endif /* EFI_PROD_CODE */

View File

@ -1,4 +1,4 @@
// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sun Jul 26 19:08:53 UTC 2020 // this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Tue Jul 28 13:12:08 UTC 2020
// by class com.rusefi.output.FileFsioSettingsConsumer // by class com.rusefi.output.FileFsioSettingsConsumer
FSIO_SETTING_FANONTEMPERATURE = 1000, FSIO_SETTING_FANONTEMPERATURE = 1000,

View File

@ -1,4 +1,4 @@
// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sun Jul 26 19:08:53 UTC 2020 // this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Tue Jul 28 13:12:08 UTC 2020
// by class com.rusefi.output.FileFsioSettingsConsumer // by class com.rusefi.output.FileFsioSettingsConsumer
case FSIO_SETTING_FANONTEMPERATURE: case FSIO_SETTING_FANONTEMPERATURE:

View File

@ -1,4 +1,4 @@
// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sun Jul 26 19:08:53 UTC 2020 // this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Tue Jul 28 13:12:08 UTC 2020
// by class com.rusefi.output.FileFsioSettingsConsumer // by class com.rusefi.output.FileFsioSettingsConsumer
static LENameOrdinalPair lefanOnTemperature(FSIO_SETTING_FANONTEMPERATURE, "cfg_fanOnTemperature"); static LENameOrdinalPair lefanOnTemperature(FSIO_SETTING_FANONTEMPERATURE, "cfg_fanOnTemperature");

View File

@ -1,4 +1,4 @@
// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sun Jul 26 19:08:53 UTC 2020 // this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Tue Jul 28 13:12:08 UTC 2020
// by class com.rusefi.output.FileFsioSettingsConsumer // by class com.rusefi.output.FileFsioSettingsConsumer
case FSIO_SETTING_FANONTEMPERATURE: case FSIO_SETTING_FANONTEMPERATURE:

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD all #define SIGNATURE_BOARD all
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 1848812543 #define SIGNATURE_HASH 1542883429
#define TS_SIGNATURE "rusEFI 2020.07.26.all.1848812543" #define TS_SIGNATURE "rusEFI 2020.07.28.all.1542883429"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD frankenso_na6 #define SIGNATURE_BOARD frankenso_na6
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 2964705052 #define SIGNATURE_HASH 2238833798
#define TS_SIGNATURE "rusEFI 2020.07.26.frankenso_na6.2964705052" #define TS_SIGNATURE "rusEFI 2020.07.28.frankenso_na6.2238833798"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD kin #define SIGNATURE_BOARD kin
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 2735505253 #define SIGNATURE_HASH 2529711359
#define TS_SIGNATURE "rusEFI 2020.07.26.kin.2735505253" #define TS_SIGNATURE "rusEFI 2020.07.28.kin.2529711359"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD mre_f4 #define SIGNATURE_BOARD mre_f4
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 667710833 #define SIGNATURE_HASH 302538475
#define TS_SIGNATURE "rusEFI 2020.07.26.mre_f4.667710833" #define TS_SIGNATURE "rusEFI 2020.07.28.mre_f4.302538475"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD mre_f7 #define SIGNATURE_BOARD mre_f7
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 667710833 #define SIGNATURE_HASH 302538475
#define TS_SIGNATURE "rusEFI 2020.07.26.mre_f7.667710833" #define TS_SIGNATURE "rusEFI 2020.07.28.mre_f7.302538475"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD prometheus_405 #define SIGNATURE_BOARD prometheus_405
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 2603514747 #define SIGNATURE_HASH 2934591713
#define TS_SIGNATURE "rusEFI 2020.07.26.prometheus_405.2603514747" #define TS_SIGNATURE "rusEFI 2020.07.28.prometheus_405.2934591713"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD prometheus_469 #define SIGNATURE_BOARD prometheus_469
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 2603514747 #define SIGNATURE_HASH 2934591713
#define TS_SIGNATURE "rusEFI 2020.07.26.prometheus_469.2603514747" #define TS_SIGNATURE "rusEFI 2020.07.28.prometheus_469.2934591713"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD proteus_f4 #define SIGNATURE_BOARD proteus_f4
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 3819164208 #define SIGNATURE_HASH 3597138346
#define TS_SIGNATURE "rusEFI 2020.07.26.proteus_f4.3819164208" #define TS_SIGNATURE "rusEFI 2020.07.28.proteus_f4.3597138346"

View File

@ -3,6 +3,6 @@
// //
#define SIGNATURE_BOARD proteus_f7 #define SIGNATURE_BOARD proteus_f7
#define SIGNATURE_DATE 2020.07.26 #define SIGNATURE_DATE 2020.07.28
#define SIGNATURE_HASH 3819164208 #define SIGNATURE_HASH 3597138346
#define TS_SIGNATURE "rusEFI 2020.07.26.proteus_f7.3819164208" #define TS_SIGNATURE "rusEFI 2020.07.28.proteus_f7.3597138346"

View File

@ -84,7 +84,7 @@ float fuelClosedLoopCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
return 1.0f; return 1.0f;
} }
size_t binIdx = computeStftBin(GET_RPM(), getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE), CONFIG(stft)); size_t binIdx = computeStftBin(GET_RPM(), getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE), CONFIG(stft));
#if EFI_TUNER_STUDIO #if EFI_TUNER_STUDIO
if (engineConfiguration->debugMode == DBG_FUEL_PID_CORRECTION) { if (engineConfiguration->debugMode == DBG_FUEL_PID_CORRECTION) {

View File

@ -18,6 +18,9 @@
! rename the bit or substitute unused integer with any new fields of the same size ! rename the bit or substitute unused integer with any new fields of the same size
! invoke gen_config.bat to apply the tools which would generate .h and .ini files ! invoke gen_config.bat to apply the tools which would generate .h and .ini files
! !
! Q: Which files to include into Pull Requests?
! A: Please only include source files (.txt and .input) into a PR, we have amazing GitHub Actions which would do the rest really
! really nicely!
! !
! each field is declared as ! each field is declared as
! type name;comment ! type name;comment
@ -432,7 +435,7 @@ ThermistorConf iat;
float knockBandCustom;+We calculate knock band based of cylinderBore\n Use this to override - kHz knock band override;"kHz", 1, 0.0, 0.0, 10.0, 2 float knockBandCustom;+We calculate knock band based of cylinderBore\n Use this to override - kHz knock band override;"kHz", 1, 0.0, 0.0, 10.0, 2
float[DWELL_CURVE_SIZE] sparkDwellRpmBins;On single-coil or wasted spark setups you have to lower dwell at high RPM;"RPM", 1, 0.0, 0.0, 18000, 2 float[DWELL_CURVE_SIZE] sparkDwellRpmBins;On Single Coil or Wasted Spark setups you have to lower dwell at high RPM;"RPM", 1, 0.0, 0.0, 18000, 2
float[DWELL_CURVE_SIZE] sparkDwellValues;;"ms", 1, 0.0, 0.0, 30.0, 2 float[DWELL_CURVE_SIZE] sparkDwellValues;;"ms", 1, 0.0, 0.0, 30.0, 2
struct_no_prefix specs_s struct_no_prefix specs_s
@ -457,7 +460,7 @@ int sensorSnifferRpmThreshold;+Disable sensor sniffer above this rpm;"RPM",
int rpmHardLimit;set rpm_hard_limit X;"rpm", 1, 0, 0, 20000.0, 2 int rpmHardLimit;set rpm_hard_limit X;"rpm", 1, 0, 0, 20000.0, 2
#define engine_load_mode_e_enum "MAF", "Alpha-N/TPS", "INVALID", "SPEED DENSITY", "MAF Air Charge", "Alpha-N", "INVALID" #define engine_load_mode_e_enum "MAF", "Alpha-N/TPS", "INVALID", "Speed Density", "MAF Air Charge", "Alpha-N", "INVALID"
custom engine_load_mode_e 4 bits, U32, @OFFSET@, [0:2], @@engine_load_mode_e_enum@@ custom engine_load_mode_e 4 bits, U32, @OFFSET@, [0:2], @@engine_load_mode_e_enum@@
@ -470,8 +473,8 @@ injection_mode_e injectionMode;+This is where the fuel injection type is defined
angle_t extraInjectionOffset;+this is about deciding when the injector starts it's squirt\nSee also injectionPhase map\ntodo: do we need even need this since we have the map anyway?;"deg", 1, 0.0, -720, 720, 2 angle_t extraInjectionOffset;+this is about deciding when the injector starts it's squirt\nSee also injectionPhase map\ntodo: do we need even need this since we have the map anyway?;"deg", 1, 0.0, -720, 720, 2
angle_t crankingTimingAngle;+Ignition advance angle used during engine cranking, 5-10 degrees will work as a base setting for most engines.\nset cranking_timing_angle X; "deg", 1, 0.0, -360, 360, 2 angle_t crankingTimingAngle;+Ignition advance angle used during engine cranking, 5-10 degrees will work as a base setting for most engines.\nset cranking_timing_angle X; "deg", 1, 0.0, -360, 360, 2
custom ignition_mode_e 4 bits, U32, @OFFSET@, [0:1], "One coil", "Individual Coils", "Wasted", "Two distributors" custom ignition_mode_e 4 bits, U32, @OFFSET@, [0:1], "Single Coil", "Individual Coils", "Wasted Spark", "Two Distributors"
ignition_mode_e ignitionMode;+"One Coil" is for use on distributed ignition system. "Individual Coils" is to be used when you have one coil per cylinder (COP or similar). "Wasted" means one coil is driving two spark plugs in two cylinders, with one of the sparks not doing anything since it's happening on the exhaust cycle\nset ignition_mode X ignition_mode_e ignitionMode;+"Single Coil" is for use on distributed ignition system. "Individual Coils" is to be used when you have one coil per cylinder (COP or similar). "Wasted Spark" means one coil is driving two spark plugs in two cylinders, with one of the sparks not doing anything since it's happening on the exhaust cycle\nset ignition_mode X
angle_t ignitionOffset;+this value could be used to offset the whole ignition timing table by a constant;"RPM", 1, 0, 0, 3000.0, 0 angle_t ignitionOffset;+this value could be used to offset the whole ignition timing table by a constant;"RPM", 1, 0, 0, 3000.0, 0
@ -950,7 +953,7 @@ custom idle_mode_e 4 bits, U32, @OFFSET@, [0:0], "Automatic", "Manual"
bit isManualSpinningMode;Usually if we have no trigger events that means engine is stopped\nUnless we are troubleshooting and spinning the engine by hand - this case a longer\ndelay is needed bit isManualSpinningMode;Usually if we have no trigger events that means engine is stopped\nUnless we are troubleshooting and spinning the engine by hand - this case a longer\ndelay is needed
bit twoWireBatchInjection;+This is needed if your coils are individually wired and you wish to use batch injection.\nenable two_wire_batch_injection bit twoWireBatchInjection;+This is needed if your coils are individually wired and you wish to use batch injection.\nenable two_wire_batch_injection
bit useOnlyRisingEdgeForTrigger;+VR sensors are only precise on rising front\nenable trigger_only_front bit useOnlyRisingEdgeForTrigger;+VR sensors are only precise on rising front\nenable trigger_only_front
bit twoWireBatchIgnition;+This is needed if your coils are individually wired (COP) and you wish to use batch ignition (wasted spark). bit twoWireBatchIgnition;+This is needed if your coils are individually wired (COP) and you wish to use batch ignition (Wasted Spark).
bit useFixedBaroCorrFromMap bit useFixedBaroCorrFromMap
bit useSeparateAdvanceForCranking;+This activates a separate advance table for cranking conditions, this allows cranking advance to be RPM dependant. bit useSeparateAdvanceForCranking;+This activates a separate advance table for cranking conditions, this allows cranking advance to be RPM dependant.
bit useAdvanceCorrectionsForCranking;+This enables the various ignition corrections during cranking (IAT, CLT, FSIO and PID idle). bit useAdvanceCorrectionsForCranking;+This enables the various ignition corrections during cranking (IAT, CLT, FSIO and PID idle).
@ -1673,4 +1676,4 @@ end_struct
#define show_test_presets true #define show_test_presets true
#define show_Frankenso_presets true #define show_Frankenso_presets true
#define show_microRusEFI_presets true #define show_microRusEFI_presets true
#define show_Proteus_presets true #define show_Proteus_presets true

View File

@ -206,8 +206,8 @@ enable2ndByteCanID = false
internalMcuTemperature = scalar,S08, 11, "deg C", 1, 0 internalMcuTemperature = scalar,S08, 11, "deg C", 1, 0
coolant = scalar, S16, 12, "deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0.0 coolant = scalar, S16, 12, "deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0.0
intake = scalar, S16, 14, "deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0.0 intake = scalar, S16, 14, "deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0.0
; todo: aux1 auxt1 = scalar, S16, 16, "deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0.0
; todo: aux2 auxt2 = scalar, S16, 18, "deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0.0
; throttle, pedal ; throttle, pedal
@ -942,6 +942,8 @@ gaugeCategory = Sensors - Extra 1
internalMcuTemperatureGauge = internalMcuTemperature, @@GAUGE_NAME_ECU_TEMPERATURE@@, "C", 0, 100, 0, 0, 75, 100, 0, 0 internalMcuTemperatureGauge = internalMcuTemperature, @@GAUGE_NAME_ECU_TEMPERATURE@@, "C", 0, 100, 0, 0, 75, 100, 0, 0
OilPressGauge = oilPressure, "Oil Pressure", "kPa", 0, 750, 35, 75, 550, 700, 0, 0 OilPressGauge = oilPressure, "Oil Pressure", "kPa", 0, 750, 35, 75, 550, 700, 0, 0
idleAirValvePositionGauge = idleAirValvePosition, "Idle position", "%", 0, 100, 0, 0, 100, 100, 1, 1 idleAirValvePositionGauge = idleAirValvePosition, "Idle position", "%", 0, 100, 0, 0, 100, 100, 1, 1
AuxT1Gauge = auxt1, "Aux temp 1", "deg C", -40, 140, -15, 1, 95, 110, 1, 1
AuxT2Gauge = auxt2, "Aux temp 2", "deg C", -40, 140, -15, 1, 95, 110, 1, 1
gaugeCategory = Ignition gaugeCategory = Ignition
ignadvGauge = ignitionAdvance, "Ignition timing", "degrees", -100, 100, -999, -999, 999, 999, 1, 1 ignadvGauge = ignitionAdvance, "Ignition timing", "degrees", -100, 100, -999, -999, 999, 999, 1, 1

View File

@ -1,6 +1,6 @@
package com.rusefi.autodetect; package com.rusefi.autodetect;
import com.rusefi.FileLog; import com.devexperts.logging.Logging;
import com.rusefi.NamedThreadFactory; import com.rusefi.NamedThreadFactory;
import com.rusefi.io.IoStream; import com.rusefi.io.IoStream;
import com.rusefi.io.LinkManager; import com.rusefi.io.LinkManager;
@ -19,19 +19,23 @@ import java.util.function.Function;
* Andrey Belomutskiy, (c) 2013-2020 * Andrey Belomutskiy, (c) 2013-2020
*/ */
public class PortDetector { public class PortDetector {
private final static Logging log = Logging.getLogging(PortDetector.class);
private static final NamedThreadFactory AUTO_DETECT_PORT = new NamedThreadFactory("AutoDetectPort"); private static final NamedThreadFactory AUTO_DETECT_PORT = new NamedThreadFactory("AutoDetectPort");
/** /**
* Connect to all serial ports and find out which one respond first * Connect to all serial ports and find out which one respond first
* @param callback * @param callback
* @return port name on which rusEFI was detected or null if none
*/ */
@Nullable
public static String autoDetectSerial(Function<IoStream, Void> callback) { public static String autoDetectSerial(Function<IoStream, Void> callback) {
String[] serialPorts = getPortNames(); String[] serialPorts = getPortNames();
if (serialPorts.length == 0) { if (serialPorts.length == 0) {
System.err.println("No serial ports detected"); log.error("No serial ports detected");
return null; return null;
} }
FileLog.MAIN.logLine("Trying " + Arrays.toString(serialPorts)); log.info("Trying " + Arrays.toString(serialPorts));
List<Thread> serialFinder = new ArrayList<>(); List<Thread> serialFinder = new ArrayList<>();
CountDownLatch portFound = new CountDownLatch(1); CountDownLatch portFound = new CountDownLatch(1);
AtomicReference<String> result = new AtomicReference<>(); AtomicReference<String> result = new AtomicReference<>();

View File

@ -0,0 +1,5 @@
package com.rusefi.io;
public interface ConnectionFailedListener {
void onConnectionFailed();
}

View File

@ -4,13 +4,11 @@ package com.rusefi.io;
* @author Andrey Belomutskiy * @author Andrey Belomutskiy
* 3/1/2017 * 3/1/2017
*/ */
public interface ConnectionStateListener { public interface ConnectionStateListener extends ConnectionFailedListener {
ConnectionStateListener VOID = new AbstractConnectionStateListener(); ConnectionStateListener VOID = new AbstractConnectionStateListener();
/** /**
* This method is invoked once we have connection & configuration from controller * This method is invoked once we have connection & configuration from controller
*/ */
void onConnectionEstablished(); void onConnectionEstablished();
void onConnectionFailed();
} }

View File

@ -196,7 +196,7 @@ public class LinkManager implements Closeable {
return connector; return connector;
} }
public void start(String port, ConnectionStateListener stateListener) { public void start(String port, ConnectionFailedListener stateListener) {
Objects.requireNonNull(port, "port"); Objects.requireNonNull(port, "port");
log.info("LinkManager: Starting " + port); log.info("LinkManager: Starting " + port);
if (isLogViewerMode(port)) { if (isLogViewerMode(port)) {

View File

@ -29,7 +29,7 @@ public class BinaryProtocolProxy {
*/ */
public static final int USER_IO_TIMEOUT = 10 * Timeouts.MINUTE; public static final int USER_IO_TIMEOUT = 10 * Timeouts.MINUTE;
public static ServerSocketReference createProxy(IoStream targetEcuSocket, int serverProxyPort, AtomicInteger relayCommandCounter) { public static ServerSocketReference createProxy(IoStream targetEcuSocket, int serverProxyPort, AtomicInteger relayCommandCounter) throws IOException {
Function<Socket, Runnable> clientSocketRunnableFactory = clientSocket -> () -> { Function<Socket, Runnable> clientSocketRunnableFactory = clientSocket -> () -> {
TcpIoStream clientStream = null; TcpIoStream clientStream = null;
try { try {

View File

@ -43,25 +43,25 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
public AtomicInteger unknownCommands = new AtomicInteger(); public AtomicInteger unknownCommands = new AtomicInteger();
public static final Function<Integer, ServerSocket> SECURE_SOCKET_FACTORY = rusEFISSLContext::getSSLServerSocket; public static final ServerSocketFunction SECURE_SOCKET_FACTORY = rusEFISSLContext::getSSLServerSocket;
public static final Function<Integer, ServerSocket> PLAIN_SOCKET_FACTORY = port -> { public static final ServerSocketFunction PLAIN_SOCKET_FACTORY = port -> {
try { ServerSocket serverSocket = new ServerSocket(port);
ServerSocket serverSocket = new ServerSocket(port); log.info("ServerSocket " + port + " created");
log.info("ServerSocket " + port + " created"); return serverSocket;
return serverSocket;
} catch (IOException e) {
throw new IllegalStateException("Error binding server socket " + port, e);
}
}; };
private static ConcurrentHashMap<String, ThreadFactory> THREAD_FACTORIES_BY_NAME = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, ThreadFactory> THREAD_FACTORIES_BY_NAME = new ConcurrentHashMap<>();
public void start(LinkManager linkManager) { public void start(LinkManager linkManager) {
try {
start(linkManager, DEFAULT_PROXY_PORT, Listener.empty(), new Context()); start(linkManager, DEFAULT_PROXY_PORT, Listener.empty(), new Context());
} catch (IOException e) {
log.error("Error starting local proxy", e);
}
} }
public void start(LinkManager linkManager, int port, Listener serverSocketCreationCallback, Context context) { public void start(LinkManager linkManager, int port, Listener serverSocketCreationCallback, Context context) throws IOException {
log.info("BinaryProtocolServer on " + port); log.info("BinaryProtocolServer on " + port);
Function<Socket, Runnable> clientSocketRunnableFactory = clientSocket -> () -> { Function<Socket, Runnable> clientSocketRunnableFactory = clientSocket -> () -> {
@ -84,11 +84,11 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
* @param serverSocketCreationCallback this callback is invoked once we open the server socket * @param serverSocketCreationCallback this callback is invoked once we open the server socket
* @return * @return
*/ */
public static ServerSocketReference tcpServerSocket(int port, String threadName, Function<Socket, Runnable> socketRunnableFactory, Listener serverSocketCreationCallback) { public static ServerSocketReference tcpServerSocket(int port, String threadName, Function<Socket, Runnable> socketRunnableFactory, Listener serverSocketCreationCallback) throws IOException {
return tcpServerSocket(socketRunnableFactory, port, threadName, serverSocketCreationCallback, PLAIN_SOCKET_FACTORY); return tcpServerSocket(socketRunnableFactory, port, threadName, serverSocketCreationCallback, PLAIN_SOCKET_FACTORY);
} }
public static ServerSocketReference tcpServerSocket(Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function<Integer, ServerSocket> nonSecureSocketFunction) { public static ServerSocketReference tcpServerSocket(Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, ServerSocketFunction nonSecureSocketFunction) throws IOException {
ThreadFactory threadFactory = getThreadFactory(threadName); ThreadFactory threadFactory = getThreadFactory(threadName);
Objects.requireNonNull(serverSocketCreationCallback, "serverSocketCreationCallback"); Objects.requireNonNull(serverSocketCreationCallback, "serverSocketCreationCallback");
@ -232,7 +232,7 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
int fromPacket = IoHelper.getCrc32(packet); int fromPacket = IoHelper.getCrc32(packet);
if (crc != fromPacket) if (crc != fromPacket)
throw new IllegalStateException("CRC mismatch crc=" + Integer.toString(crc, 16) + " vs packet=" + Integer.toString(fromPacket, 16) + " len=" + packet.length + " data: " + IoStream.printHexBinary(packet)); throw new IllegalStateException("CRC mismatch crc=" + Integer.toString(crc, 16) + " vs packet=" + Integer.toString(fromPacket, 16) + " len=" + packet.length + " data: " + IoStream.printHexBinary(packet));
// todo?! in.onPacketArrived(); in.onPacketArrived();
return new Packet(packet, crc); return new Packet(packet, crc);
} }

View File

@ -0,0 +1,8 @@
package com.rusefi.io.tcp;
import java.io.IOException;
import java.net.ServerSocket;
public interface ServerSocketFunction {
ServerSocket apply(int port) throws IOException;
}

View File

@ -7,10 +7,7 @@ import com.rusefi.io.serial.AbstractIoStream;
import com.rusefi.shared.FileUtil; import com.rusefi.shared.FileUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.BufferedInputStream; import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
/** /**
@ -37,10 +34,7 @@ public class TcpIoStream extends AbstractIoStream {
throw new NullPointerException("socket"); throw new NullPointerException("socket");
this.socket = socket; this.socket = socket;
InputStream input = new BufferedInputStream(socket.getInputStream()); InputStream input = new BufferedInputStream(socket.getInputStream());
OutputStream output = socket.getOutputStream(); this.output = new BufferedOutputStream(socket.getOutputStream());
if (output == null)
throw new NullPointerException("output");
this.output = output;
this.input = input; this.input = input;
this.dataBuffer = IncomingDataBuffer.createDataBuffer(loggingPrefix, this); this.dataBuffer = IncomingDataBuffer.createDataBuffer(loggingPrefix, this);
} }

View File

@ -34,7 +34,11 @@ public class NetworkConnector implements Closeable {
private final static Logging log = Logging.getLogging(NetworkConnector.class); private final static Logging log = Logging.getLogging(NetworkConnector.class);
private boolean isClosed; private boolean isClosed;
public NetworkConnectorResult runNetworkConnector(String authToken, String controllerPort, NetworkConnectorContext context, ReconnectListener reconnectListener) { public NetworkConnectorResult start(String authToken, String controllerPort, NetworkConnectorContext context) {
return start(authToken, controllerPort, context, ReconnectListener.VOID);
}
public NetworkConnectorResult start(String authToken, String controllerPort, NetworkConnectorContext context, ReconnectListener reconnectListener) {
LinkManager controllerConnector = new LinkManager() LinkManager controllerConnector = new LinkManager()
.setCompositeLogicEnabled(false) .setCompositeLogicEnabled(false)
.setNeedPullData(false); .setNeedPullData(false);
@ -74,7 +78,7 @@ public class NetworkConnector implements Closeable {
proxyReconnectSemaphore.acquire(); proxyReconnectSemaphore.acquire();
try { try {
runNetworkConnector(context.serverPortForControllers(), controllerConnector, authToken, (String message) -> { start(context.serverPortForControllers(), controllerConnector, authToken, (String message) -> {
log.error(message + " Disconnect from proxy server detected, now sleeping " + context.reconnectDelay() + " seconds"); log.error(message + " Disconnect from proxy server detected, now sleeping " + context.reconnectDelay() + " seconds");
sleep(context.reconnectDelay() * Timeouts.SECOND); sleep(context.reconnectDelay() * Timeouts.SECOND);
log.debug("Releasing semaphore"); log.debug("Releasing semaphore");
@ -94,7 +98,7 @@ public class NetworkConnector implements Closeable {
} }
@NotNull @NotNull
private static SessionDetails runNetworkConnector(int serverPortForControllers, LinkManager linkManager, String authToken, final TcpIoStream.DisconnectListener disconnectListener, int oneTimeToken, ControllerInfo controllerInfo, final NetworkConnectorContext context) throws IOException { private static SessionDetails start(int serverPortForControllers, LinkManager linkManager, String authToken, final TcpIoStream.DisconnectListener disconnectListener, int oneTimeToken, ControllerInfo controllerInfo, final NetworkConnectorContext context) throws IOException {
IoStream targetEcuSocket = linkManager.getConnector().getBinaryProtocol().getStream(); IoStream targetEcuSocket = linkManager.getConnector().getBinaryProtocol().getStream();
SessionDetails deviceSessionDetails = new SessionDetails(controllerInfo, authToken, oneTimeToken); SessionDetails deviceSessionDetails = new SessionDetails(controllerInfo, authToken, oneTimeToken);

View File

@ -47,7 +47,7 @@ public class TestHelper {
} }
@NotNull @NotNull
public static BinaryProtocolServer createVirtualController(ConfigurationImage ci, int port, Listener serverSocketCreationCallback, BinaryProtocolServer.Context context) { public static BinaryProtocolServer createVirtualController(ConfigurationImage ci, int port, Listener serverSocketCreationCallback, BinaryProtocolServer.Context context) throws IOException {
BinaryProtocolState state = new BinaryProtocolState(); BinaryProtocolState state = new BinaryProtocolState();
state.setController(ci); state.setController(ci);
state.setCurrentOutputs(new byte[1 + Fields.TS_OUTPUT_SIZE]); state.setCurrentOutputs(new byte[1 + Fields.TS_OUTPUT_SIZE]);
@ -83,9 +83,13 @@ public class TestHelper {
public static BinaryProtocolServer createVirtualController(int controllerPort, ConfigurationImage controllerImage, BinaryProtocolServer.Context context) throws InterruptedException { public static BinaryProtocolServer createVirtualController(int controllerPort, ConfigurationImage controllerImage, BinaryProtocolServer.Context context) throws InterruptedException {
CountDownLatch controllerCreated = new CountDownLatch(1); CountDownLatch controllerCreated = new CountDownLatch(1);
BinaryProtocolServer server = createVirtualController(controllerImage, controllerPort, parameter -> controllerCreated.countDown(), context); try {
assertLatch(controllerCreated); BinaryProtocolServer server = createVirtualController(controllerImage, controllerPort, parameter -> controllerCreated.countDown(), context);
return server; assertLatch(controllerCreated);
return server;
} catch (IOException e) {
throw new IllegalStateException(e);
}
} }
public static SessionDetails createTestSession(String authToken, String signature) { public static SessionDetails createTestSession(String authToken, String signature) {

View File

@ -32,6 +32,8 @@ public enum Sensor {
INT_TEMP(GAUGE_NAME_CPU_TEMP, SensorCategory.OPERATIONS, FieldType.INT8, 10, 1, 0, 5, "C"), INT_TEMP(GAUGE_NAME_CPU_TEMP, SensorCategory.OPERATIONS, FieldType.INT8, 10, 1, 0, 5, "C"),
CLT(GAUGE_NAME_CLT, SensorCategory.SENSOR_INPUTS, FieldType.INT16, 12, 1.0 / PACK_MULT_TEMPERATURE, -40, 150, "deg C"), CLT(GAUGE_NAME_CLT, SensorCategory.SENSOR_INPUTS, FieldType.INT16, 12, 1.0 / PACK_MULT_TEMPERATURE, -40, 150, "deg C"),
IAT(GAUGE_NAME_IAT, SensorCategory.SENSOR_INPUTS, FieldType.INT16, 14, 1.0 / PACK_MULT_TEMPERATURE, -40, 150, "deg C"), IAT(GAUGE_NAME_IAT, SensorCategory.SENSOR_INPUTS, FieldType.INT16, 14, 1.0 / PACK_MULT_TEMPERATURE, -40, 150, "deg C"),
AuxT1("AuxT1", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 16, 1.0 / PACK_MULT_TEMPERATURE, -40, 150, "deg C"),
AuxT2("AuxT2", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 18, 1.0 / PACK_MULT_TEMPERATURE, -40, 150, "deg C"),
// throttle, pedal // throttle, pedal
TPS(GAUGE_NAME_TPS, SensorCategory.SENSOR_INPUTS, FieldType.INT16, 20, 1.0 / PACK_MULT_PERCENT, 0, 100, "%"), // throttle position sensor TPS(GAUGE_NAME_TPS, SensorCategory.SENSOR_INPUTS, FieldType.INT16, 20, 1.0 / PACK_MULT_PERCENT, 0, 100, "%"), // throttle position sensor

View File

@ -11,9 +11,9 @@ import java.util.concurrent.CopyOnWriteArrayList;
* <p/> * <p/>
* Date: 1/6/13 * Date: 1/6/13
* Andrey Belomutskiy, (c) 2013-2020 * Andrey Belomutskiy, (c) 2013-2020
* @see SensorLog
*/ */
public class SensorCentral implements ISensorCentral { public class SensorCentral implements ISensorCentral {
public static final String RPM_KEY = "rpm";
private static final SensorCentral INSTANCE = new SensorCentral(); private static final SensorCentral INSTANCE = new SensorCentral();
private final SensorsHolder sensorsHolder = new SensorsHolder(); private final SensorsHolder sensorsHolder = new SensorsHolder();

View File

@ -82,14 +82,12 @@ public class SensorLogger {
Sensor.engineMakeCodeNameCrc16, Sensor.engineMakeCodeNameCrc16,
Sensor.tuneCrc16, Sensor.tuneCrc16,
}; };
private final UIContext uiContext;
private List<SensorLog> sensorLogs; private final List<SensorLog> sensorLogs;
private boolean isInitialized; private boolean isInitialized;
public SensorLogger(UIContext uiContext) { public SensorLogger(UIContext uiContext) {
this.uiContext = uiContext;
sensorLogs = Arrays.asList(new PlainTextSensorLog(uiContext), new BinarySensorLogRestarter()); sensorLogs = Arrays.asList(new PlainTextSensorLog(uiContext), new BinarySensorLogRestarter());
} }

View File

@ -5,7 +5,6 @@ import com.rusefi.auth.AutoTokenUtil;
import com.rusefi.autodetect.PortDetector; import com.rusefi.autodetect.PortDetector;
import com.rusefi.proxy.NetworkConnector; import com.rusefi.proxy.NetworkConnector;
import com.rusefi.proxy.NetworkConnectorContext; import com.rusefi.proxy.NetworkConnectorContext;
import com.rusefi.tools.online.ProxyClient;
import com.rusefi.ui.AuthTokenPanel; import com.rusefi.ui.AuthTokenPanel;
public class NetworkConnectorStartup { public class NetworkConnectorStartup {
@ -25,7 +24,7 @@ public class NetworkConnectorStartup {
NetworkConnectorContext connectorContext = new NetworkConnectorContext(); NetworkConnectorContext connectorContext = new NetworkConnectorContext();
NetworkConnector.NetworkConnectorResult networkConnectorResult = new NetworkConnector().runNetworkConnector(authToken, autoDetectedPort, connectorContext, NetworkConnector.ReconnectListener.VOID); NetworkConnector.NetworkConnectorResult networkConnectorResult = new NetworkConnector().start(authToken, autoDetectedPort, connectorContext);
log.info("Running with oneTimeToken=" + networkConnectorResult.getOneTimeToken()); log.info("Running with oneTimeToken=" + networkConnectorResult.getOneTimeToken());
} }
} }

View File

@ -13,6 +13,7 @@ import com.rusefi.ui.util.UiUtils;
import java.util.TimeZone; import java.util.TimeZone;
import static com.devexperts.logging.Logging.getLogging;
import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; import static com.rusefi.ui.storage.PersistentConfiguration.getConfig;
public class MainFrame { public class MainFrame {
@ -21,7 +22,7 @@ public class MainFrame {
/** /**
* @see StartupFrame * @see StartupFrame
*/ */
private FrameHelper frame = new FrameHelper() { private final FrameHelper frame = new FrameHelper() {
@Override @Override
protected void onWindowOpened() { protected void onWindowOpened() {
FileLog.MAIN.logLine("onWindowOpened"); FileLog.MAIN.logLine("onWindowOpened");
@ -42,22 +43,13 @@ public class MainFrame {
} }
}; };
public ConnectionStateListener listener; public ConnectionFailedListener listener;
public MainFrame(ConsoleUI consoleUI, TabbedPanel tabbedPane) { public MainFrame(ConsoleUI consoleUI, TabbedPanel tabbedPane) {
this.consoleUI = consoleUI; this.consoleUI = consoleUI;
this.tabbedPane = tabbedPane; this.tabbedPane = tabbedPane;
listener = new AbstractConnectionStateListener() { listener = () -> {
@Override
public void onConnectionEstablished() {
FileLog.MAIN.logLine("onConnectionEstablished");
// tabbedPane.romEditorPane.showContent();
tabbedPane.settingsTab.showContent();
tabbedPane.logsManager.showContent();
tabbedPane.fuelTunePane.showContent();
new BinaryProtocolServer().start(consoleUI.uiContext.getLinkManager());
}
}; };
} }
@ -87,8 +79,6 @@ public class MainFrame {
@Override @Override
public void onConnectionEstablished() { public void onConnectionEstablished() {
FileLog.MAIN.logLine("onConnectionEstablished");
// tabbedPane.romEditorPane.showContent();
tabbedPane.settingsTab.showContent(); tabbedPane.settingsTab.showContent();
tabbedPane.logsManager.showContent(); tabbedPane.logsManager.showContent();
tabbedPane.fuelTunePane.showContent(); tabbedPane.fuelTunePane.showContent();

View File

@ -8,6 +8,7 @@ import com.rusefi.server.rusEFISSLContext;
import com.rusefi.tools.online.HttpUtil; import com.rusefi.tools.online.HttpUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
@ -16,13 +17,21 @@ import static com.rusefi.TestHelper.assertLatch;
public class BackendTestHelper { public class BackendTestHelper {
public static void runApplicationConnectorBlocking(Backend backend, int serverPortForRemoteUsers) throws InterruptedException { public static void runApplicationConnectorBlocking(Backend backend, int serverPortForRemoteUsers) throws InterruptedException {
CountDownLatch applicationServerCreated = new CountDownLatch(1); CountDownLatch applicationServerCreated = new CountDownLatch(1);
backend.runApplicationConnector(serverPortForRemoteUsers, parameter -> applicationServerCreated.countDown()); try {
backend.runApplicationConnector(serverPortForRemoteUsers, parameter -> applicationServerCreated.countDown());
} catch (IOException e) {
throw new IllegalStateException(e);
}
assertLatch(applicationServerCreated); assertLatch(applicationServerCreated);
} }
public static void runControllerConnectorBlocking(Backend backend, int serverPortForControllers) throws InterruptedException { public static void runControllerConnectorBlocking(Backend backend, int serverPortForControllers) throws InterruptedException {
CountDownLatch controllerServerCreated = new CountDownLatch(1); CountDownLatch controllerServerCreated = new CountDownLatch(1);
backend.runControllerConnector(serverPortForControllers, parameter -> controllerServerCreated.countDown()); try {
backend.runControllerConnector(serverPortForControllers, parameter -> controllerServerCreated.countDown());
} catch (IOException e) {
throw new IllegalStateException(e);
}
assertLatch(controllerServerCreated); assertLatch(controllerServerCreated);
} }

View File

@ -101,7 +101,7 @@ public class FullServerTest {
}; };
// start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network // start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network
NetworkConnector.NetworkConnectorResult networkConnectorResult = new NetworkConnector().runNetworkConnector(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, networkConnectorContext, NetworkConnector.ReconnectListener.VOID); NetworkConnector.NetworkConnectorResult networkConnectorResult = new NetworkConnector().start(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, networkConnectorContext, NetworkConnector.ReconnectListener.VOID);
ControllerInfo controllerInfo = networkConnectorResult.getControllerInfo(); ControllerInfo controllerInfo = networkConnectorResult.getControllerInfo();
TestHelper.assertLatch("controllerRegistered", controllerRegistered); TestHelper.assertLatch("controllerRegistered", controllerRegistered);

View File

@ -1,6 +1,5 @@
package com.rusefi; package com.rusefi;
import com.opensr5.Logger;
import com.rusefi.config.generated.Fields; import com.rusefi.config.generated.Fields;
import com.rusefi.io.IoStream; import com.rusefi.io.IoStream;
import com.rusefi.io.commands.GetOutputsCommand; import com.rusefi.io.commands.GetOutputsCommand;
@ -34,8 +33,6 @@ import static org.junit.Assert.assertEquals;
* https://github.com/rusefi/web_backend/blob/master/documentation/rusEFI%20remote.png * https://github.com/rusefi/web_backend/blob/master/documentation/rusEFI%20remote.png
*/ */
public class ServerTest { public class ServerTest {
private final static Logger logger = Logger.CONSOLE;
@Before @Before
public void setup() throws MalformedURLException { public void setup() throws MalformedURLException {
BackendTestHelper.commonServerTest(); BackendTestHelper.commonServerTest();
@ -126,7 +123,7 @@ covered by FullServerTest
TestHelper.createVirtualController(controllerPort, new ConfigurationImage(Fields.TOTAL_CONFIG_SIZE), logger); TestHelper.createVirtualController(controllerPort, new ConfigurationImage(Fields.TOTAL_CONFIG_SIZE), logger);
// start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network // start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network
SessionDetails deviceSessionDetails = NetworkConnector.runNetworkConnector(MockRusEfiDevice.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, serverPortForControllers); SessionDetails deviceSessionDetails = NetworkConnector.start(MockRusEfiDevice.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, serverPortForControllers);
assertTrue(controllerRegistered.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); assertTrue(controllerRegistered.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS));

View File

@ -10,6 +10,7 @@ import com.rusefi.io.tcp.BinaryProtocolProxy;
import com.rusefi.io.tcp.BinaryProtocolServer; import com.rusefi.io.tcp.BinaryProtocolServer;
import org.junit.Test; import org.junit.Test;
import java.io.IOException;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -83,7 +84,7 @@ public class TcpCommunicationIntegrationTest {
} }
@Test @Test
public void testProxy() throws InterruptedException { public void testProxy() throws InterruptedException, IOException {
ConfigurationImage serverImage = TestHelper.prepareImage(239, TestHelper.createIniField(Fields.CYLINDERSCOUNT)); ConfigurationImage serverImage = TestHelper.prepareImage(239, TestHelper.createIniField(Fields.CYLINDERSCOUNT));
int controllerPort = 6102; int controllerPort = 6102;

View File

@ -75,7 +75,7 @@ public class NetworkConnectorTest {
reconnectCounter.countDown(); reconnectCounter.countDown();
} }
}; };
new NetworkConnector().runNetworkConnector(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, connectorContext, reconnectListener); new NetworkConnector().start(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, connectorContext, reconnectListener);
assertLatch(reconnectCounter); assertLatch(reconnectCounter);

View File

@ -161,7 +161,7 @@ public class Backend implements Closeable {
} }
} }
public void runApplicationConnector(int serverPortForApplications, Listener<?> serverSocketCreationCallback) { public void runApplicationConnector(int serverPortForApplications, Listener<?> serverSocketCreationCallback) throws IOException {
this.serverPortForApplications = serverPortForApplications; this.serverPortForApplications = serverPortForApplications;
// connection from authenticator app which proxies for Tuner Studio // connection from authenticator app which proxies for Tuner Studio
// authenticator pushed hello packet on connect // authenticator pushed hello packet on connect
@ -246,7 +246,7 @@ public class Backend implements Closeable {
log.info("Disconnecting application " + applicationConnectionState); log.info("Disconnecting application " + applicationConnectionState);
} }
public void runControllerConnector(int serverPortForControllers, Listener<?> serverSocketCreationCallback) { public void runControllerConnector(int serverPortForControllers, Listener<?> serverSocketCreationCallback) throws IOException {
this.serverPortForControllers = serverPortForControllers; this.serverPortForControllers = serverPortForControllers;
log.info("Starting controller connector at " + serverPortForControllers); log.info("Starting controller connector at " + serverPortForControllers);
controllerConnector = BinaryProtocolServer.tcpServerSocket(controllerSocket -> () -> { controllerConnector = BinaryProtocolServer.tcpServerSocket(controllerSocket -> () -> {

View File

@ -4,8 +4,10 @@ import com.rusefi.proxy.client.LocalApplicationProxy;
import com.rusefi.tools.online.HttpUtil; import com.rusefi.tools.online.HttpUtil;
import com.rusefi.tools.online.ProxyClient; import com.rusefi.tools.online.ProxyClient;
import java.io.IOException;
public class BackendLauncher { public class BackendLauncher {
public static void main(String[] args) { public static void main(String[] args) throws IOException {
/* todo /* todo
rusEFISSLContext.setupCertificates(new File("keystore.jks"), System.getProperty("RUSEFI_KEYSTORE_PASSWORD")); rusEFISSLContext.setupCertificates(new File("keystore.jks"), System.getProperty("RUSEFI_KEYSTORE_PASSWORD"));
*/ */

View File

@ -79,6 +79,7 @@ public class ControllerConnectionState {
public String toString() { public String toString() {
return "ControllerConnectionState{" + return "ControllerConnectionState{" +
"userDetails=" + userDetails + "userDetails=" + userDetails +
", controllerKey=" + controllerKey +
", isClosed=" + isClosed + ", isClosed=" + isClosed +
", twoKindSemaphore=" + twoKindSemaphore + ", twoKindSemaphore=" + twoKindSemaphore +
'}'; '}';

View File

@ -1,15 +1,84 @@
package com.rusefi.ts_plugin; package com.rusefi.ts_plugin;
import com.rusefi.auth.AutoTokenUtil;
import com.rusefi.autodetect.PortDetector;
import com.rusefi.autoupdate.AutoupdateUtil;
import com.rusefi.proxy.NetworkConnector; import com.rusefi.proxy.NetworkConnector;
import com.rusefi.proxy.NetworkConnectorContext;
import com.rusefi.ui.AuthTokenPanel;
import com.rusefi.ui.util.URLLabel;
import org.putgemin.VerticalFlowLayout;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @see PluginEntry
*/
public class BroadcastTab { public class BroadcastTab {
private final JComponent content = new JPanel(); private final JComponent content = new JPanel(new VerticalFlowLayout());
private final JLabel status = new JLabel();
private final JButton disconnect = new JButton("Disconnect");
private NetworkConnector networkConnector;
public BroadcastTab() { public BroadcastTab() {
// NetworkConnector JButton broadcast = new JButton("Broadcast");
disconnect.setEnabled(false);
broadcast.addActionListener(e -> {
String authToken = AuthTokenPanel.getAuthToken();
if (!AutoTokenUtil.isToken(authToken)) {
status.setText("Auth token is required to broadcast ECU");
return;
}
new Thread(() -> {
String autoDetectedPort = PortDetector.autoDetectSerial(null);
SwingUtilities.invokeLater(() -> {
startBroadcasting(authToken, autoDetectedPort);
});
}).start();
});
disconnect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
networkConnector.close();
disconnect.setEnabled(false);
}
});
content.add(broadcast);
content.add(status);
content.add(disconnect);
content.add(new URLLabel(RemoteTab.HOWTO_REMOTE_TUNING));
content.add(new JLabel(PluginEntry.LOGO));
AutoupdateUtil.trueLayout(content);
}
private void startBroadcasting(String authToken, String autoDetectedPort) {
if (autoDetectedPort == null) {
status.setText("<html>rusEFI ECU not detected.<br/>Please make sure that TunerStudio is currently not connected to ECU.</html>");
} else {
status.setText("rusEFI detected at " + autoDetectedPort);
disconnect.setEnabled(true);
NetworkConnectorContext connectorContext = new NetworkConnectorContext();
new Thread(() -> {
networkConnector = new NetworkConnector();
NetworkConnector.NetworkConnectorResult networkConnectorResult = networkConnector.start(authToken, autoDetectedPort, connectorContext);
SwingUtilities.invokeLater(() -> status.setText("One time password to connect to this ECU: " + networkConnectorResult.getOneTimeToken()));
}).start();
}
AutoupdateUtil.trueLayout(content);
} }
public JComponent getContent() { public JComponent getContent() {

View File

@ -1,6 +1,7 @@
package com.rusefi.ts_plugin; package com.rusefi.ts_plugin;
import com.efiAnalytics.plugin.ecu.ControllerAccess; import com.efiAnalytics.plugin.ecu.ControllerAccess;
import com.rusefi.autoupdate.AutoupdateUtil;
import com.rusefi.ts_plugin.util.ManifestHelper; import com.rusefi.ts_plugin.util.ManifestHelper;
import com.rusefi.tune.xml.Constant; import com.rusefi.tune.xml.Constant;
@ -11,10 +12,17 @@ import java.util.function.Supplier;
/** /**
* {@link TsPluginLauncher} creates an instance of this class via reflection. * {@link TsPluginLauncher} creates an instance of this class via reflection.
* @see UploadTab upload tune & TODO upload logs
* @see RemoteTab remote ECU access & control
* @see BroadcastTab offer your ECU for remove access & control
* @see PluginBodySandbox
*/ */
public class PluginEntry implements TsPluginBody { public class PluginEntry implements TsPluginBody {
private final JPanel content = new JPanel(new BorderLayout()); private final JPanel content = new JPanel(new BorderLayout());
static final ImageIcon LOGO = AutoupdateUtil.loadIcon("/rusefi_online_color_300.png");
/** /**
* the real constructor - this one is invoked via reflection * the real constructor - this one is invoked via reflection
*/ */

View File

@ -29,10 +29,14 @@ import java.util.concurrent.atomic.AtomicReference;
import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; import static com.rusefi.ui.storage.PersistentConfiguration.getConfig;
/** /**
* see RemoteTabSandbox * remote ECU access & control
*
* @see RemoteTabSandbox
* @see PluginEntry
*/ */
public class RemoteTab { public class RemoteTab {
private static final String APPLICATION_PORT = "application_port"; private static final String APPLICATION_PORT = "application_port";
public static final String HOWTO_REMOTE_TUNING = "https://github.com/rusefi/rusefi/wiki/HOWTO-Remote-Tuning";
private final JComponent content = new JPanel(new BorderLayout()); private final JComponent content = new JPanel(new BorderLayout());
private final JPanel list = new JPanel(new VerticalFlowLayout()); private final JPanel list = new JPanel(new VerticalFlowLayout());
@ -87,7 +91,7 @@ public class RemoteTab {
topPanel.add(oneTimePasswordControl); topPanel.add(oneTimePasswordControl);
topLines.add(topPanel); topLines.add(topPanel);
topLines.add(new URLLabel("https://github.com/rusefi/rusefi/wiki/HOWTO-Remote-Tuning")); topLines.add(new URLLabel(HOWTO_REMOTE_TUNING));
content.add(topLines, BorderLayout.NORTH); content.add(topLines, BorderLayout.NORTH);
content.add(list, BorderLayout.CENTER); content.add(list, BorderLayout.CENTER);

View File

@ -142,8 +142,7 @@ public class UploadTab {
content.add(uploadView.getContent()); content.add(uploadView.getContent());
content.add(upload); content.add(upload);
ImageIcon LOGO = AutoupdateUtil.loadIcon("/rusefi_online_color_300.png"); content.add(new JLabel(PluginEntry.LOGO));
content.add(new JLabel(LOGO));
content.add(tokenPanel.getContent()); content.add(tokenPanel.getContent());
content.add(new URLLabel(REO_URL)); content.add(new URLLabel(REO_URL));

View File

@ -14,7 +14,9 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
/** /**
* @see PluginLauncherSandbox * Sandbox for plugin body
*
* @see PluginLauncherSandbox for plugin auto-update launcher
*/ */
public class PluginBodySandbox { public class PluginBodySandbox {

View File

@ -2,6 +2,9 @@ package com.rusefi.ts_plugin;
import com.rusefi.ui.util.FrameHelper; import com.rusefi.ui.util.FrameHelper;
/**
* @see PluginBodySandbox
*/
public class RemoteTabSandbox { public class RemoteTabSandbox {
public static void main(String[] args) { public static void main(String[] args) {
new FrameHelper().showFrame(new RemoteTab().getContent()); new FrameHelper().showFrame(new RemoteTab().getContent());

View File

@ -2,6 +2,9 @@ package com.rusefi.ts_plugin;
import javax.swing.*; import javax.swing.*;
/**
* Sandbox for {@link TsPluginLauncher}
*/
public class PluginLauncherSandbox { public class PluginLauncherSandbox {
public static void main(String[] args) { public static void main(String[] args) {
JFrame frame = new JFrame(); JFrame frame = new JFrame();

View File

@ -7,7 +7,12 @@ import org.putgemin.VerticalFlowLayout;
import javax.swing.*; import javax.swing.*;
/** /**
* This class is the more permanent part of the plug, it's responsible for refreshing and launcher PluginEntry via reflections.
* which downloads the main more volatile UI part (PluginEntry)
*
* by the way TS installs stuff into %user%\.efianalytics\TunerStudio\plugins folder * by the way TS installs stuff into %user%\.efianalytics\TunerStudio\plugins folder
* @see PluginLauncherSandbox sandbox for this
* see PluginEntry
*/ */
public class TsPluginLauncher implements ApplicationPlugin { public class TsPluginLauncher implements ApplicationPlugin {
public static final int BUILD_VERSION = 3; public static final int BUILD_VERSION = 3;

View File

@ -20,9 +20,13 @@ import java.util.concurrent.atomic.AtomicInteger;
import static com.rusefi.ts_plugin.TsPluginLauncher.VERSION; import static com.rusefi.ts_plugin.TsPluginLauncher.VERSION;
/**
* Download fresh copy of {@link #PLUGIN_BODY_JAR} and launch {@link #PLUGIN_ENTRY_CLASS} via reflection.
*/
public class Updater { public class Updater {
private static final String PLUGIN_ENTRY_CLASS = "com.rusefi.ts_plugin.PluginEntry";
private static final String PLUGIN_BODY_JAR = "rusefi_plugin_body.jar"; private static final String PLUGIN_BODY_JAR = "rusefi_plugin_body.jar";
public static final String LOCAL_JAR_FILE_NAME = FileUtil.RUSEFI_SETTINGS_FOLDER + File.separator + PLUGIN_BODY_JAR; private static final String LOCAL_JAR_FILE_NAME = FileUtil.RUSEFI_SETTINGS_FOLDER + File.separator + PLUGIN_BODY_JAR;
private static final String TITLE = "rusEFI plugin installer " + VERSION; private static final String TITLE = "rusEFI plugin installer " + VERSION;
private final JPanel content = new JPanel(new VerticalFlowLayout()); private final JPanel content = new JPanel(new VerticalFlowLayout());
@ -187,7 +191,7 @@ public class Updater {
private static Class getPluginClass() throws MalformedURLException, ClassNotFoundException { private static Class getPluginClass() throws MalformedURLException, ClassNotFoundException {
URLClassLoader jarClassLoader = AutoupdateUtil.getClassLoaderByJar(LOCAL_JAR_FILE_NAME); URLClassLoader jarClassLoader = AutoupdateUtil.getClassLoaderByJar(LOCAL_JAR_FILE_NAME);
return Class.forName("com.rusefi.ts_plugin.PluginEntry", true, jarClassLoader); return Class.forName(PLUGIN_ENTRY_CLASS, true, jarClassLoader);
} }
private void replaceWith(TsPluginBody instance) { private void replaceWith(TsPluginBody instance) {