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