diff --git a/Multiprotocol/E01X_nrf24l01.ino b/Multiprotocol/E01X_nrf24l01.ino index ba348ca..d104269 100644 --- a/Multiprotocol/E01X_nrf24l01.ino +++ b/Multiprotocol/E01X_nrf24l01.ino @@ -33,31 +33,47 @@ #define E015_PACKET_SIZE 10 #define E015_BIND_PACKET_SIZE 9 +#define E016H_PACKET_PERIOD 4080 +#define E016H_PACKET_SIZE 10 +#define E016H_BIND_CHANNEL 80 +#define E016H_NUM_CHANNELS 4 + //Channels -#define E01X_ARM_SW CH5_SW -#define E01X_FLIP_SW CH6_SW -#define E01X_LED_SW CH7_SW -#define E01X_HEADLESS_SW CH8_SW -#define E01X_RTH_SW CH9_SW +#define E01X_ARM_SW CH5_SW +#define E016H_STOP_SW CH5_SW +#define E01X_FLIP_SW CH6_SW +#define E01X_LED_SW CH7_SW +#define E01X_HEADLESS_SW CH8_SW +#define E01X_RTH_SW CH9_SW // E012 flags packet[1] -#define E012_FLAG_FLIP 0x40 -#define E012_FLAG_HEADLESS 0x10 -#define E012_FLAG_RTH 0x04 +#define E012_FLAG_FLIP 0x40 +#define E012_FLAG_HEADLESS 0x10 +#define E012_FLAG_RTH 0x04 // E012 flags packet[7] -#define E012_FLAG_EXPERT 0x02 +#define E012_FLAG_EXPERT 0x02 // E015 flags packet[6] -#define E015_FLAG_DISARM 0x80 -#define E015_FLAG_ARM 0x40 +#define E015_FLAG_DISARM 0x80 +#define E015_FLAG_ARM 0x40 // E015 flags packet[7] -#define E015_FLAG_FLIP 0x80 -#define E015_FLAG_HEADLESS 0x10 -#define E015_FLAG_RTH 0x08 -#define E015_FLAG_LED 0x04 -#define E015_FLAG_EXPERT 0x02 +#define E015_FLAG_FLIP 0x80 +#define E015_FLAG_HEADLESS 0x10 +#define E015_FLAG_RTH 0x08 +#define E015_FLAG_LED 0x04 +#define E015_FLAG_EXPERT 0x02 #define E015_FLAG_INTERMEDIATE 0x01 +// E016H flags packet[1] +#define E016H_FLAG_STOP 0x20 +#define E016H_FLAG_FLIP 0x04 +// E016H flags packet[3] +#define E016H_FLAG_HEADLESS 0x10 +#define E016H_FLAG_RTH 0x04 +// E016H flags packet[7] +#define E016H_FLAG_TAKEOFF 0x80 +#define E016H_FLAG_HIGHRATE 0x08 + static void __attribute__((unused)) E015_check_arming() { uint8_t arm_channel = E01X_ARM_SW; @@ -80,6 +96,7 @@ static void __attribute__((unused)) E015_check_arming() static void __attribute__((unused)) E01X_send_packet(uint8_t bind) { + uint8_t can_flip = 0; if(sub_protocol==E012) { packet_length=E012_PACKET_SIZE; @@ -114,7 +131,7 @@ static void __attribute__((unused)) E01X_send_packet(uint8_t bind) packet[13] = 0x56; packet[14] = rx_tx_addr[2]; } - else + else if(sub_protocol==E015) { // E015 if(bind) { @@ -152,9 +169,58 @@ static void __attribute__((unused)) E01X_send_packet(uint8_t bind) packet_length=E015_PACKET_SIZE; } } + else + { // E016H + packet_length=E016H_PACKET_SIZE; + if(bind) + { + rf_ch_num=E016H_BIND_CHANNEL; + memcpy(packet, &rx_tx_addr[1], 4); + memcpy(&packet[4], hopping_frequency, 4); + packet[8] = 0x23; + } + else + { + // trim commands + packet[0] = 0; + // aileron + uint16_t val = convert_channel_16b_limit(AILERON, 0x3ff, 0); + can_flip |= (val < 0x100) || (val > 0x300); + packet[1] = val >> 8; + packet[2] = val & 0xff; + // elevator + val = convert_channel_16b_limit(ELEVATOR, 0x3ff, 0); + can_flip |= (val < 0x100) || (val > 0x300); + packet[3] = val >> 8; + packet[4] = val & 0xff; + // throttle + val = convert_channel_16b_limit(THROTTLE, 0, 0x3ff); + packet[5] = val >> 8; + packet[6] = val & 0xff; + // rudder + val = convert_channel_16b_limit(RUDDER, 0x3ff, 0); + packet[7] = val >> 8; + packet[8] = val & 0xff; + // flags + packet[1] |= GET_FLAG(E016H_STOP_SW, E016H_FLAG_STOP) + | (can_flip ? GET_FLAG(E01X_FLIP_SW, E016H_FLAG_FLIP) : 0); + packet[3] |= GET_FLAG(E01X_HEADLESS_SW, E016H_FLAG_HEADLESS) + | GET_FLAG(E01X_RTH_SW, E016H_FLAG_RTH); + packet[7] |= E016H_FLAG_HIGHRATE; + // frequency hopping + rf_ch_num=hopping_frequency[hopping_frequency_no++ & 0x03]; + } + // checksum + packet[9] = packet[0]; + for (uint8_t i=1; i < E016H_PACKET_SIZE-1; i++) + packet[9] += packet[i]; + } // Power on, TX mode, CRC enabled - HS6200_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); + if(sub_protocol==E016H) + XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); + else //E012 & E015 + HS6200_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_ch_num); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); @@ -175,8 +241,10 @@ static void __attribute__((unused)) E01X_init() NRF24L01_SetTxRxMode(TX_EN); if(sub_protocol==E012) HS6200_SetTXAddr((uint8_t *)"\x55\x42\x9C\x8F\xC9", E01X_ADDRESS_LENGTH); - else // E015 + else if(sub_protocol==E015) HS6200_SetTXAddr((uint8_t *)"\x62\x54\x79\x38\x53", E01X_ADDRESS_LENGTH); + else //E016H + XN297_SetTXAddr((uint8_t *)"\x5a\x53\x46\x30\x31", 5); // bind address NRF24L01_FlushTx(); NRF24L01_FlushRx(); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit @@ -197,7 +265,10 @@ uint16_t E01X_callback() { if (bind_counter == 0) { - HS6200_SetTXAddr(rx_tx_addr, 5); + if(sub_protocol==E016H) + HS6200_SetTXAddr(rx_tx_addr, E01X_ADDRESS_LENGTH); + else + XN297_SetTXAddr(rx_tx_addr, E01X_ADDRESS_LENGTH); BIND_DONE; } else @@ -216,7 +287,25 @@ static void __attribute__((unused)) E012_initialize_txid() // rf channels uint32_t lfsr=random(0xfefefefe); for(uint8_t i=0; i> (i*8)) & 0xff) % 0x32); + { + hopping_frequency[i] = 0x10 + ((lfsr & 0xff) % 0x32); + lfsr>>=8; + } +} + +static void __attribute__((unused)) E016H_initialize_txid() +{ + // tx id + rx_tx_addr[0] = 0xa5; + rx_tx_addr[1] = 0x00; + + // rf channels + uint32_t lfsr=random(0xfefefefe); + for(uint8_t i=0; i>=8; + } } uint16_t initE01X() @@ -227,14 +316,19 @@ uint16_t initE01X() E012_initialize_txid(); packet_period=E012_PACKET_PERIOD; } - else - { // E015 + else if(sub_protocol==E015) + { packet_period=E015_PACKET_PERIOD; rf_ch_num=E015_RF_CHANNEL; armed = 0; arm_flags = 0; arm_channel_previous = E01X_ARM_SW; } + else + { // E016H + E016H_initialize_txid(); + packet_period=E016H_PACKET_PERIOD; + } E01X_init(); bind_counter = E01X_BIND_COUNT; hopping_frequency_no = 0; diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 6674260..3dcdcdc 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -42,7 +42,7 @@ 42,BUGSMINI 43,Traxxas 44,NCC1701 -45,E01X,E012,E015 +45,E01X,E012,E015,E016H 46,V911S 47,GD00X 63,Test diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index dc7546e..336d02f 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 25 +#define VERSION_PATCH_LEVEL 26 //****************** // Protocols @@ -254,6 +254,7 @@ enum E01X { E012 = 0, E015 = 1, + E016H = 2, }; #define NONE 0 @@ -727,6 +728,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- sub_protocol==E01X E012 0 E015 1 + E016H 2 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index dd7fe4d..9fc31ca 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -502,6 +502,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PROTO_E01X E012 E015 + E016H PROTO_ESKY NONE PROTO_ESKY150