diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 4fc7db1da..b9da506f2 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -415,14 +415,6 @@ PACK(struct TrainerModuleData { uint8_t pulsePol:1; }); -/* - * Receiver structure - */ - -PACK(struct ReceiverData { - char name[PXX2_LEN_RX_NAME]; -}); - /* * Module structure */ @@ -478,26 +470,8 @@ PACK(struct ModuleData { int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) } sbus); NOBACKUP(PACK(struct { - uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W - uint8_t external_antenna:1; // false = internal antenna, true = external antenna -#if defined(PCBHORUS) - uint8_t spare:5; - uint32_t receivers; // max 5 receivers per module and 10 receivers in total (4bits per receiver with 0 = unused) -#else - uint8_t spare:1; - uint16_t receivers:12; // max 4 receivers per module and 4 receivers in total (3bits per receiver with 0 = unused) -#endif - NOBACKUP(inline uint8_t getReceiverSlot(uint8_t receiver) { - return (receivers >> (3 * receiver)) & 0b111; - }) - - NOBACKUP(inline void setReceiverSlot(uint8_t receiver, uint8_t slot) { - receivers = BF_SET(receivers, slot, 3 * receiver, 3); - }) - - NOBACKUP(inline void clearReceiverSlot(uint8_t receiver) { - setReceiverSlot(receiver, 0); - }) + uint8_t receivers; // 5 bits spare + char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; }) pxx2); }; @@ -617,7 +591,6 @@ PACK(struct ModelData { NOBACKUP(uint8_t spare1:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; - ReceiverData receiverData[NUM_RECEIVERS]; int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; TrainerModuleData trainerData; @@ -802,7 +775,6 @@ PACK(struct RadioData { NOBACKUP(int8_t varioPitch); NOBACKUP(int8_t varioRange); NOBACKUP(int8_t varioRepeat); - CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; EXTRA_GENERAL_FIELDS @@ -931,7 +903,7 @@ static inline void check_struct() #if defined(PCBHORUS) CHKSIZE(ModuleData, 9); #else - CHKSIZE(ModuleData, 6); + CHKSIZE(ModuleData, 29); #endif CHKSIZE(GVarData, 7); @@ -941,7 +913,7 @@ static inline void check_struct() #if defined(PCBXLITES) CHKSIZE(RadioData, 860); - CHKSIZE(ModelData, 6040); + CHKSIZE(ModelData, 6054); #elif defined(PCBXLITE) CHKSIZE(RadioData, 852); CHKSIZE(ModelData, 6040); diff --git a/radio/src/gui/128x64/model_receiver_options.cpp b/radio/src/gui/128x64/model_receiver_options.cpp index 24cddfe01..280f36d4d 100644 --- a/radio/src/gui/128x64/model_receiver_options.cpp +++ b/radio/src/gui/128x64/model_receiver_options.cpp @@ -23,7 +23,7 @@ #define RECEIVER_OPTIONS_2ND_COLUMN 80 extern uint8_t g_moduleIdx; -extern void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot); +extern void drawReceiverName(uint8_t x, uint8_t y, uint8_t moduleIndex, uint8_t receiverIndex, LcdFlags flags=0); void onRxOptionsUpdateConfirm(const char * result) { @@ -95,7 +95,7 @@ void menuModelReceiverOptions(event_t event) int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); - drawReceiverName(FW * 13, 0, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); + drawReceiverName(FW * 13, 0, g_moduleIdx, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); lcdInvertLine(0); if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b23ce9e05..76f38d7f4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -27,15 +27,14 @@ #define EVT_BUTTON_PRESSED() EVT_KEY_BREAK(KEY_ENTER) #endif -// TODO can be moved to reusableBuffer uint8_t g_moduleIdx; -void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) +void drawReceiverName(uint8_t x, uint8_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags=0) { - if (g_model.receiverData[receiverSlot].name[0] != '\0') - lcdDrawSizedText(x, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); + if (g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx][0] != '\0') + lcdDrawSizedText(x, y, g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME, flags); else - lcdDrawText(x, y, "---"); + lcdDrawText(x, y, "---", flags); } #if defined(PCBTARANIS) @@ -98,15 +97,9 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_OPTIONS, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, @@ -132,15 +125,9 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_OPTIONS, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -177,11 +164,10 @@ enum MenuModelSetupItems { #define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW) #define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx)) -#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.getReceiverSlot(idx)) ? (uint8_t)(xxx) : HIDDEN_ROW) #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / (ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) + #define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1)) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -272,14 +258,45 @@ void onPXX2BindMenu(const char * result) } else { // the user pressed [Exit] - uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); moduleSettings[moduleIdx].mode = MODULE_MODE_NORMAL; } } +const char * STR_BIND = "Bind"; +const char * STR_SHARE = "Share"; + +void onPXX2ReceiverMenu(const char * result) +{ + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + + if (result == STR_OPTIONS) { + memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); + reusableBuffer.hardwareAndSettings.receiverSettings.receiverId = receiverIdx; + pushMenu(menuModelReceiverOptions); + } + else if (result == STR_BIND) { + memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); + reusableBuffer.moduleSetup.pxx2.bindReceiverIndex = receiverIdx; + moduleSettings[moduleIdx].mode = MODULE_MODE_BIND; + s_editMode = 1; + } + else if (result == STR_SHARE) { + reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; + moduleSettings[moduleIdx].mode = MODULE_MODE_SHARE; + s_editMode = 1; + } + else if (result == STR_DELETE) { + g_model.moduleData[moduleIdx].pxx2.receivers &= ~(1 << receiverIdx); + memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); + storageDirty(EE_MODEL); + } +} + void onBindMenu(const char * result) { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); if (result == STR_BINDING_1_8_TELEM_ON) { g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; @@ -398,30 +415,6 @@ inline bool isDefaultModelRegistrationID() return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0; } -uint8_t findEmptyReceiverSlot() -{ - for (uint8_t slot = 1; slot <= NUM_RECEIVERS; slot++) { - bool used = false; - for (uint8_t module = 0; module < NUM_MODULES; module++) { - if (isModulePXX2(module)) { - for (uint8_t receiver = 0; receiver < PXX2_MAX_RECEIVERS_PER_MODULE; receiver++) { - if (g_model.moduleData[module].pxx2.getReceiverSlot(receiver) == slot) { - used = true; - break; - } - } - if (used) { - break; - } - } - } - if (!used) { - return slot; - } - } - return 0; -} - void menuModelSetup(event_t event) { #if defined(EXTERNAL_ANTENNA) @@ -469,15 +462,9 @@ void menuModelSetup(event_t event) IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options - IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Share - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver2 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver3 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share + IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 1 + IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 2 + IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 3 LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, @@ -494,16 +481,9 @@ void menuModelSetup(event_t event) FAILSAFE_ROWS(EXTERNAL_MODULE), IF_PXX2_MODULE(EXTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options - IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Pinmap - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Share - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver2 Range - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver3 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share - + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver 1 + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver 2 + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver 3 TRAINER_ROWS }); #else @@ -1270,45 +1250,6 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL: - { - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx); - - lcdDrawTextAlignedLeft(y, STR_RECEIVER); - lcdDrawNumber(lcdLastRightPos + 1, y, receiverIdx + 1); - - if (receiverSlot) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DEL_BUTTON, attr); - if (attr && s_editMode > 0) { - g_model.moduleData[moduleIdx].pxx2.receivers = (g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK(0, receiverIdx * 3)) | ((g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK((receiverIdx + 1) * 3, (PXX2_MAX_RECEIVERS_PER_MODULE - 1 - receiverIdx) * 3)) >> 3); - memclear(&g_model.receiverData[receiverSlot - 1], sizeof(ReceiverData)); - s_editMode = 0; - killEvents(event); - storageDirty(EE_MODEL); - } - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_RXADD_BUTTON, attr); - if (attr && s_editMode > 0) { - s_editMode = 0; - killEvents(event); - uint8_t slot = findEmptyReceiverSlot(); - if (slot > 0) { - g_model.moduleData[moduleIdx].pxx2.receivers |= (slot << (receiverIdx * 3)); - storageDirty(EE_MODEL); - } - } - } - } - break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_OPTIONS: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_OPTIONS: lcdDrawText(INDENT_WIDTH, y, STR_OPTIONS); @@ -1320,79 +1261,65 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: - lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); - if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { - g_moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); - reusableBuffer.hardwareAndSettings.receiverSettings.receiverId = receiverSlot; - pushMenu(menuModelReceiverOptions); - } - break; - - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - drawReceiverName(INDENT_WIDTH * 2, y, receiverSlot); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); - lcdDrawText(lcdLastRightPos + FW/2, y, STR_BUTTON_SHARE, menuHorizontalPosition==1 ? attr : 0); + drawStringWithIndex(INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1); - if (attr) { - if (menuHorizontalPosition == 0) { - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - // TODO this will go to module.cpp - memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); - reusableBuffer.moduleSetup.pxx2.bindReceiverId = receiverSlot; - moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; - } - else if (event == EVT_KEY_BREAK(KEY_EXIT)) { - moduleSettings[moduleIdx].mode &= ~MODULE_MODE_BIND; - } - if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { - s_editMode = 1; - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) { - popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); - for (uint8_t i=0; i 0) { + s_editMode = 0; + killEvents(event); + g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx); + storageDirty(EE_MODEL); } else { - // for now we will send the SHARE frame indefinitely (until the user manually stops it) - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; - reusableBuffer.moduleSetup.pxx2.shareReceiverId = receiverSlot; - } - else if (event == EVT_KEY_BREAK(KEY_EXIT)) { - moduleSettings[moduleIdx].mode &= ~MODULE_MODE_SHARE; - } + break; } } + + drawReceiverName(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, receiverIdx, attr); + + if (attr && (moduleSettings[moduleIdx].mode == 0 || s_editMode == 0)) { + if (moduleSettings[moduleIdx].mode) { + moduleSettings[moduleIdx].mode = 0; + killEvents(event); // we stopped BIND / SHARE, we don't want to re-open the menu + event = 0; + } + s_editMode = 0; + } + + if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { + if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) { + popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + for (uint8_t i=0; i 0 && s_editMode == 0) { switch(menuVerticalPosition) { #if defined(PCBTARANIS) - case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND: - if (menuHorizontalPosition == 0) - checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); - break; + case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND: + if (menuHorizontalPosition == 0) + checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); + break; #endif #if defined(PCBSKY9X) - case ITEM_MODEL_EXTRA_MODULE_BIND: - if (menuHorizontalPosition == 0) - checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE); - break; + case ITEM_MODEL_EXTRA_MODULE_BIND: + if (menuHorizontalPosition == 0) + checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE); + break; #endif case ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND: - if (menuHorizontalPosition == 0) - checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); - break; + if (menuHorizontalPosition == 0) + checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); + break; } } } diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 38131680c..31bfa86b5 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -420,25 +420,6 @@ When called without parameters, it will only return the status of the output buf @status current Introduced in 2.2.0 */ -TelemetryEndpoint getTelemetryEndpoint(uint8_t receiverIndex) -{ - TelemetryEndpoint result; - - for (uint8_t module=0; module= (usbStarted() ? 5 : 10)) { // run at least every 20ms (every 10ms if USB is active) -#else - if ((now - lastRunTime) >= 10) { // run at least every 20ms -#endif + if ((now - lastRunTime) >= 10) { // run at least every 10ms run = true; } else if (now == nextMixerTime[0]) { diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 7b9bcf7b9..9d820cf16 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -154,7 +154,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) case 0x01: if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { if (memcmp(&reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { - memcpy(g_model.receiverData[reusableBuffer.moduleSetup.pxx2.bindReceiverId].name, &frame[4], PXX2_LEN_RX_NAME); + memcpy(g_model.moduleData[module].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.bindReceiverIndex], &frame[4], PXX2_LEN_RX_NAME); storageDirty(EE_MODEL); reusableBuffer.moduleSetup.pxx2.bindStep = BIND_WAIT; reusableBuffer.moduleSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30; @@ -166,10 +166,8 @@ void processBindFrame(uint8_t module, uint8_t * frame) void processTelemetryFrame(uint8_t module, uint8_t * frame) { - TelemetryEndpoint origin; - origin.module = module; - origin.rxUid = frame[3] & 0x0F; - sportProcessTelemetryPacketWithoutCrc(origin.value, &frame[4]); + uint8_t origin = (module << 2) + (frame[3] & 0x03); + sportProcessTelemetryPacketWithoutCrc(origin, &frame[4]); } void processSpectrumAnalyserFrame(uint8_t module, uint8_t * frame) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 57b9c4a17..751d660d0 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -150,16 +150,15 @@ void sportProcessTelemetryPacket(const uint8_t * packet) sportProcessTelemetryPacketWithoutCrc(TELEMETRY_ENDPOINT_SPORT, packet); } -void sportProcessTelemetryPacketWithoutCrc(uint8_t originValue, const uint8_t * packet) +void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packet) { - TelemetryEndpoint & origin = (TelemetryEndpoint &)originValue; uint8_t physicalId = packet[0] & 0x1F; uint8_t primId = packet[1]; uint16_t dataId = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); if (primId == DATA_FRAME) { - uint8_t instance = physicalId + (origin.rxUid << 5); + uint8_t instance = physicalId + (origin << 5); if (dataId == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) { telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected data = SPORT_DATA_U8(packet); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 78d801b32..b742489e0 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -158,14 +158,6 @@ void logTelemetryWriteByte(uint8_t data); #define TELEMETRY_ENDPOINT_NONE 0xFF #define TELEMETRY_ENDPOINT_SPORT 0x07 -union TelemetryEndpoint { - PACK(struct { - uint8_t module:4; - uint8_t rxUid:4; - }); - uint8_t value; -}; - class OutputTelemetryBuffer { public: OutputTelemetryBuffer() @@ -175,7 +167,7 @@ class OutputTelemetryBuffer { void setDestination(uint8_t value) { - destination.value = value; + destination = value; timeout = 200; /* 2s */ } @@ -189,14 +181,14 @@ class OutputTelemetryBuffer { void reset() { - destination.value = TELEMETRY_ENDPOINT_NONE; + destination = TELEMETRY_ENDPOINT_NONE; size = 0; timeout = 0; } bool isAvailable() { - return destination.value == TELEMETRY_ENDPOINT_NONE; + return destination == TELEMETRY_ENDPOINT_NONE; } void pushByte(uint8_t byte) @@ -237,7 +229,7 @@ class OutputTelemetryBuffer { }; uint8_t size; uint8_t timeout; - TelemetryEndpoint destination; + uint8_t destination; }; extern OutputTelemetryBuffer outputTelemetryBuffer __DMA; diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 2a500c869..6bd15fd75 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -775,7 +775,7 @@ #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Receiver No.") - #define TR_RECEIVER INDENT "Receiver" + #define TR_RECEIVER "Receiver" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")