diff --git a/Multiprotocol/FrSkyR9_sx1276.ino b/Multiprotocol/FrSkyR9_sx1276.ino index 10512ca..c8a90e2 100644 --- a/Multiprotocol/FrSkyR9_sx1276.ino +++ b/Multiprotocol/FrSkyR9_sx1276.ino @@ -82,10 +82,10 @@ uint16_t initFrSkyR9() { set_rx_tx_addr(MProtocol_id_master); - if(sub_protocol == R9_915) // 915MHz - FrSkyR9_freq_map = FrSkyR9_freq_map_915; - else if(sub_protocol == R9_868) // 868MHz + if(sub_protocol & 0x01) FrSkyR9_freq_map = FrSkyR9_freq_map_868; + else + FrSkyR9_freq_map = FrSkyR9_freq_map_915; FrSkyR9_step = 1 + (random(0xfefefefe) % 24); FrSkyR9_freq_map[27] = FrSkyR9_freq_map[FrSkyR9_step]; @@ -164,10 +164,9 @@ uint16_t FrSkyR9_callback() // each channel is 11 bit + 1 bit (msb) that states whether // it's part of the upper channels (9-16) or lower (1-8) (0 - lower 1 - upper) - const uint8_t packet_offset = 8; - const bool is_upper = false; - - uint8_t chan_index = 0; + #define CH_POS 8 + static uint8_t chan_start=0; + uint8_t chan_index = chan_start; for(int i = 0; i < 8; i += 3) { @@ -175,13 +174,16 @@ uint16_t FrSkyR9_callback() uint16_t ch1 = FrSkyX_scaleForPXX(chan_index); uint16_t ch2 = FrSkyX_scaleForPXX(chan_index + 1); - packet[packet_offset + i] = ch1; - packet[packet_offset + i + 1] = (ch1 >> 8) | (ch2 << 4); - packet[packet_offset + i + 2] = (ch2 >> 4); + packet[CH_POS + i] = ch1; + packet[CH_POS + i + 1] = (ch1 >> 8) | (ch2 << 4); + packet[CH_POS + i + 2] = (ch2 >> 4); chan_index += 2; } + if((sub_protocol & 0x02) == 0) + chan_start ^= 0x08; // Alternate between lower and upper when 16 channels is used + packet[20] = 0x08; // ???? packet[21] = 0x00; // ???? packet[22] = 0x00; // ???? diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index ab0e36f..9b72083 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -62,4 +62,4 @@ 62,XK,X450,X420 63,XN_DUMP,250K,1M,2M,AUTO 64,FrskyX2,CH_16,CH_8,EU_16,EU_8 -65,FrSkyR9,915MHz,868MHz +65,FrSkyR9,915MHz,868MHz,915_8ch,868_8ch diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index e4887ba..f5e0fe9 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -119,7 +119,7 @@ const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 const char STR_SUBTYPE_ESKY150[] = "\x03""4CH""7CH"; const char STR_SUBTYPE_V911S[] = "\x04""Std\0""E119"; const char STR_SUBTYPE_XK[] = "\x04""X450""X420"; -const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz"; +const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch"; enum { @@ -328,7 +328,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_XN297DUMP, STR_XN297DUMP, 4, STR_SUBTYPE_XN297DUMP, OPTION_RFCHAN }, #endif #if defined(FRSKYR9_SX1276_INO) - {PROTO_FRSKY_R9, STR_FRSKYR9, 2, STR_SUBTYPE_FRSKYR9, OPTION_NONE }, + {PROTO_FRSKY_R9, STR_FRSKYR9, 4, STR_SUBTYPE_FRSKYR9, OPTION_NONE }, #endif {0x00, nullptr, 0, nullptr, 0 } }; diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 80b2f64..6823672 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 0 -#define VERSION_PATCH_LEVEL 66 +#define VERSION_PATCH_LEVEL 67 //****************** // Protocols @@ -329,8 +329,10 @@ enum XN297DUMP }; enum FRSKY_R9 { - R9_915 = 0, - R9_868 = 1, + R9_915 = 0, + R9_868 = 1, + R9_915_8CH = 2, + R9_868_8CH = 3, }; #define NONE 0 @@ -881,8 +883,10 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- V911S_STD 0 V911S_E119 1 sub_protocol==FRSKY_R9 - R9_915 0 - R9_868 1 + R9_915 0 + R9_868 1 + R9_915_8CH 2 + R9_868_8CH 3 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 5fa85f0..5a907b4 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -566,6 +566,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PROTO_FRSKYR9 R9_915 R9_868 + R9_915_8CH + R9_868_8CH PROTO_FRSKYV NONE PROTO_FRSKYX diff --git a/Protocols_Details.md b/Protocols_Details.md index 93c085c..0960a5f 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1344,15 +1344,33 @@ CH1|CH2|CH3|CH4|CH5 ## FRSKYR9 - *65* Extended limits supported -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ----|---|---|---|---|---|---|--- -A|E|T|R|CH5|CH6|CH7|CH8 - ### Sub_protocol R9_915 - *0* -915MHz +915MHz, 16 channels + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 +---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|---- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 ### Sub_protocol R9_868 - *1* -868MHz +868MHz, 16 channels + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 +---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|---- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 + +### Sub_protocol R9_915_8CH - *2* +915MHz, 8 channels + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 + +### Sub_protocol R9_868_8CH - *3* +868MHz, 8 channels + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 # OpenLRS module