From a07c23b25f3eb2cd561a0d6d7207eebcc617bf39 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 27 Jan 2025 16:12:21 +0100 Subject: [PATCH] New car protocol JIABAILE --- Lua_scripts/MultiChan.txt | 1 + Multiprotocol/JIABAILE_nrf24l01.ino | 315 ++++++++++++++++++++++++++++ Multiprotocol/Multi.txt | 1 + Multiprotocol/Multi_Protos.ino | 4 + Multiprotocol/Multiprotocol.h | 3 +- Multiprotocol/Validate.h | 2 + Multiprotocol/_Config.h | 3 + Protocols_Details.md | 9 + 8 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 Multiprotocol/JIABAILE_nrf24l01.ino diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 86eee95..85a5cf7 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -226,3 +226,4 @@ 61,0,EazyRC 98,0,Kyosho3,ASF,0 100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch +102,0,JIABAILE,Std,1,Speed,Light,Flash diff --git a/Multiprotocol/JIABAILE_nrf24l01.ino b/Multiprotocol/JIABAILE_nrf24l01.ino new file mode 100644 index 0000000..4fa27f2 --- /dev/null +++ b/Multiprotocol/JIABAILE_nrf24l01.ino @@ -0,0 +1,315 @@ +/* + 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 . + */ +#if defined(JIABAILE_NRF24L01_INO) + +#include "iface_xn297.h" + +//#define FORCE_JIABAILE_ORIGINAL_ID + +#define JIABAILE_PAYLOAD_SIZE 8 +#define JIABAILE_RX_PAYLOAD_SIZE 7 +#define JIABAILE_RF_NUM_CHANNELS 3 +#define JIABAILE_BIND_PACKET_PERIOD 12700 +#define JIABAILE_PACKET_PERIOD 2408 +#define JIABAILE_BIND_COUNT 2000 +#define JIABAILE_WRITE_TIME 1000 + +enum { + JIABAILE_BIND=0, + JIABAILE_RX, + JIABAILE_DATA, +}; + +static uint8_t __attribute__((unused)) JIABAILE_channel(uint8_t num) +{ + uint8_t val=convert_channel_16b_limit(num,0,100); + if(val>50) + { + packet[3] |= 0x01; + return val-50; + } + if(val<50) + { + packet[3] |= 0x02; + return 50-val; + } + return 0; +} + +static void __attribute__((unused)) JIABAILE_send_packet() +{ + hopping_frequency_no++; + if(hopping_frequency_no > 2) + hopping_frequency_no = 0; + XN297_Hopping(hopping_frequency_no); + + memcpy(packet,rx_tx_addr,3); + memset(&packet[3], 0x00, 4); + if(IS_BIND_DONE) + {//Normal + packet[4] = convert_channel_16b_limit(RUDDER,0,50)-25; //ST Trim + packet[6] = JIABAILE_channel(AILERON); //ST + packet[3] ^= 0x03; //Reverse ST channel + packet[3] <<= 2; //Move ST channel where it should be + packet[5] = JIABAILE_channel(ELEVATOR); //TH + packet[3] |= GET_FLAG(CH5_SW, 0x20) //Low speed + |GET_FLAG(CH7_SW, 0x40) //Flash light + |GET_FLAG(!CH6_SW, 0x80); //Light + if(!CH5_SW && Channel_data[CH5] > CHANNEL_MIN_COMMAND) + packet[3] |= 0x10; //Mid speed + } + packet[7] = 0x55 + hopping_frequency[hopping_frequency_no]; + for(uint8_t i=0;i4?30:8) + sum; + if(sum==4 || sum ==7) + hopping_frequency[0]++; + hopping_frequency[1] = 40 + sum; + if((sum & 0x06) == 0x06) + hopping_frequency[1] += 21; + hopping_frequency[2] = 70 + sum; + #ifdef DEBUG_SERIAL + debug("RF"); + for(uint8_t i=0; i < 3; i++) + debug(" %d", hopping_frequency[i]); + debugln(); + #endif + //Switch to normal mode + BIND_DONE; + phase = JIABAILE_DATA; + } + #ifdef DEBUG_SERIAL + else + debug("Wrong Sum"); + } + else + debug("Wrong TX ID"); + } + else + debug("Bad CRC"); + debugln(""); + #else + } + } + #endif + } + XN297_SetTxRxMode(TXRX_OFF); + JIABAILE_send_packet(); + phase++; + return JIABAILE_WRITE_TIME; + case JIABAILE_RX: + //Wait for the packet transmission to finish + while(XN297_IsPacketSent()==false); + //Switch to RX + XN297_SetTxRxMode(TXRX_OFF); + XN297_SetTxRxMode(RX_EN); + phase = JIABAILE_BIND; + return JIABAILE_BIND_PACKET_PERIOD - JIABAILE_WRITE_TIME; + default: //JIABAILE_DATA + #ifdef MULTI_SYNC + telemetry_set_input_sync(JIABAILE_PACKET_PERIOD); + #endif + JIABAILE_send_packet(); + break; + } + return JIABAILE_PACKET_PERIOD; +} + +void JIABAILE_init() +{ + BIND_IN_PROGRESS; // Autobind protocol + JIABAILE_initialize_txid(); + JIABAILE_RF_init(); + phase = JIABAILE_BIND; + hopping_frequency_no = 0; +} + +#endif +/* +// CAR RX debug code + +static void __attribute__((unused)) JIABAILE_RF_init() +{ + XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M); + //Bind address + memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5); + XN297_SetTXAddr(rx_id, 5); + XN297_SetRXAddr(rx_id, JIABAILE_PAYLOAD_SIZE); + XN297_RFChannel(7); + rx_tx_addr[0] = 0x00; + rx_tx_addr[1] = RX_num; + rx_tx_addr[2] = 0x00; +} + +uint16_t JIABAILE_callback() +{ + switch(phase) + { + case JIABAILE_BIND: + if(XN297_IsRX()) + { + if(XN297_ReadPayload(packet_in, JIABAILE_PAYLOAD_SIZE)) + {//CRC OK + XN297_SetTxRxMode(TXRX_OFF); + #ifdef DEBUG_SERIAL + debug("RX Bind"); + for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++) + debug(" %02X", packet_in[i]); + debugln(); + #endif + memcpy(packet,packet_in,3); + memcpy(&packet[3],rx_tx_addr,3); + packet[6]=0xAA + 7; + for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE-1; i++) + packet[6]+=packet[i]; + XN297_SetTxRxMode(TX_EN); + memcpy(&rx_id[1],rx_tx_addr,3); + bind_counter = 10; + phase = JIABAILE_RX; + } + } + return JIABAILE_WRITE_TIME; + case JIABAILE_RX: + if(bind_counter) + { + bind_counter--; + XN297_WritePayload(packet, JIABAILE_RX_PAYLOAD_SIZE); + #ifdef DEBUG_SERIAL + debug("TX Bind"); + for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE; i++) + debug(" %02X", packet[i]); + debugln(); + #endif + return JIABAILE_PACKET_PERIOD; + } + //Wait for the packet transmission to finish + //while(XN297_IsPacketSent()==false); + //Switch to RX + XN297_SetTxRxMode(TXRX_OFF); + XN297_SetRXAddr(rx_id, JIABAILE_PAYLOAD_SIZE); + hopping_frequency_no++; + if(hopping_frequency_no>84) + hopping_frequency_no = 0; + debug("."); + XN297_RFChannel(hopping_frequency_no); + XN297_SetTxRxMode(RX_EN); + phase = JIABAILE_DATA; + return JIABAILE_BIND_PACKET_PERIOD; + case JIABAILE_DATA: + if(XN297_IsRX()) + { + debugln(""); + if(XN297_ReadPayload(packet_in, JIABAILE_PAYLOAD_SIZE)) + {//CRC OK + #ifdef DEBUG_SERIAL + debug("CH=%d=%02X P:",hopping_frequency_no,hopping_frequency_no); + for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++) + debug(" %02X", packet_in[i]); + #endif + //Check packet + uint8_t sum=0x55 + hopping_frequency_no; + for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE-1; i++) + sum+=packet_in[i]; + if(sum==packet_in[7]) + { + debug("Good channel"); + } + else + debug("Wrong Sum"); + } + else + debug("Bad CRC"); + debugln(""); + } + phase = JIABAILE_RX; + break; + } + return JIABAILE_PACKET_PERIOD; +} + +void JIABAILE_init() +{ + JIABAILE_RF_init(); + XN297_SetTxRxMode(TXRX_OFF); + XN297_SetTxRxMode(RX_EN); + phase = JIABAILE_BIND; + hopping_frequency_no = 7; +} +*/ diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 65070f8..c090d0e 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -97,3 +97,4 @@ 98,Kyosho3 99,XK2 100,YuXiang +102,JIABAILE diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino index bb9bc5f..417092a 100644 --- a/Multiprotocol/Multi_Protos.ino +++ b/Multiprotocol/Multi_Protos.ino @@ -113,6 +113,7 @@ const char STR_EAZYRC[] ="EazyRC"; const char STR_KYOSHO3[] ="Kyosho3"; const char STR_YUXIANG[] ="YuXiang"; const char STR_PINECONE[] ="PineCone"; +const char STR_JIABAILE[] ="JIABAILE"; const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501"; @@ -375,6 +376,9 @@ const mm_protocol_definition multi_protocols[] = { #if defined(J6PRO_CYRF6936_INO) {PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback }, #endif + #if defined(JIABAILE_NRF24L01_INO) + {PROTO_JIABAILE, STR_JIABAILE, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback }, + #endif #if defined(JJRC345_NRF24L01_INO) {PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index eb1a7e2..0b18679 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 4 -#define VERSION_PATCH_LEVEL 23 +#define VERSION_PATCH_LEVEL 24 #define MODE_SERIAL 0 @@ -129,6 +129,7 @@ enum PROTOCOLS PROTO_XK2 = 99, // =>CC2500 & NRF24L01 PROTO_YUXIANG = 100, // =>NRF24L01 PROTO_PINECONE = 101, // =>CC2500 & NRF24L01 + PROTO_JIABAILE = 102, // =>NRF24L01 PROTO_NANORF = 126, // =>NRF24L01 PROTO_TEST = 127, // =>CC2500 diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 9cb2fa4..441c151 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -323,6 +323,7 @@ #undef H8_3D_NRF24L01_INO #undef HISKY_NRF24L01_INO #undef HONTAI_NRF24L01_INO + #undef JIABAILE_NRF24L01_INO #undef JJRC345_NRF24L01_INO #undef KN_NRF24L01_INO #undef KYOSHO2_NRF24L01_INO @@ -388,6 +389,7 @@ #undef KYOSHO3_CYRF6936_INO #undef MOULDKG_NRF24L01_INO #undef SHENQI_NRF24L01_INO + #undef JIABAILE_NRF24L01_INO #endif #ifdef MULTI_SURFACE diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index c6b3334..0088d7e 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -243,6 +243,7 @@ #define HISKY_NRF24L01_INO #define HONTAI_NRF24L01_INO #define H8_3D_NRF24L01_INO +#define JIABAILE_NRF24L01_INO #define JJRC345_NRF24L01_INO #define KN_NRF24L01_INO #define KYOSHO2_NRF24L01_INO @@ -732,6 +733,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { NONE PROTO_J6PRO NONE + PROTO_JIABAILE + NONE PROTO_JJRC345 JJRC345 SKYTMBLR diff --git a/Protocols_Details.md b/Protocols_Details.md index 74e3821..2bee7f3 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1912,6 +1912,15 @@ ARM| ### Sub_protocol FQ777_951 - *3* +## JIABAILE - *102* +Autobind protocol + +CH1|CH2|CH3|CH4|CH5|CH6|CH7 +---|---|---|---|---|---|--- +ST|TH|-|ST_TRIM|SPEED|LIGHT|FLASH + +SPEED: -100% High, 0% Mid, +100% Low + ## JJRC345 - *71* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11