From 5c59cddc7a3d5c10ed6207a6d21c51776234a982 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 6 Jul 2020 09:52:43 +0200 Subject: [PATCH] FrSkyR9: FCC initial support --- Multiprotocol/FrSkyR9_sx1276.ino | 115 ++++++++++++++++++++----------- Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multi_Names.ino | 4 +- Multiprotocol/Multiprotocol.h | 10 ++- Multiprotocol/_Config.h | 4 ++ 5 files changed, 91 insertions(+), 44 deletions(-) diff --git a/Multiprotocol/FrSkyR9_sx1276.ino b/Multiprotocol/FrSkyR9_sx1276.ino index a23d5cc..1f2f752 100644 --- a/Multiprotocol/FrSkyR9_sx1276.ino +++ b/Multiprotocol/FrSkyR9_sx1276.ino @@ -1,9 +1,11 @@ #if defined(FRSKYR9_SX1276_INO) #include "iface_sx1276.h" -#define FREQ_MAP_SIZE 29 +#define DISP_FREQ_TABLE -uint32_t FrSkyR9_freq_map[FREQ_MAP_SIZE]; +#define FLEX_FREQ 29 +#define FCC_FREQ 43 +#define EU_FREQ 19 enum { FRSKYR9_FREQ=0, @@ -12,23 +14,54 @@ enum { FRSKYR9_RX2, }; -static void __attribute__((unused)) FrSkyR9_build_freq() +void FrSkyR9_set_frequency() { - uint32_t start_freq=914472960; // 915 - if(sub_protocol & 0x01 && IS_BIND_DONE) - start_freq=859504640; // 868 and bind completed - for(uint8_t i=0;i=FLEX_FREQ-2) + num+=FrSkyX_chanskip-FLEX_FREQ+2; // the last 2 values are FrSkyX_chanskip and FrSkyX_chanskip+1 + num <<= 5; + num += 0xD700; + break; + }//else use R9_915 + case R9_915: + hopping_frequency_no %= FLEX_FREQ; + num=hopping_frequency_no; + if(hopping_frequency_no>=FLEX_FREQ-2) + num+=FrSkyX_chanskip-FLEX_FREQ+2; // the last 2 values are FrSkyX_chanskip and FrSkyX_chanskip+1 + num <<= 5; + num += 0xE4C0; + break; + case R9_FCC: + hopping_frequency_no %= FCC_FREQ; + num=hopping_frequency_no; + num <<= 5; + num += 0xE200; + break; + case R9_EU: + hopping_frequency_no %= EU_FREQ; + num=hopping_frequency_no; + num <<= 4; + num += 0xD7D0; + break; } - // Last two frequencies determined by FrSkyX_chanskip - FrSkyR9_freq_map[FREQ_MAP_SIZE-2] = FrSkyR9_freq_map[FrSkyX_chanskip]; - debugln("F%d=%lu", FREQ_MAP_SIZE-2, FrSkyR9_freq_map[FREQ_MAP_SIZE-2]); - FrSkyR9_freq_map[FREQ_MAP_SIZE-1] = FrSkyR9_freq_map[FrSkyX_chanskip+1]; - debugln("F%d=%lu", FREQ_MAP_SIZE-1, FrSkyR9_freq_map[FREQ_MAP_SIZE-1]); - hopping_frequency_no = 0; + data[0] = num>>8; + data[1] = num&0xFF; + data[2] = 0x00; + + #ifdef DISP_FREQ_TABLE + if(phase==0xFF) + debugln("F%d=%02X%02X%02X=%lu", hopping_frequency_no, data[0], data[1], data[2], (uint32_t)((data[0]<<16)+(data[1]<<8)+data[2])*61); + #endif + SX1276_WriteRegisterMulti(SX1276_06_FRFMSB, data, 3); } static void __attribute__((unused)) FrSkyR9_build_packet() @@ -71,20 +104,27 @@ static void __attribute__((unused)) FrSkyR9_build_packet() uint16_t initFrSkyR9() { + //Check frequencies + #ifdef DISP_FREQ_TABLE + phase=0xFF; + FrSkyX_chanskip=1; + hopping_frequency_no=0xFF; + for(uint8_t i=0;i>2)+1; TX_RSSI=SX1276_ReadReg(SX1276_1A_PACKETRSSI)-157; for(uint8_t i=0;i<9;i++) - packet[4+i]=packet_in[i]; // Adjust buffer to match FrSkyX + packet[4+i]=packet_in[i]; // Adjust buffer to match FrSkyX frsky_process_telemetry(packet,len); // Process telemetry packet pps_counter++; if(TX_LQI==0) - TX_LQI++; // Recover telemetry right away + TX_LQI++; // Recover telemetry right away } } } @@ -188,13 +223,13 @@ uint16_t FrSkyR9_callback() {//1 packet every 20ms pps_timer = millis(); debugln("%d pps", pps_counter); - TX_LQI = pps_counter<<1; // Max=100% + TX_LQI = pps_counter<<1; // Max=100% pps_counter = 0; } if(TX_LQI==0) - FrSkyX_telem_init(); // Reset telemetry + FrSkyX_telem_init(); // Reset telemetry else - telemetry_link=1; // Send telemetry out anyway + telemetry_link=1; // Send telemetry out anyway //Clear all flags SX1276_WriteReg(SX1276_12_REGIRQFLAGS,0xFF); phase=FRSKYR9_FREQ; diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 20b41cb..e7c9dd8 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -62,7 +62,7 @@ 62,XK,X450,X420 63,XN_DUMP,250K,1M,2M,AUTO 64,FrskyX2,CH_16,CH_8,EU_16,EU_8,Cloned -65,FrSkyR9,915MHz,868MHz,915_8ch,868_8ch +65,FrSkyR9,915MHz,868MHz,915_8ch,868_8ch,FCC,--,FCC_8ch,--_8ch 66,PROPEL,74-Z 67,LR12,LR12,LR12_6ch 68,Skyartec diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index f767605..6ff53b9 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -130,7 +130,7 @@ const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch"; const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2"; const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0"; const char STR_SUBTYPE_XK[] = "\x04""X450""X420"; -const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch"; +const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0 ""--\0 ""FCC 8ch""-- 8ch\0"; const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4"; const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z"; const char STR_SUBTYPE_FRSKY_RX[] = "\x07""RX\0 ""CloneTX"; @@ -246,7 +246,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_FRSKYL, STR_FRSKYL, 2, STR_SUBTYPE_FRSKYL, OPTION_RFTUNE }, #endif #if defined(FRSKYR9_SX1276_INO) - {PROTO_FRSKY_R9, STR_FRSKYR9, 4, STR_SUBTYPE_FRSKYR9, OPTION_NONE }, + {PROTO_FRSKY_R9, STR_FRSKYR9, 8, STR_SUBTYPE_FRSKYR9, OPTION_NONE }, #endif #if defined(FX816_NRF24L01_INO) {PROTO_FX816, STR_FX816, 1, STR_SUBTYPE_FX816, OPTION_NONE }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 72cd56a..2504ce6 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 36 +#define VERSION_PATCH_LEVEL 37 //****************** // Protocols @@ -344,6 +344,10 @@ enum FRSKY_R9 R9_868 = 1, R9_915_8CH = 2, R9_868_8CH = 3, + R9_FCC = 4, + R9_EU = 5, + R9_FCC_8CH = 6, + R9_EU_8CH = 7, }; enum ESKY { @@ -958,6 +962,10 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- R9_868 1 R9_915_8CH 2 R9_868_8CH 3 + R9_FCC 4 + R9_EU 5 + R9_FCC_8CH 6 + R9_EU_8CH 7 sub_protocol==ESKY ESKY_STD 0 ESKY_ET4 1 diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 69740c6..e3ab0f0 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -592,6 +592,10 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { R9_868 R9_915_8CH R9_868_8CH + R9_FCC + R9_EU + R9_FCC_8CH + R9_EU_8CH PROTO_FRSKYV NONE PROTO_FRSKYX