/* 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 . */ //****************** // Protocols //****************** enum PROTOCOLS { MODE_SERIAL = 0, // Serial commands MODE_FLYSKY = 1, // =>A7105 MODE_HUBSAN = 2, // =>A7105 MODE_FRSKY = 3, // =>CC2500 MODE_HISKY = 4, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01 MODE_DSM2 = 6, // =>CYRF6936 MODE_DEVO =7, // =>CYRF6936 MODE_YD717 = 8, // =>NRF24L01 MODE_KN = 9, // =>NRF24L01 MODE_SYMAX = 10, // =>NRF24L01 MODE_SLT = 11, // =>NRF24L01 MODE_CX10 = 12, // =>NRF24L01 MODE_CG023 = 13, // =>NRF24L01 MODE_BAYANG = 14, // =>NRF24L01 MODE_FRSKYX = 15, // =>CC2500 MODE_ESKY = 16, // =>NRF24L01 MODE_MT99XX=17, // =>NRF24L01 MODE_MJXQ=18, // =>NRF24L01 MODE_SHENQI=19, // =>NRF24L01 MODE_FY326=20, // =>NRF24L01 MODE_SFHSS=21 // =>CC2500 }; enum Flysky { Flysky=0, V9X9=1, V6X6=2, V912=3 }; enum Hisky { Hisky=0, HK310=1 }; enum DSM2{ DSM2=0, DSMX=1 }; enum YD717 { YD717=0, SKYWLKR=1, SYMAX4=2, XINXUN=3, NIHUI=4 }; enum KN { WLTOYS=0, FEILUN=1 }; enum SYMAX { SYMAX=0, SYMAX5C=1 }; enum CX10 { CX10_GREEN = 0, CX10_BLUE=1, // also compatible with CX10-A, CX12 DM007=2, Q282=3, JC3015_1=4, JC3015_2=5, MK33041=6, Q242=7 }; enum CG023 { CG023 = 0, YD829 = 1, H8_3D = 2 }; enum MT99XX { MT99 = 0, H7 = 1, YZ = 2 }; enum MJXQ { WLH08 = 0, X600 = 1, X800 = 2, H26D = 3 }; enum FRSKYX { CH_16 = 0, CH_8 = 1, }; #define NONE 0 #define P_HIGH 1 #define P_LOW 0 #define AUTOBIND 1 #define NO_AUTOBIND 0 //******************* //*** Pinouts *** //******************* #if defined STM32_board #define digitalHi(p, i) (gpio_write_bit(p, i, HIGH)) #define digitallo(p, i) (gpio_write_bit(p, i, LOW)) #define digitalIn(p, i) (gpio_read_bit(p,i)) #define digitalToggle(p, i) (gpio_toggle_bit(p,i)) // //******************** #define BIND_pin PA0 #define LED_pin PA1 // #define PPM_pin PA8 //PPM 5V tolerant // #define S1_pin PA4 //dial switch pins #define S2_pin PA5 #define S3_pin PA6 #define S4_pin PA7 // #define CTRL1 PB4 //PE1 #define CTRL2 PB5 //PE2 //CS pins #define CC25_CSN_pin PB6//CC2500 #define NRF_CSN_pin PB7//NRF24L01 #define CYRF_RST_pin PB8//CYRF RESET #define CS_pin PB9//A7105 #define CYRF_CSN_pin PB12//CYRF CSN //SPI pins #define SCK_pin PB13//SCK #define SDO_pin PB14//MISO #define SDI_pin PB15//MOSI // #define TX_INV_pin PB3 #define RX_INV_pin PB1 // #define CTRL1_on digitalHi(GPIOB,CTRL1) #define CTRL1_off digitallo(GPIOB,CTRL1) // #define CTRL2_on digitalHi(GPIOB,CTRL2) #define CTRL2_off digitallo(GPIOB,CTRL2) #define RS_HI digitalHi(GPIOB,CYRF_RST_pin) //reset pin cyrf #define RS_LO digitallo(GPIOB,CYRF_RST_pin) #define CS_on digitalHi(GPIOB,CS_pin) #define CS_off digitallo(GPIOB,CS_pin) #define SCK_on digitalHi(GPIOB,SCK_pin) #define SCK_off digitallo(GPIOB,SCK_pin) #define SDI_on digitalHi(GPIOB,SDI_pin) #define SDI_off digitallo(GPIOB,SDI_pin) #define SDI_1 (digitalIn(GPIOB,SDI_pin)==HIGH) #define SDI_0 (digitalIn(GPIOB,SDI_pin)==LOW) #define CC25_CSN_on digitalHi(GPIOB,CC25_CSN_pin) #define CC25_CSN_off digitallo(GPIOB,CC25_CSN_pin) #define NRF_CSN_on digitalHi(GPIOB,NRF_CSN_pin) #define NRF_CSN_off digitallo(GPIOB,NRF_CSN_pin) #define CYRF_CSN_on digitalHi(GPIOB,CYRF_CSN_pin) #define CYRF_CSN_off digitallo(GPIOB,CYRF_CSN_pin) #define SDO_1 (digitalIn(GPIOB,SDO_pin)==HIGH) #define SDO_0 (digitalIn(GPIOB,SDO_pin)==LOW) #define TX_INV_on digitalHi(GPIOB,TX_INV_pin) #define TX_INV_off digitallo(GPIOB,TX_INV_pin) #define RX_INV_on digitalHi(GPIOB,RX_INV_pin) #define RX_INV_off digitallo(GPIOB,RX_INV_pin) #define LED_ON digitalHi(GPIOA,LED_pin) #define LED_OFF digitallo(GPIOA,LED_pin) #define LED_TOGGLE digitalToggle(GPIOA,LED_pin) #define LED_SET_OUTPUT pinMode(LED_pin,OUTPUT) #define IS_LED_on ( digitalIn(GPIOA,LED_pin)==HIGH) #define cli() noInterrupts() #define sei() interrupts() #define _delay_us(x) delayMicroseconds(x) // #endif // Macros #define NOP() __asm__ __volatile__("nop") #define BV(bit) (1 << bit) //Serial flags definition #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 ) // #define CHANGE_PROTOCOL_FLAG_on protocol_flags |= _BV(1) #define CHANGE_PROTOCOL_FLAG_off protocol_flags &= ~_BV(1) #define IS_CHANGE_PROTOCOL_FLAG_on ( ( protocol_flags & _BV(1) ) !=0 ) // #define POWER_FLAG_on protocol_flags |= _BV(2) #define POWER_FLAG_off protocol_flags &= ~_BV(2) #define IS_POWER_FLAG_on ( ( protocol_flags & _BV(2) ) !=0 ) // #define RANGE_FLAG_on protocol_flags |= _BV(3) #define RANGE_FLAG_off protocol_flags &= ~_BV(3) #define IS_RANGE_FLAG_on ( ( protocol_flags & _BV(3) ) !=0 ) // #define AUTOBIND_FLAG_on protocol_flags |= _BV(4) #define AUTOBIND_FLAG_off protocol_flags &= ~_BV(4) #define IS_AUTOBIND_FLAG_on ( ( protocol_flags & _BV(4) ) !=0 ) // #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 #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 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 #define Servo_AUX1 Servo_AUX & _BV(0) #define Servo_AUX2 Servo_AUX & _BV(1) #define Servo_AUX3 Servo_AUX & _BV(2) #define Servo_AUX4 Servo_AUX & _BV(3) #define Servo_AUX5 Servo_AUX & _BV(4) #define Servo_AUX6 Servo_AUX & _BV(5) #define Servo_AUX7 Servo_AUX & _BV(6) #define Servo_AUX8 Servo_AUX & _BV(7) #define GET_FLAG(ch, mask) ( ch ? mask : 0) //************************ //*** Power settings *** //************************ enum { TXPOWER_100uW, TXPOWER_300uW, TXPOWER_1mW, TXPOWER_3mW, TXPOWER_10mW, TXPOWER_30mW, TXPOWER_100mW, TXPOWER_150mW }; // A7105 power // Power amp is ~+16dBm so: enum A7105_POWER { A7105_POWER_0 = 0x00<<3 | 0x00, // TXPOWER_100uW = -23dBm == PAC=0 TBG=0 A7105_POWER_1 = 0x00<<3 | 0x01, // TXPOWER_300uW = -20dBm == PAC=0 TBG=1 A7105_POWER_2 = 0x00<<3 | 0x02, // TXPOWER_1mW = -16dBm == PAC=0 TBG=2 A7105_POWER_3 = 0x00<<3 | 0x04, // TXPOWER_3mW = -11dBm == PAC=0 TBG=4 A7105_POWER_4 = 0x01<<3 | 0x05, // TXPOWER_10mW = -6dBm == PAC=1 TBG=5 A7105_POWER_5 = 0x02<<3 | 0x07, // TXPOWER_30mW = 0dBm == PAC=2 TBG=7 A7105_POWER_6 = 0x03<<3 | 0x07, // TXPOWER_100mW = 1dBm == PAC=3 TBG=7 A7105_POWER_7 = 0x03<<3 | 0x07 // TXPOWER_150mW = 1dBm == PAC=3 TBG=7 }; #define A7105_HIGH_POWER A7105_POWER_7 #define A7105_LOW_POWER A7105_POWER_3 #define A7105_RANGE_POWER A7105_POWER_0 #define A7105_BIND_POWER A7105_POWER_0 // NRF Power // Power setting is 0..3 for nRF24L01 // Claimed power amp for nRF24L01 from eBay is 20dBm. enum NRF_POWER { // Raw w 20dBm PA NRF_POWER_0 = 0x00, // 0 : -18dBm (16uW) 2dBm (1.6mW) NRF_POWER_1 = 0x01, // 1 : -12dBm (60uW) 8dBm (6mW) NRF_POWER_2 = 0x02, // 2 : -6dBm (250uW) 14dBm (25mW) NRF_POWER_3 = 0x03 // 3 : 0dBm (1mW) 20dBm (100mW) }; #define NRF_HIGH_POWER NRF_POWER_2 #define NRF_LOW_POWER NRF_POWER_1 #define NRF_RANGE_POWER NRF_POWER_0 #define NRF_BIND_POWER NRF_POWER_0 // CC2500 power output from the chip itself // The numbers do not take into account any outside amplifier enum CC2500_POWER { CC2500_POWER_0 = 0x00, // –55dbm or less CC2500_POWER_1 = 0x50, // -30dbm CC2500_POWER_2 = 0x44, // –28dbm CC2500_POWER_3 = 0xC0, // –26dbm CC2500_POWER_4 = 0x84, // –24dbm CC2500_POWER_5 = 0x81, // –22dbm CC2500_POWER_6 = 0x46, // –20dbm CC2500_POWER_7 = 0x93, // –18dbm CC2500_POWER_8 = 0x55, // –16dbm CC2500_POWER_9 = 0x8D, // –14dbm CC2500_POWER_10 = 0xC6, // -12dbm CC2500_POWER_11 = 0x97, // -10dbm CC2500_POWER_12 = 0x6E, // -8dbm CC2500_POWER_13 = 0x7F, // -6dbm CC2500_POWER_14 = 0xA9, // -4dbm CC2500_POWER_15 = 0xBB, // -2dbm CC2500_POWER_16 = 0xFE, // 0dbm CC2500_POWER_17 = 0xFF // +1dbm }; #define CC2500_HIGH_POWER CC2500_POWER_16 #define CC2500_LOW_POWER CC2500_POWER_13 #define CC2500_RANGE_POWER CC2500_POWER_1 #define CC2500_BIND_POWER CC2500_POWER_1 // CYRF power enum CYRF_POWER { CYRF_POWER_0 = 0x00, // -35dbm CYRF_POWER_1 = 0x01, // -30dbm CYRF_POWER_2 = 0x02, // -24dbm CYRF_POWER_3 = 0x03, // -18dbm CYRF_POWER_4 = 0x04, // -13dbm CYRF_POWER_5 = 0x05, // -5dbm CYRF_POWER_6 = 0x06, // 0dbm CYRF_POWER_7 = 0x07 // +4dbm }; #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_0 enum TXRX_State { TXRX_OFF, TX_EN, RX_EN }; // Packet ack status values enum { PKT_PENDING = 0, PKT_ACKED, PKT_TIMEOUT }; //******************* //*** CRC Table *** //******************* //**************************************** //*** MULTI protocol serial definition *** //**************************************** /* ************************** 16 channels serial protocol ************************** Serial: 100000 Baud 8e2 _ xxxx xxxx p -- Total of 26 bytes Stream[0] = 0x55 header Stream[1] = sub_protocol|BindBit|RangeCheckBit|AutoBindBit; sub_protocol is 0..31 (bits 0..4) => Reserved 0 Flysky 1 Hubsan 2 Frsky 3 Hisky 4 V2x2 5 DSM2 6 Devo 7 YD717 8 KN 9 SymaX 10 SLT 11 CX10 12 CG023 13 Bayang 14 FrskyX 15 ESky 16 MT99XX 17 MJXQ 18 SHENQI 19 FY326 20 SFHSS 21 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No Stream[2] = RxNum | Power | Type; RxNum value is 0..15 (bits 0..3) Type is 0..7 <<4 (bit 4..6) sub_protocol==Flysky Flysky 0 V9x9 1 V6x6 2 V912 3 sub_protocol==Hisky Hisky 0 HK310 1 sub_protocol==DSM2 DSM2 0 DSMX 1 sub_protocol==YD717 YD717 0 SKYWLKR 1 SYMAX4 2 XINXUN 3 NIHUI 4 sub_protocol==KN WLTOYS 0 FEILUN 1 sub_protocol==SYMAX SYMAX 0 SYMAX5C 1 sub_protocol==CX10 CX10_GREEN 0 CX10_BLUE 1 // also compatible with CX10-A, CX12 DM007 2 Q282 3 JC3015_1 4 JC3015_2 5 MK33041 6 Q242 7 sub_protocol==CG023 CG023 0 YD829 1 H8_3D 2 sub_protocol==MT99XX MT99 0 H7 1 YZ 2 sub_protocol==MJXQ WLH08 0 X600 1 X800 2 H26D 3 sub_protocol==FRSKYX CH_16 0 CH_8 1 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; option_protocol value is -127..127 Stream[4] to [25] = Channels 16 Channels on 11 bits (0..2047) 0 -125% 204 -100% 1024 0% 1843 +100% 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol */