Merge branch 'master' of https://github.com/rusefi/rusefi
This commit is contained in:
commit
da8385f628
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#define VCS_DATE 20200727
|
#define VCS_DATE 20200728
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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 Mon Jul 27 13:47:09 UTC 2020
|
||||||
|
|
||||||
// by class com.rusefi.output.FileFsioSettingsConsumer
|
// by class com.rusefi.output.FileFsioSettingsConsumer
|
||||||
FSIO_SETTING_FANONTEMPERATURE = 1000,
|
FSIO_SETTING_FANONTEMPERATURE = 1000,
|
||||||
|
|
|
@ -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 Mon Jul 27 13:47:09 UTC 2020
|
||||||
|
|
||||||
// by class com.rusefi.output.FileFsioSettingsConsumer
|
// by class com.rusefi.output.FileFsioSettingsConsumer
|
||||||
case FSIO_SETTING_FANONTEMPERATURE:
|
case FSIO_SETTING_FANONTEMPERATURE:
|
||||||
|
|
|
@ -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 Mon Jul 27 13:47:09 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");
|
||||||
|
|
|
@ -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 Mon Jul 27 13:47:09 UTC 2020
|
||||||
|
|
||||||
// by class com.rusefi.output.FileFsioSettingsConsumer
|
// by class com.rusefi.output.FileFsioSettingsConsumer
|
||||||
case FSIO_SETTING_FANONTEMPERATURE:
|
case FSIO_SETTING_FANONTEMPERATURE:
|
||||||
|
|
|
@ -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 2435517493
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.all.1848812543"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.all.2435517493"
|
||||||
|
|
|
@ -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 1336697046
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.frankenso_na6.2964705052"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.frankenso_na6.1336697046"
|
||||||
|
|
|
@ -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 1544933551
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.kin.2735505253"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.kin.1544933551"
|
||||||
|
|
|
@ -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 3637893819
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.mre_f4.667710833"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.mre_f4.3637893819"
|
||||||
|
|
|
@ -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 3637893819
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.mre_f7.667710833"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.mre_f7.3637893819"
|
||||||
|
|
|
@ -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 1681380529
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.prometheus_405.2603514747"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.prometheus_405.1681380529"
|
||||||
|
|
|
@ -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 1681380529
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.prometheus_469.2603514747"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.prometheus_469.1681380529"
|
||||||
|
|
|
@ -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 481983994
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.proteus_f4.3819164208"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.proteus_f4.481983994"
|
||||||
|
|
|
@ -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 481983994
|
||||||
#define TS_SIGNATURE "rusEFI 2020.07.26.proteus_f7.3819164208"
|
#define TS_SIGNATURE "rusEFI 2020.07.28.proteus_f7.481983994"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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<>();
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.rusefi.io;
|
||||||
|
|
||||||
|
public interface ConnectionFailedListener {
|
||||||
|
void onConnectionFailed();
|
||||||
|
}
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 -> () -> {
|
||||||
|
|
|
@ -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"));
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* remote ECU access & control
|
||||||
|
*
|
||||||
* @see RemoteTabSandbox
|
* @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);
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue