diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 334ecfb08..1a694a370 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1932,80 +1932,75 @@ void menuModelReceiverOptions(event_t event) drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_OK && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_READ && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } + if (!s_editMode && reusableBuffer.receiverSetup.dirty && (reusableBuffer.receiverSetup.state != RECEIVER_SETTINGS_WRITE || get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; + reusableBuffer.receiverSetup.dirty = 0; + reusableBuffer.receiverSetup.timeout = 0; + reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 100/*1s*/; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + #if defined(SIMU) reusableBuffer.receiverSetup.state = 0xFF; #endif - if (reusableBuffer.receiverSetup.state != RECEIVER_WAITING_RESPONSE) { - bool changed = false; + if (reusableBuffer.receiverSetup.state > RECEIVER_SETTINGS_READ) { for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); - uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; - uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; - int32_t channelValue = channelOutputs[channel]; switch (i) { case ITEM_RECEIVER_TELEMETRY: - previousValue = reusableBuffer.receiverSetup.telemetryEnabled; - reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, - "Telemetry", attr, event); - if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) { - changed = true; - TRACE("TELEM CHANGED (%d , %d)", previousValue, reusableBuffer.receiverSetup.telemetryEnabled); + reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telemetry", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.receiverSetup.dirty = true; } break; - case ITEM_RECEIVER_PWM_RATE: - previousValue = reusableBuffer.receiverSetup.pwmRate; reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); - TRACE("pwmRate : %d", reusableBuffer.receiverSetup.pwmRate); - if (previousValue != reusableBuffer.receiverSetup.pwmRate) { - changed = true; - TRACE("pwmRate CHANGED (%d , %d)", previousValue, reusableBuffer.receiverSetup.pwmRate); + if (attr && checkIncDec_Ret) { + reusableBuffer.receiverSetup.dirty = true; } break; default: // Pin - lcdDrawText(0, y, "Pin"); - lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + { + uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; + uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; + int32_t channelValue = channelOutputs[channel]; + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + putsChn(7 * FW, y, channel + 1, attr); - // Channel - if ((menuVerticalPosition - ITEM_RECEIVER_PINMAP_FIRST)== pin) { - if (s_editMode > 0) { - channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); + // Channel + if (attr) { + channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx) - 1); if (checkIncDec_Ret) { reusableBuffer.receiverSetup.channelMapping[pin] = channel; - changed = true; + reusableBuffer.receiverSetup.dirty = true; } } - } - putsChn(7 * FW, y, channel + 1, attr); - // Bargraph + // Bargraph #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); + lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); #endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); - break; + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + break; + } } } - if (changed) { - reusableBuffer.receiverSetup.timeout = 0; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } } else { lcdDrawText(4 * FW, 4 * FH, "Waiting for RX..."); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ae2a6913e..5aea443df 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1149,6 +1149,7 @@ union ReusableBuffer uint8_t channelMapping[24]; uint8_t telemetryEnabled; uint8_t pwmRate; + uint8_t dirty; } receiverSetup; // 103 bytes diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 94483b766..7e1050ac7 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -147,19 +147,26 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; - Pxx2Transport::addByte(flag1); - uint8_t channelsCount = sentModuleChannels(module); - for (int i = 0; i < channelsCount; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + if (reusableBuffer.receiverSetup.timeout) { + if (get_tmr10ms() > reusableBuffer.receiverSetup.timeout) { + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; + } + setupChannelsFrame(module); + } + else { + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; + Pxx2Transport::addByte(flag1); + uint8_t channelsCount = sentModuleChannels(module); + for (int i = 0; i < channelsCount; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + } + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 30/*300ms*/; } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; - reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; - moduleSettings[module].mode = MODULE_MODE_NORMAL; } void Pxx2Pulses::setupBindFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 497c22066..a5683a235 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -55,16 +55,18 @@ enum PXX2RegisterSteps { }; enum PXX2BindSteps { - BIND_START, - BIND_RX_NAME_SELECTED, - BIND_WAIT, - BIND_OK + BIND_START, + BIND_RX_NAME_SELECTED, + BIND_WAIT, + BIND_OK }; enum PXX2ReceiverStatus { - RECEIVER_WAITING_RESPONSE, - RECEIVER_OK + RECEIVER_SETTINGS_READ = 0x00, + RECEIVER_SETTINGS_OK, + RECEIVER_SETTINGS_WRITE = 0x40 }; + extern ModuleFifo intmoduleFifo; extern ModuleFifo extmoduleFifo; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index e4b617aa0..565ff5a27 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -62,15 +62,22 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { + if (moduleSettings[module].mode != MODULE_MODE_RECEIVER_SETTINGS) { + return; + } + uint8_t channelsCount = sentModuleChannels(module); for (uint8_t pin = 0; pin < channelsCount; pin++) { reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) reusableBuffer.receiverSetup.pwmRate = 1; + // if (frame[4] & PXX2_RECV_OPTION_MASK_TELEMETRY) // reusableBuffer.receiverSetup.telemetryEnabled = 1; - reusableBuffer.receiverSetup.state = RECEIVER_OK; + + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; reusableBuffer.receiverSetup.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; }