diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 4afa60c..0e4020e 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -72,4 +72,5 @@ 72,Q90C 73,Kyosho 74,RadioLink,Surface -76,Realacc,R11 \ No newline at end of file +76,Realacc,R11 +77,OMP \ No newline at end of file diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 99b2714..c339f44 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -89,6 +89,7 @@ const char STR_SKYARTEC[] ="Skyartc"; const char STR_KYOSHO[] ="Kyosho"; const char STR_RLINK[] ="RadLink"; const char STR_REALACC[] ="Realacc"; +const char STR_OMP[] ="OMP"; const char STR_TEST[] ="Test"; const char STR_FAKE[] ="Fake"; @@ -307,6 +308,9 @@ 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) + {PROTO_OMP, STR_OMP, 0, NO_SUBTYPE, OPTION_RFTUNE }, + #endif #if defined(PELIKAN_A7105_INO) {PROTO_PELIKAN, STR_PELIKAN , 2, STR_SUBTYPE_PELIKAN, OPTION_NONE }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index cfeb9b2..295973e 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 55 +#define VERSION_PATCH_LEVEL 56 //****************** // Protocols @@ -102,6 +102,7 @@ enum PROTOCOLS PROTO_KYOSHO = 73, // =>A7105 PROTO_RLINK = 74, // =>CC2500 PROTO_REALACC = 76, // =>NRF24L01 + PROTO_OMP = 77, // =>NRF24L01 PROTO_FAKE = 126, // =>CC2500+NRF24L01 PROTO_TEST = 127, // =>CC2500 @@ -811,6 +812,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- KYOSHO 73 RLINK 74 REALACC 76 + OMP 77 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index b255c86..abd3214 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -1604,6 +1604,12 @@ static void protocol_init() remote_callback = REALACC_callback; break; #endif + #if defined(OMP_NRF24L01_INO) + case PROTO_OMP: + next_callback=initOMP(); + remote_callback = OMP_callback; + break; + #endif #if defined(TEST_CC2500_INO) case PROTO_TEST: next_callback=initTEST(); diff --git a/Multiprotocol/OMP_nrf24l01.ino b/Multiprotocol/OMP_nrf24l01.ino new file mode 100644 index 0000000..7ea7e10 --- /dev/null +++ b/Multiprotocol/OMP_nrf24l01.ino @@ -0,0 +1,135 @@ +/* + 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,0,2047); + packet[8 ] |= channel<<3; + packet[9 ] = channel>>5; + channel=convert_channel_16b_limit(ELEVATOR,0,2047); + packet[10] |= channel<<6; + packet[11] = channel>>2; + packet[12] = channel>>10; + channel=convert_channel_16b_limit(RUDDER,0,2047); + packet[12] |= channel<<1; + packet[13] = channel>>8; + + //unknown + //packet[13] = 0x00; + //packet[14] = 0x00; + 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