diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index baaff12..07d2330 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -27,7 +27,7 @@ void A7105_WriteData(uint8_t len, uint8_t channel) for (i = 0; i < len; i++) SPI_Write(packet[i]); A7105_CSN_on; - if(protocol!=MODE_FLYSKY) + if(protocol!=PROTO_FLYSKY) { A7105_Strobe(A7105_STANDBY); //Force standby mode, ie cancel any TX or RX... A7105_SetTxRxMode(TX_EN); //Switch to PA @@ -177,17 +177,17 @@ void A7105_AdjustLOBaseFreq(uint8_t cmd) old_offset=2048; switch(protocol) { - case MODE_HUBSAN: + case PROTO_HUBSAN: #ifdef FORCE_HUBSAN_TUNING offset=(int16_t)FORCE_HUBSAN_TUNING; #endif break; - case MODE_FLYSKY: + case PROTO_FLYSKY: #ifdef FORCE_FLYSKY_TUNING offset=(int16_t)FORCE_FLYSKY_TUNING; #endif break; - case MODE_AFHDS2A: + case PROTO_AFHDS2A: #ifdef FORCE_AFHDS2A_TUNING offset=(int16_t)FORCE_AFHDS2A_TUNING; #endif @@ -255,7 +255,7 @@ void A7105_Init(void) uint8_t *A7105_Regs=0; #ifdef HUBSAN_A7105_INO - if(protocol==MODE_HUBSAN) + if(protocol==PROTO_HUBSAN) { A7105_WriteID(ID_NORMAL); A7105_Regs=(uint8_t*)HUBSAN_A7105_regs; @@ -265,7 +265,7 @@ void A7105_Init(void) { A7105_WriteID(0x5475c52A);//0x2Ac57554 #ifdef FLYSKY_A7105_INO - if(protocol==MODE_FLYSKY) + if(protocol==PROTO_FLYSKY) A7105_Regs=(uint8_t*)FLYSKY_A7105_regs; else #endif @@ -280,7 +280,7 @@ void A7105_Init(void) { uint8_t val=pgm_read_byte_near(&A7105_Regs[i]); #ifdef FLYSKY_A7105_INO - if(protocol==MODE_FLYSKY && sub_protocol==CX20) + if(protocol==PROTO_FLYSKY && sub_protocol==CX20) { if(i==0x0E) val=0x01; if(i==0x1F) val=0x1F; @@ -298,7 +298,7 @@ void A7105_Init(void) // A7105_ReadReg(A7105_22_IF_CALIB_I); // A7105_ReadReg(A7105_24_VCO_CURCAL); - if(protocol!=MODE_HUBSAN) + if(protocol!=PROTO_HUBSAN) { //VCO Current Calibration A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet @@ -319,8 +319,8 @@ void A7105_Init(void) // A7105_ReadReg(A7105_25_VCO_SBCAL_I); //Reset VCO Band calibration - if(protocol!=MODE_HUBSAN) - A7105_WriteReg(A7105_25_VCO_SBCAL_I,protocol==MODE_FLYSKY?0x08:0x0A); + if(protocol!=PROTO_HUBSAN) + A7105_WriteReg(A7105_25_VCO_SBCAL_I,protocol==PROTO_FLYSKY?0x08:0x0A); A7105_SetTxRxMode(TX_EN); A7105_SetPower(); diff --git a/Multiprotocol/CX10_nrf24l01.ino b/Multiprotocol/CX10_nrf24l01.ino index 8a35cba..328d04b 100644 --- a/Multiprotocol/CX10_nrf24l01.ino +++ b/Multiprotocol/CX10_nrf24l01.ino @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ -// compatible with Cheerson CX-10 blue & newer red pcb, CX-10A, CX11, CX-10 green pcb, DM007, Floureon FX-10, JXD 509 (Q282) +// compatible with Cheerson CX-10 blue & newer red pcb, CX-10A, CX11, CX-10 green pcb, DM007, Floureon FX-10, JXD 509 (Q282), Q222, Q242 and Q282 // Last sync with hexfet new_protocols/cx10_nrf24l01.c dated 2015-11-26 #if defined(CX10_NRF24L01_INO) @@ -81,9 +81,9 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind) flags |= GET_FLAG(!CH7_SW, 0x10) // Channel 7 - picture |GET_FLAG( CH8_SW, 0x08); // Channel 8 - video break; - case Q282: - case Q242: - case Q222: + case F_Q282: + case F_Q242: + case F_Q222: memcpy(&packet[15], "\x10\x10\xaa\xaa\x00\x00", 6); //FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL flags2 = GET_FLAG(CH5_SW, 0x80) // Channel 5 - FLIP @@ -92,7 +92,7 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind) |GET_FLAG(CH11_SW, 0x04) // Channel 11 - XCAL |GET_FLAG(CH12_SW, 0x02); // Channel 12 - YCAL or Start/Stop motors on JXD 509 - if(sub_protocol==Q242) + if(sub_protocol==F_Q242) { flags=2; flags2|= GET_FLAG(CH7_SW,0x01) // Channel 7 - picture @@ -101,16 +101,16 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind) packet[18]=0x00; } else - { // Q282 & Q222 + { // F_Q282 & F_Q222 flags=3; // expert - if(CH8_SW) // Channel 8 - Q282 video / Q222 Module 1 + if(CH8_SW) // Channel 8 - F_Q282 video / F_Q222 Module 1 { if (!(video_state & 0x20)) video_state ^= 0x21; } else if (video_state & 0x20) video_state &= 0x01; flags2 |= video_state - |GET_FLAG(CH7_SW,0x10); // Channel 7 - Q282 picture / Q222 Module 2 + |GET_FLAG(CH7_SW,0x10); // Channel 7 - F_Q282 picture / F_Q222 Module 2 } if(CH10_SW) flags |=0x80; // Channel 10 - RTH break; @@ -238,12 +238,12 @@ uint16_t CX10_callback() static void __attribute__((unused)) CX10_initialize_txid() { rx_tx_addr[1]%= 0x30; - if(sub_protocol&0x08) //Q2X2 protocols + if(sub_protocol&0x08) //F_Q2X2 protocols { - uint8_t offset=0; //Q282 - if(sub_protocol==Q242) + uint8_t offset=0; //F_Q282 + if(sub_protocol==F_Q242) offset=2; - if(sub_protocol==Q222) + if(sub_protocol==F_Q222) offset=3; for(uint8_t i=0;i<4;i++) hopping_frequency[i]=0x46+2*i+offset; @@ -272,7 +272,7 @@ uint16_t initCX10(void) } else { - if(sub_protocol&0x08) //Q2X2 protocols + if(sub_protocol&0x08) //F_Q2X2 protocols packet_length = Q2X2_PACKET_SIZE; else packet_length = CX10_PACKET_SIZE; diff --git a/Multiprotocol/Devo_cyrf6936.ino b/Multiprotocol/Devo_cyrf6936.ino index d848a00..8be4bea 100644 --- a/Multiprotocol/Devo_cyrf6936.ino +++ b/Multiprotocol/Devo_cyrf6936.ino @@ -63,7 +63,7 @@ static void __attribute__((unused)) DEVO_add_pkt_suffix() BIND_SET_PULLUP; // set pullup if(IS_BIND_BUTTON_on) { - eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+mode_select),0x01); // Set fixed id mode for the current model + eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x01); // Set fixed id mode for the current model option=1; } BIND_SET_OUTPUT; diff --git a/Multiprotocol/Hontai_nrf24l01.ino b/Multiprotocol/Hontai_nrf24l01.ino index 4e5b5ba..03d3f1c 100644 --- a/Multiprotocol/Hontai_nrf24l01.ino +++ b/Multiprotocol/Hontai_nrf24l01.ino @@ -73,18 +73,18 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) packet[4] = convert_channel_16b_limit(AILERON, 63, 0); // Aileron packet[5] = convert_channel_16b_limit(ELEVATOR, 0, 63); // Elevator packet[6] = convert_channel_16b_limit(RUDDER, 0, 63); // Rudder - if(sub_protocol == FORMAT_X5C1) + if(sub_protocol == X5C1) packet[7] = convert_channel_16b_limit(AILERON, 0, 63)-31; // Aileron trim else packet[7] = convert_channel_16b_limit(AILERON, 0, 32)-16; // Aileron trim packet[8] = convert_channel_16b_limit(RUDDER, 0, 32)-16; // Rudder trim - if (sub_protocol == FORMAT_X5C1) + if (sub_protocol == X5C1) packet[9] = convert_channel_16b_limit(ELEVATOR, 0, 63)-31; // Elevator trim else packet[9] = convert_channel_16b_limit(ELEVATOR, 0, 32)-16; // Elevator trim switch(sub_protocol) { - case FORMAT_HONTAI: + case HONTAI: packet[0] = 0x0B; packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture packet[4] |= GET_FLAG(CH10_SW, 0x80) // RTH @@ -93,7 +93,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) | GET_FLAG(CH5_SW, 0x40); // Flip packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video break; - case FORMAT_JJRCX1: + case JJRCX1: packet[0] = GET_FLAG(CH6_SW, 0x02); // Arm packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture packet[4] |= 0x80; // unknown @@ -104,7 +104,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) | GET_FLAG(CH10_SW, 0x02) // RTH | GET_FLAG(CH9_SW, 0x01); // Headless break; - case FORMAT_X5C1: + case X5C1: packet[0] = 0x0B; packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture packet[4] = 0x80 // unknown @@ -116,7 +116,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) | GET_FLAG(CH10_SW, 0x02) // RTH | GET_FLAG(CH9_SW, 0x01); // Headless break; - case FORMAT_FQ777_951: + case FQ777_951: packet[0] = GET_FLAG(CH7_SW, 0x01) // Picture | GET_FLAG(CH8_SW, 0x02); // Video packet[3] |= GET_FLAG(CH5_SW, 0x01); // Flip @@ -129,7 +129,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) crc16(packet, bind ? HONTAI_BIND_PACKET_SIZE:HONTAI_PACKET_SIZE); // Power on, TX mode, 2byte CRC - if(sub_protocol == FORMAT_JJRCX1) + if(sub_protocol == JJRCX1) NRF24L01_SetTxRxMode(TX_EN); else XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); @@ -140,7 +140,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); - if(sub_protocol == FORMAT_JJRCX1) + if(sub_protocol == JJRCX1) NRF24L01_WritePayload(packet, bind ? HONTAI_BIND_PACKET_SIZE:HONTAI_PACKET_SIZE); else XN297_WritePayload(packet, bind ? HONTAI_BIND_PACKET_SIZE:HONTAI_PACKET_SIZE); @@ -154,7 +154,7 @@ static void __attribute__((unused)) HONTAI_init() NRF24L01_SetTxRxMode(TX_EN); - if(sub_protocol == FORMAT_JJRCX1) + if(sub_protocol == JJRCX1) NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t*)"\xd2\xb5\x99\xb3\x4a", 5); else XN297_SetTXAddr((const uint8_t*)"\xd2\xb5\x99\xb3\x4a", 5); @@ -166,7 +166,7 @@ static void __attribute__((unused)) HONTAI_init() NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps NRF24L01_SetPower(); NRF24L01_Activate(0x73); // Activate feature register - if(sub_protocol == FORMAT_JJRCX1) + if(sub_protocol == JJRCX1) { NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0xff); // JJRC uses dynamic payload length NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3f); // match other stock settings even though AA disabled... @@ -201,21 +201,21 @@ static void __attribute__((unused)) HONTAI_init2() data_tx_addr[2] = pgm_read_byte_near( &HONTAI_addr_vals[2][ rx_tx_addr[4] & 0x0f]); data_tx_addr[3] = pgm_read_byte_near( &HONTAI_addr_vals[3][(rx_tx_addr[4] >> 4) & 0x0f]); data_tx_addr[4] = 0x24; - if(sub_protocol == FORMAT_JJRCX1) + if(sub_protocol == JJRCX1) NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, data_tx_addr, sizeof(data_tx_addr)); else XN297_SetTXAddr(data_tx_addr, sizeof(data_tx_addr)); //Hopping frequency table for(uint8_t i=0;i<3;i++) - hopping_frequency[i]=pgm_read_byte_near( &HONTAI_hopping_frequency_nonels[sub_protocol == FORMAT_JJRCX1?1:0][i] ); + hopping_frequency[i]=pgm_read_byte_near( &HONTAI_hopping_frequency_nonels[sub_protocol == JJRCX1?1:0][i] ); hopping_frequency_no=0; } static void __attribute__((unused)) HONTAI_initialize_txid() { rx_tx_addr[4] = rx_tx_addr[2]; - if(sub_protocol == FORMAT_HONTAI || sub_protocol == FORMAT_FQ777_951) + if(sub_protocol == HONTAI || sub_protocol == FQ777_951) { rx_tx_addr[0] = 0x4c; // first three bytes some kind of model id? - set same as stock tx rx_tx_addr[1] = 0x4b; @@ -244,7 +244,7 @@ uint16_t HONTAI_callback() else HONTAI_send_packet(0); - return sub_protocol == FORMAT_FQ777_951 ? FQ777_951_PACKET_PERIOD : HONTAI_PACKET_PERIOD; + return sub_protocol == FQ777_951 ? FQ777_951_PACKET_PERIOD : HONTAI_PACKET_PERIOD; } uint16_t initHONTAI() diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 1c70f02..33c4491 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,50 +19,50 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_REVISION 0 -#define VERSION_PATCH_LEVEL 15 +#define VERSION_PATCH_LEVEL 16 //****************** // Protocols //****************** enum PROTOCOLS { MODE_SERIAL = 0, // Serial commands - MODE_FLYSKY = 1, // =>A7105 - MODE_HUBSAN = 2, // =>A7105 - MODE_FRSKYD = 3, // =>CC2500 - MODE_HISKY = 4, // =>NRF24L01 - MODE_V2X2 = 5, // =>NRF24L01 - MODE_DSM = 6, // =>CYRF6936 - MODE_DEVO = 7, // =>CYRF6936 - MODE_YD717 = 8, // =>NRF24L01 - MODE_KN = 9, // =>NRF24L01 - MODE_SYMAX = 10, // =>NRF24L01 - MODE_SLT = 11, // =>NRF24L01 - MODE_CX10 = 12, // =>NRF24L01 - MODE_CG023 = 13, // =>NRF24L01 - MODE_BAYANG = 14, // =>NRF24L01 - MODE_FRSKYX = 15, // =>CC2500 - MODE_ESKY = 16, // =>NRF24L01 - MODE_MT99XX = 17, // =>NRF24L01 - MODE_MJXQ = 18, // =>NRF24L01 - MODE_SHENQI = 19, // =>NRF24L01 - MODE_FY326 = 20, // =>NRF24L01 - MODE_SFHSS = 21, // =>CC2500 - MODE_J6PRO = 22, // =>CYRF6936 - MODE_FQ777 = 23, // =>NRF24L01 - MODE_ASSAN = 24, // =>NRF24L01 - MODE_FRSKYV = 25, // =>CC2500 - MODE_HONTAI = 26, // =>NRF24L01 - MODE_OPENLRS = 27, // =>OpenLRS hardware - MODE_AFHDS2A = 28, // =>A7105 - MODE_Q2X2 = 29, // =>NRF24L01, extension of CX-10 protocol - MODE_WK2x01 = 30, // =>CYRF6936 - MODE_Q303 = 31, // =>NRF24L01 - MODE_GW008 = 32, // =>NRF24L01 - MODE_DM002 = 33, // =>NRF24L01 - MODE_CABELL = 34, // =>NRF24L01 - MODE_ESKY150 = 35, // =>NRF24L01 - MODE_H8_3D = 36, // =>NRF24L01 - MODE_CORONA = 37, // =>CC2500 + PROTO_FLYSKY = 1, // =>A7105 + PROTO_HUBSAN = 2, // =>A7105 + PROTO_FRSKYD = 3, // =>CC2500 + PROTO_HISKY = 4, // =>NRF24L01 + PROTO_V2X2 = 5, // =>NRF24L01 + PROTO_DSM = 6, // =>CYRF6936 + PROTO_DEVO = 7, // =>CYRF6936 + PROTO_YD717 = 8, // =>NRF24L01 + PROTO_KN = 9, // =>NRF24L01 + PROTO_SYMAX = 10, // =>NRF24L01 + PROTO_SLT = 11, // =>NRF24L01 + PROTO_CX10 = 12, // =>NRF24L01 + PROTO_CG023 = 13, // =>NRF24L01 + PROTO_BAYANG = 14, // =>NRF24L01 + PROTO_FRSKYX = 15, // =>CC2500 + PROTO_ESKY = 16, // =>NRF24L01 + PROTO_MT99XX = 17, // =>NRF24L01 + PROTO_MJXQ = 18, // =>NRF24L01 + PROTO_SHENQI = 19, // =>NRF24L01 + PROTO_FY326 = 20, // =>NRF24L01 + PROTO_SFHSS = 21, // =>CC2500 + PROTO_J6PRO = 22, // =>CYRF6936 + PROTO_FQ777 = 23, // =>NRF24L01 + PROTO_ASSAN = 24, // =>NRF24L01 + PROTO_FRSKYV = 25, // =>CC2500 + PROTO_HONTAI = 26, // =>NRF24L01 + PROTO_OPENLRS = 27, // =>OpenLRS hardware + PROTO_AFHDS2A = 28, // =>A7105 + PROTO_Q2X2 = 29, // =>NRF24L01, extension of CX-10 protocol + PROTO_WK2x01 = 30, // =>CYRF6936 + PROTO_Q303 = 31, // =>NRF24L01 + PROTO_GW008 = 32, // =>NRF24L01 + PROTO_DM002 = 33, // =>NRF24L01 + PROTO_CABELL = 34, // =>NRF24L01 + PROTO_ESKY150 = 35, // =>NRF24L01 + PROTO_H8_3D = 36, // =>NRF24L01 + PROTO_CORONA = 37, // =>CC2500 }; enum Flysky @@ -133,9 +133,12 @@ enum CX10 }; enum Q2X2 { - Q222 = 8, - Q242 = 9, - Q282 = 10, + Q222 = 0, + Q242 = 1, + Q282 = 2, + F_Q222 = 8, + F_Q242 = 9, + F_Q282 = 10, }; enum CG023 { @@ -175,10 +178,10 @@ enum FRSKYX }; enum HONTAI { - FORMAT_HONTAI = 0, - FORMAT_JJRCX1 = 1, - FORMAT_X5C1 = 2, - FORMAT_FQ777_951 =3 + HONTAI = 0, + JJRCX1 = 1, + X5C1 = 2, + FQ777_951 =3 }; enum V2X2 { @@ -359,6 +362,9 @@ enum MultiPacketTypes #define BLINK_BAD_PROTO_TIME_LOW 1000 #define BLINK_WAIT_BIND_TIME_HIGH 1000 #define BLINK_WAIT_BIND_TIME_LOW 100 +#define BLINK_BANK_TIME_HIGH 50 +#define BLINK_BANK_TIME_LOW 500 +#define BLINK_BANK_REPEAT 1500 //******************* //*** AUX flags *** @@ -490,12 +496,12 @@ enum { /** EEPROM Layout */ #define EEPROM_ID_OFFSET 10 // Module ID (4 bytes) +#define EEPROM_BANK_OFFSET 15 // Current bank number (1 byte) #define EEPROM_ID_VALID_OFFSET 20 // 1 byte flag that ID is valid #define MODELMODE_EEPROM_OFFSET 30 // Autobind mode, 1 byte per model, end is 46 #define AFHDS2A_EEPROM_OFFSET 50 // RX ID, 4 byte per model id, end is 114 #define CONFIG_EEPROM_OFFSET 120 // Current configuration of the multimodule - //**************************************** //*** MULTI protocol serial definition *** //**************************************** @@ -629,10 +635,10 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- EU_16 2 EU_8 3 sub_protocol==HONTAI - FORMAT_HONTAI 0 - FORMAT_JJRCX1 1 - FORMAT_X5C1 2 - FORMAT_FQ777_951 3 + HONTAI 0 + JJRCX1 1 + X5C1 2 + FQ777_951 3 sub_protocol==AFHDS2A PWM_IBUS 0 PPM_IBUS 1 diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index ca8881e..349793e 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -38,7 +38,7 @@ #include "_Config.h" //Personal config file -#if __has_include("_MyConfig.h") || defined(USE_MY_CONFIG) +#if defined(USE_MY_CONFIG) #include "_MyConfig.h" #endif @@ -300,10 +300,10 @@ void setup() SERIAL_TX_output; // pullups - MODE_DIAL1_port |= _BV(MODE_DIAL1_pin); - MODE_DIAL2_port |= _BV(MODE_DIAL2_pin); - MODE_DIAL3_port |= _BV(MODE_DIAL3_pin); - MODE_DIAL4_port |= _BV(MODE_DIAL4_pin); + PROTO_DIAL1_port |= _BV(PROTO_DIAL1_pin); + PROTO_DIAL2_port |= _BV(PROTO_DIAL2_pin); + PROTO_DIAL3_port |= _BV(PROTO_DIAL3_pin); + PROTO_DIAL4_port |= _BV(PROTO_DIAL4_pin); BIND_port |= _BV(BIND_pin); // Timer1 config @@ -357,13 +357,17 @@ void setup() mode_select= 0x0F -(uint8_t)(((GPIOA->regs->IDR)>>4)&0x0F); #else mode_select = - ((MODE_DIAL1_ipr & _BV(MODE_DIAL1_pin)) ? 0 : 1) + - ((MODE_DIAL2_ipr & _BV(MODE_DIAL2_pin)) ? 0 : 2) + - ((MODE_DIAL3_ipr & _BV(MODE_DIAL3_pin)) ? 0 : 4) + - ((MODE_DIAL4_ipr & _BV(MODE_DIAL4_pin)) ? 0 : 8); + ((PROTO_DIAL1_ipr & _BV(PROTO_DIAL1_pin)) ? 0 : 1) + + ((PROTO_DIAL2_ipr & _BV(PROTO_DIAL2_pin)) ? 0 : 2) + + ((PROTO_DIAL3_ipr & _BV(PROTO_DIAL3_pin)) ? 0 : 4) + + ((PROTO_DIAL4_ipr & _BV(PROTO_DIAL4_pin)) ? 0 : 8); #endif //mode_select=1; - debugln("Mode switch reads as %d", mode_select); + debugln("Protocol selection switch reads as %d", mode_select); + + #ifdef ENABLE_PPM + uint8_t bank=bank_switch(); + #endif // Set default channels' value InitChannel(); @@ -373,7 +377,7 @@ void setup() // Update LED LED_off; - LED_output; + LED_output; //Init RF modules modules_reset(); @@ -396,47 +400,47 @@ void setup() //Protocol and interrupts initialization if(mode_select != MODE_SERIAL) { // PPM - mode_select--; - protocol = PPM_prot[mode_select].protocol; + uint8_t line=bank*14+mode_select-1; + protocol = PPM_prot[line].protocol; cur_protocol[1] = protocol; - sub_protocol = PPM_prot[mode_select].sub_proto; - RX_num = PPM_prot[mode_select].rx_num; + sub_protocol = PPM_prot[line].sub_proto; + RX_num = PPM_prot[line].rx_num; //Forced frequency tuning values for CC2500 protocols #if defined(FORCE_FRSKYD_TUNING) && defined(FRSKYD_CC2500_INO) - if(protocol==MODE_FRSKYD) + if(protocol==PROTO_FRSKYD) option = FORCE_FRSKYD_TUNING; // Use config-defined tuning value for FrSkyD else #endif #if defined(FORCE_FRSKYV_TUNING) && defined(FRSKYV_CC2500_INO) - if(protocol==MODE_FRSKYV) + if(protocol==PROTO_FRSKYV) option = FORCE_FRSKYV_TUNING; // Use config-defined tuning value for FrSkyV else #endif #if defined(FORCE_FRSKYX_TUNING) && defined(FRSKYX_CC2500_INO) - if(protocol==MODE_FRSKYX) + if(protocol==PROTO_FRSKYX) option = FORCE_FRSKYX_TUNING; // Use config-defined tuning value for FrSkyX else #endif #if defined(FORCE_SFHSS_TUNING) && defined(SFHSS_CC2500_INO) - if (protocol==MODE_SFHSS) + if (protocol==PROTO_SFHSS) option = FORCE_SFHSS_TUNING; // Use config-defined tuning value for SFHSS else #endif #if defined(FORCE_CORONA_TUNING) && defined(CORONA_CC2500_INO) - if (protocol==MODE_CORONA) + if (protocol==PROTO_CORONA) option = FORCE_CORONA_TUNING; // Use config-defined tuning value for CORONA else #endif - option = PPM_prot[mode_select].option; // Use radio-defined option value + option = PPM_prot[line].option; // Use radio-defined option value - if(PPM_prot[mode_select].power) POWER_FLAG_on; - if(PPM_prot[mode_select].autobind) + if(PPM_prot[line].power) POWER_FLAG_on; + if(PPM_prot[line].autobind) { AUTOBIND_FLAG_on; BIND_IN_PROGRESS; // Force a bind at protocol startup } - mode_select++; + line++; protocol_init(); @@ -601,7 +605,7 @@ uint8_t Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if( (protocol==MODE_FRSKYD) || (protocol==MODE_BAYANG) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) || (protocol==MODE_CABELL) ) + if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) ) #endif TelemetryUpdate(); #endif @@ -617,7 +621,7 @@ uint8_t Update_All() BIND_CH_PREV_off; //Request protocol to terminate bind #if defined(FRSKYD_CC2500_INO) || defined(FRSKYX_CC2500_INO) || defined(FRSKYV_CC2500_INO) - if(protocol==MODE_FRSKYD || protocol==MODE_FRSKYX || protocol==MODE_FRSKYV) + if(protocol==PROTO_FRSKYD || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYV) BIND_DONE; else #endif @@ -700,6 +704,88 @@ static void update_led_status(void) } } +#ifdef ENABLE_PPM +uint8_t bank_switch(void) +{ + uint8_t bank=eeprom_read_byte((EE_ADDR)EEPROM_BANK_OFFSET); + if(bank>=NBR_BANKS) + { // Wrong number of bank + eeprom_write_byte((EE_ADDR)EEPROM_BANK_OFFSET,0x00); // set bank to 0 + bank=0; + } + debugln("Using bank %d", bank); + + phase=3; + uint32_t check=millis(); + blink=millis(); + while(mode_select==15) + { //loop here if the dial is on position 15 for user to select the bank + if(blink>2) >= bank) + { + phase=0; + blink+=BLINK_BANK_REPEAT; + } + else + phase+=2; + break; + case 3: + LED_output; + LED_off; + blink+=BLINK_BANK_TIME_LOW; + phase=0; + break; + } + } + if(check=NBR_BANKS) + bank=0; + eeprom_write_byte((EE_ADDR)EEPROM_BANK_OFFSET,bank); + debugln("Using bank %d", bank); + phase=3; + blink+=BLINK_BANK_REPEAT; + check+=2*BLINK_BANK_REPEAT; + } + check+=1; + } + } + return bank; +} +#endif + inline void tx_pause() { #ifdef TELEMETRY @@ -799,21 +885,21 @@ static void protocol_init() { #ifdef A7105_INSTALLED #if defined(FLYSKY_A7105_INO) - case MODE_FLYSKY: + case PROTO_FLYSKY: PE1_off; //antenna RF1 next_callback = initFlySky(); remote_callback = ReadFlySky; break; #endif #if defined(AFHDS2A_A7105_INO) - case MODE_AFHDS2A: + case PROTO_AFHDS2A: PE1_off; //antenna RF1 next_callback = initAFHDS2A(); remote_callback = ReadAFHDS2A; break; #endif #if defined(HUBSAN_A7105_INO) - case MODE_HUBSAN: + case PROTO_HUBSAN: PE1_off; //antenna RF1 if(IS_BIND_BUTTON_FLAG_on) random_id(EEPROM_ID_OFFSET,true); // Generate new ID if bind button is pressed. next_callback = initHubsan(); @@ -823,7 +909,7 @@ static void protocol_init() #endif #ifdef CC2500_INSTALLED #if defined(FRSKYD_CC2500_INO) - case MODE_FRSKYD: + case PROTO_FRSKYD: PE1_off; //antenna RF2 PE2_on; next_callback = initFrSky_2way(); @@ -831,7 +917,7 @@ static void protocol_init() break; #endif #if defined(FRSKYV_CC2500_INO) - case MODE_FRSKYV: + case PROTO_FRSKYV: PE1_off; //antenna RF2 PE2_on; next_callback = initFRSKYV(); @@ -839,7 +925,7 @@ static void protocol_init() break; #endif #if defined(FRSKYX_CC2500_INO) - case MODE_FRSKYX: + case PROTO_FRSKYX: PE1_off; //antenna RF2 PE2_on; next_callback = initFrSkyX(); @@ -847,7 +933,7 @@ static void protocol_init() break; #endif #if defined(SFHSS_CC2500_INO) - case MODE_SFHSS: + case PROTO_SFHSS: PE1_off; //antenna RF2 PE2_on; next_callback = initSFHSS(); @@ -855,7 +941,7 @@ static void protocol_init() break; #endif #if defined(CORONA_CC2500_INO) - case MODE_CORONA: + case PROTO_CORONA: PE1_off; //antenna RF2 PE2_on; next_callback = initCORONA(); @@ -865,25 +951,25 @@ static void protocol_init() #endif #ifdef CYRF6936_INSTALLED #if defined(DSM_CYRF6936_INO) - case MODE_DSM: + case PROTO_DSM: PE2_on; //antenna RF4 next_callback = initDsm(); remote_callback = ReadDsm; break; #endif #if defined(DEVO_CYRF6936_INO) - case MODE_DEVO: + case PROTO_DEVO: #ifdef ENABLE_PPM if(mode_select) //PPM mode { if(IS_BIND_BUTTON_FLAG_on) { - eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+mode_select),0x00); // reset to autobind mode for the current model + eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model option=0; } else { - option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+mode_select)); // load previous mode: autobind or fixed id + option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id if(option!=1) option=0; // if not fixed id mode then it should be autobind } } @@ -894,18 +980,18 @@ static void protocol_init() break; #endif #if defined(WK2x01_CYRF6936_INO) - case MODE_WK2x01: + case PROTO_WK2x01: #ifdef ENABLE_PPM if(mode_select) //PPM mode { if(IS_BIND_BUTTON_FLAG_on) { - eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+mode_select),0x00); // reset to autobind mode for the current model + eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model option=0; } else { - option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+mode_select)); // load previous mode: autobind or fixed id + option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id if(option!=1) option=0; // if not fixed id mode then it should be autobind } } @@ -916,7 +1002,7 @@ static void protocol_init() break; #endif #if defined(J6PRO_CYRF6936_INO) - case MODE_J6PRO: + case PROTO_J6PRO: PE2_on; //antenna RF4 next_callback = initJ6Pro(); remote_callback = ReadJ6Pro; @@ -925,141 +1011,141 @@ static void protocol_init() #endif #ifdef NRF24L01_INSTALLED #if defined(HISKY_NRF24L01_INO) - case MODE_HISKY: + case PROTO_HISKY: next_callback=initHiSky(); remote_callback = hisky_cb; break; #endif #if defined(V2X2_NRF24L01_INO) - case MODE_V2X2: + case PROTO_V2X2: next_callback = initV2x2(); remote_callback = ReadV2x2; break; #endif #if defined(YD717_NRF24L01_INO) - case MODE_YD717: + case PROTO_YD717: next_callback=initYD717(); remote_callback = yd717_callback; break; #endif #if defined(KN_NRF24L01_INO) - case MODE_KN: + case PROTO_KN: next_callback = initKN(); remote_callback = kn_callback; break; #endif #if defined(SYMAX_NRF24L01_INO) - case MODE_SYMAX: + case PROTO_SYMAX: next_callback = initSymax(); remote_callback = symax_callback; break; #endif #if defined(SLT_NRF24L01_INO) - case MODE_SLT: + case PROTO_SLT: next_callback=initSLT(); remote_callback = SLT_callback; break; #endif #if defined(CX10_NRF24L01_INO) - case MODE_Q2X2: + case PROTO_Q2X2: sub_protocol|=0x08; // Increase the number of sub_protocols for CX-10 - case MODE_CX10: + case PROTO_CX10: next_callback=initCX10(); remote_callback = CX10_callback; break; #endif #if defined(CG023_NRF24L01_INO) - case MODE_CG023: + case PROTO_CG023: next_callback=initCG023(); remote_callback = CG023_callback; break; #endif #if defined(BAYANG_NRF24L01_INO) - case MODE_BAYANG: + case PROTO_BAYANG: next_callback=initBAYANG(); remote_callback = BAYANG_callback; break; #endif #if defined(ESKY_NRF24L01_INO) - case MODE_ESKY: + case PROTO_ESKY: next_callback=initESKY(); remote_callback = ESKY_callback; break; #endif #if defined(MT99XX_NRF24L01_INO) - case MODE_MT99XX: + case PROTO_MT99XX: next_callback=initMT99XX(); remote_callback = MT99XX_callback; break; #endif #if defined(MJXQ_NRF24L01_INO) - case MODE_MJXQ: + case PROTO_MJXQ: next_callback=initMJXQ(); remote_callback = MJXQ_callback; break; #endif #if defined(SHENQI_NRF24L01_INO) - case MODE_SHENQI: + case PROTO_SHENQI: next_callback=initSHENQI(); remote_callback = SHENQI_callback; break; #endif #if defined(FY326_NRF24L01_INO) - case MODE_FY326: + case PROTO_FY326: next_callback=initFY326(); remote_callback = FY326_callback; break; #endif #if defined(FQ777_NRF24L01_INO) - case MODE_FQ777: + case PROTO_FQ777: next_callback=initFQ777(); remote_callback = FQ777_callback; break; #endif #if defined(ASSAN_NRF24L01_INO) - case MODE_ASSAN: + case PROTO_ASSAN: next_callback=initASSAN(); remote_callback = ASSAN_callback; break; #endif #if defined(HONTAI_NRF24L01_INO) - case MODE_HONTAI: + case PROTO_HONTAI: next_callback=initHONTAI(); remote_callback = HONTAI_callback; break; #endif #if defined(Q303_NRF24L01_INO) - case MODE_Q303: + case PROTO_Q303: next_callback=initQ303(); remote_callback = Q303_callback; break; #endif #if defined(GW008_NRF24L01_INO) - case MODE_GW008: + case PROTO_GW008: next_callback=initGW008(); remote_callback = GW008_callback; break; #endif #if defined(DM002_NRF24L01_INO) - case MODE_DM002: + case PROTO_DM002: next_callback=initDM002(); remote_callback = DM002_callback; break; #endif #if defined(CABELL_NRF24L01_INO) - case MODE_CABELL: + case PROTO_CABELL: next_callback=initCABELL(); remote_callback = CABELL_callback; break; #endif #if defined(ESKY150_NRF24L01_INO) - case MODE_ESKY150: + case PROTO_ESKY150: next_callback=initESKY150(); remote_callback = ESKY150_callback; break; #endif #if defined(H8_3D_NRF24L01_INO) - case MODE_H8_3D: + case PROTO_H8_3D: next_callback=initH8_3D(); remote_callback = H8_3D_callback; break; @@ -1114,27 +1200,27 @@ void update_serial_data() //Forced frequency tuning values for CC2500 protocols #if defined(FORCE_FRSKYD_TUNING) && defined(FRSKYD_CC2500_INO) - if(protocol==MODE_FRSKYD) + if(protocol==PROTO_FRSKYD) option=FORCE_FRSKYD_TUNING; // Use config-defined tuning value for FrSkyD else #endif #if defined(FORCE_FRSKYV_TUNING) && defined(FRSKYV_CC2500_INO) - if(protocol==MODE_FRSKYV) + if(protocol==PROTO_FRSKYV) option=FORCE_FRSKYV_TUNING; // Use config-defined tuning value for FrSkyV else #endif #if defined(FORCE_FRSKYX_TUNING) && defined(FRSKYX_CC2500_INO) - if(protocol==MODE_FRSKYX) + if(protocol==PROTO_FRSKYX) option=FORCE_FRSKYX_TUNING; // Use config-defined tuning value for FrSkyX else #endif #if defined(FORCE_SFHSS_TUNING) && defined(SFHSS_CC2500_INO) - if (protocol==MODE_SFHSS) + if (protocol==PROTO_SFHSS) option=FORCE_SFHSS_TUNING; // Use config-defined tuning value for SFHSS else #endif #if defined(FORCE_CORONA_TUNING) && defined(CORONA_CC2500_INO) - if (protocol==MODE_CORONA) + if (protocol==PROTO_CORONA) option=FORCE_CORONA_TUNING; // Use config-defined tuning value for CORONA else #endif @@ -1175,7 +1261,7 @@ void update_serial_data() if( ((rx_ok_buff[1]&0x80)==0) && ((cur_protocol[1]&0x80)!=0) ) // Bind flag has been reset { // Request protocol to end bind #if defined(FRSKYD_CC2500_INO) || defined(FRSKYX_CC2500_INO) || defined(FRSKYV_CC2500_INO) - if(protocol==MODE_FRSKYD || protocol==MODE_FRSKYX || protocol==MODE_FRSKYV) + if(protocol==PROTO_FRSKYD || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYV) BIND_DONE; else #endif @@ -1441,11 +1527,11 @@ void pollBoot() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_BAYANG) || (protocol==MODE_CABELL) ) + if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG) || (protocol==PROTO_CABELL) ) initTXSerial( SPEED_9600 ) ; - if(protocol==MODE_FRSKYX) + if(protocol==PROTO_FRSKYX) initTXSerial( SPEED_57600 ) ; - if(protocol==MODE_DSM) + if(protocol==PROTO_DSM) initTXSerial( SPEED_125K ) ; } #endif diff --git a/Multiprotocol/Pins.h b/Multiprotocol/Pins.h index 3d91623..075b5a8 100644 --- a/Multiprotocol/Pins.h +++ b/Multiprotocol/Pins.h @@ -32,18 +32,18 @@ #endif // Dial - #define MODE_DIAL1_pin 2 - #define MODE_DIAL1_port PORTB - #define MODE_DIAL1_ipr PINB - #define MODE_DIAL2_pin 3 - #define MODE_DIAL2_port PORTB - #define MODE_DIAL2_ipr PINB - #define MODE_DIAL3_pin 4 - #define MODE_DIAL3_port PORTB - #define MODE_DIAL3_ipr PINB - #define MODE_DIAL4_pin 0 - #define MODE_DIAL4_port PORTC - #define MODE_DIAL4_ipr PINC + #define PROTO_DIAL1_pin 2 + #define PROTO_DIAL1_port PORTB + #define PROTO_DIAL1_ipr PINB + #define PROTO_DIAL2_pin 3 + #define PROTO_DIAL2_port PORTB + #define PROTO_DIAL2_ipr PINB + #define PROTO_DIAL3_pin 4 + #define PROTO_DIAL3_port PORTB + #define PROTO_DIAL3_ipr PINB + #define PROTO_DIAL4_pin 0 + #define PROTO_DIAL4_port PORTC + #define PROTO_DIAL4_ipr PINC // PPM #define PPM_pin 3 //D3 = PD3 @@ -291,6 +291,7 @@ #define LED_output pinMode(LED_pin,OUTPUT) #define IS_LED_on ( digitalRead(LED_pin)==HIGH) + //iRangeX modules have a second LED #define LED2_on digitalWrite(LED2_pin,HIGH) #define LED2_off digitalWrite(LED2_pin,LOW) #define LED2_toggle digitalWrite(LED2_pin ,!digitalRead(LED2_pin)) diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 58bae07..1b3d4f1 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -113,14 +113,14 @@ static void multi_send_status() //Is failsafe supported? switch (protocol) { - case MODE_HISKY: + case PROTO_HISKY: if(sub_protocol!=HK310) break; - case MODE_AFHDS2A: - case MODE_DEVO: - case MODE_SFHSS: - case MODE_WK2x01: - case MODE_FRSKYX: + case PROTO_AFHDS2A: + case PROTO_DEVO: + case PROTO_SFHSS: + case PROTO_WK2x01: + case PROTO_FRSKYX: flags |= 0x20; //Yes default: break; @@ -219,7 +219,7 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) if(pktt[6]>0 && pktt[6]<=10) { - if (protocol==MODE_FRSKYD) + if (protocol==PROTO_FRSKYD) { if ( ( pktt[7] & 0x1F ) == (telemetry_counter & 0x1F) ) { @@ -243,7 +243,7 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) // #if defined SPORT_TELEMETRY && defined FRSKYX_CC2500_INO telemetry_lost=0; - if (protocol==MODE_FRSKYX) + if (protocol==PROTO_FRSKYX) { uint16_t lcrc = frskyX_crc_x(&pkt[3], len-7 ) ; @@ -340,7 +340,7 @@ void init_frskyd_link_telemetry() void frsky_link_frame() { frame[0] = 0xFE; // Link frame - if (protocol==MODE_FRSKYD) + if (protocol==PROTO_FRSKYD) { frame[1] = pktt[3]; // A1 frame[2] = pktt[4]; // A2 @@ -349,7 +349,7 @@ void frsky_link_frame() telemetry_link |= 2 ; // Send hub if available } else - if (protocol==MODE_HUBSAN||protocol==MODE_AFHDS2A||protocol==MODE_BAYANG||protocol==MODE_CABELL) + if (protocol==PROTO_HUBSAN||protocol==PROTO_AFHDS2A||protocol==PROTO_BAYANG||protocol==PROTO_CABELL) { frame[1] = v_lipo1; frame[2] = v_lipo2; @@ -854,7 +854,7 @@ void TelemetryUpdate() #endif #if defined SPORT_TELEMETRY - if (protocol==MODE_FRSKYX) + if (protocol==PROTO_FRSKYX) { // FrSkyX for(;;) { @@ -900,7 +900,7 @@ void TelemetryUpdate() #endif // SPORT_TELEMETRY #if defined DSM_TELEMETRY - if(telemetry_link && protocol == MODE_DSM) + if(telemetry_link && protocol == PROTO_DSM) { // DSM DSM_frame(); telemetry_link=0; @@ -908,7 +908,7 @@ void TelemetryUpdate() } #endif #if defined AFHDS2A_FW_TELEMETRY - if(telemetry_link == 2 && protocol == MODE_AFHDS2A) + if(telemetry_link == 2 && protocol == PROTO_AFHDS2A) { AFHDSA_short_frame(); telemetry_link=0; @@ -916,13 +916,13 @@ void TelemetryUpdate() } #endif - if((telemetry_link & 1 )&& protocol != MODE_FRSKYX) + if((telemetry_link & 1 )&& protocol != PROTO_FRSKYX) { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell frsky_link_frame(); return; } #if defined HUB_TELEMETRY - if((telemetry_link & 2) && protocol == MODE_FRSKYD) + if((telemetry_link & 2) && protocol == PROTO_FRSKYD) { // FrSkyD frsky_user_frame(); return; diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 4e90edd..e732468 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -49,6 +49,11 @@ #error "You have enabled CHECK_FOR_BOOTLOADER but not selected the 'Flash from TX' bootloader." #endif +//Check number of banks +#if NBR_BANKS < 1 || NBR_BANKS > 5 + #error "You need to select a number of banks between 1 and 5." +#endif + //Check failsafe throttle value #ifdef FAILSAFE_ENABLE #if ( FAILSAFE_THROTTLE_LOW < -125 ) || ( FAILSAFE_THROTTLE_LOW > 125 ) diff --git a/Multiprotocol/WK2x01_cyrf6936.ino b/Multiprotocol/WK2x01_cyrf6936.ino index 614a67a..2924f13 100644 --- a/Multiprotocol/WK2x01_cyrf6936.ino +++ b/Multiprotocol/WK2x01_cyrf6936.ino @@ -294,7 +294,7 @@ static void __attribute__((unused)) WK_build_beacon_pkt_2801() BIND_SET_PULLUP; // set pullup if(IS_BIND_BUTTON_on) { - eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+mode_select),0x01); // Set fixed id mode for the current model + eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x01); // Set fixed id mode for the current model option=1; } BIND_SET_OUTPUT; @@ -303,7 +303,7 @@ static void __attribute__((unused)) WK_build_beacon_pkt_2801() if(prev_option!=option && IS_BIND_DONE) { set_rx_tx_addr(MProtocol_id); - rx_tx_addr[2]=rx_tx_addr[3]<<4; // Make use of RX_Num + rx_tx_addr[2]=rx_tx_addr[3]<<4; // Make use of RX_num bind_counter = WK_BIND_COUNT / 8 + 1; } if (option) @@ -490,7 +490,7 @@ uint16_t WK_setup() } else { - rx_tx_addr[2]=rx_tx_addr[3]<<4; // Make use of RX_Num + rx_tx_addr[2]=rx_tx_addr[3]<<4; // Make use of RX_num bind_counter = 0; phase = WK_BOUND_1; BIND_DONE; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 6563ff9..2d54dc5 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -22,7 +22,7 @@ /********************/ //If you know parameters you want for sure to be enabled or disabled which survives in future, you can use a file named "_MyConfig.h". //An example is given within the file named "_MyConfig.h.example" which needs to be renamed if you want to use it. -//To enable this config file remove the // from the line below. It's automatically loaded if the file exists for the AVR platform but not STM32... +//To enable this config file remove the // from the line below. //#define USE_MY_CONFIG @@ -305,160 +305,240 @@ /** Dial Protocol Selector Settings **/ //The table below indicates which protocol to run when a specific position on the dial has been selected. //All fields and values are explained below. Everything is configurable from here like in the Serial mode. -//Example: You can associate multiple times the same protocol to different dial positions to take advantage of the model match (RX_Num) -const PPM_Parameters PPM_prot[15]= { +//Tip: You can associate multiple times the same protocol to different dial positions to take advantage of the model match based on RX_Num + +//A system of banks enable the access to more protocols than positions on the dial. Banks can be selected by placing the dial on position 15, power up the module and +// short press the bind button multiple times until you reach the desired one. The bank number currently selected is indicated by the number of LED flash. +//The parameter below indicates the number of desired banks between 1 and 5. Default is 5. +#define NBR_BANKS 5 + +const PPM_Parameters PPM_prot[14*NBR_BANKS]= { +#if NBR_BANKS > 0 +//****************************** BANK 1 ****************************** // Dial Protocol Sub protocol RX_Num Power Auto Bind Option -/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 2 */ {MODE_HUBSAN, H107 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 3 */ {MODE_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning -/* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 6 */ {MODE_DSM , DSMX_11 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels -/* 7 */ {MODE_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, -/* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 10 */ {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 11 */ {MODE_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 12 */ {MODE_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 13 */ {MODE_CG023 , CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 14 */ {MODE_BAYANG, BAYANG , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 15 */ {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } +/* 1 */ {PROTO_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 2 */ {PROTO_AFHDS2A, PWM_IBUS , 0 , P_HIGH , NO_AUTOBIND , 0 }, // RX number 0 +/* 3 */ {PROTO_AFHDS2A, PWM_IBUS , 1 , P_HIGH , NO_AUTOBIND , 0 }, // RX number 1 +/* 4 */ {PROTO_AFHDS2A, PWM_IBUS , 2 , P_HIGH , NO_AUTOBIND , 0 }, // RX number 2 +/* 5 */ {PROTO_AFHDS2A, PWM_IBUS , 3 , P_HIGH , NO_AUTOBIND , 0 }, // RX number 3 +/* 6 */ {PROTO_AFHDS2A, PWM_IBUS , 2 , P_HIGH , NO_AUTOBIND , 0 }, // RX number 4 +/* 7 */ {PROTO_AFHDS2A, PWM_IBUS , 3 , P_HIGH , NO_AUTOBIND , 0 }, // RX number 5 +/* 8 */ {PROTO_SFHSS, H107 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 9 */ {PROTO_FRSKYV, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning +/* 10 */ {PROTO_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning +/* 11 */ {PROTO_FRSKYX, CH_16 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning +/* 12 */ {PROTO_FRSKYX, EU_16 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning +/* 13 */ {PROTO_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 14 */ {PROTO_WK2x01, WK2801 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +#endif +#if NBR_BANKS > 1 +//****************************** BANK 2 ****************************** +// Dial Protocol Sub protocol RX_Num Power Auto Bind Option +/* 1 */ {PROTO_DSM , DSM2_11 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels +/* 2 */ {PROTO_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels +/* 3 */ {PROTO_DSM , DSMX_11 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels +/* 4 */ {PROTO_DSM , DSMX_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels +/* 5 */ {PROTO_DSM , DSM2_11 , 0 , P_HIGH , NO_AUTOBIND , 8 }, // option=number of channels +/* 6 */ {PROTO_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 8 }, // option=number of channels +/* 7 */ {PROTO_DSM , DSMX_11 , 0 , P_HIGH , NO_AUTOBIND , 8 }, // option=number of channels +/* 8 */ {PROTO_DSM , DSMX_22 , 0 , P_HIGH , NO_AUTOBIND , 8 }, // option=number of channels +/* 9 */ {PROTO_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 10 */ {PROTO_HUBSAN, H107 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 11 */ {PROTO_HUBSAN, H301 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 12 */ {PROTO_HUBSAN, H501 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 13 */ {PROTO_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 14 */ {PROTO_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +#endif +#if NBR_BANKS > 2 +//****************************** BANK 3 ****************************** +// Dial Protocol Sub protocol RX_Num Power Auto Bind Option +/* 1 */ {PROTO_ESKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 2 */ {PROTO_ESKY150, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 3 */ {PROTO_ASSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 4 */ {PROTO_CORONA, COR_V2 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 5 */ {PROTO_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 6 */ {PROTO_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 7 */ {PROTO_BAYANG, BAYANG , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 8 */ {PROTO_BAYANG, H8S3D , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 9 */ {PROTO_BAYANG, X16_AH , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 10 */ {PROTO_BAYANG, IRDRONE , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 11 */ {PROTO_H8_3D, H8_3D , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 12 */ {PROTO_H8_3D, H20H , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 13 */ {PROTO_H8_3D, H20MINI , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 14 */ {PROTO_H8_3D, H30MINI , 0 , P_HIGH , NO_AUTOBIND , 0 }, +#endif +#if NBR_BANKS > 3 +//****************************** BANK 4 ****************************** +// Dial Protocol Sub protocol RX_Num Power Auto Bind Option +/* 1 */ {PROTO_MJXQ , WLH08 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 2 */ {PROTO_MJXQ , X600 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 3 */ {PROTO_MJXQ , X800 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 4 */ {PROTO_MJXQ , H26D , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 5 */ {PROTO_MJXQ , E010 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 6 */ {PROTO_MJXQ , H26WH , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 7 */ {PROTO_HONTAI, HONTAI , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 8 */ {PROTO_HONTAI, JJRCX1 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 9 */ {PROTO_HONTAI, X5C1 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 10 */ {PROTO_HONTAI, FQ777_951 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 11 */ {PROTO_Q303 , Q303 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 12 */ {PROTO_Q303 , CX35 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 13 */ {PROTO_Q303 , CX10D , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 14 */ {PROTO_Q303 , CX10WD , 0 , P_HIGH , NO_AUTOBIND , 0 }, +#endif +#if NBR_BANKS > 4 +//****************************** BANK 5 ****************************** +// Dial Protocol Sub protocol RX_Num Power Auto Bind Option +/* 1 */ {PROTO_CX10 , CX10_GREEN , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 2 */ {PROTO_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 3 */ {PROTO_CX10 , DM007 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 4 */ {PROTO_CX10 , JC3015_1 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 5 */ {PROTO_CX10 , JC3015_2 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 6 */ {PROTO_CX10 , MK33041 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 7 */ {PROTO_Q2X2 , Q222 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 8 */ {PROTO_Q2X2 , Q242 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 9 */ {PROTO_Q2X2 , Q282 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 10 */ {PROTO_CG023, CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 11 */ {PROTO_CG023, YD829 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 12 */ {PROTO_FQ777, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 13 */ {PROTO_YD717, YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 14 */ {PROTO_MT99XX, MT99 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +#endif }; /* Available protocols and associated sub protocols to pick and choose from - MODE_FLYSKY + PROTO_FLYSKY Flysky V9X9 V6X6 V912 CX20 - MODE_HUBSAN + PROTO_HUBSAN H107 H301 H501 - MODE_FRSKYV + PROTO_FRSKYV NONE - MODE_FRSKYD + PROTO_FRSKYD NONE - MODE_FRSKYX + PROTO_FRSKYX CH_16 CH_8 EU_16 EU_8 - MODE_HISKY + PROTO_HISKY Hisky HK310 - MODE_V2X2 + PROTO_V2X2 V2X2 JXD506 - MODE_DSM + PROTO_DSM DSM2_22 DSM2_11 DSMX_22 DSMX_11 - MODE_DEVO + PROTO_DEVO NONE - MODE_YD717 + PROTO_YD717 YD717 SKYWLKR SYMAX4 XINXUN NIHUI - MODE_KN + PROTO_KN WLTOYS FEILUN - MODE_SYMAX + PROTO_SYMAX SYMAX SYMAX5C - MODE_SLT + PROTO_SLT NONE - MODE_CX10 + PROTO_CX10 CX10_GREEN CX10_BLUE DM007 JC3015_1 JC3015_2 MK33041 - MODE_Q2X2 + PROTO_Q2X2 Q222 Q242 Q282 - MODE_SLT + PROTO_SLT SLT VISTA - MODE_CG023 + PROTO_CG023 CG023 YD829 - MODE_BAYANG + PROTO_BAYANG BAYANG H8S3D X16_AH IRDRONE - MODE_ESKY + PROTO_ESKY NONE - MODE_MT99XX + PROTO_MT99XX MT99 H7 YZ LS FY805 - MODE_MJXQ + PROTO_MJXQ WLH08 X600 X800 H26D E010 H26WH - MODE_SHENQI + PROTO_SHENQI NONE - MODE_FY326 + PROTO_FY326 FY326 FY319 - MODE_SFHSS + PROTO_SFHSS NONE - MODE_J6PRO + PROTO_J6PRO NONE - MODE_FQ777 + PROTO_FQ777 NONE - MODE_ASSAN + PROTO_ASSAN NONE - MODE_HONTAI - FORMAT_HONTAI - FORMAT_JJRCX1 - FORMAT_X5C1 - FORMAT_FQ777_951 - MODE_AFHDS2A + PROTO_HONTAI + HONTAI + JJRCX1 + X5C1 + FQ777_951 + PROTO_AFHDS2A PWM_IBUS PPM_IBUS PWM_SBUS PPM_SBUS - MODE_WK2X01 + PROTO_WK2x01 WK2801 WK2401 W6_5_1 W6_6_1 W6_HEL W6_HEL_I - MODE_Q303 + PROTO_Q303 Q303 CX35 CX10D CX10WD - MODE_GW008 + PROTO_GW008 NONE - MODE_DM002 + PROTO_DM002 NONE - MODE_CABELL + PROTO_CABELL CABELL_V3 CABELL_V3_TELEMETRY CABELL_SET_FAIL_SAFE CABELL_UNBIND - MODE_ESKY150 - MODE_H8_3D + PROTO_ESKY150 + PROTO_H8_3D H8_3D H20H - H20 Mini - H30 Mini - MODE_CORONA + H20MINI + H30MINI + PROTO_CORONA COR_V1 COR_V2 */ diff --git a/Protocols_Details.md b/Protocols_Details.md index a42c8dd..5bcb675 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -27,29 +27,20 @@ Here are detailed descriptions of every supported protocols (sorted by RF module - Using channel 16 for the bind channel seems the most relevant as only one protocol so far is using 16 channels which is FrSkyX. But even on FrSkyX this feature won't have any impact since there is NO valid reason to have Autobind set to Y for such a protocol. -## Default Mapping of Protocols in PPM mode -Here is the default mapping of protocols to the 16-position protocol selection switch on the module. You can customize these when you compile your own firmware as described in [Compiling and Programming.](docs/Compiling.md) +## Protocol selection in PPM mode +The protocol selection is based on 2 parameters: + * selection switch: this is the rotary switch on the module numbered from 0 to 15 + - switch position 0 is to select the Serial mode for er9x/ersky9x/OpenTX radio + - switch position 15 is to select the bank + - switch position 1..14 will select the protocol 1..14 in the bank X + * banks are used to increase the amount of accessible protocols by the switch. There are up to 5 banks giving acces to up to 70 protocol entries (5 * 14). To modify or verify which bank is currenlty active do the following: + - turn on the module with the switch on position 15 + - the number of LED flash indicates the bank number (1 to 5 flash) + - to go to the next bank short press the bind button, this action is confirmed by the LED staying on for 1.5 sec -**Note that the protocol must be selected before the unit is turned on.** - -Dial|Protocol|Sub_protocol|RX Num|Power|Auto Bind|Option|RF Module -----|--------|------------|------|-----|---------|------|--------- -0|Select serial|||||| -1|FLYSKY|Flysky|0|High|No|0|A7105 -2|HUBSAN|-|0|High|No|0|A7105 -3|FRSKYD|-|0|High|No|40|CC2500 -4|HISKY|Hisky|0|High|No|0|NRF24L01 -5|V2X2|-|0|High|No|0|NRF24L01 -6|DSM|DSM2|0|High|No|6|CYRF6936 -7|DEVO|-|0|High|No|0|CYRF6936 -8|YD717|YD717|0|High|No|0|NRF24L01 -9|KN|WLTOYS|0|High|No|0|NRF24L01 -10|SYMAX|SYMAX|0|High|No|0|NRF24L01 -11|SLT|-|0|High|No|0|NRF24L01 -12|CX10|BLUE|0|High|No|0|NRF24L01 -13|CG023|CG023|0|High|No|0|NRF24L01 -14|BAYANG|-|0|High|No|0|NRF24L01 -15|SYMAX|SYMAX5C|0|High|No|0|NRF24L01 +The default protocol mapping can be seen at the end of the file [_Config.h](/Multiprotocol/_Config.h). + +**Note: the protocol selection must be done before the module is turned on** # A7105 RF Module @@ -259,7 +250,7 @@ Bind procedure using serial: - Turn on RX (RX LED fast blink). - Turn on TX (RX LED solid, TX LED fast blink). - Wait for bind on the TX to complete (TX LED solid). -- Make sure to set the RX_Num value for model match. +- Make sure to set a uniq RX_Num value for model match. - Change option to 1 to use the global ID. - Do not touch option/RX_Num anymore. @@ -272,7 +263,7 @@ Bind procedure using PPM: - Wait for bind on the TX to complete (TX LED solid). - Press the bind button for 1 second. TX/RX is now in fixed ID mode. - To verify that the TX is in fixed mode: power cycle the TX, the module LED should be solid ON (no blink). -- Note: Autobind/fixed ID mode is linked to the dial number. Which means that you can have multiple dial numbers set to the same protocol DEVO with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match under DEVO. +- Note: Autobind/fixed ID mode is linked to the RX_Num number. Which means that you can have multiple dial numbers set to the same protocol DEVO with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match under DEVO. ## WK2X01 - *30* Extended limits supported @@ -295,7 +286,7 @@ Bind procedure using serial: - Turn on RX (RX LED fast blink). - Turn on TX (RX LED solid, TX LED fast blink). - Wait for bind on the TX to complete (TX LED solid). -- Make sure to set the RX_Num value for model match. +- Make sure to set a uniq RX_Num value for model match. - Change option to 1 to use the global ID. - Do not touch option/RX_Num anymore. @@ -308,7 +299,7 @@ Bind procedure using PPM: - Wait for bind on the TX to complete (TX LED solid). - Press the bind button for 1 second. TX/RX is now in fixed ID mode. - To verify that the TX is in fixed mode: power cycle the TX, the module LED should be solid ON (no blink). -- Note: Autobind/fixed ID mode is linked to the dial number. Which means that you can have multiple dial numbers set to the same protocol WK2X01 and sub_protocol WK2801 with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match. +- Note: Autobind/fixed ID mode is linked to the RX_Num number. Which means that you can have multiple dial numbers set to the same protocol DEVO with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match under DEVO. ### Sub_protocol WK2401 - *1* The WK2401 protocol is used to control older Walkera models.