From 0fed2486f51589c28bfb115b0112c65293536110 Mon Sep 17 00:00:00 2001 From: richardclli Date: Tue, 17 Jan 2023 03:06:27 +0800 Subject: [PATCH] FX9630 protocol support, resolves #801 (#805) New protocol FX9630 --- Multiprotocol/FX_nrf24l01.ino | 93 ++++++++++++++++++++++++++++------ Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multi_Protos.ino | 4 +- Multiprotocol/Multiprotocol.h | 1 + Multiprotocol/_Config.h | 1 + 5 files changed, 83 insertions(+), 18 deletions(-) diff --git a/Multiprotocol/FX_nrf24l01.ino b/Multiprotocol/FX_nrf24l01.ino index 512710f..3b2808e 100644 --- a/Multiprotocol/FX_nrf24l01.ino +++ b/Multiprotocol/FX_nrf24l01.ino @@ -33,7 +33,14 @@ Multiprotocol is distributed in the hope that it will be useful, #define FX620_PAYLOAD_SIZE 7 #define FX620_CH_OFFSET 1 +#define FX9630_PACKET_PERIOD 8124 +#define FX9630_BIND_PACKET_PERIOD 8124 +#define FX9630_BIND_CHANNEL 51 +#define FX9630_PAYLOAD_SIZE 8 +#define FX9630_NUM_CHANNELS 3 + //#define FORCE_FX620_ID +//#define FORCE_FX9630_ID static void __attribute__((unused)) FX_send_packet() { @@ -41,21 +48,44 @@ static void __attribute__((unused)) FX_send_packet() if(IS_BIND_DONE) { XN297_Hopping(hopping_frequency_no++); - hopping_frequency_no &= 0x03; + if(sub_protocol == FX9630) + { + XN297_SetTXAddr(rx_tx_addr, 4); + if (hopping_frequency_no > FX9630_NUM_CHANNELS) + hopping_frequency_no = 0; + } + else // FX816 and FX620 + { + hopping_frequency_no &= 0x03; + } } memset(packet,0x00,packet_length); //Channels - uint8_t offset=sub_protocol == FX816 ? FX816_CH_OFFSET:FX620_CH_OFFSET; - uint8_t val=convert_channel_8b(AILERON); - if(val>127+FX_SWITCH) - packet[offset] = sub_protocol == FX816 ? 1:0xFF; - else if(val<127-FX_SWITCH) - packet[offset] = sub_protocol == FX816 ? 2:0x00; - else - packet[offset] = sub_protocol == FX816 ? 0:0x7F; - packet[offset+1] = convert_channel_16b_limit(THROTTLE,0,100); //FX816:0x00..0x63, FX620:0x00..0x5E but that should work + uint8_t val; + if (sub_protocol == FX9630) + { + packet[0] = convert_channel_8b(THROTTLE); + packet[1] = convert_channel_8b(AILERON); + packet[2] = 0xFF - convert_channel_8b(ELEVATOR); + packet[3] = convert_channel_8b(RUDDER); + packet[4] = 0x20; + packet[5] = GET_FLAG(CH5_SW, 0x01); // DR toggle swich: 0 small throw, 1 large throw + packet[5] |= (Channel_data[CH6] < CHANNEL_MIN_COMMAND ? 0x00 : (Channel_data[CH6] > CHANNEL_MAX_COMMAND ? 0x02 : 0x01)) << 1; // Mode A(0) : 6D small throw, B(1) : 6D large throw, C(2) : 3D + } + else // FX816 and FX620 + { + uint8_t offset=sub_protocol == FX816 ? FX816_CH_OFFSET:FX620_CH_OFFSET; + val=convert_channel_8b(AILERON); + if(val>127+FX_SWITCH) + packet[offset] = sub_protocol == FX816 ? 1:0xFF; + else if(val<127-FX_SWITCH) + packet[offset] = sub_protocol == FX816 ? 2:0x00; + else + packet[offset] = sub_protocol == FX816 ? 0:0x7F; + packet[offset+1] = convert_channel_16b_limit(THROTTLE,0,100); //FX816:0x00..0x63, FX620:0x00..0x5E but that should work + } //Bind and specifics if(sub_protocol == FX816) @@ -67,7 +97,7 @@ static void __attribute__((unused)) FX_send_packet() packet[1] = rx_tx_addr[0]; packet[2] = rx_tx_addr[1]; } - else //FX620 + else if(sub_protocol == FX620) { if(IS_BIND_IN_PROGRESS) { @@ -82,12 +112,27 @@ static void __attribute__((unused)) FX_send_packet() packet[5] = 0xAB; // Is it based on ID?? } } + else // FX9630 + { + if(IS_BIND_IN_PROGRESS) + { + memcpy(packet,rx_tx_addr, 4); + packet[4] = hopping_frequency[1]; + packet[5] = hopping_frequency[2]; + packet[7] = 0x55; + } + } //Check + uint8_t last_packet_idx = packet_length-1; + if (sub_protocol == FX9630 && IS_BIND_IN_PROGRESS) + last_packet_idx--; val=0; - for(uint8_t i=0;i