From c02f273d5749aa59efe9766b02e2bec03971693f Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 6 Feb 2017 18:46:34 +0100 Subject: [PATCH] New feature: end bind This new feature is available: - in serial mode and when binding from the GUI. As soon as the Bind window is closed = serial bind bit was set and cleared, the current bind operation will be terminated. - if the bind was initiated from the Bind on channel feature (bind channel goes high) then as soon as the bind channel goes low the current bind operation will be terminated. Tested on ersky9x which does open a bind window, not sure about OpenTX... Some protocols (Hubsan, Assan, FY326, Shenqi...) which are waiting for model/RX to reply will stay in bind mode. --- Multiprotocol/Common.ino | 10 ++++++++++ Multiprotocol/FrSkyD_cc2500.ino | 5 ++++- Multiprotocol/FrSkyX_cc2500.ino | 5 ++++- Multiprotocol/MT99xx_nrf24l01.ino | 3 ++- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/Multiprotocol.ino | 23 +++++++++++++++++++++-- Multiprotocol/Symax_nrf24l01.ino | 6 +++--- Multiprotocol/V2X2_nrf24l01.ino | 11 +++++------ Multiprotocol/iface_cc2500.h | 10 ---------- 9 files changed, 50 insertions(+), 25 deletions(-) diff --git a/Multiprotocol/Common.ino b/Multiprotocol/Common.ino index 1de24e5..b8a87be 100644 --- a/Multiprotocol/Common.ino +++ b/Multiprotocol/Common.ino @@ -82,6 +82,16 @@ uint16_t limit_channel_100(uint8_t ch) /** FrSky D and X routines **/ /******************************/ #if defined(FRSKYD_CC2500_INO) || defined(FRSKYX_CC2500_INO) +enum { + FRSKY_BIND = 0, + FRSKY_BIND_DONE = 1000, + FRSKY_DATA1, + FRSKY_DATA2, + FRSKY_DATA3, + FRSKY_DATA4, + FRSKY_DATA5 +}; + void Frsky_init_hop(void) { uint8_t val; diff --git a/Multiprotocol/FrSkyD_cc2500.ino b/Multiprotocol/FrSkyD_cc2500.ino index 4277789..2155626 100644 --- a/Multiprotocol/FrSkyD_cc2500.ino +++ b/Multiprotocol/FrSkyD_cc2500.ino @@ -120,7 +120,10 @@ uint16_t ReadFrSky_2way() CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); CC2500_Strobe(CC2500_SFRX);//0x3A CC2500_WriteData(packet, packet[0]+1); - state++; + if(IS_BIND_DONE_on) + state = FRSKY_BIND_DONE; + else + state++; return 9000; } if (state == FRSKY_BIND_DONE) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 22dfa22..3d69d08 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -183,7 +183,10 @@ uint16_t ReadFrSkyX() frskyX_build_bind_packet(); CC2500_Strobe(CC2500_SIDLE); CC2500_WriteData(packet, packet[0]+1); - state++; + if(IS_BIND_DONE_on) + state = FRSKY_BIND_DONE; + else + state++; return 9000; case FRSKY_BIND_DONE: initialize_data(0); diff --git a/Multiprotocol/MT99xx_nrf24l01.ino b/Multiprotocol/MT99xx_nrf24l01.ino index 29a21f7..705a77c 100644 --- a/Multiprotocol/MT99xx_nrf24l01.ino +++ b/Multiprotocol/MT99xx_nrf24l01.ino @@ -261,7 +261,8 @@ uint16_t initMT99XX(void) bind_counter = MT99XX_BIND_COUNT; memcpy(hopping_frequency,"\x02\x48\x0C\x3e\x16\x34\x20\x2A\x2A\x20\x34\x16\x3e\x0c\x48\x02",16); - + hopping_frequency_no=0; + MT99XX_initialize_txid(); MT99XX_init(); diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index e08b52f..7117cd6 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 14 +#define VERSION_PATCH_LEVEL 15 //****************** // Protocols //****************** diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index a7c64ff..d6d9766 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -505,7 +505,16 @@ uint8_t Update_All() BIND_CH_PREV_on; } if(IS_BIND_CH_PREV_on && Servo_data[BIND_CH-1]2) + bind_counter=2; + } #endif //ENABLE_BIND_CH if(IS_CHANGE_PROTOCOL_FLAG_on) { // Protocol needs to be changed or relaunched for bind @@ -964,10 +973,20 @@ void update_serial_data() RX_num=rx_ok_buff[2]& 0x0F; // rx_num bits 0---3 } else - if( ((rx_ok_buff[1]&0x80)!=0) && ((cur_protocol[1]&0x80)==0) ) // Bind flag has been set + if( ((rx_ok_buff[1]&0x80)!=0) && ((cur_protocol[1]&0x80)==0) ) // Bind flag has been set CHANGE_PROTOCOL_FLAG_on; //restart protocol with bind else - CHANGE_PROTOCOL_FLAG_off; //no need to restart + if( ((rx_ok_buff[1]&0x80)==0) && ((cur_protocol[1]&0x80)!=0) ) // Bind flag has been reset + { + #if defined(FRSKYD_CC2500_INO) || defined(FRSKYX_CC2500_INO) || defined(FRSKYV_CC2500_INO) + if(protocol==MODE_FRSKYD || protocol==MODE_FRSKYX || protocol==MODE_FRSKYV) + BIND_DONE; + else + #endif + if(bind_counter>2) + bind_counter=2; + } + //store current protocol values for(uint8_t i=0;i<3;i++) cur_protocol[i] = rx_ok_buff[i]; diff --git a/Multiprotocol/Symax_nrf24l01.ino b/Multiprotocol/Symax_nrf24l01.ino index db4cb34..3506140 100644 --- a/Multiprotocol/Symax_nrf24l01.ino +++ b/Multiprotocol/Symax_nrf24l01.ino @@ -319,12 +319,12 @@ uint16_t symax_callback() return SYMAX_FIRST_PACKET_DELAY; break; case SYMAX_BIND2: - counter = SYMAX_BIND_COUNT; + bind_counter = SYMAX_BIND_COUNT; phase = SYMAX_BIND3; SYMAX_send_packet(1); break; case SYMAX_BIND3: - if (counter == 0) + if (bind_counter == 0) { symax_init2(); phase = SYMAX_DATA; @@ -333,7 +333,7 @@ uint16_t symax_callback() else { SYMAX_send_packet(1); - counter--; + bind_counter--; } break; case SYMAX_DATA: diff --git a/Multiprotocol/V2X2_nrf24l01.ino b/Multiprotocol/V2X2_nrf24l01.ino index 5dc216e..23cf69b 100644 --- a/Multiprotocol/V2X2_nrf24l01.ino +++ b/Multiprotocol/V2X2_nrf24l01.ino @@ -252,19 +252,18 @@ uint16_t ReadV2x2() return 150; break; case V202_BIND2: - if (packet_sent && NRF24L01_packet_ack() != PKT_ACKED) { + if (packet_sent && NRF24L01_packet_ack() != PKT_ACKED) return V2X2_PACKET_CHKTIME; - } V2X2_send_packet(1); - if (--counter == 0) { + if (--bind_counter == 0) + { phase = V202_DATA; BIND_DONE; } break; case V202_DATA: - if (packet_sent && NRF24L01_packet_ack() != PKT_ACKED) { + if (packet_sent && NRF24L01_packet_ack() != PKT_ACKED) return V2X2_PACKET_CHKTIME; - } V2X2_send_packet(0); break; } @@ -278,7 +277,7 @@ uint16_t initV2x2() // if (IS_AUTOBIND_FLAG_on) { - counter = V2X2_BIND_COUNT; + bind_counter = V2X2_BIND_COUNT; phase = V202_INIT2; } else diff --git a/Multiprotocol/iface_cc2500.h b/Multiprotocol/iface_cc2500.h index 03cdc27..81b101b 100644 --- a/Multiprotocol/iface_cc2500.h +++ b/Multiprotocol/iface_cc2500.h @@ -16,16 +16,6 @@ #ifndef _IFACE_CC2500_H_ #define _IFACE_CC2500_H_ -enum { - FRSKY_BIND = 0, - FRSKY_BIND_DONE = 1000, - FRSKY_DATA1, - FRSKY_DATA2, - FRSKY_DATA3, - FRSKY_DATA4, - FRSKY_DATA5 -}; - enum { CC2500_00_IOCFG2 = 0x00, // GDO2 output pin configuration CC2500_01_IOCFG1 = 0x01, // GDO1 output pin configuration