diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 293c65cd0..f3d20ec37 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1933,19 +1933,16 @@ void menuModelReceiverOptions(event_t event) drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0xFF && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_OK && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; - reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.state = 0x00; // Get options - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - TRACE("GET polling"); + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_GET_SETTINGS; } #if defined(SIMU) reusableBuffer.receiverSetup.state = 0xFF; #endif - if (reusableBuffer.receiverSetup.state != 0) { + if (reusableBuffer.receiverSetup.state != RECEIVER_WAITING_RESPONSE) { bool changed = false; for (uint8_t k=0; k reusableBuffer.receiverSetup.timeout) { - reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.state = 0xFF; - moduleSettings[module].mode = MODULE_MODE_NORMAL; - } - setupChannelsFrame(module); + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(0x40 + reusableBuffer.receiverSetup.receiverId); + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= 0x10; + Pxx2Transport::addByte(flag1); + for (int i = 0; i < 24; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } - else { - TRACE("Frame is %d", reusableBuffer.receiverSetup.state); - 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 |= 0x10; - Pxx2Transport::addByte(flag1); - for (int i = 0; i < 24; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); - } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; + reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; // module will be confirming changes + moduleSettings[module].mode = MODULE_MODE_NORMAL; +} + + +void Pxx2Pulses::setupReceiverGetSettingsFrame(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 |= 0x10; + Pxx2Transport::addByte(flag1); + for (int i = 0; i < 24; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } + 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) @@ -241,8 +249,11 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_GET_HARDWARE_INFO: setupHardwareInfoFrame(module); break; - case MODULE_MODE_RECEIVER_SETTINGS: - setupReceiverSettingsFrame(module); + case MODULE_MODE_RECEIVER_GET_SETTINGS: + setupReceiverGetSettingsFrame(module); + break; + case MODULE_MODE_RECEIVER_SET_SETTINGS: + setupReceiverSetSettingsFrame(module); break; case MODULE_MODE_REGISTER: setupRegisterFrame(module); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index e76704d3d..b7c1ee126 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -59,6 +59,10 @@ enum PXX2BindSteps { BIND_OK }; +enum PXX2ReceiverStatus { + RECEIVER_WAITING_RESPONSE, + RECEIVER_OK +}; extern ModuleFifo intmoduleFifo; extern ModuleFifo extmoduleFifo; @@ -112,7 +116,9 @@ class Pxx2Pulses: public PxxPulses { void setupShareMode(uint8_t module); - void setupReceiverSettingsFrame(uint8_t module); + void setupReceiverSetSettingsFrame(uint8_t module); + + void setupReceiverGetSettingsFrame(uint8_t module); void setupChannelsFrame(uint8_t module); diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index ab899e446..7df61e9f6 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -62,20 +62,16 @@ 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; - } - TRACE("Processing Frame"); - if (reusableBuffer.receiverSetup.state == 0x00) { - TRACE("Frame is GET"); + if (reusableBuffer.receiverSetup.state == RECEIVER_WAITING_RESPONSE) { for (uint8_t pin = 0; pin < 24; pin++) { reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } reusableBuffer.receiverSetup.pwmRate = frame[4] & 0x30; + reusableBuffer.receiverSetup.state = RECEIVER_OK; + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; } - reusableBuffer.receiverSetup.state = 0xFF; - moduleSettings[module].mode = MODULE_MODE_NORMAL; -} + } void processRegisterFrame(uint8_t module, uint8_t * frame) {