From 7169b28ea72c9f346fe70471ac537e956594e068 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Fri, 3 Nov 2023 16:39:56 -0700 Subject: [PATCH] both sides of JNI creeping together --- .../com/rusefi/maintenance/OpenbltJni.java | 16 ++++ misc/openblt_jni/openblt_jni.cpp | 77 +++++++++++++++---- 2 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 java_console/ui/src/main/java/com/rusefi/maintenance/OpenbltJni.java diff --git a/java_console/ui/src/main/java/com/rusefi/maintenance/OpenbltJni.java b/java_console/ui/src/main/java/com/rusefi/maintenance/OpenbltJni.java new file mode 100644 index 0000000000..6d4a66a348 --- /dev/null +++ b/java_console/ui/src/main/java/com/rusefi/maintenance/OpenbltJni.java @@ -0,0 +1,16 @@ +package com.rusefi.maintenance; + +public final class OpenbltJni { + interface OpenbltCallbacks + { + void log(String line); + void updateProgress(int percent); + void error(String line); + } + + public static native void loadFirmware(String filename, OpenbltCallbacks callbacks); + public static native void sessionStart(String serialPort, OpenbltCallbacks callbacks); + public static native void erase(OpenbltCallbacks callbacks); + public static native void program(OpenbltCallbacks callbacks); + public static native void stop(OpenbltCallbacks callbacks); +} diff --git a/misc/openblt_jni/openblt_jni.cpp b/misc/openblt_jni/openblt_jni.cpp index 1b457cc17a..8a73ed3c92 100644 --- a/misc/openblt_jni/openblt_jni.cpp +++ b/misc/openblt_jni/openblt_jni.cpp @@ -7,28 +7,73 @@ #include -JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_loadFirmware(JNIEnv* env, jobject, jstring jFilename) { +class Callbacks { +public: + Callbacks(JNIEnv* env, jobject jCallbacks) + : m_env(env) + , m_obj(jCallbacks) + , m_class(env->FindClass("OpenbltJni.Callbacks")) + , m_log(env->GetMethodID(m_class, "log", "(java/lang/String)V")) + , m_updateProgress(env->GetMethodID(m_class, "updateProgress", "(I)V")) + , m_error(env->GetMethodID(m_class, "error", "(java/lang/String)V")) + { + } + + void log(const char* line) { + jstring jLine = m_env->NewStringUTF(line); + m_env->CallObjectMethod(m_obj, m_error, jLine); + m_env->DeleteLocalRef(jLine); + } + + void updateProgress(int percent) { + m_env->CallIntMethod(m_obj, m_updateProgress, percent); + } + + void error(const char* err) { + jstring jErr = m_env->NewStringUTF(err); + m_env->CallObjectMethod(m_obj, m_error, jErr); + m_env->DeleteLocalRef(jErr); + } + +private: + JNIEnv* const m_env; + jobject const m_obj; + + jclass const m_class; + + jmethodID const m_log; + jmethodID const m_updateProgress; + jmethodID const m_error; +}; + +JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_loadFirmware(JNIEnv* env, jobject, jstring jFilename, jobject jCallbacks) { + Callbacks cb(env, jCallbacks); + const char* filename = env->GetStringUTFChars(jFilename, 0); BltFirmwareInit(BLT_FIRMWARE_PARSER_SRECORD); if (BltFirmwareLoadFromFile(filename, 0) != BLT_RESULT_OK) { - // todo: error handling - } - - // Check that the file isn't empty - if (BltFirmwareGetSegmentCount() == 0) { - // todo: error handling + cb.error("BltFirmwareLoadFromFile() not OK, failed to load firmware file."); + return; } env->ReleaseStringUTFChars(jFilename, filename); + + // Check that the file isn't empty + if (BltFirmwareGetSegmentCount() == 0) { + cb.error("BltFirmwareGetSegmentCount() returned 0"); + return; + } } static tBltSessionSettingsXcpV10 xcpSettings; static tBltTransportSettingsXcpV10Rs232 transportSettings; static char s_portName[256]; -JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_sessionStart(JNIEnv* env, jobject, jstring jSerialPort) { +JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_sessionStart(JNIEnv* env, jobject, jstring jSerialPort, jobject jCallbacks) { + Callbacks cb(env, jCallbacks); + xcpSettings.timeoutT1 = 1000; xcpSettings.timeoutT3 = 2000; xcpSettings.timeoutT4 = 10000; @@ -48,11 +93,13 @@ JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_sessionStart(JNIEnv* en BltSessionInit(BLT_SESSION_XCP_V10, &xcpSettings, BLT_TRANSPORT_XCP_V10_RS232, &transportSettings); if (BltSessionStart() != BLT_RESULT_OK) { - // todo: error handling + cb.error("BltSessionStart() failed"); } } -JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_erase(JNIEnv*, jobject) { +JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_erase(JNIEnv* env, jobject, jobject jCallbacks) { + Callbacks cb(env, jCallbacks); + int result = 0; uint32_t segmentIdx; @@ -109,12 +156,14 @@ JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_erase(JNIEnv*, jobject) stillToEraseCnt -= currentEraseCnt; uint8_t progressPct = (uint8_t)(((segmentLen - stillToEraseCnt) * 100ul) / segmentLen); - // TODO: report progress + cb.updateProgress(progressPct); } } } -JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_program(JNIEnv*, jobject) { +JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_program(JNIEnv* env, jobject, jobject jCallbacks) { + Callbacks cb(env, jCallbacks); + uint32_t segmentIdx; uint32_t segmentLen; uint32_t segmentBase; @@ -169,12 +218,12 @@ JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_program(JNIEnv*, jobjec stillToWriteCnt -= currentWriteCnt; uint8_t progressPct = (uint8_t)(((segmentLen - stillToWriteCnt) * 100ul) / segmentLen); - // TODO: report progress + cb.updateProgress(progressPct); } } } -JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_stop(JNIEnv*, jobject) { +JNIEXPORT void JNICALL com_rusefi_maintenance_OpenbltJni_stop(JNIEnv*, jobject, jobject jCallbacks) { BltSessionStop(); BltSessionTerminate(); BltFirmwareTerminate();