From a0074adcb25e0fb44499e227c91235ad8a1e8192 Mon Sep 17 00:00:00 2001 From: midelic Date: Fri, 23 Sep 2016 23:46:48 +0300 Subject: [PATCH] Fixes --- Multiprotocol/A7105_SPI.ino | 24 +- Multiprotocol/Multiprotocol.h | 234 +++------- Multiprotocol/Multiprotocol.ino | 657 +++++++++++++--------------- Multiprotocol/Multiprotocol_STM32.h | 33 +- Multiprotocol/SPI.ino | 5 + Multiprotocol/Telemetry.ino | 477 +++++++++++--------- Multiprotocol/_Config.h | 205 +++++---- 7 files changed, 777 insertions(+), 858 deletions(-) diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index 552be89..cf1f16f 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -23,12 +23,12 @@ void A7105_WriteData(uint8_t len, uint8_t channel) { uint8_t i; - A7105_CS_off; + A7105_CSN_off; spi_write(A7105_RST_WRPTR); spi_write(0x05); for (i = 0; i < len; i++) spi_write(packet[i]); - A7105_CS_on; + A7105_CSN_on; A7105_WriteReg(0x0F, channel); A7105_Strobe(A7105_TX); } @@ -36,27 +36,27 @@ void A7105_WriteData(uint8_t len, uint8_t channel) void A7105_ReadData() { uint8_t i; A7105_Strobe(0xF0); //A7105_RST_RDPTR - A7105_CS_off; + A7105_CSN_off; spi_write(0x45); for (i=0;i<16;i++) packet[i]=spi_Read(); - A7105_CS_on; + A7105_CSN_on; } void A7105_WriteReg(uint8_t address, uint8_t data) { - A7105_CS_off; + A7105_CSN_off; spi_write(address); NOP(); spi_write(data); - A7105_CS_on; + A7105_CSN_on; } uint8_t A7105_ReadReg(uint8_t address) { uint8_t result; - A7105_CS_off; + A7105_CSN_off; spi_write(address |=0x40); //bit 6 =1 for reading result = spi_Read(); - A7105_CS_on; + A7105_CSN_on; return(result); } @@ -93,13 +93,13 @@ uint8_t A7105_Reset() } void A7105_WriteID(uint32_t ida) { - A7105_CS_off; + A7105_CSN_off; spi_write(0x06);//ex id=0x5475c52a ;txid3txid2txid1txid0 spi_write((ida>>24)&0xff);//53 spi_write((ida>>16)&0xff);//75 spi_write((ida>>8)&0xff);//c5 spi_write((ida>>0)&0xff);//2a - A7105_CS_on; + A7105_CSN_on; } /* @@ -145,9 +145,9 @@ void A7105_SetPower() } void A7105_Strobe(uint8_t address) { - A7105_CS_off; + A7105_CSN_off; spi_write(address); - A7105_CS_on; + A7105_CSN_on; } const uint8_t PROGMEM HUBSAN_A7105_regs[] = { diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 74a038a..a4ae685 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -15,7 +15,7 @@ // Check selected board type #ifndef XMEGA -#if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) + #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) #error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini" #endif #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) @@ -55,7 +55,7 @@ enum PROTOCOLS MODE_ASSAN = 24, // =>NRF24L01 MODE_FRSKYV = 25, // =>CC2500 MODE_HONTAI = 26, // =>NRF24L01 - MODE_OPENLRS = 27 // =>OpenLRS hardware + MODE_OPENLRS = 27, // =>OpenLRS hardware }; enum Flysky @@ -70,10 +70,13 @@ enum Hisky Hisky = 0, HK310 = 1 }; -enum DSM2 +enum DSM { - DSM2 = 0, - DSMX = 1 + DSM2_22 = 0, + DSM2_11 = 1, + DSMX_22 = 2, + DSMX_11 = 3, + DSM_AUTO = 4 }; enum YD717 { @@ -125,7 +128,6 @@ enum MJXQ H26D = 3, E010 = 4 }; - enum FRSKYX { CH_16 = 0, @@ -146,22 +148,29 @@ enum HONTAI struct PPM_Parameters { - uint8_t protocol : 5; + uint8_t protocol : 6; uint8_t sub_proto : 3; uint8_t rx_num : 4; uint8_t power : 1; uint8_t autobind : 1; uint8_t option; }; + +// Macros +#define NOP() __asm__ __volatile__("nop") + +//******************* +//*** Timer *** +//******************* #ifdef XMEGA #define TIFR1 TCC1.INTFLAGS #define OCF1A_bm TC1_CCAIF_bm #define OCR1A TCC1.CCA #define TCNT1 TCC1.CNT - #define USARTC0.DATA UDR0 + #define UDR0 USARTC0.DATA #define OCF1B_bm TC1_CCBIF_bm #define OCR1B TCC1.CCB - #define TCC1.INTCTRLB TIMSK1 + #define TIMSK1 TCC1.INTCTRLB #define SET_TIMSK1_OCIE1B TIMSK1 = (TIMSK1 & 0xF3) | 0x04 #define CLR_TIMSK1_OCIE1B TIMSK1 &= 0xF3 #else @@ -170,157 +179,10 @@ struct PPM_Parameters #define SET_TIMSK1_OCIE1B TIMSK1 |= _BV(OCIE1B) #define CLR_TIMSK1_OCIE1B TIMSK1 &=~_BV(OCIE1B) #endif -//******************* -//*** Pinouts *** -//******************* -#define LED_pin 5 //D13 = PB5 -#define BIND_pin 5 //D13 = PB5 -#define PPM_pin 3 //D3 = PD3 -#ifdef XMEGA - #define SDI_pin 6 //SDIO-D6 -#else - #define SDI_pin 5 //D5 = PD5 -#endif -#define SCLK_pin 4 //D4 = PD4 -#define A7105_CS_pin 2 //D2 = PD2 -#define SDO_pin 6 //D6 = PD6 -#define CC25_CSN_pin 7 //D7 = PD7 -#define NRF_CSN_pin 0 //D8 = PB0 -#define CYRF_CSN_pin 1 //D9 = PB1 -#define CTRL1_pin 1 //A1 = PC1 -#define CTRL2_pin 2 //A2 = PC2 -// -#ifdef XMEGA - #define CTRL1_on - #define CTRL1_off - #define CTRL2_on - #define CTRL2_off -#else - #define CTRL1_on PORTC |= _BV(1) - #define CTRL1_off PORTC &= ~_BV(1) - #define CTRL2_on PORTC |= _BV(2) - #define CTRL2_off PORTC &= ~_BV(2) -#endif -// -#ifdef XMEGA - #define A7105_CS_on PORTD.OUTSET = _BV(4) //D4 - #define A7105_CS_off PORTD.OUTCLR = _BV(4) //D4 -#else - #define CS_on PORTD |= _BV(2) //D2 - #define CS_off PORTD &= ~_BV(2) //D2 -#endif -// -#ifdef XMEGA - #define SCK_on PORTD.OUTSET = _BV(7) //D7 - #define SCK_off PORTD.OUTCLR = _BV(7) //D7 -#else - #define SCK_on PORTD |= _BV(4) //D4 - #define SCK_off PORTD &= ~_BV(4) //D4 -#endif -// -#ifdef XMEGA - #define SDI_on PORTD.OUTSET = _BV(5) //D5 - #define SDI_off PORTD.OUTCLR = _BV(5) //D5 -#else - #define SDI_on PORTD |= _BV(5) //D5 - #define SDI_off PORTD &= ~_BV(5) //D5 -#endif -// -#ifdef XMEGA - #define SDI_1 (PORTD.IN & _BV(SDI_pin)) == _BV(SDI_pin) //D5 - #define SDI_0 (PORTD.IN & _BV(SDI_pin)) == 0x00 //D5 -#else - #define SDI_1 (PIND & _BV(SDI_pin)) == _BV(SDI_pin) //D5 - #define SDI_0 (PIND & _BV(SDI_pin)) == 0x00 //D5 -#endif -// -#define SDI_SET_INPUT DDRD &= ~_BV(5) //D5 -#define SDI_SET_OUTPUT DDRD |= _BV(5) //D5 -// -#ifdef XMEGA - #define CC25_CSN_on PORTD.OUTSET = _BV(7) //D7 - #define CC25_CSN_off PORTD.OUTCLR = _BV(7) //D7 -#else - #define CC25_CSN_on PORTD |= _BV(7) //D7 - #define CC25_CSN_off PORTD &= ~_BV(7) //D7 -#endif -// -#ifdef XMEGA - #define NRF_CSN_on - #define NRF_CSN_off - #define NRF_CE_on - #define NRF_CE_off -#else - #define NRF_CSN_on PORTB |= _BV(0) //D8 - #define NRF_CSN_off PORTB &= ~_BV(0) //D8 - #define NRF_CE_on - #define NRF_CE_off -#endif -// -#ifdef XMEGA - #define CYRF_CSN_on PORTD.OUTSET = _BV(4) - #define CYRF_CSN_off PORTD.OUTCLR = _BV(4) -#else - #define CYRF_CSN_on PORTB |= _BV(1) //D9 - #define CYRF_CSN_off PORTB &= ~_BV(1) //D9 - #define CYRF_RST_HI PORTC |= _BV(5) //A5 - #define CYRF_RST_LO PORTC &= ~_BV(5) //A5 - #define CYRF_RST_pin 5 -#endif -// -#ifdef XMEGA - #define SDO_1 (PORTD.IN & _BV(SDO_pin)) == _BV(SDO_pin) //D6 - #define SDO_0 (PORTD.IN & _BV(SDO_pin)) == 0x00 //D6 -#else - #define SDO_1 (PIND & _BV(SDO_pin)) == _BV(SDO_pin) //D6 - #define SDO_0 (PIND & _BV(SDO_pin)) == 0x00 //D6 -#endif -// -// -// LED -#ifdef XMEGA - #define LED_ON PORTD.OUTCLR = _BV(1) - #define LED_OFF PORTD.OUTSET = _BV(1) - #define LED_TOGGLE PORTD.OUTTGL = _BV(1) - #define LED_SET_OUTPUT PORTD.DIRSET = _BV(1) - #define IS_LED_on ( (PORTD.OUT & _BV(1)) != 0x00 ) -#else - #define LED_ON PORTB |= _BV(5) - #define LED_OFF PORTB &= ~_BV(5) - #define LED_TOGGLE PORTB ^= _BV(5) - #define LED_SET_OUTPUT DDRB |= _BV(5) - #define IS_LED_on ( (PORTB & _BV(5)) != 0x00 ) -#endif - -//BIND -#ifdef XMEGA - #define IS_BIND_BUTTON_on ( (PORTD.IN & _BV(2)) == 0x00 ) -#else - #define BIND_SET_INPUT DDRB &= ~_BV(5) - #define BIND_SET_PULLUP PORTB |= _BV(5) - #define IS_BIND_BUTTON_on ( (PINB & _BV(5)) == 0x00 ) - #define BIND_SET_OUTPUT DDRB |= _BV(5) -#endif - -// TX -#ifdef DEBUG_TX - #define TX_ON PORTD |= _BV(1) - #define TX_OFF PORTD &= ~_BV(1) - #define TX_TOGGLE PORTD ^= _BV(1) - #define TX_SET_OUTPUT DDRD |= _BV(1) -#else - #define TX_ON - #define TX_OFF - #define TX_TOGGLE - #define TX_SET_OUTPUT -#endif - -// Macros -#define NOP() __asm__ __volatile__("nop") -#define BV(bit) (1 << bit) - -//Serial flags definition +//*************** +//*** Flags *** +//*************** #define RX_FLAG_on protocol_flags |= _BV(0) #define RX_FLAG_off protocol_flags &= ~_BV(0) #define IS_RX_FLAG_on ( ( protocol_flags & _BV(0) ) !=0 ) @@ -344,45 +206,47 @@ struct PPM_Parameters #define BIND_BUTTON_FLAG_on protocol_flags |= _BV(5) #define BIND_BUTTON_FLAG_off protocol_flags &= ~_BV(5) #define IS_BIND_BUTTON_FLAG_on ( ( protocol_flags & _BV(5) ) !=0 ) - //PPM RX OK #define PPM_FLAG_off protocol_flags &= ~_BV(6) #define PPM_FLAG_on protocol_flags |= _BV(6) #define IS_PPM_FLAG_on ( ( protocol_flags & _BV(6) ) !=0 ) - -//Bind flag for blinking +//Bind flag #define BIND_IN_PROGRESS protocol_flags &= ~_BV(7) #define BIND_DONE protocol_flags |= _BV(7) #define IS_BIND_DONE_on ( ( protocol_flags & _BV(7) ) !=0 ) - +// #define BAD_PROTO_off protocol_flags2 &= ~_BV(0) #define BAD_PROTO_on protocol_flags2 |= _BV(0) #define IS_BAD_PROTO_on ( ( protocol_flags2 & _BV(0) ) !=0 ) - +// #define RX_DONOTUPDTAE_off protocol_flags2 &= ~_BV(1) #define RX_DONOTUPDTAE_on protocol_flags2 |= _BV(1) #define IS_RX_DONOTUPDTAE_on ( ( protocol_flags2 & _BV(1) ) !=0 ) - +// #define RX_MISSED_BUFF_off protocol_flags2 &= ~_BV(2) #define RX_MISSED_BUFF_on protocol_flags2 |= _BV(2) #define IS_RX_MISSED_BUFF_on ( ( protocol_flags2 & _BV(2) ) !=0 ) - +//TX Pause #define TX_MAIN_PAUSE_off protocol_flags2 &= ~_BV(3) #define TX_MAIN_PAUSE_on protocol_flags2 |= _BV(3) #define IS_TX_MAIN_PAUSE_on ( ( protocol_flags2 & _BV(3) ) !=0 ) - #define TX_RX_PAUSE_off protocol_flags2 &= ~_BV(4) #define TX_RX_PAUSE_on protocol_flags2 |= _BV(4) #define IS_TX_RX_PAUSE_on ( ( protocol_flags2 & _BV(4) ) !=0 ) - #define IS_TX_PAUSE_on ( ( protocol_flags2 & (_BV(4)|_BV(3)) ) !=0 ) +//******************** +//*** Blink timing *** +//******************** #define BLINK_BIND_TIME 100 #define BLINK_SERIAL_TIME 500 #define BLINK_BAD_PROTO_TIME_LOW 1000 #define BLINK_BAD_PROTO_TIME_HIGH 50 -//AUX flags definition +//******************* +//*** AUX flags *** +//******************* +#define GET_FLAG(ch, mask) ( ch ? mask : 0) #define Servo_AUX1 Servo_AUX & _BV(0) #define Servo_AUX2 Servo_AUX & _BV(1) #define Servo_AUX3 Servo_AUX & _BV(2) @@ -392,8 +256,6 @@ struct PPM_Parameters #define Servo_AUX7 Servo_AUX & _BV(6) #define Servo_AUX8 Servo_AUX & _BV(7) -#define GET_FLAG(ch, mask) ( ch ? mask : 0) - //************************ //*** Power settings *** //************************ @@ -484,7 +346,7 @@ enum CYRF_POWER #define CYRF_HIGH_POWER CYRF_POWER_7 #define CYRF_LOW_POWER CYRF_POWER_3 #define CYRF_RANGE_POWER CYRF_POWER_1 // 1/30 of the full power distance -#define CYRF_BIND_POWER CYRF_POWER_1 +#define CYRF_BIND_POWER CYRF_POWER_0 enum TXRX_State { TXRX_OFF, @@ -502,6 +364,8 @@ enum { // baudrate defines for serial #define SPEED_100K 0 #define SPEED_9600 1 +#define SPEED_57600 2 +#define SPEED_125K 3 //**************************************** //*** MULTI protocol serial definition *** @@ -512,17 +376,18 @@ enum { ************************** Serial: 100000 Baud 8e2 _ xxxx xxxx p -- Total of 26 bytes - Stream[0] = 0x55 + Stream[0] = 0x55 sub_protocol values are 0..31 + Stream[0] = 0x54 sub_protocol values are 32..63 header Stream[1] = sub_protocol|BindBit|RangeCheckBit|AutoBindBit; - sub_protocol is 0..31 (bits 0..4) + sub_protocol is 0..31 (bits 0..4), value should be added with 32 if Stream[0] = 0x54 => Reserved 0 Flysky 1 Hubsan 2 - Frsky 3 + FrskyD 3 Hisky 4 V2x2 5 - DSM2 6 + DSM 6 Devo 7 YD717 8 KN 9 @@ -541,7 +406,9 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- J6PRO 22 FQ777 23 ASSAN 24 - FRSKY1 25 + FrskyV 25 + HONTAI 26 + OpenLRS 27 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No @@ -556,9 +423,11 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- sub_protocol==Hisky Hisky 0 HK310 1 - sub_protocol==DSM2 - DSM2 0 - DSMX 1 + sub_protocol==DSM + DSM2_22 0 + DSM2_11 1 + DSMX_22 2 + DSMX_11 3 sub_protocol==YD717 YD717 0 SKYWLKR 1 @@ -598,6 +467,10 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- sub_protocol==FRSKYX CH_16 0 CH_8 1 + sub_protocol==HONTAI + FORMAT_HONTAI 0 + FORMAT_JJRCX1 1 + FORMAT_X5C1 2 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; option_protocol value is -127..127 @@ -610,4 +483,3 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol */ - diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index b905dc1..46cd599 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -22,28 +22,41 @@ */ +//uncomment for board selection. +#define STM32_board #include -#include "_Config.h" -#include "TX_Def.h" + #ifdef STM32_board +//#undef __cplusplus +#include "Multiprotocol_STM32.h" +#include +#include +#include +#include HardwareTimer timer(2); +#else +#include +#include +#include "Multiprotocol.h" #endif +#include "_Config.h" +#include "TX_Def.h" + #ifdef XMEGA - #undef ENABLE_PPM // Disable PPM for orange module - #undef A7105_INSTALLED // Disable A7105 for orange module - #undef CC2500_INSTALLED // Disable CC2500 for orange module - #undef NFR24L01_INSTALLED // Disable NRF for orange module +#undef ENABLE_PPM // Disable PPM for OrangeTX module +#undef A7105_INSTALLED // Disable A7105 for OrangeTX module +#undef CC2500_INSTALLED // Disable CC2500 for OrangeTX module +#undef NRF24L01_INSTALLED // Disable NRF for OrangeTX module +#define TELEMETRY // Enable telemetry +#define INVERT_TELEMETRY // Enable invert telemetry +#define DSM_TELEMETRY // Enable DSM telemetry #endif -//Multiprotocol module configuration file //Global constants/variables uint32_t MProtocol_id;//tx id, uint32_t MProtocol_id_master; -uint32_t Model_fixed_id=0; -uint32_t fixed_id; uint32_t blink=0; - // uint16_t counter; uint8_t channel; @@ -97,34 +110,51 @@ uint8_t protocol_flags=0,protocol_flags2=0; // PPM variable volatile uint16_t PPM_data[NUM_CHN]; -// Serial variables -#ifdef INVERT_TELEMETRY -// enable bit bash for serial -#ifndef STM32_board #ifndef XMEGA -#define BASH_SERIAL 1 +//Random variable +volatile uint32_t gWDT_entropy=0; #endif -#define INVERT_SERIAL 1 -#endif -#endif -#define BAUD 100000 -#define RXBUFFER_SIZE 25 -#define TXBUFFER_SIZE 32 -volatile uint8_t rx_buff[RXBUFFER_SIZE]; -volatile uint8_t rx_ok_buff[RXBUFFER_SIZE]; -#ifndef BASH_SERIAL -volatile uint8_t tx_buff[TXBUFFER_SIZE]; -#endif -volatile uint8_t discard_frame = 0; //Serial protocol uint8_t sub_protocol; +uint8_t protocol; uint8_t option; -uint8_t cur_protocol[2]; -uint8_t prev_protocol=0; -uint8_t prev_option;//change option value on the fly. +uint8_t cur_protocol[3]; +uint8_t prev_option; uint8_t prev_power=0xFD; // unused power value +//Serial RX variables +#define BAUD 100000 +#define RXBUFFER_SIZE 26 +volatile uint8_t rx_buff[RXBUFFER_SIZE]; +volatile uint8_t rx_ok_buff[RXBUFFER_SIZE]; +volatile uint8_t discard_frame = 0; + +//Make sure telemetry is selected correctly +#ifndef TELEMETRY +#undef INVERT_TELEMETRY +#undef DSM_TELEMETRY +#undef SPORT_TELEMETRY +#undef HUB_TELEMETRY +#else +#if not defined(CYRF6936_INSTALLED) || not defined(DSM_CYRF6936_INO) +#undef DSM_TELEMETRY +#endif +#if (not defined(CC2500_INSTALLED) || not defined(FRSKYD_CC2500_INO)) && (not defined(A7105_INSTALLED) || not defined(HUBSAN_A7105_INO)) +#undef HUB_TELEMETRY +#endif +#if not defined(CC2500_INSTALLED) || not defined(FRSKYX_CC2500_INO) +#undef SPORT_TELEMETRY +#endif +#endif +#if not defined(DSM_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(SPORT_TELEMETRY) +#undef TELEMETRY +#undef INVERT_TELEMETRY +#endif + + + + #ifdef STM32_board void PPM_decode(); void ISR_COMPB(); @@ -133,9 +163,21 @@ void ISR_COMPB(); #define MAX_PKT 27 uint8_t pkt[MAX_PKT];//telemetry receiving packets #if defined(TELEMETRY) +#ifdef INVERT_TELEMETRY +// enable bit bash for serial +#ifndef STM32_board +#ifndef XMEGA +#define BASH_SERIAL 1 +#endif +#define INVERT_SERIAL 1 +#endif +#endif + uint8_t pass = 0; uint8_t pktt[MAX_PKT];//telemetry receiving packets #ifndef BASH_SERIAL +#define TXBUFFER_SIZE 32 +volatile uint8_t tx_buff[TXBUFFER_SIZE]; volatile uint8_t tx_head=0; volatile uint8_t tx_tail=0; #endif // BASH_SERIAL @@ -148,7 +190,6 @@ uint8_t telemetry_counter=0; // Callback typedef uint16_t (*void_function_t) (void);//pointer to a function with no parameters which return an uint16_t integer void_function_t remote_callback = 0; -//static void CheckTimer(uint16_t (*cb)(void)); // Init void setup() @@ -161,22 +202,18 @@ void setup() PORTD.PIN2CTRL = 0x18 ; PORTE.DIRSET = 0x01 ; PORTE.DIRCLR = 0x02 ; - PORTE.OUTSET = 0x01 ; - - for ( uint8_t count = 0 ; count < 20 ; count += 1 ) - asm("nop") ; - PORTE.OUTCLR = 0x01 ; + // Timer1 config // TCC1 16-bit timer, clocked at 0.5uS EVSYS.CH3MUX = 0x80 + 0x04 ; // Prescaler of 16 TCC1.CTRLB = 0; TCC1.CTRLC = 0; TCC1.CTRLD = 0; TCC1.CTRLE = 0; - TCC1.INTCTRLA = 0; TCC1.INTCTRLB = 0; + TCC1.INTCTRLA = 0; TIMSK1 = 0; TCC1.PER = 0xFFFF ; - TCC1.CNT = 0 ; + TCNT1 = 0 ; TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) #else // General pinout #if defined STM32_board - pinMode(CS_pin,OUTPUT); + pinMode(A7105_CSN_pin,OUTPUT); pinMode(CC25_CSN_pin,OUTPUT); pinMode(NRF_CSN_pin,OUTPUT); pinMode(CYRF_CSN_pin,OUTPUT); @@ -206,7 +243,7 @@ void setup() //select the counter clock. start_timer2();//0.5us #else - DDRD = (1<SR & TIMER_SR_CC1IF)!=0){ cli(); OCR1A = TCNT1; @@ -350,18 +416,17 @@ void loop() #else if( (TIFR1 & OCF1A_bm) != 0) { - cli(); // disable global int + cli(); // Disable global int due to RW of 16 bits registers OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point. - sei(); // enable global int + sei(); // Enable global int } else - while((TIFR1 & OCF1A_bm) == 0); // wait before callback - #endif + while((TIFR1 & OCF1A_bm) == 0); // Wait before callback + #endif do { #ifndef STM32_board - TX_ON; - TX_MAIN_PAUSE_on; + TX_MAIN_PAUSE_on; tx_pause(); #endif next_callback=remote_callback(); @@ -373,7 +438,7 @@ void loop() while(next_callback>4000) { // start to wait here as much as we can... next_callback-=2000; - #if defined STM32_board + #ifdef STM32_board cli(); OCR1A+=2000*2;// clear compare A=callback flag TIMER2_BASE->SR &= ~TIMER_SR_CC1IF; //clear compare Flag @@ -395,7 +460,7 @@ void loop() } // at this point we have between 2ms and 4ms in next_callback next_callback *= 2 ; // disable global int - #if defined STM32_board + #ifdef STM32_board cli(); OCR1A+=next_callback; TIMER2_BASE->SR &= ~TIMER_SR_CC1IF;//clear compare Flag write zero @@ -414,25 +479,30 @@ void loop() } } - void Update_All() { #ifdef ENABLE_SERIAL - if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received + + + +if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received { - update_serial_data(); // Update protocol and data + update_serial_data(); // Update protocol and data update_aux_flags(); if(IS_CHANGE_PROTOCOL_FLAG_on) { // Protocol needs to be changed - LED_OFF; //led off during protocol init + LED_off; //led off during protocol init modules_reset(); //reset all modules protocol_init(); //init new protocol + } + } #endif //ENABLE_SERIAL #ifdef ENABLE_PPM if(mode_select!=MODE_SERIAL && IS_PPM_FLAG_on) // PPM mode and a full frame has been received { + Serial.println("start"); for(uint8_t i=0;iPPM_MAX_125) temp_ppm=PPM_MAX_125; Servo_data[i]= temp_ppm ; + + + } + update_aux_flags(); PPM_FLAG_off; // wait for next frame before update } #endif //ENABLE_PPM update_led_status(); #if defined(TELEMETRY) - uint8_t protocol=cur_protocol[0]&0x1F; - if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM2) ) + if((protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) TelemetryUpdate(); #endif } - // Update Servo_AUX flags based on servo AUX positions static void update_aux_flags(void) { @@ -470,7 +542,7 @@ static void update_led_status(void) { if(blink led on + LED_off; //bind completed -> led on else blink+=BLINK_BIND_TIME; //blink fastly during binding - LED_TOGGLE; + LED_toggle; } } @@ -512,15 +584,17 @@ inline void tx_resume() #ifdef TELEMETRY if(!IS_TX_PAUSE_on) { - #ifdef XMEGA - USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt - #else - #ifdef STM32_board - USART3_BASE->CR1 |= USART_CR1_TXEIE;// TX intrrupt enabled - #else - UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt - #endif - #endif + #ifdef XMEGA + cli() ; + USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt + sei() ; + #else + #ifdef STM32_board + USART3_BASE->CR1 |= USART_CR1_TXEIE;// TX intrrupt enabled + #else + UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt + #endif + #endif } #endif } @@ -546,7 +620,6 @@ static void protocol_init() uint16_t next_callback=0; // Default is immediate call back remote_callback = 0; - set_rx_tx_addr(MProtocol_id); // reset telemetry #ifdef TELEMETRY #ifndef STM32_board @@ -568,64 +641,69 @@ static void protocol_init() else BIND_DONE; - CTRL1_on; //NRF24L01 antenna RF3 by default - CTRL2_off; //NRF24L01 antenna RF3 by default + PE1_on; //NRF24L01 antenna RF3 by default + PE2_off; //NRF24L01 antenna RF3 by default - switch(cur_protocol[0]&0x1F) // Init the requested protocol + switch(protocol) // Init the requested protocol { + #ifdef A7105_INSTALLED #if defined(FLYSKY_A7105_INO) case MODE_FLYSKY: - CTRL1_off; //antenna RF1 + PE1_off; //antenna RF1 next_callback = initFlySky(); remote_callback = ReadFlySky; break; #endif #if defined(HUBSAN_A7105_INO) case MODE_HUBSAN: - CTRL1_off; //antenna RF1 + PE1_off; //antenna RF1 if(IS_BIND_BUTTON_FLAG_on) random_id(10,true); // Generate new ID if bind button is pressed. next_callback = initHubsan(); remote_callback = ReadHubsan; break; #endif - #if defined(FRSKY_CC2500_INO) + #endif + #ifdef CC2500_INSTALLED + #if defined(FRSKYD_CC2500_INO) case MODE_FRSKYD: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initFrSky_2way(); remote_callback = ReadFrSky_2way; break; #endif - #if defined(FRSKY1_CC2500_INO) + #if defined(FRSKYV_CC2500_INO) case MODE_FRSKYV: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initFRSKYV(); remote_callback = ReadFRSKYV; break; #endif #if defined(FRSKYX_CC2500_INO) case MODE_FRSKYX: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initFrSkyX(); remote_callback = ReadFrSkyX; break; #endif #if defined(SFHSS_CC2500_INO) case MODE_SFHSS: - CTRL1_off; //antenna RF2 - CTRL2_on; + PE1_off; //antenna RF2 + PE2_on; next_callback = initSFHSS(); remote_callback = ReadSFHSS; break; #endif - #if defined(DSM2_CYRF6936_INO) - case MODE_DSM2: - CTRL2_on; //antenna RF4 - next_callback = initDsm2(); + #endif + #ifdef CYRF6936_INSTALLED + #if defined(DSM_CYRF6936_INO) + case MODE_DSM: + PE2_on; //antenna RF4 + next_callback = initDsm(); //Servo_data[2]=1500;//before binding - remote_callback = ReadDsm2; + remote_callback = ReadDsm; break; #endif #if defined(DEVO_CYRF6936_INO) @@ -653,18 +731,20 @@ static void protocol_init() } } #endif //ENABLE_PPM - CTRL2_on; //antenna RF4 + PE2_on; //antenna RF4 next_callback = DevoInit(); remote_callback = devo_callback; break; #endif #if defined(J6PRO_CYRF6936_INO) case MODE_J6PRO: - CTRL2_on; //antenna RF4 + PE2_on; //antenna RF4 next_callback = initJ6Pro(); remote_callback = ReadJ6Pro; break; #endif + #endif + #ifdef NRF24L01_INSTALLED #if defined(HISKY_NRF24L01_INO) case MODE_HISKY: next_callback=initHiSky(); @@ -761,12 +841,13 @@ static void protocol_init() remote_callback = ASSAN_callback; break; #endif - #if defined(HONTAI_NRF24L01_INO) + #if defined(HONTAI_NRF24L01_INO) case MODE_HONTAI: next_callback=initHONTAI(); remote_callback = HONTAI_callback; break; #endif + #endif } if(next_callback>32000) @@ -793,40 +874,42 @@ static void protocol_init() static void update_serial_data() { RX_DONOTUPDTAE_on; - RX_FLAG_off; //data has been processed - if(rx_ok_buff[0]&0x20) //check range + RX_FLAG_off; //data is being processed + if(rx_ok_buff[1]&0x20) //check range RANGE_FLAG_on; else RANGE_FLAG_off; - if(rx_ok_buff[0]&0xC0) //check autobind(0x40) & bind(0x80) together + if(rx_ok_buff[1]&0xC0) //check autobind(0x40) & bind(0x80) together AUTOBIND_FLAG_on; else AUTOBIND_FLAG_off; - if(rx_ok_buff[1]&0x80) //if rx_ok_buff[1] ==1,power is low ,0-power high + if(rx_ok_buff[2]&0x80) //if rx_ok_buff[2] ==1,power is low ,0-power high POWER_FLAG_off; //power low else POWER_FLAG_on; //power high - option=rx_ok_buff[2]; + option=rx_ok_buff[3]; - if( ((rx_ok_buff[0]&0x5F) != (cur_protocol[0]&0x5F)) || ( (rx_ok_buff[1]&0x7F) != cur_protocol[1] ) ) + if( (rx_ok_buff[0] != cur_protocol[0]) || ((rx_ok_buff[1]&0x5F) != (cur_protocol[1]&0x5F)) || ( (rx_ok_buff[2]&0x7F) != (cur_protocol[2]&0x7F) ) ) { // New model has been selected - prev_protocol=cur_protocol[0]&0x1F; //store previous protocol so we can reset the module - cur_protocol[1] = rx_ok_buff[1]&0x7F; //store current protocol CHANGE_PROTOCOL_FLAG_on; //change protocol - sub_protocol=(rx_ok_buff[1]>>4)& 0x07; //subprotocol no (0-7) bits 4-6 - RX_num=rx_ok_buff[1]& 0x0F; - MProtocol_id=MProtocol_id_master+RX_num; //personalized RX bind + rx num // rx_num bits 0---3 + protocol=(rx_ok_buff[0]==0x55?0:32) + (rx_ok_buff[1]&0x1F); //protocol no (0-63) bits 4-6 of buff[1] and bit 0 of buf[0] + sub_protocol=(rx_ok_buff[2]>>4)& 0x07; //subprotocol no (0-7) bits 4-6 + RX_num=rx_ok_buff[2]& 0x0F; // rx_num bits 0---3 + MProtocol_id=MProtocol_id_master+RX_num;//personalized RX bind + rx num + set_rx_tx_addr(MProtocol_id); //set rx_tx_addr } else - if( ((rx_ok_buff[0]&0x80)!=0) && ((cur_protocol[0]&0x80)==0) ) // Bind flag has been set + if( ((rx_ok_buff[1]&0x80)!=0) && ((cur_protocol[1]&0x80)==0) ) // Bind flag has been set CHANGE_PROTOCOL_FLAG_on; //restart protocol with bind else CHANGE_PROTOCOL_FLAG_off; //no need to restart - cur_protocol[0] = rx_ok_buff[0]; //store current protocol + //store current protocol values + for(uint8_t i=0;i<3;i++) + cur_protocol[i] = rx_ok_buff[i]; // decode channel values - volatile uint8_t *p=rx_ok_buff+2; + volatile uint8_t *p=rx_ok_buff+3; uint8_t dec=-3; for(uint8_t i=0;i>dec)&0x7FF)*5)/8+860; //value range 860<->2140 -125%<->+125% } - RX_DONOTUPDTAE_off; - + RX_DONOTUPDTAE_off; #ifdef XMEGA cli(); #else - UCSR0B &= ~(1<>8); -} - -// Channel value is limited to PPM_100 -uint16_t limit_channel_100(uint8_t ch) -{ - if(Servo_data[ch]>servo_max_100) - return servo_max_100; - else - if (Servo_data[ch]> 16) & 0xFF; rx_tx_addr[2] = (id >> 8) & 0xFF; rx_tx_addr[3] = (id >> 0) & 0xFF; - rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port + rx_tx_addr[4] = (rx_tx_addr[2]&0xF0)|(rx_tx_addr[3]&0x0F); } + +#ifndef STM32_board +#ifndef XMEGA +static void random_init(void) +{ + cli(); // Temporarily turn off interrupts, until WDT configured + MCUSR = 0; // Use the MCU status register to reset flags for WDR, BOR, EXTR, and POWR + WDTCSR |= _BV(WDCE); // WDT control register, This sets the Watchdog Change Enable (WDCE) flag, which is needed to set the prescaler + WDTCSR = _BV(WDIE); // Watchdog interrupt enable (WDIE) + sei(); // Turn interupts on +} + +static uint32_t random_value(void) +{ + while (!gWDT_entropy); + return gWDT_entropy; +} +#endif +#endif + + #if defined STM32_board static uint32_t random_id(uint16_t adress, uint8_t create_new) { @@ -1019,6 +1060,7 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) for(uint8_t i=0;i<4;i++) txid[i]=EEPROM.read(adress+110); id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24)); + } else { // if not generate a random ID @@ -1046,134 +1088,23 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) { // TXID exists in EEPROM eeprom_read_block((void*)txid,(const void*)adress,4); id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24)); + if(id!=0x2AD141A7) //ID with seed=0 + return id; } - else - { // if not generate a random ID - randomSeed((uint32_t)analogRead(A6)<<10|analogRead(A7));//seed - // - id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); - txid[0]= (id &0xFF); - txid[1] = ((id >> 8) & 0xFF); - txid[2] = ((id >> 16) & 0xFF); - txid[3] = ((id >> 24) & 0xFF); - eeprom_write_block((const void*)txid,(void*)adress,4); - eeprom_write_byte((uint8_t*)(adress+10),0xf0);//write bind flag in eeprom. - } + // Generate a random ID + id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); + txid[0]= (id &0xFF); + txid[1] = ((id >> 8) & 0xFF); + txid[2] = ((id >> 16) & 0xFF); + txid[3] = ((id >> 24) & 0xFF); + eeprom_write_block((const void*)txid,(void*)adress,4); + eeprom_write_byte((uint8_t*)(adress+10),0xf0);//write bind flag in eeprom. return id; } #endif -#ifndef XMEGA -#ifndef STM32_board -/************************************/ -/** Arduino replacement routines **/ -/************************************/ -// replacement millis() and micros() -// These work polled, no interrupts -// micros() MUST be called at least once every 32 milliseconds -uint16_t MillisPrecount ; -uint16_t lastTimerValue ; -uint32_t TotalMicros ; -uint32_t TotalMillis ; -uint8_t Correction ; -uint32_t micros() -{ - uint16_t elapsed ; - uint8_t millisToAdd ; - uint8_t oldSREG = SREG ; - cli() ; - uint16_t time = TCNT1 ; // Read timer 1 - SREG = oldSREG ; - - elapsed = time - lastTimerValue ; - elapsed += Correction ; - Correction = elapsed & 0x01 ; - elapsed >>= 1 ; - - uint32_t ltime = TotalMicros ; - ltime += elapsed ; - cli() ; - TotalMicros = ltime ; // Done this way for RPM to work correctly - lastTimerValue = time ; - SREG = oldSREG ; // Still valid from above - - elapsed += MillisPrecount; - millisToAdd = 0 ; - - if ( elapsed > 15999 ) - { - millisToAdd = 16 ; - elapsed -= 16000 ; - } - if ( elapsed > 7999 ) - { - millisToAdd += 8 ; - elapsed -= 8000 ; - } - if ( elapsed > 3999 ) - { - millisToAdd += 4 ; - elapsed -= 4000 ; - } - if ( elapsed > 1999 ) - { - millisToAdd += 2 ; - elapsed -= 2000 ; - } - if ( elapsed > 999 ) - { - millisToAdd += 1 ; - elapsed -= 1000 ; - } - TotalMillis += millisToAdd ; - MillisPrecount = elapsed ; - return TotalMicros ; -} - -uint32_t millis() -{ - micros() ; - return TotalMillis ; -} - -void delayMilliseconds(unsigned long ms) -{ - uint16_t start = (uint16_t)micros(); - uint16_t lms = ms ; - - while (lms > 0) { - if (((uint16_t)micros() - start) >= 1000) { - lms--; - start += 1000; - } - } -} - -/* Important notes: - - Max value is 16000µs - - delay is not accurate due to interrupts happening */ -void delayMicroseconds(unsigned int us) -{ - if (--us == 0) - return; - us <<= 2; // * 4 - us -= 2; // - 2 - __asm__ __volatile__ ( - "1: sbiw %0,1" "\n\t" // 2 cycles - "brne 1b" : "=w" (us) : "0" (us) // 2 cycles - ); -} - -void init() -{ - // this needs to be called before setup() or some functions won't work there - sei(); -} - -#endif -#endif /**************************/ @@ -1185,21 +1116,27 @@ void init() //PPM #ifdef ENABLE_PPM #ifdef XMEGA +#if PPM_pin == 2 ISR(PORTD_INT0_vect) #else +ISR(PORTD_INT1_vect) +#endif +#else #ifdef STM32_board void PPM_decode() #else -ISR(INT1_vect,ISR_NOBLOCK) +#if PPM_pin == 2 +ISR(INT0_vect, ISR_NOBLOCK) +#else +ISR(INT1_vect, ISR_NOBLOCK) +#endif #endif #endif { // Interrupt on PPM pin static int8_t chan=-1; static uint16_t Prev_TCNT1=0; uint16_t Cur_TCNT1; - Cur_TCNT1=TCNT1-Prev_TCNT1; // Capture current Timer1 value - if(Cur_TCNT1<1000) chan=-1; // bad frame else @@ -1241,8 +1178,10 @@ extern "C" { #ifdef XMEGA if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error #else + #ifndef STM32_board UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable sei(); + #endif #if defined STM32_board if(USART2_BASE->SR & USART_SR_RXNE) { if((USART2_BASE->SR &0x0F)==0) @@ -1253,31 +1192,35 @@ extern "C" { { // received byte is ok to process if(idx==0||discard_frame==1) { // Let's try to sync at this point - idx=0;discard_frame=0; - if(UDR0==0x55) // If 1st byte is 0x55 it looks ok + idx=0;discard_frame=0; + RX_MISSED_BUFF_off; // If rx_buff was good it's not anymore... + rx_buff[0]=UDR0; + if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok { + #ifndef STM32_board + TX_RX_PAUSE_on; + tx_pause(); + #endif #if defined STM32_board uint16_t OCR1B; - OCR1B =TCNT1+6500L; + OCR1B =TCNT1+(6500L); timer.setCompare(TIMER_CH2,OCR1B); timer.attachCompare2Interrupt(ISR_COMPB); #else - OCR1B=TCNT1+6500L; // Full message should be received within timer of 3250us - TIFR1 = OCF1B_bm ; // clear OCR1B match flag - SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match + OCR1B=TCNT1+(6500L); // Full message should be received within timer of 3250us + TIFR1 = OCF1B_bm ; // clear OCR1B match flag + SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match #endif idx++; } } else - { - RX_MISSED_BUFF_off; // if rx_buff was good it's not anymore... - rx_buff[(idx++)-1]=UDR0; // Store received byte - if(idx>RXBUFFER_SIZE) + { + rx_buff[idx++]=UDR0; // Store received byte + if(idx>=RXBUFFER_SIZE) { // A full frame has been received - if(!IS_RX_DONOTUPDTAE_on) - { //Good frame received and main has finished with previous buffer + { //Good frame received and main is not working on the buffer memcpy((void*)rx_ok_buff,(const void*)rx_buff,RXBUFFER_SIZE);// Duplicate the buffer RX_FLAG_on; // flag for main to process servo data } @@ -1292,22 +1235,22 @@ extern "C" { idx=UDR0; // Dummy read discard_frame=1; // Error encountered discard full frame... } - if(discard_frame==1) { #if defined STM32_board detachInterrupt(2);//disable interrupt on ch2 #else - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - TX_RX_PAUSE_off; + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match + TX_RX_PAUSE_off; tx_resume(); #endif } - #ifndef XMEGA + #ifndef STM32_board cli() ; UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable #endif + #endif #if defined STM32_board //If activated telemetry it doesn't work activated } #endif @@ -1318,6 +1261,9 @@ extern "C" { #endif #endif + + + //Serial timer #ifdef XMEGA ISR(TCC1_CCB_vect) @@ -1342,4 +1288,33 @@ ISR(TIMER1_COMPB_vect,ISR_NOBLOCK) } +#ifndef STM32_board +#ifndef XMEGA +// Random interrupt service routine called every time the WDT interrupt is triggered. +// It is only enabled at startup to generate a seed. +ISR(WDT_vect) +{ + static uint8_t gWDT_buffer_position=0; + #define gWDT_buffer_SIZE 32 + static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; + gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) + gWDT_buffer_position++; // every time the WDT interrupt is triggered + if (gWDT_buffer_position >= gWDT_buffer_SIZE) + { + // The following code is an implementation of Jenkin's one at a time hash + for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) + { + gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; + gWDT_entropy += (gWDT_entropy << 10); + gWDT_entropy ^= (gWDT_entropy >> 6); + } + gWDT_entropy += (gWDT_entropy << 3); + gWDT_entropy ^= (gWDT_entropy >> 11); + gWDT_entropy += (gWDT_entropy << 15); + WDTCSR = 0; // Disable Watchdog interrupt + } +} +#endif +#endif + #endif //ENABLE_SERIAL diff --git a/Multiprotocol/Multiprotocol_STM32.h b/Multiprotocol/Multiprotocol_STM32.h index 30edfcf..a382349 100644 --- a/Multiprotocol/Multiprotocol_STM32.h +++ b/Multiprotocol/Multiprotocol_STM32.h @@ -25,7 +25,7 @@ enum PROTOCOLS MODE_FRSKYD = 3, // =>CC2500 MODE_HISKY = 4, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01 - MODE_DSM2 = 6, // =>CYRF6936 + MODE_DSM = 6, // =>CYRF6936 MODE_DEVO = 7, // =>CYRF6936 MODE_YD717 = 8, // =>NRF24L01 MODE_KN = 9, // =>NRF24L01 @@ -61,9 +61,12 @@ enum Hisky Hisky = 0, HK310 = 1 }; -enum DSM2{ - DSM2 = 0, - DSMX = 1 +enum DSM{ + DSM2_22 = 0, + DSM2_11 = 1, + DSMX_22 = 2, + DSMX_11 = 3, + DSM_AUTO = 4 }; enum YD717 { @@ -177,7 +180,7 @@ struct PPM_Parameters #define CC25_CSN_pin PB6//CC2500 #define NRF_CSN_pin PB7//NRF24L01 #define CYRF_RST_pin PB8//CYRF RESET -#define A7105_CS_pin PB9//A7105 +#define A7105_CSN_pin PB9//A7105 #define CYRF_CSN_pin PB12//CYRF CSN //SPI pins #define SCK_pin PB13//SCK @@ -187,18 +190,18 @@ struct PPM_Parameters #define TX_INV_pin PB3 #define RX_INV_pin PB1 // -#define CTRL1_on digitalWrite(CTRL1,HIGH) -#define CTRL1_off digitalWrite(CTRL1,LOW) +#define PE1_on digitalWrite(CTRL1,HIGH) +#define PE1_off digitalWrite(CTRL1,LOW) // -#define CTRL2_on digitalWrite(CTRL2,HIGH) -#define CTRL2_off digitalWrite(CTRL2,LOW) +#define PE2_on digitalWrite(CTRL2,HIGH) +#define PE2_off digitalWrite(CTRL2,LOW) #define RS_HI digitalWrite(CYRF_RST_pin,HIGH) //reset pin cyrf #define RS_LO digitalWrite(CYRF_RST_pin,LOW) -#define A7105_CS_on digitalWrite(CS_pin,HIGH) -#define A7105_CS_off digitalWrite(CS_pin,LOW) +#define A7105_CSN_on digitalWrite(A7105_CSN_pin,HIGH) +#define A7105_CSN_off digitalWrite(A7105_CSN_pin,LOW) #define NRF_CE_on #define NRF_CE_off @@ -233,9 +236,9 @@ struct PPM_Parameters #define RX_INV_on digitalWrite(RX_INV_pin,HIGH) #define RX_INV_off digitalWrite(RX_INV_pin,LOW) -#define LED_ON digitalWrite(LED_pin,HIGH) -#define LED_OFF digitalWrite(LED_pin,LOW) -#define LED_TOGGLE digitalWrite(LED_pin ,!digitalRead(LED_pin)) +#define LED_on digitalWrite(LED_pin,HIGH) +#define LED_off digitalWrite(LED_pin,LOW) +#define LED_toggle digitalWrite(LED_pin ,!digitalRead(LED_pin)) #define LED_SET_OUTPUT pinMode(LED_pin,OUTPUT) #define IS_LED_on ( digitalRead(LED_pin)==HIGH) @@ -310,7 +313,7 @@ struct PPM_Parameters #define IS_TX_PAUSE_on ( ( protocol_flags2 & (_BV(4)|_BV(3)) ) !=0 ) -#define IS_BIND_BUTTON_on (digitalRead(BIND_pin)==0x00) +#define IS_BIND_BUTTON_on (digitalRead(BIND_pin)==LOW) #define BIND_SET_INPUT pinMode(BIND_pin,INPUT) #define BIND_SET_PULLUP digitalWrite(BIND_pin,HIGH) diff --git a/Multiprotocol/SPI.ino b/Multiprotocol/SPI.ino index 9558ab3..c28cb03 100644 --- a/Multiprotocol/SPI.ino +++ b/Multiprotocol/SPI.ino @@ -78,6 +78,11 @@ void SPI_SET_UNIDIRECTIONAL() #else +#ifdef XMEGA +#define XNOP() NOP() +#else +#define XNOP() +#endif void spi_write(uint8_t command) { uint8_t n=8; diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 2ad4e33..46e8b29 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -1,22 +1,34 @@ -//************************************* -// FrSky Telemetry serial code * -// By Midelic on RCGroups * -//************************************* +/* +This project is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +Multiprotocol is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Multiprotocol. If not, see . +*/ +//************************** +// Telemetry serial code * +//************************** #if defined TELEMETRY #if defined SPORT_TELEMETRY - #define SPORT_TIME 12000 - #define FRSKY_SPORT_PACKET_SIZE 8 - uint32_t last = 0; - uint8_t sport_counter=0; - uint8_t RxBt = 0; - uint8_t rssi; - uint8_t sport = 0; +#define SPORT_TIME 12000 +#define FRSKY_SPORT_PACKET_SIZE 8 +uint32_t last = 0; +uint8_t sport_counter=0; +uint8_t RxBt = 0; +uint8_t rssi; +uint8_t sport = 0; #endif #if defined HUB_TELEMETRY - #define USER_MAX_BYTES 6 - uint8_t prev_index; +#define USER_MAX_BYTES 6 +uint8_t prev_index; #endif #define START_STOP 0x7e @@ -28,10 +40,8 @@ uint8_t pktx1[MAX_PKTX];//second buffer for sport uint8_t idxt; uint8_t frame[18]; - #ifdef BASH_SERIAL // For bit-bashed serial output - struct t_serial_bash { uint8_t head ; @@ -42,13 +52,12 @@ struct t_serial_bash } SerialControl ; #endif - #if defined DSM_TELEMETRY -void DSM2_frame() +void DSM_frame() { - Serial_write(0xAA); // Start + Serial_write(0xAA); // Telemetry packet for (uint8_t i = 0; i < 17; i++) // RSSI value followed by 16 bytes of telemetry data - Serial_write(pkt[i]); + Serial_write(pkt[i]); } #endif @@ -72,9 +81,9 @@ void compute_RSSIdbm() RSSI_dBm = (((uint16_t)(pktt[len-2])*18)>>4); if(pktt[len-2] >=128) - RSSI_dBm -= 164; + RSSI_dBm -= 164; else - RSSI_dBm += 130; + RSSI_dBm += 130; } void frsky_check_telemetry(uint8_t *pkt,uint8_t len) @@ -82,13 +91,13 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) if(pkt[1] == rx_tx_addr[3] && pkt[2] == rx_tx_addr[2] && len ==(pkt[0] + 3)) { for (uint8_t i=3;i> 4 & 0x0f) == 0x08) { @@ -99,9 +108,9 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) else { if ((pktt[5] >> 4 & 0x03) == (seq_last_rcvd + 1) % 4) - seq_last_rcvd = (seq_last_rcvd + 1) % 4; + seq_last_rcvd = (seq_last_rcvd + 1) % 4; else - pass=0;//reset if sequence wrong + pass=0;//reset if sequence wrong } } #endif @@ -111,7 +120,7 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) void frsky_link_frame() { frame[0] = 0xFE; - if ((cur_protocol[0]&0x1F)==MODE_FRSKYD) + if (protocol==MODE_FRSKYD) { compute_RSSIdbm(); frame[1] = pktt[3]; @@ -120,13 +129,13 @@ void frsky_link_frame() frame[4] = (uint8_t)RSSI_dBm; } else - if ((cur_protocol[0]&0x1F)==MODE_HUBSAN) - { - frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V - frame[2] = frame[1]; - frame[3] = 0x00; - frame[4] = (uint8_t)RSSI_dBm; - } + if (protocol==MODE_HUBSAN) + { + frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V + frame[2] = frame[1]; + frame[3] = 0x00; + frame[4] = (uint8_t)RSSI_dBm; + } frame[5] = frame[6] = frame[7] = frame[8] = 0; frskySendStuffed(); } @@ -142,58 +151,58 @@ void frsky_user_frame() frame[2] = pktt[7]; switch(pass) { - case 0: - indexx=pktt[6]; - for(i=0;i0) { @@ -300,29 +309,36 @@ void sportSendFrame() } switch (sport_counter) { - case 2: // RSSI - frame[2] = 0x01; - frame[3] = 0xf1; - frame[4] = rssi; + case 0: + frame[2] = 0x05; + frame[3] = 0xf1; + frame[4] = 0x02 ;//dummy values if swr 20230f00 + frame[5] = 0x23; + frame[6] = 0x0F; + break; + case 2: // RSSI + frame[2] = 0x01; + frame[3] = 0xf1; + frame[4] = rssi; + break; + case 4: //BATT + frame[2] = 0x04; + frame[3] = 0xf1; + frame[4] = RxBt;//a1; + break; + default: + if(sport) + { + for (i=0;i= FRSKY_SPORT_PACKET_SIZE) {//8 bytes no crc if ( sport ) { - // overrun! do nothing + // overrun! } else { @@ -375,12 +397,12 @@ void proces_sport_data(uint8_t data) void TelemetryUpdate() { #if defined SPORT_TELEMETRY - if ((cur_protocol[0]&0x1F)==MODE_FRSKYX) + if (protocol==MODE_FRSKYX) { // FrSkyX if(telemetry_link) { - if(pktt[4] & 0x80) - rssi=pktt[4] & 0x7F ; + if(pktt[4] & 0x80) + rssi=pktt[4] & 0x7F ; else RxBt = (pktt[4]<<1) + 1 ; for (uint8_t i=0; i < pktt[6]; i++) @@ -400,6 +422,8 @@ void TelemetryUpdate() } #endif + // check for space in tx buffer + #ifdef BASH_SERIAL uint8_t h ; uint8_t t ; @@ -418,7 +442,7 @@ void TelemetryUpdate() return ; } - #else + #else uint8_t h ; uint8_t t ; h = tx_head ; @@ -435,24 +459,24 @@ void TelemetryUpdate() { return ; } - #endif - + #endif + #if defined DSM_TELEMETRY - if(telemetry_link && (cur_protocol[0]&0x1F) == MODE_DSM2 ) - { // DSM2 - DSM2_frame(); + if(telemetry_link && protocol == MODE_DSM ) + { // DSM + DSM_frame(); telemetry_link=0; return; } #endif - if(telemetry_link && (cur_protocol[0]&0x1F) != MODE_FRSKYX ) + if(telemetry_link && protocol != MODE_FRSKYX ) { // FrSky + Hubsan frsky_link_frame(); telemetry_link=0; return; } #if defined HUB_TELEMETRY - if(!telemetry_link && (cur_protocol[0]&0x1F) == MODE_FRSKYD) + if(!telemetry_link && protocol == MODE_FRSKYD) { // FrSky frsky_user_frame(); return; @@ -471,7 +495,6 @@ void TelemetryUpdate() /**************************/ /**************************/ - #ifndef BASH_SERIAL // Routines for normal serial output void Serial_write(uint8_t data) @@ -479,86 +502,131 @@ void Serial_write(uint8_t data) uint8_t nextHead ; nextHead = tx_head + 1 ; if ( nextHead >= TXBUFFER_SIZE ) - nextHead = 0 ; + nextHead = 0 ; tx_buff[nextHead]=data; tx_head = nextHead ; tx_resume(); } -// Speed is 0 for 100K and 1 for 9600 void initTXSerial( uint8_t speed) { +#ifdef ENABLE_PPM if(speed==SPEED_9600) { // 9600 - #ifdef XMEGA + #ifdef XMEGA USARTC0.BAUDCTRLA = 207 ; USARTC0.BAUDCTRLB = 0 ; - USARTC0.CTRLB = 0x18 ; USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; USARTC0.CTRLC = 0x03 ; - } - #else - #ifdef STM32_board - Serial2.begin(9600);//USART3 + #else + #ifdef STM32_board + Serial2.begin(9600);//USART3 USART3_BASE->CR1 &= ~ USART_CR1_RE;//disable RX leave TX enabled - } - #else + #else //9600 bauds UBRR0H = 0x00; UBRR0L = 0x67; UCSR0A = 0 ; // Clear X2 bit //Set frame format to 8 data bits, none, 1 stop bit UCSR0C = (1<CR1 &= ~ USART_CR1_RE;//disable RX leave TX enabled + #else + //57600 bauds + UBRR0H = 0x00; + UBRR0L = 0x22; + UCSR0A = 0x02 ; // Set X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<CR1 &= ~ USART_CR1_RE;//disable RX leave TX enabled + #else + //125000 bauds + UBRR0H = 0x00; + UBRR0L = 0x07; + UCSR0A = 0x00 ; // Clear X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<SR & USART_SR_TXE) { - #endif - if(tx_head!=tx_tail) - { - if(++tx_tail>=TXBUFFER_SIZE)//head - tx_tail=0; + #if defined STM32_board + if(USART3_BASE->SR & USART_SR_TXE) { + #endif + if(tx_head!=tx_tail) + { + if(++tx_tail>=TXBUFFER_SIZE)//head + tx_tail=0; #if defined STM32_board USART3_BASE->DR=tx_buff[tx_tail];//clears TXE bit - #else - UDR0=tx_buff[tx_tail]; + #else + UDR0=tx_buff[tx_tail]; #endif - } - if (tx_tail == tx_head) + } + if (tx_tail == tx_head) #if defined STM32_board USART3_BASE->CR1 &= ~USART_CR1_TXEIE;//disable interrupt - } - #else - tx_pause(); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt - #endif + } + #else + tx_pause(); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt + #endif } #if defined STM32_board #ifdef __cplusplus - } - #endif +} +#endif #endif #endif @@ -572,11 +640,10 @@ void initTXSerial( uint8_t speed) { TIMSK0 = 0 ; // Stop all timer 0 interrupts #ifdef INVERT_SERIAL - PORTD &= ~2 ; + SERIAL_TX_off; #else - PORTD |= 2 ; + SERIAL_TX_on; #endif - DDRD |= 2 ; // TxD pin is an output UCSR0B &= ~(1<>= 4 ; temp = byte ^ temp ; @@ -637,13 +704,19 @@ void Serial_write( uint8_t byte ) #ifdef INVERT_SERIAL byte |= 1 ; // Start bit #endif - uint8_t next = (SerialControl.head + 2) & 0x3f ; + uint8_t next = (SerialControl.head + 2) & 0x3f ; if ( next != SerialControl.tail ) { SerialControl.data[SerialControl.head] = byte ; SerialControl.data[SerialControl.head+1] = byteLo ; SerialControl.head = next ; } + if(!IS_TX_PAUSE_on) + tx_resume(); +} + +void resumeBashSerial() +{ cli() ; if ( SerialControl.busy == 0 ) { @@ -684,13 +757,9 @@ ISR(TIMER0_COMPA_vect) uint8_t byte ; byte = GPIOR0 ; if ( byte & 0x01 ) - { - PORTD |= 0x02 ; - } + SERIAL_TX_on; else - { - PORTD &= ~0x02 ; - } + SERIAL_TX_off; byte /= 2 ; // Generates shorter code than byte >>= 1 GPIOR0 = byte ; if ( --GPIOR1 == 0 ) @@ -709,34 +778,38 @@ ISR(TIMER0_COMPB_vect) uint8_t byte ; byte = GPIOR2 ; if ( byte & 0x01 ) - { - PORTD |= 0x02 ; - } + SERIAL_TX_on; else - { - PORTD &= ~0x02 ; - } + SERIAL_TX_off; byte /= 2 ; // Generates shorter code than byte >>= 1 GPIOR2 = byte ; if ( --GPIOR1 == 0 ) { - // prepare next byte and allow for 2 stop bits - struct t_serial_bash *ptr = &SerialControl ; - if ( ptr->head != ptr->tail ) - { - GPIOR0 = ptr->data[ptr->tail] ; - GPIOR2 = ptr->data[ptr->tail+1] ; - ptr->tail = ( ptr->tail + 2 ) & 0x3F ; - GPIOR1 = 8 ; - OCR0A = OCR0B + 40 ; - OCR0B = OCR0A + 8 * 20 ; - TIMSK0 |= (1<head != ptr->tail ) + { + GPIOR0 = ptr->data[ptr->tail] ; + GPIOR2 = ptr->data[ptr->tail+1] ; + ptr->tail = ( ptr->tail + 2 ) & 0x3F ; + GPIOR1 = 8 ; + OCR0A = OCR0B + 40 ; + OCR0B = OCR0A + 8 * 20 ; + TIMSK0 |= (1<>= 1 if ( GPIOR1 > 2 ) { diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index ce41782..27f0ec7 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -1,38 +1,20 @@ /* - This project is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +This project is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Multiprotocol is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Multiprotocol. If not, see . +*/ - Multiprotocol is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with Multiprotocol. If not, see . - */ - - -/**Board selection**/ -#define STM32_board -//#define XMEGA -/*******************/ -#ifdef STM32_board -#undef __cplusplus -#include "Multiprotocol_STM32.h" -#include -#include -#include -#include -#else -#include -#include -#include "Multiprotocol.h" -#endif - - /** Multiprotocol module configuration file ***/ /*******************/ @@ -48,59 +30,58 @@ #define CC2500_INSTALLED #define NFR24L01_INSTALLED -//Comment a protocol to exclude it from compilation -#ifdef A7105_INSTALLED - #define FLYSKY_A7105_INO - #define HUBSAN_A7105_INO -#endif -#ifdef CYRF6936_INSTALLED - #define DEVO_CYRF6936_INO - #define DSM2_CYRF6936_INO - #define J6PRO_CYRF6936_INO -#endif -#ifdef CC2500_INSTALLED - #define FRSKYD_CC2500_INO - #define FRSKYV_CC2500_INO - #define FRSKYX_CC2500_INO - #define SFHSS_CC2500_INO -#endif -#ifdef NFR24L01_INSTALLED - #define BAYANG_NRF24L01_INO - #define CG023_NRF24L01_INO - #define CX10_NRF24L01_INO - #define ESKY_NRF24L01_INO - #define HISKY_NRF24L01_INO - #define KN_NRF24L01_INO - #define SLT_NRF24L01_INO - #define SYMAX_NRF24L01_INO - #define V2X2_NRF24L01_INO - #define YD717_NRF24L01_INO - #define MT99XX_NRF24L01_INO - #define MJXQ_NRF24L01_INO - #define SHENQI_NRF24L01_INO - #define FY326_NRF24L01_INO - #define FQ777_NRF24L01_INO - #define ASSAN_NRF24L01_INO -#endif +//The protocols below need an A7105 to be installed +#define FLYSKY_A7105_INO +#define HUBSAN_A7105_INO + +//The protocols below need a CYRF6936 to be installed +#define DEVO_CYRF6936_INO +#define DSM2_CYRF6936_INO +#define J6PRO_CYRF6936_INO + +//The protocols below need a CC2500 to be installed +#define FRSKYD_CC2500_INO +#define FRSKYV_CC2500_INO +#define FRSKYX_CC2500_INO +#define SFHSS_CC2500_INO + +//The protocols below need a NRF24L01 to be installed +#define BAYANG_NRF24L01_INO +#define CG023_NRF24L01_INO +#define CX10_NRF24L01_INO +#define ESKY_NRF24L01_INO +#define HISKY_NRF24L01_INO +#define KN_NRF24L01_INO +#define SLT_NRF24L01_INO +#define SYMAX_NRF24L01_INO +#define V2X2_NRF24L01_INO +#define YD717_NRF24L01_INO +#define MT99XX_NRF24L01_INO +#define MJXQ_NRF24L01_INO +#define SHENQI_NRF24L01_INO +#define FY326_NRF24L01_INO +#define FQ777_NRF24L01_INO +#define ASSAN_NRF24L01_INO +#define HONTAI_NRF24L01_INO + + +/**************************/ +/*** TELEMETRY SETTINGS ***/ +/**************************/ +//In this section you can configure the telemetry. //Uncomment to enable telemetry #define TELEMETRY //Uncomment to invert the polarity of the telemetry serial signal. //For ER9X and ERSKY9X it must be commented. For OpenTX it must be uncommented. -//#define INVERT_TELEMETRY 1 +//#define INVERT_TELEMETRY //Comment to disable a specific telemetry -#if defined(TELEMETRY) - #if defined DSM2_CYRF6936_INO - #define DSM_TELEMETRY - #endif - #if defined FRSKYX_CC2500_INO - #define SPORT_TELEMETRY - #endif - #if defined FRSKYD_CC2500_INO - #define HUB_TELEMETRY - #endif -#endif +#define DSM_TELEMETRY +#define SPORT_TELEMETRY +#define HUB_TELEMETRY + + /****************************/ @@ -125,10 +106,11 @@ //It is important for the module to know the endpoints of your radio. //Below are some standard transmitters already preconfigured. //Uncomment only the one which matches your transmitter. -#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs) -//#define TX_DEVO7 //DEVO (1120<->1920µs) -//#define TX_SPEKTRUM //Spektrum (1100<->1900µs) -//#define TX_HISKY //HISKY (1100<->1900µs) +#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs) +//#define TX_DEVO7 //DEVO (1120<->1920µs) +//#define TX_SPEKTRUM //Spektrum (1100<->1900µs) +//#define TX_HISKY //HISKY (1100<->1900µs) +//#define TX_MPX //Multiplex MC2020 (1250<->1950µs) //#define TX_CUSTOM //Custom // The lines below are used to set the end points in microseconds (µs) if you have selected TX_CUSTOM. @@ -138,10 +120,10 @@ // - Centered stick value is usually 1500. It should match the middle between MIN and MAX, ie Center=(MAX-MIN)/2+MIN. If your TX is not centered you can adjust the value MIN or MAX. // - 100% is the value when the model is by default, 125% is the value when you extend the servo travel which is only used by some protocols #if defined(TX_CUSTOM) - #define PPM_MAX_100 1900 // 100% - #define PPM_MIN_100 1100 // 100% - #define PPM_MAX_125 2000 // 125% - #define PPM_MIN_125 1000 // 125% +#define PPM_MAX_100 1900 // 100% +#define PPM_MIN_100 1100 // 100% +#define PPM_MAX_125 2000 // 125% +#define PPM_MIN_125 1000 // 125% #endif /* @@ -157,22 +139,22 @@ struct PPM_Parameters */ //Update this table to set which protocol and all associated settings are called for the corresponding dial number const PPM_Parameters PPM_prot[15]= { -// Dial Protocol Sub protocol RX_Num Power Auto Bind Option -/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 2 */ {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 3 */ {MODE_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // D7 fine tuning -/* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 6 */ {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // 6 channels @ 11ms -/* 7 */ {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 10 */ {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 11 */ {MODE_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 12 */ {MODE_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 13 */ {MODE_CG023 , CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 14 */ {MODE_BAYANG, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 15 */ {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } + // Dial Protocol Sub protocol RX_Num Power Auto Bind Option + /* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 2 */ {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 3 */ {MODE_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning + /* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 6 */ {MODE_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels + /* 7 */ {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 10 */ {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 11 */ {MODE_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 12 */ {MODE_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 13 */ {MODE_CG023 , CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 14 */ {MODE_BAYANG, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, + /* 15 */ {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } }; /* Available protocols and associated sub protocols: MODE_FLYSKY @@ -182,16 +164,18 @@ const PPM_Parameters PPM_prot[15]= { V912 MODE_HUBSAN NONE - MODE_FRSKY + MODE_FRSKYD NONE MODE_HISKY Hisky HK310 MODE_V2X2 NONE - MODE_DSM2 - DSM2 - DSMX + MODE_DSM + DSM2_22 + DSM2_11 + DSMX_22 + DSMX_11 MODE_DEVO NONE MODE_YD717 @@ -232,21 +216,32 @@ const PPM_Parameters PPM_prot[15]= { MT99 H7 YZ + LS MODE_MJXQ WLH08 X600 X800 H26D + E010 MODE_SHENQI NONE MODE_FY326 NONE MODE_SFHSS NONE + MODE_J6PRO + NONE MODE_FQ777 NONE MODE_ASSAN NONE + MODE_FRSKYV + NONE + MODE_HONTAI + FORMAT_HONTAI + FORMAT_JJRCX1 + FORMAT_X5C1 + RX_Num value between 0 and 15