From d96ba9fa463a5bc7bf0259cc909adb98c3e3feec Mon Sep 17 00:00:00 2001 From: pascallanger Date: Sun, 4 Sep 2016 16:48:52 +0200 Subject: [PATCH] Flysky Flash space optimization --- Multiprotocol/FlySky_a7105.ino | 65 ++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/Multiprotocol/FlySky_a7105.ino b/Multiprotocol/FlySky_a7105.ino index a7f4033..43ccffd 100644 --- a/Multiprotocol/FlySky_a7105.ino +++ b/Multiprotocol/FlySky_a7105.ino @@ -50,10 +50,6 @@ enum { FLAG_V912_BTMBTN= 0x80, }; -uint8_t chanrow; -uint8_t chancol; -uint8_t chanoffset; - const uint8_t PROGMEM V912_X17_SEQ[10] = { 0x14, 0x31, 0x40, 0x49, 0x49, // sometime first byte is 0x15 ? 0x49, 0x49, 0x49, 0x49, 0x49, }; @@ -151,25 +147,6 @@ static void __attribute__((unused)) flysky_build_packet(uint8_t init) flysky_apply_extension_flags(); } -const uint8_t PROGMEM tx_channels[16][16] = { - {0x0a, 0x5a, 0x14, 0x64, 0x1e, 0x6e, 0x28, 0x78, 0x32, 0x82, 0x3c, 0x8c, 0x46, 0x96, 0x50, 0xa0}, - {0xa0, 0x50, 0x96, 0x46, 0x8c, 0x3c, 0x82, 0x32, 0x78, 0x28, 0x6e, 0x1e, 0x64, 0x14, 0x5a, 0x0a}, - {0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x46, 0x96, 0x1e, 0x6e, 0x3c, 0x8c, 0x28, 0x78, 0x32, 0x82}, - {0x82, 0x32, 0x78, 0x28, 0x8c, 0x3c, 0x6e, 0x1e, 0x96, 0x46, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a}, - {0x28, 0x78, 0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96}, - {0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a, 0x78, 0x28}, - {0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96, 0x14, 0x64}, - {0x64, 0x14, 0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50}, - {0x50, 0xa0, 0x46, 0x96, 0x3c, 0x8c, 0x28, 0x78, 0x0a, 0x5a, 0x32, 0x82, 0x1e, 0x6e, 0x14, 0x64}, - {0x64, 0x14, 0x6e, 0x1e, 0x82, 0x32, 0x5a, 0x0a, 0x78, 0x28, 0x8c, 0x3c, 0x96, 0x46, 0xa0, 0x50}, - {0x46, 0x96, 0x3c, 0x8c, 0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64}, - {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50, 0x8c, 0x3c, 0x96, 0x46}, - {0x46, 0x96, 0x0a, 0x5a, 0x3c, 0x8c, 0x14, 0x64, 0x50, 0xa0, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82}, - {0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0xa0, 0x50, 0x64, 0x14, 0x8c, 0x3c, 0x5a, 0x0a, 0x96, 0x46}, - {0x46, 0x96, 0x0a, 0x5a, 0x50, 0xa0, 0x3c, 0x8c, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64}, - {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0x8c, 0x3c, 0xa0, 0x50, 0x5a, 0x0a, 0x96, 0x46}, -}; - uint16_t ReadFlySky() { if (bind_counter) @@ -183,28 +160,56 @@ uint16_t ReadFlySky() else { flysky_build_packet(0); - A7105_WriteData(21, pgm_read_byte_near(&tx_channels[chanrow][chancol])-chanoffset); - chancol = (chancol + 1) % 16; - if (! chancol) //Keep transmit power updated - A7105_SetPower(); + A7105_WriteData(21, hopping_frequency[hopping_frequency_no]); + hopping_frequency_no = (hopping_frequency_no + 1) & 0x0F; + A7105_SetPower(); } return 1510; //1460 on deviation but not working with the latest V911 bricks... Turnigy 9X v2 is 1533, Flysky TX for 9XR/9XR Pro is 1510, V911 TX is 1490. } -uint16_t initFlySky() { +const uint8_t PROGMEM tx_channels[8][4] = { + { 0x12, 0x34, 0x56, 0x78}, + { 0x18, 0x27, 0x36, 0x45}, + { 0x41, 0x82, 0x36, 0x57}, + { 0x84, 0x13, 0x65, 0x72}, + { 0x87, 0x64, 0x15, 0x32}, + { 0x76, 0x84, 0x13, 0x52}, + { 0x71, 0x62, 0x84, 0x35}, + { 0x71, 0x86, 0x43, 0x52} +}; + +uint16_t initFlySky() +{ + uint8_t chanrow; + uint8_t chanoffset; + uint8_t temp; + A7105_Init(INIT_FLYSKY); //flysky_init(); if ((rx_tx_addr[3]&0xF0) > 0x90) // limit offset to 9 as higher values don't work with some RX (ie V912) rx_tx_addr[3]=rx_tx_addr[3]-0x70; chanrow=rx_tx_addr[3] & 0x0F; - chancol=0; chanoffset=rx_tx_addr[3]/16; + // Build frequency hop table + for(uint8_t i=0;i<16;i++) + { + temp=pgm_read_byte_near(&tx_channels[chanrow>>1][i>>2]); + if(i&0x01) + temp&=0x0F; + else + temp>>=4; + temp*=0x0A; + if(i&0x02) + temp+=0x50; + hopping_frequency[((chanrow&1)?15-i:i)]=temp-chanoffset; + } + hopping_frequency_no=0; + if(IS_AUTOBIND_FLAG_on) bind_counter = FLYSKY_BIND_COUNT; else bind_counter = 0; return 2400; } - #endif