diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7ced4f024..32e0e936f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -292,7 +292,7 @@ void onPXX2R9MBindModeMenu(const char * result) reusableBuffer.moduleSetup.bindInformation.step = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); #else - reusableBuffer.moduleSetup.bindInformation.step = BIND_OPTIONS_SELECTED; + reusableBuffer.moduleSetup.bindInformation.step = BIND_START; #endif } @@ -323,7 +323,7 @@ void onPXX2BindMenu(const char * result) reusableBuffer.moduleSetup.bindInformation.step = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); #else - reusableBuffer.moduleSetup.bindInformation.step = BIND_OPTIONS_SELECTED; + reusableBuffer.moduleSetup.bindInformation.step = BIND_START; #endif } } @@ -1419,7 +1419,7 @@ void menuModelSetup(event_t event) } if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { - if (reusableBuffer.moduleSetup.bindInformation.step == BIND_START && reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { + if (reusableBuffer.moduleSetup.bindInformation.step == BIND_INIT && reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i 1 @@ -434,6 +467,17 @@ void menuRadioSdManager(event_t _event) } } + if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { + if (reusableBuffer.sdManager.otaInformation.step == BIND_INIT && reusableBuffer.sdManager.otaInformation.candidateReceiversCount > 0) { + popupMenuItemsCount = min(reusableBuffer.sdManager.otaInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + for (uint8_t i=0; i 1 const char * ext = getFileExtension(reusableBuffer.sdManager.lines[index]); if (ext && isExtensionMatching(ext, BITMAPS_EXT)) { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 719e459ad..5c327b952 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -131,8 +131,11 @@ struct BindInformation { uint8_t rxUid; uint8_t lbtMode; uint8_t flexMode; + PXX2HardwareInformation receiverInformation; }; +typedef void (* ModuleCallback)(); + PACK(struct ModuleState { uint8_t protocol:4; uint8_t mode:4; @@ -144,9 +147,12 @@ PACK(struct ModuleState { ModuleSettings * moduleSettings; BindInformation * bindInformation; }; - void startBind(BindInformation * destination) + ModuleCallback callback; + + void startBind(BindInformation * destination, ModuleCallback bindCallback = nullptr) { bindInformation = destination; + callback = bindCallback; mode = MODULE_MODE_BIND; #if defined(SIMU) bindInformation->candidateReceiversCount = 2; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 6fc47c966..d8f1653d4 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -228,14 +228,20 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) if (get_tmr10ms() > destination->timeout) { moduleState[module].mode = MODULE_MODE_NORMAL; destination->step = BIND_OK; - POPUP_INFORMATION(STR_BIND_OK); + POPUP_INFORMATION(STR_BIND_OK); // TODO rather use the new callback } return; } addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); - if (destination->step == BIND_OPTIONS_SELECTED) { + if (destination->step == BIND_INFO_REQUEST) { + Pxx2Transport::addByte(0x02); + for (uint8_t i=0; icandidateReceiversNames[destination->selectedReceiverIndex][i]); + } + } + else if (destination->step == BIND_START) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; icandidateReceiversNames[destination->selectedReceiverIndex][i]); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 9d3a39801..dae69d1e9 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -115,25 +115,21 @@ enum PXX2Variant { }; enum PXX2RegisterSteps { - REGISTER_START, + REGISTER_INIT, REGISTER_RX_NAME_RECEIVED, REGISTER_RX_NAME_SELECTED, REGISTER_OK }; enum PXX2BindSteps { - BIND_START, + BIND_INIT, BIND_RX_NAME_SELECTED, - BIND_OPTIONS_SELECTED, + BIND_INFO_REQUEST, + BIND_START, BIND_WAIT, BIND_OK }; -enum PXX2ResetSteps { - RESET_START, - RESET_OK -}; - enum PXX2ReceiverStatus { PXX2_HARDWARE_INFO, PXX2_SETTINGS_READ, @@ -220,8 +216,6 @@ class Pxx2Pulses: public PxxPulses { void addFrameType(uint8_t type_c, uint8_t type_id) { // TYPE_C + TYPE_ID - // TODO optimization ? Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose - Pxx2Transport::addByte(type_c); Pxx2Transport::addByte(type_id); } diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 54e0c27fb..d3f55a219 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -109,7 +109,7 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) switch(frame[3]) { case 0x00: - if (reusableBuffer.moduleSetup.pxx2.registerStep == REGISTER_START) { + if (reusableBuffer.moduleSetup.pxx2.registerStep == REGISTER_INIT) { // RX_NAME follows, we store it for the next step str2zchar(reusableBuffer.moduleSetup.pxx2.registerRxName, (const char *)&frame[4], PXX2_LEN_RX_NAME); reusableBuffer.moduleSetup.pxx2.registerLoopIndex = frame[12]; @@ -141,7 +141,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) switch(frame[3]) { case 0x00: - if (destination->step == BIND_START) { + if (destination->step == BIND_INIT) { bool found = false; for (uint8_t i=0; icandidateReceiversCount; i++) { if (memcmp(destination->candidateReceiversNames[i], &frame[4], PXX2_LEN_RX_NAME) == 0) { @@ -151,12 +151,15 @@ void processBindFrame(uint8_t module, uint8_t * frame) } if (!found && destination->candidateReceiversCount < PXX2_MAX_RECEIVERS_PER_MODULE) { memcpy(destination->candidateReceiversNames[destination->candidateReceiversCount++], &frame[4], PXX2_LEN_RX_NAME); + if (moduleState[module].callback) { + moduleState[module].callback(); + } } } break; case 0x01: - if (destination->step == BIND_OPTIONS_SELECTED) { + if (destination->step == BIND_START) { if (memcmp(&destination->candidateReceiversNames[destination->selectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { memcpy(g_model.moduleData[module].pxx2.receiverName[destination->rxUid], &frame[4], PXX2_LEN_RX_NAME); storageDirty(EE_MODEL); @@ -165,6 +168,17 @@ void processBindFrame(uint8_t module, uint8_t * frame) } } break; + + case 0x02: + if (destination->step == BIND_INFO_REQUEST) { + if (memcmp(&destination->candidateReceiversNames[destination->selectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { + memcpy(&destination->receiverInformation, &frame[12], sizeof(PXX2HardwareInformation)); + if (moduleState[module].callback) { + moduleState[module].callback(); + } + } + } + break; } }