From 5b8a08ab2285106eea89ccd066104e125592bff8 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Fri, 18 Sep 2020 16:13:45 +0200 Subject: [PATCH] OMP: added telemetry --- Multiprotocol/Multi.txt | 3 +- Multiprotocol/Multi_Names.ino | 4 +- Multiprotocol/Multiprotocol.h | 4 +- Multiprotocol/Multiprotocol.ino | 6 +- Multiprotocol/OMP_cc2500.ino | 262 ++++++++++++++++++++++++++++++++ Multiprotocol/OMP_nrf24l01.ino | 140 ----------------- Multiprotocol/Telemetry.ino | 4 +- Multiprotocol/Validate.h | 9 +- Multiprotocol/_Config.h | 3 +- Protocols_Details.md | 35 +++-- 10 files changed, 301 insertions(+), 169 deletions(-) create mode 100644 Multiprotocol/OMP_cc2500.ino delete mode 100644 Multiprotocol/OMP_nrf24l01.ino diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 0e4020e..fcab237 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -71,6 +71,7 @@ 71,JJRC345 72,Q90C 73,Kyosho -74,RadioLink,Surface +74,RadioLink,Surface,Air +75,--- 76,Realacc,R11 77,OMP \ No newline at end of file diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 1f816ae..c7c71ba 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -228,7 +228,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE }, #endif #if defined(HEIGHT_A7105_INO) - {PROTO_HEIGHT, STR_HEIGHT, 2, STR_SUBTYPE_HEIGHT, OPTION_NONE }, + {PROTO_HEIGHT, STR_HEIGHT, 2, STR_SUBTYPE_HEIGHT, OPTION_NONE }, #endif #if defined(FQ777_NRF24L01_INO) {PROTO_FQ777, STR_FQ777, 0, NO_SUBTYPE, OPTION_NONE }, @@ -308,7 +308,7 @@ const mm_protocol_definition multi_protocols[] = { #if defined(NCC1701_NRF24L01_INO) {PROTO_NCC1701, STR_NCC1701, 0, NO_SUBTYPE, OPTION_NONE }, #endif - #if defined(OMP_NRF24L01_INO) + #if defined(OMP_CC2500_INO) {PROTO_OMP, STR_OMP, 0, NO_SUBTYPE, OPTION_RFTUNE }, #endif #if defined(PELIKAN_A7105_INO) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 8998e03..06416a5 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 64 +#define VERSION_PATCH_LEVEL 65 //****************** // Protocols @@ -102,7 +102,7 @@ enum PROTOCOLS PROTO_KYOSHO = 73, // =>A7105 PROTO_RLINK = 74, // =>CC2500 PROTO_REALACC = 76, // =>NRF24L01 - PROTO_OMP = 77, // =>NRF24L01 + PROTO_OMP = 77, // =>CC2500 & NRF24L01 PROTO_NANORF = 126, // =>NRF24L01 PROTO_TEST = 127, // =>CC2500 diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 00ad6ef..01b088e 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -810,7 +810,7 @@ bool Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK)) + if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK)) #endif if(IS_DISABLE_TELEM_off) TelemetryUpdate(); @@ -1641,7 +1641,7 @@ static void protocol_init() remote_callback = REALACC_callback; break; #endif - #if defined(OMP_NRF24L01_INO) + #if defined(OMP_CC2500_INO) case PROTO_OMP: next_callback=initOMP(); remote_callback = OMP_callback; @@ -2265,7 +2265,7 @@ void pollBoot() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_RLINK) + if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_RLINK) #ifdef TELEMETRY_FRSKYX_TO_FRSKYD || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) #endif diff --git a/Multiprotocol/OMP_cc2500.ino b/Multiprotocol/OMP_cc2500.ino new file mode 100644 index 0000000..1b3407b --- /dev/null +++ b/Multiprotocol/OMP_cc2500.ino @@ -0,0 +1,262 @@ +/* + 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(OMP_CC2500_INO) + +#include "iface_nrf250k.h" + +//#define FORCE_OMP_ORIGINAL_ID +//#define OMP_TELEM_DEBUG + +#define OMP_INITIAL_WAIT 500 +#define OMP_PACKET_PERIOD 5000 +#define OMP_RF_BIND_CHANNEL 35 +#define OMP_RF_NUM_CHANNELS 8 +#define OMP_PAYLOAD_SIZE 16 +#define OMP_BIND_COUNT 600 //3sec + +static void __attribute__((unused)) OMP_send_packet() +{ +#ifdef OMP_HUB_TELEMETRY + if(option==0) option=1; // Select the CC2500 by default + PE1_off; PE2_on; // CC2500 antenna RF2 +#endif + + if(IS_BIND_IN_PROGRESS) + { + memcpy(packet,"BND",3); + memcpy(&packet[3],rx_tx_addr,5); + memcpy(&packet[8],hopping_frequency,8); + } + else + { + memset(packet,0x00,OMP_PAYLOAD_SIZE); + +#ifdef OMP_HUB_TELEMETRY + //RX telem request every 7*5=35ms + packet_sent++; + packet_sent %= OMP_RF_NUM_CHANNELS-1; // Change telem RX channels every time + if(packet_sent==0) + { + packet[0] |= 0x40; // |0x40 to request RX telemetry + NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); + } +#endif + + //hopping frequency + packet[0 ] |= hopping_frequency_no; + XN297L_Hopping(hopping_frequency_no); + hopping_frequency_no++; + hopping_frequency_no &= OMP_RF_NUM_CHANNELS-1; // 8 RF channels + + //flags + packet[1 ] = 0x08 //unknown + | GET_FLAG(CH5_SW, 0x20); // HOLD + + packet[2 ] = 0x40; //unknown + + if(Channel_data[CH6] > CHANNEL_MAX_COMMAND) + packet[2 ] |= 0x20; // IDLE2 + else if(Channel_data[CH6] > CHANNEL_MIN_COMMAND) + packet[1 ] |= 0x40; // IDLE1 + + if(Channel_data[CH7] > CHANNEL_MAX_COMMAND) + packet[2 ] |= 0x08; // 3D + else if(Channel_data[CH7] > CHANNEL_MIN_COMMAND) + packet[2 ] |= 0x04; // ATTITUDE + + //trims?? + //packet[3..6] + + //channels TAER packed 11bits + uint16_t channel=convert_channel_16b_limit(THROTTLE,0,2047); + packet[7 ] = channel; + packet[8 ] = channel>>8; + channel=convert_channel_16b_limit(AILERON,2047,0); + packet[8 ] |= channel<<3; + packet[9 ] = channel>>5; + channel=convert_channel_16b_limit(ELEVATOR,0,2047); + packet[9] |= channel<<6; + packet[10] = channel>>2; + packet[11] = channel>>10; + channel=convert_channel_16b_limit(RUDDER,2047,0); + packet[11] |= channel<<1; + packet[12] = channel>>7; + + //unknown + //packet[13..15] + packet[15] = 0x04; + } + + XN297L_SetPower(); // Set tx_power + XN297L_SetFreqOffset(); // Set frequency offset + XN297L_WriteEnhancedPayload(packet, OMP_PAYLOAD_SIZE, packet_sent!=0); +} + +static void __attribute__((unused)) OMP_init() +{ + //Config CC2500 +#ifdef OMP_HUB_TELEMETRY + if(option==0) + option=1; // Select the CC2500 +#endif + XN297L_Init(); + XN297L_SetTXAddr((uint8_t*)"FLPBD", 5); + XN297L_HoppingCalib(OMP_RF_NUM_CHANNELS); // Calibrate all channels + XN297L_RFChannel(OMP_RF_BIND_CHANNEL); // Set bind channel + +#ifdef OMP_HUB_TELEMETRY + //Config NRF + option=0; // Select the NRF + XN297L_Init(); + NRF24L01_SetTxRxMode(TXRX_OFF); // Turn it off for now + XN297_SetRXAddr(rx_tx_addr, 5); // Set the RX address + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, OMP_PAYLOAD_SIZE + 2); // packet length +2 bytes of CRC +#endif +} + +static void __attribute__((unused)) OMP_initialize_txid() +{ + calc_fh_channels(OMP_RF_NUM_CHANNELS); + #ifdef FORCE_OMP_ORIGINAL_ID + rx_tx_addr[0]=0x4E; + rx_tx_addr[1]=0x72; + rx_tx_addr[2]=0x8E; + rx_tx_addr[3]=0x70; + rx_tx_addr[4]=0x62; + for(uint8_t i=0; i=100) + {//LQI calculation + packet_count=0; + TX_LQI=telemetry_counter; + RX_RSSI=telemetry_counter; + if(telemetry_counter==0) + telemetry_lost = 1; + telemetry_counter = 0; + } + } + #endif + return OMP_PACKET_PERIOD; + #ifdef OMP_HUB_TELEMETRY + case OMP_RX: + NRF24L01_WriteReg(NRF24L01_07_STATUS, (1 << NRF24L01_07_RX_DR) //reset the flag(s) + | (1 << NRF24L01_07_TX_DS) + | (1 << NRF24L01_07_MAX_RT)); + NRF24L01_FlushRx(); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_PWR_UP) | (1 << NRF24L01_00_PRIM_RX) ); // Start RX + { + uint16_t start=(uint16_t)micros(); + while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500) + { + if(CC2500_ReadReg(CC2500_35_MARCSTATE | CC2500_READ_BURST) != 0x13) + break; + } + } + PE1_on;PE2_off; // NRF24L01 antenna RF3 + phase = OMP_DATA; + return OMP_PACKET_PERIOD-OMP_WRITE_TIME; + #endif + } + return OMP_PACKET_PERIOD; +} + +uint16_t initOMP() +{ + OMP_initialize_txid(); + OMP_init(); + hopping_frequency_no = 0; + packet_sent = 0; + #ifdef OMP_HUB_TELEMETRY + packet_count = 0; + telemetry_lost = 1; + #endif + if(IS_BIND_IN_PROGRESS) + { + bind_counter = OMP_BIND_COUNT; + phase = OMP_BIND; + } + else + phase = OMP_PREPDATA; + return OMP_INITIAL_WAIT; +} + +#endif diff --git a/Multiprotocol/OMP_nrf24l01.ino b/Multiprotocol/OMP_nrf24l01.ino deleted file mode 100644 index df2e53c..0000000 --- a/Multiprotocol/OMP_nrf24l01.ino +++ /dev/null @@ -1,140 +0,0 @@ -/* - 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(OMP_NRF24L01_INO) - -#include "iface_nrf250k.h" - -//#define FORCE_OMP_ORIGINAL_ID - -#define OMP_INITIAL_WAIT 500 -#define OMP_PACKET_PERIOD 5000 -#define OMP_RF_BIND_CHANNEL 35 -#define OMP_RF_NUM_CHANNELS 8 -#define OMP_PAYLOAD_SIZE 16 -#define OMP_BIND_COUNT 600 //3sec - -static void __attribute__((unused)) OMP_send_packet() -{ - if(IS_BIND_IN_PROGRESS) - { - memcpy(packet,"BND",3); - memcpy(&packet[3],rx_tx_addr,5); - memcpy(&packet[8],hopping_frequency,8); - } - else - { - memset(packet,0x00,OMP_PAYLOAD_SIZE); - - //hopping frequency - packet[0 ] = hopping_frequency_no; // |0x40 to request RX telemetry - XN297L_Hopping(hopping_frequency_no); - hopping_frequency_no++; - hopping_frequency_no &= OMP_RF_NUM_CHANNELS-1; // 8 RF channels - - //flags - packet[1 ] = 0x08 //unknown - | GET_FLAG(CH5_SW, 0x20); // HOLD - - packet[2 ] = 0x40; //unknown - - if(Channel_data[CH6] > CHANNEL_MAX_COMMAND) - packet[2 ] |= 0x20; // IDLE2 - else if(Channel_data[CH6] > CHANNEL_MIN_COMMAND) - packet[1 ] |= 0x40; // IDLE1 - - if(Channel_data[CH7] > CHANNEL_MAX_COMMAND) - packet[2 ] |= 0x08; // 3D - else if(Channel_data[CH7] > CHANNEL_MIN_COMMAND) - packet[2 ] |= 0x04; // ATTITUDE - - //trims?? - //packet[3..6] - - //channels TAER packed 11bits - uint16_t channel=convert_channel_16b_limit(THROTTLE,0,2047); - packet[7 ] = channel; - packet[8 ] = channel>>8; - channel=convert_channel_16b_limit(AILERON,2047,0); - packet[8 ] |= channel<<3; - packet[9 ] = channel>>5; - channel=convert_channel_16b_limit(ELEVATOR,0,2047); - packet[9] |= channel<<6; - packet[10] = channel>>2; - packet[11] = channel>>10; - channel=convert_channel_16b_limit(RUDDER,2047,0); - packet[11] |= channel<<1; - packet[12] = channel>>7; - - //unknown - //packet[13..15] - packet[15] = 0x04; - } - - XN297L_SetPower(); // Set tx_power - XN297L_SetFreqOffset(); // Set frequency offset - XN297L_WriteEnhancedPayload(packet, OMP_PAYLOAD_SIZE, IS_BIND_IN_PROGRESS); -} - -static void __attribute__((unused)) OMP_init() -{ - XN297L_Init(); - XN297L_SetTXAddr((uint8_t*)"FLPBD", 5); - XN297L_HoppingCalib(OMP_RF_NUM_CHANNELS); // Calibrate all channels - XN297L_RFChannel(OMP_RF_BIND_CHANNEL); // Set bind channel -} - -static void __attribute__((unused)) OMP_initialize_txid() -{ - calc_fh_channels(OMP_RF_NUM_CHANNELS); - #ifdef FORCE_OMP_ORIGINAL_ID - rx_tx_addr[0]=0x4E; - rx_tx_addr[1]=0x72; - rx_tx_addr[2]=0x8E; - rx_tx_addr[3]=0x70; - rx_tx_addr[4]=0x62; - for(uint8_t i=0; i