diff --git a/Multiprotocol/E129_cyrf6936.ino b/Multiprotocol/E129_cyrf6936.ino index 8800a97..16c584c 100644 --- a/Multiprotocol/E129_cyrf6936.ino +++ b/Multiprotocol/E129_cyrf6936.ino @@ -18,15 +18,17 @@ #include "iface_rf2500.h" //#define E129_FORCE_ID +//#define C186_FORCE_ID #define E129_BIND_CH 0x2D //45 #define E129_PAYLOAD_SIZE 16 +#define C186_PAYLOAD_SIZE 19 static void __attribute__((unused)) E129_build_data_packet() { //Build the packet - memset(packet,0,E129_PAYLOAD_SIZE); - packet[ 0] = 0x0F; // Packet length + memset(packet,0,packet_length); + packet[ 0] = packet_length - 1; // Packet length if(IS_BIND_IN_PROGRESS) { packet[ 1] = 0xA4; @@ -40,11 +42,22 @@ static void __attribute__((unused)) E129_build_data_packet() else { packet[ 1] = 0xA6; - packet[ 2] = 0xF7; // High rate 0xF7, low rate 0xF4 - //packet[ 3] = 0x00; // Mode: short press=0x20->0x00->0x20->..., long press=0x10->0x30->0x10->... + //Flags + if(sub_protocol == E129_E129) + packet[ 2] = 0xF7; // High rate 0xF7, low 0xF4 + else //C186 + { + packet[ 2] = 0xFA; // High rate 0xFA, medium 0xF7, low 0xF4 + packet[13] = bit_reverse(rx_tx_addr[2]); + packet[14] = bit_reverse(rx_tx_addr[3]); + packet[15] = bit_reverse(rx_tx_addr[0]); + packet[16] = bit_reverse(rx_tx_addr[1]); + } + //packet[ 3] = 0x00; // E129 Mode: short press=0x20->0x00->0x20->..., long press=0x10->0x30->0x10->... => C186 throttle trim is doing the same:up=short press and down=long press packet[ 4] = GET_FLAG(CH5_SW, 0x20) // Take off/Land 0x20 - | GET_FLAG(CH6_SW, 0x04); // Emergency stop 0x04 + | GET_FLAG(CH6_SW, 0x04); // Emergency stop 0x04 + //Channels and trims uint16_t val = convert_channel_10b(AILERON,false); uint8_t trim = convert_channel_8b(CH7) & 0xFC; packet[ 5] = trim | (val >>8); // Trim (0x00..0x1F..0x3E) << 2 | channel >> 8 @@ -67,10 +80,14 @@ static void __attribute__((unused)) E129_build_data_packet() packet[11] = trim | (val >>8); // Trim (0x00..0x1F..0x3E) << 2 | channel >> 8 packet[12] = val; // channel (0x000...0x200...0x3FF) } - packet[14] = 0x00; // Check - for(uint8_t i=0;i<14;i++) - packet[14] += packet[i]; - + //Check + if(sub_protocol == E129_E129) + packet[packet_length-2] = packet[0] + packet[1]; + else + packet[packet_length-2] = 0x24 + packet[0] + (packet[1]&0x03); // ?? + for(uint8_t i=2;i>8); buffer[RF2500_payload_length+1] = bit_reverse(crc); + #if 0 + debugln("C:%02X %02X",buffer[RF2500_payload_length ], buffer[RF2500_payload_length+1]); + #endif + if(RF2500_scramble_enabled) { buffer[RF2500_payload_length ] ^= RF2500_crc_xorout_scramble>>8; diff --git a/Multiprotocol/XN297Dump_nrf24l01.ino b/Multiprotocol/XN297Dump_nrf24l01.ino index 9c69d4c..3a4d845 100644 --- a/Multiprotocol/XN297Dump_nrf24l01.ino +++ b/Multiprotocol/XN297Dump_nrf24l01.ino @@ -609,12 +609,12 @@ static uint16_t XN297Dump_callback() { if(phase==0) { - address_length=5; - memcpy(rx_tx_addr, (uint8_t *)"\x61\x94\x17\x27\xED", address_length); //"\xA3\x05\x22\xC1""\x5A\x20\x12\xAC" + address_length=3; + memcpy(rx_tx_addr, (uint8_t *)"\xBD\x54\x78", address_length); //"\x62\xE6\xBD\x54\x78" - bitrate=XN297DUMP_250K; - packet_length=32; - hopping_frequency_no=54; //bind ?, normal 60 + bitrate=XN297DUMP_1M; + packet_length=7; + hopping_frequency_no=40; //bind ?, normal 40 NRF24L01_Initialize(); NRF24L01_SetTxRxMode(TXRX_OFF); @@ -622,7 +622,7 @@ static uint16_t XN297Dump_callback() NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, address_length-2); // RX/TX address length NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, address_length); // set up RX address NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, packet_length); // Enable rx pipe 0 - NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency_no); + NRF24L01_WriteReg(NRF24L01_05_RF_CH, option); //hopping_frequency_no); debug("NRF dump, len=%d, rf=%d, address length=%d, bitrate=",packet_length,hopping_frequency_no,address_length); switch(bitrate) @@ -718,6 +718,7 @@ static uint16_t XN297Dump_callback() NRF24L01_FlushRx(); NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX)); // _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | } + NRF24L01_WriteReg(NRF24L01_05_RF_CH, option); //hopping_frequency_no); } } else if(sub_protocol == XN297DUMP_CC2500) diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index f945a1d..1732c39 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -612,7 +612,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { E012 E015 PROTO_E129 - NONE + E129_E129 + E129_C186 PROTO_ESKY ESKY_STD ESKY_ET4 diff --git a/Protocols_Details.md b/Protocols_Details.md index 7ab3dda..26a466c 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -76,11 +76,11 @@ CFlie|38|CFlie||||||||NRF24L01| [DM002](Protocols_Details.md#DM002---33)|33|||||||||NRF24L01|XN297 [DSM](Protocols_Details.md#DSM---6)|6|DSM2_1F|DSM2_2F|DSMX_1F|DSMX_2F|AUTO|DSMR_1F|||CYRF6936| [DSM_RX](Protocols_Details.md#DSM_RX---70)|70|Multi|CPPM|||||||CYRF6936| -[E010R5](Protocols_Details.md#E010R5---81)|81|||||||||CYRF6936/NRF24L01|RF2500 +[E010R5](Protocols_Details.md#E010R5---81)|81|||||||||CYRF6936|RF2500 [E016H](Protocols_Details.md#E016H---85)|85|||||||||NRF24L01|XN297 [E016HV2](Protocols_Details.md#E016HV2---80)|80|||||||||CC2500/NRF24L01|unknown [E01X](Protocols_Details.md#E01X---45)|45|E012|E015|||||||CYRF6936|HS6200 -[E129](Protocols_Details.md#E129---83)|83|||||||||CYRF6936/NRF24L01|RF2500 +[E129](Protocols_Details.md#E129---83)|83|E129|C186|||||||CYRF6936|RF2500 [ESky](Protocols_Details.md#ESKY---16)|16|ESky|ET4|||||||NRF24L01| [ESky150](Protocols_Details.md#ESKY150---35)|35|||||||||NRF24L01| [ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|||||||||CC2500|NRF51822 @@ -597,9 +597,8 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 A|E|T|R|ARM|FLIP|LED|HEADLESS|RTH ## E129 - *83* -Models: Eachine E129/E130 and Twister Ninja 250 -Not supported by Atmega328p modules. +**Not supported by Atmega328p modules.** CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- @@ -611,6 +610,14 @@ Take off with a none spring throttle is easier by putting both sticks down outwa Calib is the same as the original radio with both sticks down and to the left in Mode 1/2, not sure about other modes. +### Sub_protocol E129 - *0* +Models: Eachine E129/E130 and Twister Ninja 250 + +### Sub_protocol C186 - *1* +Models: C186, E120 + +The FC of the heli seems to store the trims Trim A/E/R=CH7..9. If you use these trims, make sure to center them after powering off the heli or they will be added to the previous trims. + ## J6Pro - *22* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12