From 76e90029953813846c2e94aab3a72e285f6700c8 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Wed, 22 Nov 2017 13:56:42 +0100 Subject: [PATCH] S-FHSS failsafe --- BootLoaders/Boards/boards.txt | 3 ++ .../package_multi_4in1_board_index.json | 4 +- .../package_multi_4in1_board_v1.0.0.zip | Bin 3135 -> 3161 bytes Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/Multiprotocol.ino | 2 +- Multiprotocol/SFHSS_cc2500.ino | 37 +++++++++++++----- Multiprotocol/_MyConfig.h | 23 +++++++++++ 7 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 Multiprotocol/_MyConfig.h diff --git a/BootLoaders/Boards/boards.txt b/BootLoaders/Boards/boards.txt index 4abfa94..6735147 100644 --- a/BootLoaders/Boards/boards.txt +++ b/BootLoaders/Boards/boards.txt @@ -20,6 +20,7 @@ multiatmega328p.build.f_cpu=16000000L multiatmega328p.build.core=arduino:arduino multiatmega328p.build.variant=arduino:eightanaloginputs multiatmega328p.build.extra_flags=-Wl,--relax +multiatmega328p.build.board=MULTI_AVR multiatmega328p.bootloader.tool=arduino:avrdude multiatmega328p.bootloader.low_fuses=0xFF @@ -29,12 +30,14 @@ multiatmega328p.bootloader.lock_bits=0x0F multiatmega328p.menu.bootloader.none=No bootloader multiatmega328p.menu.bootloader.none.build.board=MULTI_NO_BOOT + multiatmega328p.menu.bootloader.none.upload.maximum_size=32768 multiatmega328p.menu.bootloader.none.bootloader.file=Multi4in1/AtmegaMultiEmpty.hex multiatmega328p.menu.bootloader.none.bootloader.high_fuses=0xD7 multiatmega328p.menu.bootloader.optiboot=Flash from TX multiatmega328p.menu.bootloader.optiboot.build.board=MULTI_FLASH_FROM_TX + multiatmega328p.menu.bootloader.optiboot.upload.maximum_size=32512 multiatmega328p.menu.bootloader.optiboot.bootloader.file=Multi4in1/AtmegaMultiBoot.hex multiatmega328p.menu.bootloader.optiboot.bootloader.high_fuses=0xD6 diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index 7b352c3..1d5b725 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -19,8 +19,8 @@ }, "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", - "checksum": "SHA-256:7B8A93E4EDFA8EF63884A6B152C0DAFF24E067FA4F779A52AE77BFC8F23DCB72", - "size": "3135", + "checksum": "SHA-256:F5CF6502AB15B2BEC5F47CE0258DB9A1682CA3A4F2A4E490EA76F54961072483", + "size": "3161", "boards": [ {"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"} ], diff --git a/BootLoaders/package_multi_4in1_board_v1.0.0.zip b/BootLoaders/package_multi_4in1_board_v1.0.0.zip index bb22be91561159ba43af027bc13c5a2ee518d44a..af0bf240dd8c8d5b9edb1f5356170ba846c4aed6 100644 GIT binary patch literal 3161 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 //#define DEBUG_TX -//#define USE_MY_CONFIG +#define USE_MY_CONFIG #ifdef ARDUINO_AVR_XMEGA32D4 #include "MultiOrange.h" #endif diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index edc6190..6f995f8 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -127,25 +127,42 @@ static void __attribute__((unused)) SFHSS_calc_next_chan() // Values grow down and to the right. static void __attribute__((unused)) SFHSS_build_data_packet() { + uint16_t ch1,ch2,ch3,ch4; // command.bit0 is the packet number indicator: =0 -> SFHSS_DATA1, =1 -> SFHSS_DATA2 // command.bit1 is unknown but seems to be linked to the payload[0].bit0 but more dumps are needed: payload[0]=0x82 -> =0, payload[0]=0x81 -> =1 // command.bit2 is the failsafe transmission indicator: =0 -> normal data, =1->failsafe data // command.bit3 is the channels indicator: =0 -> CH1-4, =1 -> CH5-8 + + //Coding below matches the Futaba T8J transmission scheme DATA1->CH1-4, DATA2->CH5-8, DATA1->CH5-8, DATA2->CH1-4,... + // XK, T10J and TM-FH are different with a classic DATA1->CH1-4, DATA2->CH5-8,... + //Failsafe is sent twice every couple of seconds (unknown but >5s) + uint8_t command= (phase == SFHSS_DATA1) ? 0 : 1; // Building packet for Data1 or Data2 counter+=command; - if(counter&1) command|=0x08; // Transmit lower and upper channels twice in a row - if((counter&0x3FE)==0x3FE) - { - command|=0x04; // Transmit failsafe data every 7s - counter&=0x3FF; // Reset counter + if( (counter&0x3FC) == 0x3FC ) + { // Transmit failsafe data twice every 7s + if( ((counter&1)^(command&1)) == 0 ) + command|=0x04; // Failsafe } else command|=0x02; // Assuming packet[0] == 0x81 - uint8_t ch_offset = ((command&0x08) >> 1) + ((command&0x04)<<1); // CH1..CH8 when failsafe is off, CH9..CH16 when failsafe is on - uint16_t ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); - uint16_t ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); - uint16_t ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); - uint16_t ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); + counter&=0x3FF; // Reset failsafe counter + if(counter&1) command|=0x08; // Transmit lower and upper channels twice in a row + if(command&0x04) + {//Failsafe data + ch1=0x400; // Centered + ch2=0x400; // Centered + ch3=(command&0x08)?0x400:0xC00; // Centered or zero if throttle channel + ch4=0x400; // Centered + } + else + {//Normal data + uint8_t ch_offset = (command&0x08) >> 1; // CH1..CH4 or CH5..CH8 + ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); + ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); + ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); + ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); + } // XK [0]=0x81 [3]=0x00 [4]=0x00 // T8J [0]=0x81 [3]=0x42 [4]=0x07 diff --git a/Multiprotocol/_MyConfig.h b/Multiprotocol/_MyConfig.h new file mode 100644 index 0000000..1ab7c1f --- /dev/null +++ b/Multiprotocol/_MyConfig.h @@ -0,0 +1,23 @@ +//#define FORCE_GLOBAL_ID 0x12345678 + +#if not defined STM32_BOARD + // #undef AFHDS2A_A7105_INO + + // #undef DEVO_CYRF6936_INO + // #undef J6PRO_CYRF6936_INO + // #undef WK2x01_CYRF6936_INO + + // #undef FRSKYV_CC2500_INO + // #undef FRSKYX_CC2500_INO + + // #undef KN_NRF24L01_INO + // #undef SLT_NRF24L01_INO + + // #undef FY326_NRF24L01_INO + // #undef FQ777_NRF24L01_INO + // #undef ASSAN_NRF24L01_INO + // #undef HONTAI_NRF24L01_INO + // #undef Q303_NRF24L01_INO + // #undef GW008_NRF24L01_INO + // #undef DM002_NRF24L01_INO +#endif