From 068b21cbb1144f28b0d7c677e4538bedd9b5b690 Mon Sep 17 00:00:00 2001 From: tipouic Date: Fri, 30 Sep 2016 13:36:12 +0200 Subject: [PATCH 1/6] =?UTF-8?q?Cr=C3=A9ation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Multiprotocol/A7105_SPI.ino | 21 +- Multiprotocol/A7105_joysway.ino | 4 +- Multiprotocol/CX10_nrf24l01.ino | 27 - Multiprotocol/CYRF6936_SPI.ino | 7 - Multiprotocol/CYRF6936_j6pro.ino | 277 -- Multiprotocol/Cc2500_skyartec.ino | 114 +- Multiprotocol/DSM2_cyrf6936.ino | 538 -- Multiprotocol/Devo_cyrf6936.ino | 81 - Multiprotocol/FY326_nrf24l01.ino | 146 +- Multiprotocol/FlySky_a7105.ino | 183 +- Multiprotocol/Flysky_afhds2a_a7105.ino | 317 ++ Multiprotocol/FrSkyX_cc2500.ino | 291 +- Multiprotocol/FrSky_cc2500.ino | 219 - Multiprotocol/Hisky_nrf24l01.ino | 2 +- Multiprotocol/Hontai_nrf24l01.ino | 57 +- Multiprotocol/Hubsan_a7105.ino | 125 +- Multiprotocol/KN_nrf24l01.ino | 8 - Multiprotocol/Lua Generateur.htm | 5468 +++++++++++++++++++++ Multiprotocol/MJXQ_nrf24l01.ino | 77 - Multiprotocol/MT99xx_nrf24l01.ino | 97 - Multiprotocol/Multiprotocol 2.zip | Bin 0 -> 304859 bytes Multiprotocol/Multiprotocol.ino | 990 +--- Multiprotocol/NRF24l01_SPI.ino | 164 +- Multiprotocol/Nrf24l01_bluefly.ino | 5 +- Multiprotocol/Nrf24l01_cflie.ino | 119 +- Multiprotocol/Nrf24l01_esky150.ino | 59 +- Multiprotocol/Nrf24l01_fbl100.ino | 9 +- Multiprotocol/Nrf24l01_h377.ino | 9 +- Multiprotocol/Nrf24l01_hm830.ino | 16 +- Multiprotocol/Nrf24l01_hontai.ino | 272 - Multiprotocol/Nrf24l01_inav.ino | 733 +++ Multiprotocol/Nrf24l01_ne260.ino | 10 +- Multiprotocol/Nrf24l01_udi.ino | 60 +- Multiprotocol/README.md | 230 + Multiprotocol/SHENQI_nrf24l01.ino | 50 - Multiprotocol/TX_Def.h | 11 +- Multiprotocol/Telemetry.ino | 540 +- Multiprotocol/YD717_nrf24l01.ino | 25 - Multiprotocol/_Config.h | 307 +- Multiprotocol/_EEPROM.txt | 4 + Multiprotocol/calcul chanel.ods | Bin 0 -> 19588 bytes Multiprotocol/iface_a7105.h | 1 + Multiprotocol/iface_nrf24l01.h | 5 - Multiprotocol/multi.lua | 94 - Multiprotocol/multiprotocol.h | 174 +- Multiprotocol/opentx-multi-2015-24-12.bin | Bin 362852 -> 0 bytes Multiprotocol/opentx.bin | Bin 228420 -> 0 bytes Multiprotocol/sync.ffs_db | Bin 0 -> 942 bytes 48 files changed, 7675 insertions(+), 4271 deletions(-) delete mode 100644 Multiprotocol/CYRF6936_j6pro.ino delete mode 100644 Multiprotocol/DSM2_cyrf6936.ino create mode 100644 Multiprotocol/Flysky_afhds2a_a7105.ino delete mode 100644 Multiprotocol/FrSky_cc2500.ino create mode 100644 Multiprotocol/Lua Generateur.htm create mode 100644 Multiprotocol/Multiprotocol 2.zip delete mode 100644 Multiprotocol/Nrf24l01_hontai.ino create mode 100644 Multiprotocol/Nrf24l01_inav.ino create mode 100644 Multiprotocol/README.md create mode 100644 Multiprotocol/_EEPROM.txt create mode 100644 Multiprotocol/calcul chanel.ods delete mode 100644 Multiprotocol/multi.lua delete mode 100644 Multiprotocol/opentx-multi-2015-24-12.bin delete mode 100644 Multiprotocol/opentx.bin create mode 100644 Multiprotocol/sync.ffs_db diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index 251d31e..349de65 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -30,12 +30,12 @@ void A7105_WriteData(uint8_t len, uint8_t channel) A7105_Strobe(A7105_TX); } -void A7105_ReadData() { +void A7105_ReadData(uint8_t len=16) { uint8_t i; A7105_Strobe(0xF0); //A7105_RST_RDPTR A7105_CSN_off; SPI_Write(0x45); - for (i=0;i<16;i++) + for (i=0;i= Model.num_channels) { packet[chmap[i]] = 0x64; continue; } - uint32_t value = (uint32_t)Servo_data[i] * 0x66 / PPM_MAX + 0x66; - if (value < 0) { value = 0; } - if (value > 0xff) { value = 0xff; } + uint32_t value = map(limit_channel_100(i),servo_min_100,servo_max_100,0,204); packet[chmap[i]] = value; } packet[8] = 0x64; diff --git a/Multiprotocol/CX10_nrf24l01.ino b/Multiprotocol/CX10_nrf24l01.ino index adc7279..f836e02 100644 --- a/Multiprotocol/CX10_nrf24l01.ino +++ b/Multiprotocol/CX10_nrf24l01.ino @@ -25,10 +25,6 @@ #define Q282_PACKET_SIZE 21 #define CX10_PACKET_PERIOD 1316 // Timeout for callback in uSec #define CX10A_PACKET_PERIOD 6000 -<<<<<<< HEAD -#define CX10A_BIND_COUNT 400 // 2 seconds -======= ->>>>>>> refs/remotes/pascallanger/master #define CX10_INITIAL_WAIT 500 @@ -201,30 +197,15 @@ uint16_t CX10_callback() } break; case CX10_BIND2: -<<<<<<< HEAD - bind_counter--; - if(bind_counter==0) - { // Needed for some CX-10A to properly finish the bind - CX10_init(); - bind_counter=CX10A_BIND_COUNT; - } - if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) -======= if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) ->>>>>>> refs/remotes/pascallanger/master { // RX fifo data ready XN297_ReadPayload(packet, packet_length); NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TX_EN); if(packet[9] == 1) { -<<<<<<< HEAD - phase = CX10_BIND1; - bind_counter=0; -======= BIND_DONE; phase = CX10_DATA; ->>>>>>> refs/remotes/pascallanger/master } } else @@ -234,11 +215,7 @@ uint16_t CX10_callback() NRF24L01_FlushTx(); NRF24L01_SetTxRxMode(TX_EN); CX10_Write_Packet(1); -<<<<<<< HEAD - delayMicroseconds(400); // 300µs in deviation but not working so using 400µs instead -======= delayMicroseconds(400); ->>>>>>> refs/remotes/pascallanger/master // switch to RX mode NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_FlushRx(); @@ -288,10 +265,6 @@ uint16_t initCX10(void) packet_period = CX10A_PACKET_PERIOD; phase = CX10_BIND2; -<<<<<<< HEAD - bind_counter=CX10A_BIND_COUNT; -======= ->>>>>>> refs/remotes/pascallanger/master for(uint8_t i=0; i<4; i++) packet[5+i] = 0xff; // clear aircraft id diff --git a/Multiprotocol/CYRF6936_SPI.ino b/Multiprotocol/CYRF6936_SPI.ino index 6a3bae6..2b2d52a 100644 --- a/Multiprotocol/CYRF6936_SPI.ino +++ b/Multiprotocol/CYRF6936_SPI.ino @@ -192,18 +192,11 @@ static void CYRF_StartReceive() CYRF_ReadRegisterMulti(CYRF_21_RX_BUFFER, dpbuffer, 0x10); } */ -<<<<<<< HEAD -static void CYRF_ReadDataPacketLen(uint8_t dpbuffer[], uint8_t length) -======= void CYRF_ReadDataPacketLen(uint8_t dpbuffer[], uint8_t length) ->>>>>>> refs/remotes/pascallanger/master { CYRF_ReadRegisterMulti(CYRF_21_RX_BUFFER, dpbuffer, length); } -<<<<<<< HEAD -======= ->>>>>>> refs/remotes/pascallanger/master static void CYRF_WriteDataPacketLen(const uint8_t dpbuffer[], uint8_t len) { CYRF_WriteRegister(CYRF_01_TX_LENGTH, len); diff --git a/Multiprotocol/CYRF6936_j6pro.ino b/Multiprotocol/CYRF6936_j6pro.ino deleted file mode 100644 index 623ae5f..0000000 --- a/Multiprotocol/CYRF6936_j6pro.ino +++ /dev/null @@ -1,277 +0,0 @@ -/* - 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. - - Deviation 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 Deviation. If not, see . - */ - -#if defined(J6PRO_CYRF6936_INO) -#include "iface_cyrf6936.h" - -#define NUM_WAIT_LOOPS (100 / 5) //each loop is ~5us. Do not wait more than 100us - -//For Debug -//#define NO_SCRAMBLE - -enum J6ProState { - J6PRO_BIND, - J6PRO_BIND_01, - J6PRO_BIND_03_START, - J6PRO_BIND_03_CHECK, - J6PRO_BIND_05_1, - J6PRO_BIND_05_2, - J6PRO_BIND_05_3, - J6PRO_BIND_05_4, - J6PRO_BIND_05_5, - J6PRO_BIND_05_6, - J6PRO_CHANSEL, - J6PRO_CHAN_1, - J6PRO_CHAN_2, - J6PRO_CHAN_3, - J6PRO_CHAN_4, -}; - -static const uint8_t J6Pro_sopcodes[][8] = { - /* Note these are in order transmitted (LSB 1st) */ - {0x3C, 0x37, 0xCC, 0x91, 0xE2, 0xF8, 0xCC, 0x91}, - {0x9B, 0xC5, 0xA1, 0x0F, 0xAD, 0x39, 0xA2, 0x0F}, - {0xEF, 0x64, 0xB0, 0x2A, 0xD2, 0x8F, 0xB1, 0x2A}, - {0x66, 0xCD, 0x7C, 0x50, 0xDD, 0x26, 0x7C, 0x50}, - {0x5C, 0xE1, 0xF6, 0x44, 0xAD, 0x16, 0xF6, 0x44}, - {0x5A, 0xCC, 0xAE, 0x46, 0xB6, 0x31, 0xAE, 0x46}, - {0xA1, 0x78, 0xDC, 0x3C, 0x9E, 0x82, 0xDC, 0x3C}, - {0xB9, 0x8E, 0x19, 0x74, 0x6F, 0x65, 0x18, 0x74}, - {0xDF, 0xB1, 0xC0, 0x49, 0x62, 0xDF, 0xC1, 0x49}, - {0x97, 0xE5, 0x14, 0x72, 0x7F, 0x1A, 0x14, 0x72}, - {0x82, 0xC7, 0x90, 0x36, 0x21, 0x03, 0xFF, 0x17}, - {0xE2, 0xF8, 0xCC, 0x91, 0x3C, 0x37, 0xCC, 0x91}, //Note: the '03' was '9E' in the Cypress recommended table - {0xAD, 0x39, 0xA2, 0x0F, 0x9B, 0xC5, 0xA1, 0x0F}, //The following are the same as the 1st 8 above, - {0xD2, 0x8F, 0xB1, 0x2A, 0xEF, 0x64, 0xB0, 0x2A}, //but with the upper and lower word swapped - {0xDD, 0x26, 0x7C, 0x50, 0x66, 0xCD, 0x7C, 0x50}, - {0xAD, 0x16, 0xF6, 0x44, 0x5C, 0xE1, 0xF6, 0x44}, - {0xB6, 0x31, 0xAE, 0x46, 0x5A, 0xCC, 0xAE, 0x46}, - {0x9E, 0x82, 0xDC, 0x3C, 0xA1, 0x78, 0xDC, 0x3C}, - {0x6F, 0x65, 0x18, 0x74, 0xB9, 0x8E, 0x19, 0x74}, -}; -const uint8_t bind_sop_code[] = {0x62, 0xdf, 0xc1, 0x49, 0xdf, 0xb1, 0xc0, 0x49}; -const uint8_t data_code[] = {0x02, 0xf9, 0x93, 0x97, 0x02, 0xfa, 0x5c, 0xe3, 0x01, 0x2b, 0xf1, 0xdb, 0x01, 0x32, 0xbe, 0x6f}; - -static uint8_t stateJ6P; -static uint8_t radio_ch[4]; -static uint8_t num_channels; - -void J6Pro_build_bind_packet() -{ - packet[0] = 0x01; //Packet type - packet[1] = 0x01; //FIXME: What is this? Model number maybe? - packet[2] = 0x56; //FIXME: What is this? - packet[3] = cyrfmfg_id[0]; - packet[4] = cyrfmfg_id[1]; - packet[5] = cyrfmfg_id[2]; - packet[6] = cyrfmfg_id[3]; - packet[7] = cyrfmfg_id[4]; - packet[8] = cyrfmfg_id[5]; -} -void J6Pro_build_data_packet() -{ - uint8_t i; - uint32_t upperbits = 0; - packet[0] = 0xaa; //FIXME what is this? - for (i = 0; i < 12; i++) { - if (i >= num_channels) { - packet[i+1] = 0xff; - continue; - } - uint32_t value = (uint32_t)Servo_data[i] * 0x200 / PPM_MAX + 0x200; - if (value < 0) - value = 0; - if (value > 0x3ff) - value = 0x3ff; - packet[i+1] = value & 0xff; - upperbits |= (value >> 8) << (i * 2); - } - packet[13] = upperbits & 0xff; - packet[14] = (upperbits >> 8) & 0xff; - packet[15] = (upperbits >> 16) & 0xff; -} - -static void J6Pro_cyrf_init() -{ - /* Initialise CYRF chip */ - CYRF_WriteRegister(CYRF_28_CLK_EN, 0x02); - CYRF_WriteRegister(CYRF_32_AUTO_CAL_TIME, 0x3c); - CYRF_WriteRegister(CYRF_35_AUTOCAL_OFFSET, 0x14); - CYRF_WriteRegister(CYRF_1C_TX_OFFSET_MSB, 0x05); - CYRF_WriteRegister(CYRF_1B_TX_OFFSET_LSB, 0x55); - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - CYRF_WriteRegister(CYRF_03_TX_CFG, 0x05 | CYRF_BIND_POWER); - CYRF_WriteRegister(CYRF_06_RX_CFG, 0x8a); - CYRF_WriteRegister(CYRF_03_TX_CFG, 0x28 | CYRF_BIND_POWER); - CYRF_WriteRegister(CYRF_12_DATA64_THOLD, 0x0e); - CYRF_WriteRegister(CYRF_10_FRAMING_CFG, 0xee); - CYRF_WriteRegister(CYRF_1F_TX_OVERRIDE, 0x00); - CYRF_WriteRegister(CYRF_1E_RX_OVERRIDE, 0x00); - CYRF_ConfigDataCode(data_code, 16); - CYRF_WritePreamble(0x023333); -} -static void J6Pro_cyrf_bindinit() -{ -/* Use when binding */ - //0.060470# 03 2f - CYRF_WriteRegister(CYRF_03_TX_CFG, 0x28 | 0x07); //Use max power for binding in case there is no telem module - - CYRF_ConfigRFChannel(0x52); - CYRF_ConfigSOPCode(bind_sop_code); - CYRF_ConfigCRCSeed(0x0000); - CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); - CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); - //0.061511# 13 20 - - CYRF_ConfigRFChannel(0x52); - //0.062684# 0f 05 - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - //0.062792# 0f 05 - CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40); - J6Pro_build_bind_packet(); //01 01 e9 49 ec a9 c4 c1 ff - //CYRF_WriteDataPacketLen(packet, 0x09); -} -static void J6Pro_cyrf_datainit() -{ -/* Use when already bound */ - //0.094007# 0f 05 - uint8_t sop_idx = (0xff & (cyrfmfg_id[0] + cyrfmfg_id[1] + cyrfmfg_id[2] + cyrfmfg_id[3] - cyrfmfg_id[5])) % 19; - uint16_t crc = (0xff & (cyrfmfg_id[1] - cyrfmfg_id[4] + cyrfmfg_id[5])) | - ((0xff & (cyrfmfg_id[2] + cyrfmfg_id[3] - cyrfmfg_id[4] + cyrfmfg_id[5])) << 8); - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - CYRF_ConfigSOPCode(J6Pro_sopcodes[sop_idx]); - CYRF_ConfigCRCSeed(crc); -} - -static void J6Pro_set_radio_channels() -{ - //FIXME: Query free channels - //lowest channel is 0x08, upper channel is 0x4d? - CYRF_FindBestChannels(radio_ch, 3, 5, 8, 77); - radio_ch[3] = radio_ch[0]; -} - -static uint16_t j6pro_cb() -{ - switch(stateJ6P) { - case J6PRO_BIND: - J6Pro_cyrf_bindinit(); - stateJ6P = J6PRO_BIND_01; - //no break because we want to send the 1st bind packet now - case J6PRO_BIND_01: - CYRF_ConfigRFChannel(0x52); - CYRF_SetTxRxMode(TX_EN); - //0.062684# 0f 05 - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - //0.062684# 0f 05 - CYRF_WriteDataPacketLen(packet, 0x09); - stateJ6P = J6PRO_BIND_03_START; - return 3000; //3msec - case J6PRO_BIND_03_START: - { - int i = 0; - while (! (CYRF_ReadRegister(0x04) & 0x06)) - if(++i > NUM_WAIT_LOOPS) - break; - } - CYRF_ConfigRFChannel(0x53); - CYRF_SetTxRxMode(RX_EN); - CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); - CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); - stateJ6P = J6PRO_BIND_03_CHECK; - return 30000; //30msec - case J6PRO_BIND_03_CHECK: - { - uint8_t rx = CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS); - if((rx & 0x1a) == 0x1a) { - rx = CYRF_ReadRegister(CYRF_0A_RX_LENGTH); - if(rx == 0x0f) { - rx = CYRF_ReadRegister(CYRF_09_RX_COUNT); - if(rx == 0x0f) { - //Expected and actual length are both 15 - CYRF_ReadDataPacketLen(packet, rx); - if (packet[0] == 0x03 && - packet[3] == cyrfmfg_id[0] && - packet[4] == cyrfmfg_id[1] && - packet[5] == cyrfmfg_id[2] && - packet[6] == cyrfmfg_id[3] && - packet[7] == cyrfmfg_id[4] && - packet[8] == cyrfmfg_id[5]) - { - //Send back Ack - packet[0] = 0x05; - CYRF_ConfigRFChannel(0x54); - CYRF_SetTxRxMode(TX_EN); - stateJ6P = J6PRO_BIND_05_1; - return 2000; //2msec - } - } - } - } - stateJ6P = J6PRO_BIND_01; - return 500; - } - case J6PRO_BIND_05_1: - case J6PRO_BIND_05_2: - case J6PRO_BIND_05_3: - case J6PRO_BIND_05_4: - case J6PRO_BIND_05_5: - case J6PRO_BIND_05_6: - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - CYRF_WriteDataPacketLen(packet, 0x0f); - stateJ6P = stateJ6P + 1; - return 4600; //4.6msec - case J6PRO_CHANSEL: - BIND_DONE; - J6Pro_set_radio_channels(); - J6Pro_cyrf_datainit(); - stateJ6P = J6PRO_CHAN_1; - case J6PRO_CHAN_1: - //Keep transmit power updated - CYRF_SetPower(CYRF_HIGH_POWER); - J6Pro_build_data_packet(); - //return 3400; - case J6PRO_CHAN_2: - //return 3500; - case J6PRO_CHAN_3: - //return 3750 - case J6PRO_CHAN_4: - CYRF_ConfigRFChannel(radio_ch[stateJ6P - J6PRO_CHAN_1]); - CYRF_SetTxRxMode(TX_EN); - CYRF_WriteDataPacket(packet); - if (stateJ6P == J6PRO_CHAN_4) { - stateJ6P = J6PRO_CHAN_1; - return 13900; - } - stateJ6P = stateJ6P + 1; - return 3550; - } - return 0; -} - -static uint16_t j6pro_setup() -{ - CYRF_Reset(); - J6Pro_cyrf_init(); - num_channels = 8; - if (IS_AUTOBIND_FLAG_on) { - stateJ6P = J6PRO_BIND; - BIND_IN_PROGRESS; - } else { - stateJ6P = J6PRO_CHANSEL; - } - return 2400; -} -#endif diff --git a/Multiprotocol/Cc2500_skyartec.ino b/Multiprotocol/Cc2500_skyartec.ino index 7f3a932..e54abb3 100644 --- a/Multiprotocol/Cc2500_skyartec.ino +++ b/Multiprotocol/Cc2500_skyartec.ino @@ -37,53 +37,53 @@ enum { static void skyartec_init() { CC2500_Reset(); - cc2500_writeReg(CC2500_16_MCSM2, 0x07); - cc2500_writeReg(CC2500_17_MCSM1, 0x30); - cc2500_writeReg(CC2500_1E_WOREVT1, 0x87); - cc2500_writeReg(CC2500_1F_WOREVT0, 0x6b); - cc2500_writeReg(CC2500_20_WORCTRL, 0xf8); - cc2500_writeReg(CC2500_2A_PTEST, 0x7f); - cc2500_writeReg(CC2500_2B_AGCTEST, 0x3f); - cc2500_writeReg(CC2500_0B_FSCTRL1, 0x09); - cc2500_writeReg(CC2500_0C_FSCTRL0, 0x00); - cc2500_writeReg(CC2500_0D_FREQ2, 0x5d); - cc2500_writeReg(CC2500_0E_FREQ1, 0x93); - cc2500_writeReg(CC2500_0F_FREQ0, 0xb1); - cc2500_writeReg(CC2500_10_MDMCFG4, 0x2d); - cc2500_writeReg(CC2500_11_MDMCFG3, 0x20); - cc2500_writeReg(CC2500_12_MDMCFG2, 0x73); - cc2500_writeReg(CC2500_13_MDMCFG1, 0x22); - cc2500_writeReg(CC2500_14_MDMCFG0, 0xf8); - cc2500_writeReg(CC2500_0A_CHANNR, 0xcd); - cc2500_writeReg(CC2500_15_DEVIATN, 0x50); - cc2500_writeReg(CC2500_21_FREND1, 0xb6); - cc2500_writeReg(CC2500_22_FREND0, 0x10); - cc2500_writeReg(CC2500_18_MCSM0, 0x18); - cc2500_writeReg(CC2500_19_FOCCFG, 0x1d); - cc2500_writeReg(CC2500_1A_BSCFG, 0x1c); - cc2500_writeReg(CC2500_1B_AGCCTRL2, 0xc7); - cc2500_writeReg(CC2500_1C_AGCCTRL1, 0x00); - cc2500_writeReg(CC2500_1D_AGCCTRL0, 0xb2); - cc2500_writeReg(CC2500_23_FSCAL3, 0xea); - cc2500_writeReg(CC2500_24_FSCAL2, 0x0a); - cc2500_writeReg(CC2500_25_FSCAL1, 0x00); - cc2500_writeReg(CC2500_26_FSCAL0, 0x11); - cc2500_writeReg(CC2500_29_FSTEST, 0x59); - cc2500_writeReg(CC2500_2C_TEST2, 0x88); - cc2500_writeReg(CC2500_2D_TEST1, 0x31); - cc2500_writeReg(CC2500_2E_TEST0, 0x0b); - cc2500_writeReg(CC2500_07_PKTCTRL1, 0x05); - cc2500_writeReg(CC2500_08_PKTCTRL0, 0x05); - cc2500_writeReg(CC2500_09_ADDR, 0x43); - cc2500_writeReg(CC2500_06_PKTLEN, 0xff); - cc2500_writeReg(CC2500_04_SYNC1, 0x13); - cc2500_writeReg(CC2500_05_SYNC0, 0x18); + CC2500_WriteReg(CC2500_16_MCSM2, 0x07); + CC2500_WriteReg(CC2500_17_MCSM1, 0x30); + CC2500_WriteReg(CC2500_1E_WOREVT1, 0x87); + CC2500_WriteReg(CC2500_1F_WOREVT0, 0x6b); + CC2500_WriteReg(CC2500_20_WORCTRL, 0xf8); + CC2500_WriteReg(CC2500_2A_PTEST, 0x7f); + CC2500_WriteReg(CC2500_2B_AGCTEST, 0x3f); + CC2500_WriteReg(CC2500_0B_FSCTRL1, 0x09); + CC2500_WriteReg(CC2500_0C_FSCTRL0, 0x00); + CC2500_WriteReg(CC2500_0D_FREQ2, 0x5d); + CC2500_WriteReg(CC2500_0E_FREQ1, 0x93); + CC2500_WriteReg(CC2500_0F_FREQ0, 0xb1); + CC2500_WriteReg(CC2500_10_MDMCFG4, 0x2d); + CC2500_WriteReg(CC2500_11_MDMCFG3, 0x20); + CC2500_WriteReg(CC2500_12_MDMCFG2, 0x73); + CC2500_WriteReg(CC2500_13_MDMCFG1, 0x22); + CC2500_WriteReg(CC2500_14_MDMCFG0, 0xf8); + CC2500_WriteReg(CC2500_0A_CHANNR, 0xcd); + CC2500_WriteReg(CC2500_15_DEVIATN, 0x50); + CC2500_WriteReg(CC2500_21_FREND1, 0xb6); + CC2500_WriteReg(CC2500_22_FREND0, 0x10); + CC2500_WriteReg(CC2500_18_MCSM0, 0x18); + CC2500_WriteReg(CC2500_19_FOCCFG, 0x1d); + CC2500_WriteReg(CC2500_1A_BSCFG, 0x1c); + CC2500_WriteReg(CC2500_1B_AGCCTRL2, 0xc7); + CC2500_WriteReg(CC2500_1C_AGCCTRL1, 0x00); + CC2500_WriteReg(CC2500_1D_AGCCTRL0, 0xb2); + CC2500_WriteReg(CC2500_23_FSCAL3, 0xea); + CC2500_WriteReg(CC2500_24_FSCAL2, 0x0a); + CC2500_WriteReg(CC2500_25_FSCAL1, 0x00); + CC2500_WriteReg(CC2500_26_FSCAL0, 0x11); + CC2500_WriteReg(CC2500_29_FSTEST, 0x59); + CC2500_WriteReg(CC2500_2C_TEST2, 0x88); + CC2500_WriteReg(CC2500_2D_TEST1, 0x31); + CC2500_WriteReg(CC2500_2E_TEST0, 0x0b); + CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); + CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); + CC2500_WriteReg(CC2500_09_ADDR, 0x43); + CC2500_WriteReg(CC2500_06_PKTLEN, 0xff); + CC2500_WriteReg(CC2500_04_SYNC1, 0x13); + CC2500_WriteReg(CC2500_05_SYNC0, 0x18); CC2500_SetTxRxMode(TX_EN); CC2500_SetPower(); - cc2500_strobe(CC2500_SFTX); - cc2500_strobe(CC2500_SFRX); - cc2500_strobe(CC2500_SXOFF); - cc2500_strobe(CC2500_SIDLE); + CC2500_Strobe(CC2500_SFTX); + CC2500_Strobe(CC2500_SFRX); + CC2500_Strobe(CC2500_SXOFF); + CC2500_Strobe(CC2500_SIDLE); } static void add_pkt_suffix() { @@ -104,7 +104,7 @@ static void send_data_packet() { packet[1] = TX_ADDR; //Tx Addr? packet[2] = 0x01; //??? for(int i = 0; i < 7; i++) { - uint32_t value = (uint32_t)Servo_data[i] * 0x280 / PPM_MAX + 0x280; + uint32_t value = map(limit_channel_100(i),servo_min_100,servo_max_100,0,1280); if(value < 0) { value = 0; } if(value > 0x500) { value = 0x500; } packet[3+2*i] = value >> 8; @@ -112,11 +112,11 @@ static void send_data_packet() { } add_pkt_suffix(); //for(int i = 0; i < 20; i++) printf("%02x ", packet[i]); printf("\n"); - cc2500_writeReg(CC2500_04_SYNC1, ((binding_idx >> 0) & 0xff)); - cc2500_writeReg(CC2500_05_SYNC0, ((binding_idx >> 8) & 0xff)); - cc2500_writeReg(CC2500_09_ADDR, TX_ADDR); - cc2500_writeReg(CC2500_0A_CHANNR, TX_CHANNEL); - cc2500_writeFifo(packet, 20); + CC2500_WriteReg(CC2500_04_SYNC1, ((binding_idx >> 0) & 0xff)); + CC2500_WriteReg(CC2500_05_SYNC0, ((binding_idx >> 8) & 0xff)); + CC2500_WriteReg(CC2500_09_ADDR, TX_ADDR); + CC2500_WriteReg(CC2500_0A_CHANNR, TX_CHANNEL); + CC2500_WriteData(packet, 20); } static void send_bind_packet() { @@ -135,16 +135,16 @@ static void send_bind_packet() { uint8_t xore = 0; for(int i = 3; i < 11; i++) { xore ^= packet[i]; } packet[11] = xore; - cc2500_writeReg(CC2500_04_SYNC1, 0x7d); - cc2500_writeReg(CC2500_05_SYNC0, 0x7d); - cc2500_writeReg(CC2500_09_ADDR, 0x7d); - cc2500_writeReg(CC2500_0A_CHANNR, 0x7d); - cc2500_writeFifo(packet, 12); + CC2500_WriteReg(CC2500_04_SYNC1, 0x7d); + CC2500_WriteReg(CC2500_05_SYNC0, 0x7d); + CC2500_WriteReg(CC2500_09_ADDR, 0x7d); + CC2500_WriteReg(CC2500_0A_CHANNR, 0x7d); + CC2500_WriteData(packet, 12); } static uint16_t skyartec_cb() { if (state & 0x01) { - cc2500_strobe(CC2500_SIDLE); + CC2500_Strobe(CC2500_SIDLE); if (state == SKYARTEC_LAST) { CC2500_SetPower(); state = SKYARTEC_PKT1; } else { state++; } return 3000; diff --git a/Multiprotocol/DSM2_cyrf6936.ino b/Multiprotocol/DSM2_cyrf6936.ino deleted file mode 100644 index 19a969e..0000000 --- a/Multiprotocol/DSM2_cyrf6936.ino +++ /dev/null @@ -1,538 +0,0 @@ -/* - 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(DSM2_CYRF6936_INO) - -#include "iface_cyrf6936.h" - -#define RANDOM_CHANNELS 0 // disabled -//#define RANDOM_CHANNELS 1 // enabled -#define BIND_CHANNEL 0x0d //13 This can be any odd channel -#define NUM_WAIT_LOOPS (100 / 5) //each loop is ~5us. Do not wait more than 100us - -//During binding we will send BIND_COUNT/2 packets -//One packet each 10msec -#define BIND_COUNT1 600 - -enum { - DSM2_BIND = 0, - DSM2_CHANSEL = BIND_COUNT1 + 0, - DSM2_CH1_WRITE_A = BIND_COUNT1 + 1, - DSM2_CH1_CHECK_A = BIND_COUNT1 + 2, - DSM2_CH2_WRITE_A = BIND_COUNT1 + 3, - DSM2_CH2_CHECK_A = BIND_COUNT1 + 4, - DSM2_CH2_READ_A = BIND_COUNT1 + 5, - DSM2_CH1_WRITE_B = BIND_COUNT1 + 6, - DSM2_CH1_CHECK_B = BIND_COUNT1 + 7, - DSM2_CH2_WRITE_B = BIND_COUNT1 + 8, - DSM2_CH2_CHECK_B = BIND_COUNT1 + 9, - DSM2_CH2_READ_B = BIND_COUNT1 + 10, -}; - -const uint8_t PROGMEM pncodes[5][9][8] = { - /* Note these are in order transmitted (LSB 1st) */ - { /* Row 0 */ - /* Col 0 */ {0x03, 0xBC, 0x6E, 0x8A, 0xEF, 0xBD, 0xFE, 0xF8}, - /* Col 1 */ {0x88, 0x17, 0x13, 0x3B, 0x2D, 0xBF, 0x06, 0xD6}, - /* Col 2 */ {0xF1, 0x94, 0x30, 0x21, 0xA1, 0x1C, 0x88, 0xA9}, - /* Col 3 */ {0xD0, 0xD2, 0x8E, 0xBC, 0x82, 0x2F, 0xE3, 0xB4}, - /* Col 4 */ {0x8C, 0xFA, 0x47, 0x9B, 0x83, 0xA5, 0x66, 0xD0}, - /* Col 5 */ {0x07, 0xBD, 0x9F, 0x26, 0xC8, 0x31, 0x0F, 0xB8}, - /* Col 6 */ {0xEF, 0x03, 0x95, 0x89, 0xB4, 0x71, 0x61, 0x9D}, - /* Col 7 */ {0x40, 0xBA, 0x97, 0xD5, 0x86, 0x4F, 0xCC, 0xD1}, - /* Col 8 */ {0xD7, 0xA1, 0x54, 0xB1, 0x5E, 0x89, 0xAE, 0x86} - }, - { /* Row 1 */ - /* Col 0 */ {0x83, 0xF7, 0xA8, 0x2D, 0x7A, 0x44, 0x64, 0xD3}, - /* Col 1 */ {0x3F, 0x2C, 0x4E, 0xAA, 0x71, 0x48, 0x7A, 0xC9}, - /* Col 2 */ {0x17, 0xFF, 0x9E, 0x21, 0x36, 0x90, 0xC7, 0x82}, - /* Col 3 */ {0xBC, 0x5D, 0x9A, 0x5B, 0xEE, 0x7F, 0x42, 0xEB}, - /* Col 4 */ {0x24, 0xF5, 0xDD, 0xF8, 0x7A, 0x77, 0x74, 0xE7}, - /* Col 5 */ {0x3D, 0x70, 0x7C, 0x94, 0xDC, 0x84, 0xAD, 0x95}, - /* Col 6 */ {0x1E, 0x6A, 0xF0, 0x37, 0x52, 0x7B, 0x11, 0xD4}, - /* Col 7 */ {0x62, 0xF5, 0x2B, 0xAA, 0xFC, 0x33, 0xBF, 0xAF}, - /* Col 8 */ {0x40, 0x56, 0x32, 0xD9, 0x0F, 0xD9, 0x5D, 0x97} - }, - { /* Row 2 */ - /* Col 0 */ {0x40, 0x56, 0x32, 0xD9, 0x0F, 0xD9, 0x5D, 0x97}, - /* Col 1 */ {0x8E, 0x4A, 0xD0, 0xA9, 0xA7, 0xFF, 0x20, 0xCA}, - /* Col 2 */ {0x4C, 0x97, 0x9D, 0xBF, 0xB8, 0x3D, 0xB5, 0xBE}, - /* Col 3 */ {0x0C, 0x5D, 0x24, 0x30, 0x9F, 0xCA, 0x6D, 0xBD}, - /* Col 4 */ {0x50, 0x14, 0x33, 0xDE, 0xF1, 0x78, 0x95, 0xAD}, - /* Col 5 */ {0x0C, 0x3C, 0xFA, 0xF9, 0xF0, 0xF2, 0x10, 0xC9}, - /* Col 6 */ {0xF4, 0xDA, 0x06, 0xDB, 0xBF, 0x4E, 0x6F, 0xB3}, - /* Col 7 */ {0x9E, 0x08, 0xD1, 0xAE, 0x59, 0x5E, 0xE8, 0xF0}, - /* Col 8 */ {0xC0, 0x90, 0x8F, 0xBB, 0x7C, 0x8E, 0x2B, 0x8E} - }, - { /* Row 3 */ - /* Col 0 */ {0xC0, 0x90, 0x8F, 0xBB, 0x7C, 0x8E, 0x2B, 0x8E}, - /* Col 1 */ {0x80, 0x69, 0x26, 0x80, 0x08, 0xF8, 0x49, 0xE7}, - /* Col 2 */ {0x7D, 0x2D, 0x49, 0x54, 0xD0, 0x80, 0x40, 0xC1}, - /* Col 3 */ {0xB6, 0xF2, 0xE6, 0x1B, 0x80, 0x5A, 0x36, 0xB4}, - /* Col 4 */ {0x42, 0xAE, 0x9C, 0x1C, 0xDA, 0x67, 0x05, 0xF6}, - /* Col 5 */ {0x9B, 0x75, 0xF7, 0xE0, 0x14, 0x8D, 0xB5, 0x80}, - /* Col 6 */ {0xBF, 0x54, 0x98, 0xB9, 0xB7, 0x30, 0x5A, 0x88}, - /* Col 7 */ {0x35, 0xD1, 0xFC, 0x97, 0x23, 0xD4, 0xC9, 0x88}, - /* Col 8 */ {0x88, 0xE1, 0xD6, 0x31, 0x26, 0x5F, 0xBD, 0x40} - }, - { /* Row 4 */ - /* Col 0 */ {0xE1, 0xD6, 0x31, 0x26, 0x5F, 0xBD, 0x40, 0x93}, - /* Col 1 */ {0xDC, 0x68, 0x08, 0x99, 0x97, 0xAE, 0xAF, 0x8C}, - /* Col 2 */ {0xC3, 0x0E, 0x01, 0x16, 0x0E, 0x32, 0x06, 0xBA}, - /* Col 3 */ {0xE0, 0x83, 0x01, 0xFA, 0xAB, 0x3E, 0x8F, 0xAC}, - /* Col 4 */ {0x5C, 0xD5, 0x9C, 0xB8, 0x46, 0x9C, 0x7D, 0x84}, - /* Col 5 */ {0xF1, 0xC6, 0xFE, 0x5C, 0x9D, 0xA5, 0x4F, 0xB7}, - /* Col 6 */ {0x58, 0xB5, 0xB3, 0xDD, 0x0E, 0x28, 0xF1, 0xB0}, - /* Col 7 */ {0x5F, 0x30, 0x3B, 0x56, 0x96, 0x45, 0xF4, 0xA1}, - /* Col 8 */ {0x03, 0xBC, 0x6E, 0x8A, 0xEF, 0xBD, 0xFE, 0xF8} - }, -}; - -static void __attribute__((unused)) read_code(uint8_t *buf, uint8_t row, uint8_t col, uint8_t len) -{ - for(uint8_t i=0;i> 8; - packet[1] = crc & 0xff; - packet[2] = 0xff ^ cyrfmfg_id[2]; - packet[3] = (0xff ^ cyrfmfg_id[3]) + RX_num; - packet[4] = packet[0]; - packet[5] = packet[1]; - packet[6] = packet[2]; - packet[7] = packet[3]; - for(i = 0; i < 8; i++) - sum += packet[i]; - packet[8] = sum >> 8; - packet[9] = sum & 0xff; - packet[10] = 0x01; //??? - packet[11] = option>3?option:option+4; - if(sub_protocol==DSMX) //DSMX type - packet[12] = 0xb2; // Telemetry off: packet[12] = num_channels < 8 && Model.proto_opts[PROTOOPTS_TELEMETRY] == TELEM_OFF ? 0xa2 : 0xb2; - else - packet[12] = option<8?0x01:0x02; - packet[13] = 0x00; //??? - for(i = 8; i < 14; i++) - sum += packet[i]; - packet[14] = sum >> 8; - packet[15] = sum & 0xff; -} - -static uint8_t __attribute__((unused)) PROTOCOL_SticksMoved(uint8_t init) -{ -#define STICK_MOVEMENT 15*(PPM_MAX-PPM_MIN)/100 // defines when the bind dialog should be interrupted (stick movement STICK_MOVEMENT %) - static uint16_t ele_start, ail_start; - uint16_t ele = Servo_data[ELEVATOR];//CHAN_ReadInput(MIXER_MapChannel(INP_ELEVATOR)); - uint16_t ail = Servo_data[AILERON];//CHAN_ReadInput(MIXER_MapChannel(INP_AILERON)); - if(init) { - ele_start = ele; - ail_start = ail; - return 0; - } - uint16_t ele_diff = ele_start - ele;//abs(ele_start - ele); - uint16_t ail_diff = ail_start - ail;//abs(ail_start - ail); - return ((ele_diff + ail_diff) > STICK_MOVEMENT);// -} - -static void __attribute__((unused)) build_data_packet(uint8_t upper)// -{ - uint8_t i; - uint8_t bits; - - uint8_t ch_map[] = {3, 2, 1, 5, 0, 4, 6, 7, 8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //9 Channels - DM9 TX - switch(option>3?option:option+4) // Create channel map based on number of channels - { - case 12: - ch_map[11]=11; // 12 channels - case 11: - ch_map[10]=10; // 11 channels - case 10: - ch_map[9]=9; // 10 channels - break; - case 8: - memcpy(ch_map,"\x01\x05\x02\x03\x06\xFF\xFF\x04\x00\x07",10); // 8 channels - DX8 TX - break; - case 7: - memcpy(ch_map,"\x01\x05\x02\x04\x03\x06\x00",7); // 7 channels - DX6i TX - break; - case 6: - memcpy(ch_map,"\x01\x05\x02\x03\x00\x04\xFF",7); // 6 channels - HP6DSM TX - break; - case 4: - case 5: - memcpy(ch_map,"\x00\x01\x02\x03\xFF\xFF\xFF",7); // 4 channels - Guess - if(option&0x01) - ch_map[4]=4; // 5 channels - Guess - break; - } - // - if( binding && PROTOCOL_SticksMoved(0) ) - binding = 0; - if (sub_protocol==DSMX) - { - packet[0] = cyrfmfg_id[2]; - packet[1] = cyrfmfg_id[3] + RX_num; - bits=11; - } - else - { - packet[0] = (0xff ^ cyrfmfg_id[2]); - packet[1] = (0xff ^ cyrfmfg_id[3]) + RX_num; - bits=10; - } - // - uint16_t max = 1 << bits;//max=2048 for DSMX & 1024 for DSM2 less than 8 ch and 2048 otherwise - //uint16_t pct_100 = (uint32_t)max * 100 / 150;//682 1024*100/150 - // - for (i = 0; i < 7; i++) - { - uint8_t idx = ch_map[upper * 7 + i];//1,5,2,3,0,4 - uint16_t value; - if (idx == 0xff) - value = 0xffff; - else - { - if (binding) - { // Failsafe position during binding - value=max/2; //all channels to middle - if(idx==0) - value=1; //except throttle - } - else - { - switch(idx) - { - case 0: - value=Servo_data[THROTTLE];//85.75-938.25=125%//171-853=100% - break; - case 1: - value=Servo_data[AILERON]; - break; - case 2: - value=Servo_data[ELEVATOR]; - break; - case 3: - value=Servo_data[RUDDER]; - break; - case 4: - value=Servo_data[AUX1]; - break; - case 5: - value=Servo_data[AUX2]; - break; - case 6: - value=Servo_data[AUX3]; - break; - case 7: - value=Servo_data[AUX4]; - break; - } - value=map(value,PPM_MIN,PPM_MAX,0,max-1); - } - value |= (upper && i == 0 ? 0x8000 : 0) | (idx << bits); - } - packet[i*2+2] = (value >> 8) & 0xff; - packet[i*2+3] = (value >> 0) & 0xff; - } -} - -static uint8_t __attribute__((unused)) get_pn_row(uint8_t channel) -{ - return (sub_protocol == DSMX ? (channel - 2) % 5 : channel % 5); -} - -const uint8_t init_vals[][2] = { - {CYRF_02_TX_CTRL, 0x00}, - {CYRF_05_RX_CTRL, 0x00}, - {CYRF_28_CLK_EN, 0x02}, - {CYRF_32_AUTO_CAL_TIME, 0x3c}, - {CYRF_35_AUTOCAL_OFFSET, 0x14}, - {CYRF_06_RX_CFG, 0x4A}, - {CYRF_1B_TX_OFFSET_LSB, 0x55}, - {CYRF_1C_TX_OFFSET_MSB, 0x05}, - {CYRF_0F_XACT_CFG, 0x24}, // Force Idle - {CYRF_03_TX_CFG, 0x38 | CYRF_BIND_POWER}, //Set 64chip, SDR mode - {CYRF_12_DATA64_THOLD, 0x0a}, - {CYRF_0F_XACT_CFG, 0x04}, // Idle - {CYRF_39_ANALOG_CTRL, 0x01}, - {CYRF_0F_XACT_CFG, 0x24}, //Force IDLE - {CYRF_29_RX_ABORT, 0x00}, //Clear RX abort - {CYRF_12_DATA64_THOLD, 0x0a}, //set pn correlation threshold - {CYRF_10_FRAMING_CFG, 0x4a}, //set sop len and threshold - {CYRF_29_RX_ABORT, 0x0f}, //Clear RX abort? - {CYRF_03_TX_CFG, 0x38 | CYRF_BIND_POWER}, //Set 64chip, SDR mode - {CYRF_10_FRAMING_CFG, 0x4a}, //set sop len and threshold - {CYRF_1F_TX_OVERRIDE, 0x04}, //disable tx CRC - {CYRF_1E_RX_OVERRIDE, 0x14}, //disable rx crc - {CYRF_14_EOP_CTRL, 0x02}, //set EOP sync == 2 - {CYRF_01_TX_LENGTH, 0x10}, //16byte packet -}; - -static void __attribute__((unused)) cyrf_config() -{ - for(uint8_t i = 0; i < sizeof(init_vals) / 2; i++) - CYRF_WriteRegister(init_vals[i][0], init_vals[i][1]); - CYRF_WritePreamble(0x333304); - CYRF_ConfigRFChannel(0x61); -} - -static void __attribute__((unused)) initialize_bind_state() -{ - uint8_t code[32]; - - CYRF_ConfigRFChannel(BIND_CHANNEL); //This seems to be random? - uint8_t pn_row = get_pn_row(BIND_CHANNEL); - //printf("Ch: %d Row: %d SOP: %d Data: %d\n", BIND_CHANNEL, pn_row, sop_col, data_col); - CYRF_ConfigCRCSeed(crc); - - read_code(code,pn_row,sop_col,8); - CYRF_ConfigSOPCode(code); - read_code(code,pn_row,data_col,16); - read_code(code+16,0,8,8); - memcpy(code + 24, "\xc6\x94\x22\xfe\x48\xe6\x57\x4e", 8); - CYRF_ConfigDataCode(code, 32); - - build_bind_packet(); -} - -const uint8_t data_vals[][2] = { - {CYRF_05_RX_CTRL, 0x83}, //Initialize for reading RSSI - {CYRF_29_RX_ABORT, 0x20}, - {CYRF_0F_XACT_CFG, 0x24}, - {CYRF_29_RX_ABORT, 0x00}, - {CYRF_03_TX_CFG, 0x08 | CYRF_HIGH_POWER}, - {CYRF_10_FRAMING_CFG, 0xea}, - {CYRF_1F_TX_OVERRIDE, 0x00}, - {CYRF_1E_RX_OVERRIDE, 0x00}, - {CYRF_03_TX_CFG, 0x28 | CYRF_HIGH_POWER}, - {CYRF_12_DATA64_THOLD, 0x3f}, - {CYRF_10_FRAMING_CFG, 0xff}, - {CYRF_0F_XACT_CFG, 0x24}, //Switch from reading RSSI to Writing - {CYRF_29_RX_ABORT, 0x00}, - {CYRF_12_DATA64_THOLD, 0x0a}, - {CYRF_10_FRAMING_CFG, 0xea}, -}; - -static void __attribute__((unused)) cyrf_configdata() -{ - for(uint8_t i = 0; i < sizeof(data_vals) / 2; i++) - CYRF_WriteRegister(data_vals[i][0], data_vals[i][1]); -} - -static void __attribute__((unused)) set_sop_data_crc() -{ - uint8_t code[16]; - uint8_t pn_row = get_pn_row(hopping_frequency[chidx]); - //printf("Ch: %d Row: %d SOP: %d Data: %d\n", ch[chidx], pn_row, sop_col, data_col); - CYRF_ConfigRFChannel(hopping_frequency[chidx]); - CYRF_ConfigCRCSeed(crcidx ? ~crc : crc); - - read_code(code,pn_row,sop_col,8); - CYRF_ConfigSOPCode(code); - read_code(code,pn_row,data_col,16); - CYRF_ConfigDataCode(code, 16); - - if(sub_protocol == DSMX) - chidx = (chidx + 1) % 23; - else - chidx = (chidx + 1) % 2; - crcidx = !crcidx; -} - -static void __attribute__((unused)) calc_dsmx_channel() -{ - uint8_t idx = 0; - uint32_t id = ~(((uint32_t)cyrfmfg_id[0] << 24) | ((uint32_t)cyrfmfg_id[1] << 16) | ((uint32_t)cyrfmfg_id[2] << 8) | (cyrfmfg_id[3] << 0)); - uint32_t id_tmp = id; - while(idx < 23) - { - uint8_t i; - uint8_t count_3_27 = 0, count_28_51 = 0, count_52_76 = 0; - id_tmp = id_tmp * 0x0019660D + 0x3C6EF35F; // Randomization - uint8_t next_ch = ((id_tmp >> 8) % 0x49) + 3; // Use least-significant byte and must be larger than 3 - if (((next_ch ^ id) & 0x01 )== 0) - continue; - for (i = 0; i < idx; i++) - { - if(hopping_frequency[i] == next_ch) - break; - if(hopping_frequency[i] <= 27) - count_3_27++; - else - if (hopping_frequency[i] <= 51) - count_28_51++; - else - count_52_76++; - } - if (i != idx) - continue; - if ((next_ch < 28 && count_3_27 < 8) - ||(next_ch >= 28 && next_ch < 52 && count_28_51 < 7) - ||(next_ch >= 52 && count_52_76 < 8)) - hopping_frequency[idx++] = next_ch; - } -} - -uint16_t ReadDsm2() -{ -#define CH1_CH2_DELAY 4010 // Time between write of channel 1 and channel 2 -#define WRITE_DELAY 1650 // 1550 original, Time after write to verify write complete -#define READ_DELAY 400 // Time before write to check read state, and switch channels - uint8_t i = 0; - - switch(cyrf_state) - { - default: - //Binding - cyrf_state++; - if(cyrf_state & 1) - { - //Send packet on even states - //Note state has already incremented, - // so this is actually 'even' state - CYRF_WriteDataPacket(packet); - return 8500; - } - else - { - //Check status on odd states - CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS); - return 1500; - } - case DSM2_CHANSEL: - BIND_DONE; - //Select channels and configure for writing data - //CYRF_FindBestChannels(ch, 2, 10, 1, 79); - cyrf_configdata(); - CYRF_SetTxRxMode(TX_EN); - chidx = 0; - crcidx = 0; - cyrf_state = DSM2_CH1_WRITE_A; // in fact cyrf_state++ - set_sop_data_crc(); - return 10000; - case DSM2_CH1_WRITE_A: - case DSM2_CH1_WRITE_B: - build_data_packet(cyrf_state == DSM2_CH1_WRITE_B);//compare state and DSM2_CH1_WRITE_B return 0 or 1 - case DSM2_CH2_WRITE_A: - case DSM2_CH2_WRITE_B: - CYRF_WriteDataPacket(packet); - cyrf_state++; // change from WRITE to CHECK mode - return WRITE_DELAY; - case DSM2_CH1_CHECK_A: - case DSM2_CH1_CHECK_B: - while (! (CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)) - if(++i > NUM_WAIT_LOOPS) - break; - set_sop_data_crc(); - cyrf_state++; // change from CH1_CHECK to CH2_WRITE - return CH1_CH2_DELAY - WRITE_DELAY; - case DSM2_CH2_CHECK_A: - case DSM2_CH2_CHECK_B: - while (! (CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02)) - if(++i > NUM_WAIT_LOOPS) - break; - if (cyrf_state == DSM2_CH2_CHECK_A) - CYRF_SetPower(0x28); //Keep transmit power in sync - // No telemetry... - set_sop_data_crc(); - if (cyrf_state == DSM2_CH2_CHECK_A) - { - if(option < 8) - { - cyrf_state = DSM2_CH1_WRITE_A; // change from CH2_CHECK_A to CH1_WRITE_A (ie no upper) - if(option>3) - return 11000 - CH1_CH2_DELAY - WRITE_DELAY ; // force 11ms if option>3 ie 4,5,6,7 channels @11ms - else - return 22000 - CH1_CH2_DELAY - WRITE_DELAY ; // normal 22ms mode if option<=3 ie 4,5,6,7 channels @22ms - } - else - cyrf_state = DSM2_CH1_WRITE_B; // change from CH2_CHECK_A to CH1_WRITE_A (to transmit upper) - } - else - cyrf_state = DSM2_CH1_WRITE_A; // change from CH2_CHECK_B to CH1_WRITE_A (upper already transmitted so transmit lower) - return 11000 - CH1_CH2_DELAY - WRITE_DELAY; - } - return 0; -} - -uint16_t initDsm2() -{ - CYRF_Reset(); - CYRF_GetMfgData(cyrfmfg_id);// - - cyrf_config(); - - if (sub_protocol ==DSMX) - calc_dsmx_channel(); - else - { -#if RANDOM_CHANNELS == 1 - uint8_t tmpch[10]; - CYRF_FindBestChannels(tmpch, 10, 5, 3, 75); - // - randomSeed((uint32_t)analogRead(A6)<<10|analogRead(A7));//seed - uint8_t idx = random(0xfefefefe) % 10; - hopping_frequency[0] = tmpch[idx]; - while(1) - { - idx = random(0xfefefefe) % 10; - if (tmpch[idx] != hopping_frequency[0]) - break; - } - hopping_frequency[1] = tmpch[idx]; -#else - hopping_frequency[0] = (cyrfmfg_id[0] + cyrfmfg_id[2] + cyrfmfg_id[4]) % 39 + 1; - hopping_frequency[1] = (cyrfmfg_id[1] + cyrfmfg_id[3] + cyrfmfg_id[5]) % 40 + 40; -#endif - } - - ///} - crc = ~((cyrfmfg_id[0] << 8) + cyrfmfg_id[1]); //The crc for channel 'a' is NOT(mfgid[1] << 8 + mfgid[0]) - crcidx = 0;//The crc for channel 'b' is (mfgid[1] << 8 + mfgid[0]) - // - sop_col = (cyrfmfg_id[0] + cyrfmfg_id[1] + cyrfmfg_id[2] + 2) & 0x07;//Ok - data_col = 7 - sop_col;//ok - - CYRF_SetTxRxMode(TX_EN); - // - if(IS_AUTOBIND_FLAG_on) - { - cyrf_state = DSM2_BIND; - PROTOCOL_SticksMoved(1); //Initialize Stick position - initialize_bind_state(); - binding = 1; - } - else - { - cyrf_state = DSM2_CHANSEL;// - binding = 0; - } - return 10000; -} - -#endif diff --git a/Multiprotocol/Devo_cyrf6936.ino b/Multiprotocol/Devo_cyrf6936.ino index 91d752e..a677de9 100644 --- a/Multiprotocol/Devo_cyrf6936.ino +++ b/Multiprotocol/Devo_cyrf6936.ino @@ -43,31 +43,7 @@ enum { DEVO_BOUND_10, }; -<<<<<<< HEAD -const uint8_t sopcodes[][8] = { - /* Note these are in order transmitted (LSB 1st) */ - /* 0 */ {0x3C,0x37,0xCC,0x91,0xE2,0xF8,0xCC,0x91}, //0x91CCF8E291CC373C - /* 1 */ {0x9B,0xC5,0xA1,0x0F,0xAD,0x39,0xA2,0x0F}, //0x0FA239AD0FA1C59B - /* 2 */ {0xEF,0x64,0xB0,0x2A,0xD2,0x8F,0xB1,0x2A}, //0x2AB18FD22AB064EF - /* 3 */ {0x66,0xCD,0x7C,0x50,0xDD,0x26,0x7C,0x50}, //0x507C26DD507CCD66 - /* 4 */ {0x5C,0xE1,0xF6,0x44,0xAD,0x16,0xF6,0x44}, //0x44F616AD44F6E15C - /* 5 */ {0x5A,0xCC,0xAE,0x46,0xB6,0x31,0xAE,0x46}, //0x46AE31B646AECC5A - /* 6 */ {0xA1,0x78,0xDC,0x3C,0x9E,0x82,0xDC,0x3C}, //0x3CDC829E3CDC78A1 - /* 7 */ {0xB9,0x8E,0x19,0x74,0x6F,0x65,0x18,0x74}, //0x7418656F74198EB9 - /* 8 */ {0xDF,0xB1,0xC0,0x49,0x62,0xDF,0xC1,0x49}, //0x49C1DF6249C0B1DF - /* 9 */ {0x97,0xE5,0x14,0x72,0x7F,0x1A,0x14,0x72}, //0x72141A7F7214E597 -}; - -uint8_t txState; -uint8_t pkt_num; -uint8_t ch_idx; -uint8_t use_fixed_id; -uint8_t failsafe_pkt; - -static void __attribute__((unused)) scramble_pkt() -======= static void __attribute__((unused)) DEVO_scramble_pkt() ->>>>>>> refs/remotes/pascallanger/master { #ifdef NO_SCRAMBLE return; @@ -77,11 +53,7 @@ static void __attribute__((unused)) DEVO_scramble_pkt() #endif } -<<<<<<< HEAD -static void __attribute__((unused)) add_pkt_suffix() -======= static void __attribute__((unused)) DEVO_add_pkt_suffix() ->>>>>>> refs/remotes/pascallanger/master { uint8_t bind_state; #ifdef ENABLE_PPM @@ -119,11 +91,7 @@ static void __attribute__((unused)) DEVO_add_pkt_suffix() packet[15] = (MProtocol_id >> 16) & 0xff; } -<<<<<<< HEAD -static void __attribute__((unused)) build_beacon_pkt(uint8_t upper) -======= static void __attribute__((unused)) DEVO_build_beacon_pkt(uint8_t upper) ->>>>>>> refs/remotes/pascallanger/master { packet[0] = (DEVO_NUM_CHANNELS << 4) | 0x07; uint8_t max = 8; @@ -138,11 +106,7 @@ static void __attribute__((unused)) DEVO_build_beacon_pkt(uint8_t upper) DEVO_add_pkt_suffix(); } -<<<<<<< HEAD -static void __attribute__((unused)) build_bind_pkt() -======= static void __attribute__((unused)) DEVO_build_bind_pkt() ->>>>>>> refs/remotes/pascallanger/master { packet[0] = (DEVO_NUM_CHANNELS << 4) | 0x0a; packet[1] = bind_counter & 0xff; @@ -162,11 +126,7 @@ static void __attribute__((unused)) DEVO_build_bind_pkt() packet[15] ^= cyrfmfg_id[2]; } -<<<<<<< HEAD -static void __attribute__((unused)) build_data_pkt() -======= static void __attribute__((unused)) DEVO_build_data_pkt() ->>>>>>> refs/remotes/pascallanger/master { static uint8_t ch_idx=0; @@ -190,11 +150,7 @@ static void __attribute__((unused)) DEVO_build_data_pkt() DEVO_add_pkt_suffix(); } -<<<<<<< HEAD -static void __attribute__((unused)) cyrf_set_bound_sop_code() -======= static void __attribute__((unused)) DEVO_cyrf_set_bound_sop_code() ->>>>>>> refs/remotes/pascallanger/master { /* crc == 0 isn't allowed, so use 1 if the math results in 0 */ uint8_t crc = (cyrfmfg_id[0] + (cyrfmfg_id[1] >> 6) + cyrfmfg_id[2]); @@ -207,9 +163,6 @@ static void __attribute__((unused)) DEVO_cyrf_set_bound_sop_code() CYRF_SetPower(0x08); } -<<<<<<< HEAD -static void __attribute__((unused)) cyrf_init() -======= const uint8_t PROGMEM DEVO_init_vals[][2] = { { CYRF_1D_MODE_OVERRIDE, 0x38 }, { CYRF_03_TX_CFG, 0x08 }, @@ -233,18 +186,13 @@ const uint8_t PROGMEM DEVO_init_vals[][2] = { }; static void __attribute__((unused)) DEVO_cyrf_init() ->>>>>>> refs/remotes/pascallanger/master { /* Initialise CYRF chip */ for(uint8_t i = 0; i < sizeof(DEVO_init_vals) / 2; i++) CYRF_WriteRegister(pgm_read_byte( &DEVO_init_vals[i][0]), pgm_read_byte( &DEVO_init_vals[i][1]) ); } -<<<<<<< HEAD -static void __attribute__((unused)) set_radio_channels() -======= static void __attribute__((unused)) DEVO_set_radio_channels() ->>>>>>> refs/remotes/pascallanger/master { CYRF_FindBestChannels(hopping_frequency, 3, 4, 4, 80); hopping_frequency[3] = hopping_frequency[0]; @@ -337,35 +285,6 @@ uint16_t devo_callback() return 1200; } -<<<<<<< HEAD -/*static void __attribute__((unused)) devo_bind() -{ - fixed_id = Model_fixed_id; - bind_counter = DEVO_BIND_COUNT; - use_fixed_id = 1; - //PROTOCOL_SetBindState(0x1388 * 2400 / 1000); //msecs 12000ms -} - - -static void __attribute__((unused)) generate_fixed_id_bind(){ -if(BIND_0){ -//randomSeed((uint32_t)analogRead(A6)<<10|analogRead(A7));//seed -uint8_t txid[4]; -//Model_fixed_id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); -Model_fixed_id=0x332211; -txid[0]= (id &0xFF); -txid[1] = ((id >> 8) & 0xFF); -txid[2] = ((id >> 16) & 0xFF); -//txid[3] = ((id >> 24) & 0xFF); -eeprom_write_block((const void*)txid,(void*)40,3); -devo_bind(); -} -} -*/ - - -======= ->>>>>>> refs/remotes/pascallanger/master uint16_t DevoInit() { DEVO_cyrf_init(); diff --git a/Multiprotocol/FY326_nrf24l01.ino b/Multiprotocol/FY326_nrf24l01.ino index 670103f..fdb441d 100644 --- a/Multiprotocol/FY326_nrf24l01.ino +++ b/Multiprotocol/FY326_nrf24l01.ino @@ -15,26 +15,17 @@ // Last sync with hexfet new_protocols/fy326_nrf24l01.c dated 2015-07-29 #if defined(FY326_NRF24L01_INO) -<<<<<<< HEAD -======= - ->>>>>>> refs/remotes/pascallanger/master #include "iface_nrf24l01.h" #define FY326_INITIAL_WAIT 500 #define FY326_PACKET_PERIOD 1500 #define FY326_PACKET_CHKTIME 300 #define FY326_PACKET_SIZE 15 -<<<<<<< HEAD -#define FY326_BIND_COUNT 16 -======= #define FY326_BIND_COUNT 16 ->>>>>>> refs/remotes/pascallanger/master #define FY326_RF_BIND_CHANNEL 0x17 #define FY326_NUM_RF_CHANNELS 5 enum { -<<<<<<< HEAD FY326_INIT1 = 0, FY326_BIND1, FY326_BIND2, @@ -42,11 +33,6 @@ enum { FY319_INIT1, FY319_BIND1, FY319_BIND2, -======= - FY326_BIND1=0, - FY326_BIND2, - FY326_DATA ->>>>>>> refs/remotes/pascallanger/master }; #define rxid channel @@ -56,11 +42,7 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind) { packet[0] = rx_tx_addr[3]; if(bind) -<<<<<<< HEAD packet[1] = 0x55; -======= - packet[1] = 0x55; ->>>>>>> refs/remotes/pascallanger/master else packet[1] = GET_FLAG(Servo_AUX3, 0x80) // Headless | GET_FLAG(Servo_AUX2, 0x40) // RTH @@ -71,11 +53,10 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind) packet[3] = convert_channel_8b_scale(ELEVATOR, 0, 200); // elevator packet[4] = 200 - convert_channel_8b_scale(RUDDER, 0, 200); // rudder packet[5] = convert_channel_8b_scale(THROTTLE, 0, 200); // throttle -<<<<<<< HEAD if(sub_protocol == FY319) { - packet[6] = 255 - scale_channel(AILERON, 0, 255); - packet[7] = scale_channel(ELEVATOR, 0, 255); - packet[8] = 255 - scale_channel(RUDDER, 0, 255); + packet[6] = 255 - convert_channel_8b_scale(AILERON, 0, 255); + packet[7] = convert_channel_8b_scale(ELEVATOR, 0, 255); + packet[8] = 255 - convert_channel_8b_scale(RUDDER, 0, 255); } else { packet[6] = rx_tx_addr[0]; @@ -87,16 +68,6 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind) packet[11] = CHAN_TO_TRIM(packet[4]); // rudder_trim; packet[12] = 0; // throttle_trim; packet[13] = rxid; -======= - packet[6] = rx_tx_addr[0]; - packet[7] = rx_tx_addr[1]; - packet[8] = rx_tx_addr[2]; - packet[9] = CHAN_TO_TRIM(packet[2]); // aileron_trim; - packet[10] = CHAN_TO_TRIM(packet[3]); // elevator_trim; - packet[11] = CHAN_TO_TRIM(packet[4]); // rudder_trim; - packet[12] = 0; // throttle_trim; - packet[13] = rxid; ->>>>>>> refs/remotes/pascallanger/master packet[14] = rx_tx_addr[4]; if (bind) @@ -105,20 +76,12 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind) { NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++]); hopping_frequency_no %= FY326_NUM_RF_CHANNELS; -<<<<<<< HEAD } // clear packet status bits and TX FIFO NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); -======= - } - - // clear packet status bits and TX FIFO - NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); - NRF24L01_FlushTx(); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WritePayload(packet, FY326_PACKET_SIZE); @@ -127,18 +90,12 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind) static void __attribute__((unused)) FY326_init() { -<<<<<<< HEAD NRF24L01_Initialize(); NRF24L01_SetTxRxMode(TX_EN); if(sub_protocol == FY319) NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // Five-byte rx/tx address else NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address -======= - NRF24L01_Initialize(); - NRF24L01_SetTxRxMode(TX_EN); - NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t *)"\x15\x59\x23\xc6\x29", 5); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t *)"\x15\x59\x23\xc6\x29", 5); NRF24L01_FlushTx(); @@ -150,20 +107,14 @@ static void __attribute__((unused)) FY326_init() NRF24L01_WriteReg(NRF24L01_05_RF_CH, FY326_RF_BIND_CHANNEL); NRF24L01_SetBitrate(NRF24L01_BR_250K); NRF24L01_SetPower(); -<<<<<<< HEAD NRF24L01_Activate(0x73); -======= - - NRF24L01_Activate(0x73); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3f); NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x07); NRF24L01_Activate(0x73); } -<<<<<<< HEAD -uint16_t fy326_callback() +uint16_t FY326_callback() { uint8_t i; switch (phase) { @@ -171,19 +122,19 @@ uint16_t fy326_callback() NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_FlushRx(); NRF24L01_SetTxRxMode(RX_EN); - NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL); + NRF24L01_WriteReg(NRF24L01_05_RF_CH, FY326_RF_BIND_CHANNEL); phase = FY319_BIND1; BIND_IN_PROGRESS; - return FY326_CHKTIME; + return FY326_PACKET_CHKTIME; break; case FY319_BIND1: - if(NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) { - NRF24L01_ReadPayload(packet, FY326_SIZE); + if(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) { + NRF24L01_ReadPayload(packet, FY326_PACKET_SIZE); rxid = packet[13]; - packet[0] = txid[3]; + packet[0] = rx_tx_addr[3]; packet[1] = 0x80; - packet[14]= txid[4]; + packet[14]= rx_tx_addr[4]; bind_counter = FY326_BIND_COUNT; NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TX_EN); @@ -191,16 +142,16 @@ uint16_t fy326_callback() NRF24L01_FlushTx(); bind_counter = 255; for(i=2; i<6; i++) - packet[i] = rf_chans[0]; + packet[i] = hopping_frequency[0]; phase = FY319_BIND2; } - return FY326_CHKTIME; + return FY326_PACKET_CHKTIME; break; case FY319_BIND2: NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); - NRF24L01_WritePayload(packet, FY326_SIZE); + NRF24L01_WritePayload(packet, FY326_PACKET_SIZE); if(bind_counter == 250) packet[1] = 0x40; if(--bind_counter == 0) { @@ -212,12 +163,12 @@ uint16_t fy326_callback() case FY326_INIT1: bind_counter = FY326_BIND_COUNT; phase = FY326_BIND2; - send_packet(1); - return FY326_CHKTIME; + FY326_send_packet(1); + return FY326_PACKET_CHKTIME; break; case FY326_BIND1: - if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) + if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) { // RX fifo data ready NRF24L01_ReadPayload(packet, FY326_PACKET_SIZE); rxid = packet[13]; @@ -240,7 +191,7 @@ uint16_t fy326_callback() break; case FY326_BIND2: - if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS)) + if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)) { // TX data sent -> switch to RX mode NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_FlushRx(); @@ -255,55 +206,11 @@ uint16_t fy326_callback() FY326_send_packet(0); break; } -======= -uint16_t FY326_callback() -{ - switch (phase) - { - case FY326_BIND1: - if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) - { // RX fifo data ready - NRF24L01_ReadPayload(packet, FY326_PACKET_SIZE); - rxid = packet[13]; - rx_tx_addr[0] = 0xAA; - NRF24L01_SetTxRxMode(TXRX_OFF); - NRF24L01_SetTxRxMode(TX_EN); - BIND_DONE; - phase = FY326_DATA; - } - else - if (bind_counter-- == 0) - { - bind_counter = FY326_BIND_COUNT; - NRF24L01_SetTxRxMode(TXRX_OFF); - NRF24L01_SetTxRxMode(TX_EN); - FY326_send_packet(1); - phase = FY326_BIND2; - return FY326_PACKET_CHKTIME; - } - break; - case FY326_BIND2: - if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)) - { // TX data sent -> switch to RX mode - NRF24L01_SetTxRxMode(TXRX_OFF); - NRF24L01_FlushRx(); - NRF24L01_SetTxRxMode(RX_EN); - phase = FY326_BIND1; - } - else - return FY326_PACKET_CHKTIME; - break; - case FY326_DATA: - FY326_send_packet(0); - break; - } ->>>>>>> refs/remotes/pascallanger/master return FY326_PACKET_PERIOD; } static void __attribute__((unused)) FY326_initialize_txid() { -<<<<<<< HEAD if(sub_protocol == FY319) { hopping_frequency[0] = (rx_tx_addr[0]&0x0f) & ~0x80; hopping_frequency[1] = (rx_tx_addr[0] >> 4) & ~0x80; @@ -317,34 +224,19 @@ static void __attribute__((unused)) FY326_initialize_txid() hopping_frequency[3] = 0x30 + (rx_tx_addr[1] >> 4); hopping_frequency[4] = 0x40 + (rx_tx_addr[2] >> 4); } -======= - hopping_frequency[0] = (rx_tx_addr[0]&0x0f); - hopping_frequency[1] = 0x10 + (rx_tx_addr[0] >> 4); - hopping_frequency[2] = 0x20 + (rx_tx_addr[1]&0x0f); - hopping_frequency[3] = 0x30 + (rx_tx_addr[1] >> 4); - hopping_frequency[4] = 0x40 + (rx_tx_addr[2] >> 4); ->>>>>>> refs/remotes/pascallanger/master } uint16_t initFY326(void) { BIND_IN_PROGRESS; // autobind protocol -<<<<<<< HEAD - rxid = 0xaa; + rxid = 0xAA; bind_counter = 0; FY326_initialize_txid(); - fy326_init(); + FY326_init(); if(sub_protocol == FY319) phase = FY319_INIT1; else phase = FY326_INIT1; -======= - rxid = 0xAA; - bind_counter = 0; - FY326_initialize_txid(); - FY326_init(); - phase=FY326_BIND1; ->>>>>>> refs/remotes/pascallanger/master return FY326_INITIAL_WAIT; } diff --git a/Multiprotocol/FlySky_a7105.ino b/Multiprotocol/FlySky_a7105.ino index 1165aea..43ccffd 100644 --- a/Multiprotocol/FlySky_a7105.ino +++ b/Multiprotocol/FlySky_a7105.ino @@ -21,34 +21,6 @@ //FlySky constants & variables #define FLYSKY_BIND_COUNT 2500 -<<<<<<< HEAD -const uint8_t PROGMEM tx_channels[] = { - 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 -}; - -enum { - // flags going to byte 10 - FLAG_V9X9_VIDEO = 0x40, - FLAG_V9X9_CAMERA= 0x80, - // flags going to byte 12 - FLAG_V9X9_FLIP = 0x10, - FLAG_V9X9_LED = 0x20, -======= enum { // flags going to byte 10 FLAG_V9X9_VIDEO = 0x40, @@ -56,27 +28,26 @@ enum { // flags going to byte 12 FLAG_V9X9_FLIP = 0x10, FLAG_V9X9_LED = 0x20, ->>>>>>> refs/remotes/pascallanger/master }; enum { - // flags going to byte 13 - FLAG_V6X6_HLESS1= 0x80, - // flags going to byte 14 - FLAG_V6X6_VIDEO = 0x01, - FLAG_V6X6_YCAL = 0x02, - FLAG_V6X6_XCAL = 0x04, - FLAG_V6X6_RTH = 0x08, - FLAG_V6X6_CAMERA= 0x10, - FLAG_V6X6_HLESS2= 0x20, - FLAG_V6X6_LED = 0x40, - FLAG_V6X6_FLIP = 0x80, + // flags going to byte 13 + FLAG_V6X6_HLESS1= 0x80, + // flags going to byte 14 + FLAG_V6X6_VIDEO = 0x01, + FLAG_V6X6_YCAL = 0x02, + FLAG_V6X6_XCAL = 0x04, + FLAG_V6X6_RTH = 0x08, + FLAG_V6X6_CAMERA= 0x10, + FLAG_V6X6_HLESS2= 0x20, + FLAG_V6X6_LED = 0x40, + FLAG_V6X6_FLIP = 0x80, }; enum { - // flags going to byte 14 - FLAG_V912_TOPBTN= 0x40, - FLAG_V912_BTMBTN= 0x80, + // flags going to byte 14 + FLAG_V912_TOPBTN= 0x40, + FLAG_V912_BTMBTN= 0x80, }; const uint8_t PROGMEM V912_X17_SEQ[10] = { 0x14, 0x31, 0x40, 0x49, 0x49, // sometime first byte is 0x15 ? @@ -84,79 +55,6 @@ const uint8_t PROGMEM V912_X17_SEQ[10] = { 0x14, 0x31, 0x40, 0x49, 0x49, // static void __attribute__((unused)) flysky_apply_extension_flags() { -<<<<<<< HEAD - const uint8_t V912_X17_SEQ[10] = { 0x14, 0x31, 0x40, 0x49, 0x49, // sometime first byte is 0x15 ? - 0x49, 0x49, 0x49, 0x49, 0x49, }; - static uint8_t seq_counter; - switch(sub_protocol) - { - case V9X9: - if(Servo_AUX1) - packet[12] |= FLAG_V9X9_FLIP; - if(Servo_AUX2) - packet[12] |= FLAG_V9X9_LED; - if(Servo_AUX3) - packet[10] |= FLAG_V9X9_CAMERA; - if(Servo_AUX4) - packet[10] |= FLAG_V9X9_VIDEO; - break; - - case V6X6: - packet[13] = 0x03; // 3 = 100% rate (0=40%, 1=60%, 2=80%) - packet[14] = 0x00; - if(Servo_AUX1) - packet[14] |= FLAG_V6X6_FLIP; - if(Servo_AUX2) - packet[14] |= FLAG_V6X6_LED; - if(Servo_AUX3) - packet[14] |= FLAG_V6X6_CAMERA; - if(Servo_AUX4) - packet[14] |= FLAG_V6X6_VIDEO; - if(Servo_AUX5) - { - packet[13] |= FLAG_V6X6_HLESS1; - packet[14] |= FLAG_V6X6_HLESS2; - } - if(Servo_AUX6) //use option to manipulate these bytes - packet[14] |= FLAG_V6X6_RTH; - if(Servo_AUX7) - packet[14] |= FLAG_V6X6_XCAL; - if(Servo_AUX8) - packet[14] |= FLAG_V6X6_YCAL; - packet[15] = 0x10; // unknown - packet[16] = 0x10; // unknown - packet[17] = 0xAA; // unknown - packet[18] = 0xAA; // unknown - packet[19] = 0x60; // unknown, changes at irregular interval in stock TX - packet[20] = 0x02; // unknown - break; - - case V912: - seq_counter++; - if( seq_counter > 9) - seq_counter = 0; - packet[12] |= 0x20; // bit 6 is always set ? - packet[13] = 0x00; // unknown - packet[14] = 0x00; - if(Servo_AUX1) - packet[14] = FLAG_V912_BTMBTN; - if(Servo_AUX2) - packet[14] |= FLAG_V912_TOPBTN; - packet[15] = 0x27; // [15] and [16] apparently hold an analog channel with a value lower than 1000 - packet[16] = 0x03; // maybe it's there for a pitch channel for a CP copter ? - packet[17] = V912_X17_SEQ[seq_counter]; // not sure what [17] & [18] are for - if(seq_counter == 0) // V912 Rx does not even read those bytes... [17-20] - packet[18] = 0x02; - else - packet[18] = 0x00; - packet[19] = 0x00; // unknown - packet[20] = 0x00; // unknown - break; - - default: - break; - } -======= static uint8_t seq_counter; switch(sub_protocol) { @@ -226,78 +124,39 @@ static void __attribute__((unused)) flysky_apply_extension_flags() default: break; } ->>>>>>> refs/remotes/pascallanger/master } static void __attribute__((unused)) flysky_build_packet(uint8_t init) { uint8_t i; - //servodata timing range for flysky. - ////-100% =~ 0x03e8//=1000us(min) - //+100% =~ 0x07ca//=1994us(max) - //Center = 0x5d9//=1497us(center) - //channel order AIL;ELE;THR;RUD;AUX1;AUX2;AUX3;AUX4 + //servodata timing range for flysky. + ////-100% =~ 0x03e8//=1000us(min) + //+100% =~ 0x07ca//=1994us(max) + //Center = 0x5d9//=1497us(center) + //channel order AIL;ELE;THR;RUD;AUX1;AUX2;AUX3;AUX4 packet[0] = init ? 0xaa : 0x55; packet[1] = rx_tx_addr[3]; packet[2] = rx_tx_addr[2]; packet[3] = rx_tx_addr[1]; packet[4] = rx_tx_addr[0]; -<<<<<<< HEAD - const uint8_t ch[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4}; - for(i = 0; i < 8; i++) - { - packet[5+2*i]=lowByte(Servo_data[ch[i]]); //low byte of servo timing(1000-2000us) - packet[6+2*i]=highByte(Servo_data[ch[i]]); //high byte of servo timing(1000-2000us) - } -======= for(i = 0; i < 8; i++) { packet[5 + i*2]=Servo_data[CH_AETR[i]]&0xFF; //low byte of servo timing(1000-2000us) packet[6 + i*2]=(Servo_data[CH_AETR[i]]>>8)&0xFF; //high byte of servo timing(1000-2000us) } ->>>>>>> refs/remotes/pascallanger/master flysky_apply_extension_flags(); } uint16_t ReadFlySky() { if (bind_counter) - { + { flysky_build_packet(1); A7105_WriteData(21, 1); bind_counter--; if (! bind_counter) BIND_DONE; } -<<<<<<< HEAD - else - { - flysky_build_packet(0); - A7105_WriteData(21, pgm_read_byte_near(&tx_channels[chanrow*16+chancol])-chanoffset); - chancol = (chancol + 1) % 16; - if (! chancol) //Keep transmit power updated - A7105_SetPower(); - } - return 1460; -} - -uint16_t initFlySky() { - //A7105_Reset(); - A7105_Init(INIT_FLYSKY); //flysky_init(); - - if (rx_tx_addr[3] > 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] % 16; - chancol=0; - chanoffset=rx_tx_addr[3] / 16; - - - if(IS_AUTOBIND_FLAG_on) - bind_counter = FLYSKY_BIND_COUNT; - else - bind_counter = 0; - return 2400; -======= else { flysky_build_packet(0); @@ -352,7 +211,5 @@ uint16_t initFlySky() else bind_counter = 0; return 2400; ->>>>>>> refs/remotes/pascallanger/master } #endif - diff --git a/Multiprotocol/Flysky_afhds2a_a7105.ino b/Multiprotocol/Flysky_afhds2a_a7105.ino new file mode 100644 index 0000000..c83a582 --- /dev/null +++ b/Multiprotocol/Flysky_afhds2a_a7105.ino @@ -0,0 +1,317 @@ +// adaptation de https://github.com/goebish/deviation/blob/c5dd9fcc1441fc05fe9effa4c378886aeb3938d4/src/protocol/flysky_afhds2a_a7105.c +#ifdef AFHDS2A_A7105_INO + #define EEPROMadress 0 // rx ID 32bit + #define SERVO_HZ 0 //Frequency's servo 0=50 1=400 2=5 + + #define TXPACKET_SIZE 38 + #define RXPACKET_SIZE 37 + #define NUMFREQ 16 + #define TXID_SIZE 4 + #define RXID_SIZE 4 + + static uint8_t rxid[RXID_SIZE]; + static uint8_t packet_type; + static uint8_t bind_reply; + + + enum{ + PACKET_STICKS, + PACKET_SETTINGS, + PACKET_FAILSAFE, + }; + + enum{ + BIND1, + BIND2, + BIND3, + BIND4, + DATA1, + }; + enum { + PWM_IBUS = 0, + PPM_IBUS, + PWM_SBUS, + PPM_SBUS + }; + + + static void build_packet(uint8_t type) { + switch(type) { + case PACKET_STICKS: + packet[0] = 0x58; + memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[5], rxid, 4); + for(uint8_t ch=0; ch<14; ch++) { + packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF; + packet[10 + ch*2] = (Servo_data[CH_AETR[ch]]>>8)&0xFF; + } + packet[37] = 0x00; + break; + + case PACKET_SETTINGS: + packet[0] = 0xaa; + memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[5], rxid, 4); + packet[9] = 0xfd; + packet[10]= 0xff; + packet[11]= SERVO_HZ & 0xff; + packet[12]= (SERVO_HZ >> 8) & 0xff; + if(option == PPM_IBUS || option == PPM_SBUS) + packet[13] = 0x01; // PPM output enabled + else + packet[13] = 0x00; + packet[14]= 0x00; + for(uint8_t i=15; i<37; i++) + packet[i] = 0xff; + packet[18] = 0x05; // ? + packet[19] = 0xdc; // ? + packet[20] = 0x05; // ? + if(option == PWM_SBUS || option == PPM_SBUS) + packet[21] = 0xdd; // SBUS output enabled + else + packet[21] = 0xde; + packet[37] = 0x00; + break; + + case PACKET_FAILSAFE: + packet[0] = 0x56; + memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[5], rxid, 4); + for(uint8_t ch=0; ch<14; ch++) { + if(ch==0) { + // if(ch < Model.num_channels && (Model.limits[ch].flags & CH_FAILSAFE_EN)) { + uint32_t value = ((uint32_t)Servo_data[AUX11] + 100) * 5 + 1000; + packet[9 + ch*2] = value & 0xff; + packet[10+ ch*2] = (value >> 8) & 0xff; + } + else { + packet[9 + ch*2] = 0xff; + packet[10+ ch*2] = 0xff; + } + } + packet[37] = 0x00; + break; + } + } + + #if defined(TELEMETRY) + // telemetry sensors ID + enum{ + SENSOR_RX_VOLTAGE = 0x00, + SENSOR_RX_ERR_RATE = 0xfe, + SENSOR_RX_RSSI = 0xfc, + SENSOR_RX_NOISE = 0xfb, + SENSOR_RX_SNR = 0xfa, + }; + + static void update_telemetry() { + // AA | TXID | RXID | sensor id | sensor # | value 16 bit big endian | sensor id ...... + // max 7 sensors per packet + + for(uint8_t sensor=0; sensor<7; sensor++) { + uint8_t index = 9+(4*sensor); + switch(packet[index]) { + case SENSOR_RX_VOLTAGE: + v_lipo = packet[index+3]<<8 | packet[index+2]; + telemetry_link=1; + break; + case SENSOR_RX_ERR_RATE: + // packet[index+2]; + break; + case SENSOR_RX_RSSI: + RSSI_dBm = -packet[index+2]; + break; + case 0xff: + return; + default: + // unknown sensor ID + break; + } + } + } + #endif + + static void afhds2a_build_bind_packet() { + uint8_t ch; + memcpy( &packet[1], rx_tx_addr, 4); + memset( &packet[5], 0xff, 4); + packet[10]= 0x00; + for(ch=0; ch<16; ch++) { + packet[11+ch] = hopping_frequency[ch]; + } + memset( &packet[27], 0xff, 10); + packet[37] = 0x00; + switch(phase) { + case BIND1: + packet[0] = 0xbb; + packet[9] = 0x01; + break; + case BIND2: + case BIND3: + case BIND4: + packet[0] = 0xbc; + if(phase == BIND4) { + memcpy( &packet[5], &rxid, 4); + memset( &packet[11], 0xff, 16); + } + packet[9] = phase-1; + if(packet[9] > 0x02) + packet[9] = 0x02; + packet[27]= 0x01; + packet[28]= 0x80; + break; + } + } + + static void calc_afhds_channels(uint32_t seed) { + int idx = 0; + uint32_t rnd = seed; + while (idx < NUMFREQ) { + int i; + int count_1_42 = 0, count_43_85 = 0, count_86_128 = 0, count_129_168=0; + rnd = rnd * 0x0019660D + 0x3C6EF35F; // Randomization + + uint8_t next_ch = ((rnd >> (idx%32)) % 0xa8) + 1; + // Keep the distance 2 between the channels - either odd or even + if (((next_ch ^ seed) & 0x01 )== 0) + continue; + // Check that it's not duplicate and spread uniformly + for (i = 0; i < idx; i++) { + if(hopping_frequency[i] == next_ch) + break; + if(hopping_frequency[i] <= 42) + count_1_42++; + else if (hopping_frequency[i] <= 85) + count_43_85++; + else if (hopping_frequency[i] <= 128) + count_86_128++; + else + count_129_168++; + } + if (i != idx) + continue; + if ((next_ch <= 42 && count_1_42 < 5) + ||(next_ch >= 43 && next_ch <= 85 && count_43_85 < 5) + ||(next_ch >= 86 && next_ch <=128 && count_86_128 < 5) + ||(next_ch >= 129 && count_129_168 < 5)) + { + hopping_frequency[idx++] = next_ch; + } + } + } + + #define WAIT_WRITE 0x80 + static uint16_t afhds2a_cb() { + switch(phase) { + case BIND1: + case BIND2: + case BIND3: + A7105_Strobe(A7105_STANDBY); + afhds2a_build_bind_packet(); + A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); + if(A7105_ReadReg(0) == 0x1b) { // todo: replace with check crc+fec + A7105_Strobe(A7105_RST_RDPTR); + A7105_ReadData(RXPACKET_SIZE); + if(packet[0] == 0xbc) { + for(uint8_t i=0; i<4; i++) { + rxid[i] = packet[5+i]; + } + eeprom_write_block((const void*)rxid,(void*)EEPROMadress,4); + if(packet[9] == 0x01) + phase = BIND4; + } + } + packet_count++; + phase |= WAIT_WRITE; + return 1700; + case BIND1|WAIT_WRITE: + case BIND2|WAIT_WRITE: + case BIND3|WAIT_WRITE: + A7105_Strobe(A7105_RX); + phase &= ~WAIT_WRITE; + phase++; + if(phase > BIND3) + phase = BIND1; + return 2150; + case BIND4: + A7105_Strobe(A7105_STANDBY); + afhds2a_build_bind_packet(); + A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); + packet_count++; + bind_reply++; + if(bind_reply>=4) { + packet_count=0; + channel=1; + phase = DATA1; + BIND_DONE; + } + phase |= WAIT_WRITE; + return 1700; + case BIND4|WAIT_WRITE: + A7105_Strobe(A7105_RX); + phase &= ~WAIT_WRITE; + return 2150; + case DATA1: + A7105_Strobe(A7105_STANDBY); + build_packet(packet_type); + A7105_WriteData(38, hopping_frequency[channel++]); + if(channel >= 16) + channel = 0; + if(!(packet_count % 1313)) + packet_type = PACKET_SETTINGS; + else if(!(packet_count % 1569)) + packet_type = PACKET_FAILSAFE; + else + packet_type = PACKET_STICKS; // todo : check for settings changes + // got some data from RX ? + // we've no way to know if RX fifo has been filled + // as we can't poll GIO1 or GIO2 to check WTR + // we can't check A7105_MASK_TREN either as we know + // it's currently in transmit mode. + if(!(A7105_ReadReg(0) & (1<<5 | 1<<6))) { // FECF+CRCF Ok + A7105_Strobe(A7105_RST_RDPTR); + A7105_ReadData(1); + if(packet[0] == 0xaa) { + A7105_Strobe(A7105_RST_RDPTR); + A7105_ReadData(RXPACKET_SIZE); + if(packet[9] == 0xfc) { // rx is asking for settings + packet_type=PACKET_SETTINGS; + } + else { + #if defined(TELEMETRY) + update_telemetry(); + #endif + } + } + } + packet_count++; + phase |= WAIT_WRITE; + return 1700; + case DATA1|WAIT_WRITE: + phase &= ~WAIT_WRITE; + A7105_Strobe(A7105_RX); + return 2150; + } + return 3850; // never reached, please the compiler + } + + static uint16_t AFHDS2A_setup() + { + A7105_Init(INIT_FLYSKY_AFHDS2A); //flysky_init(); + + calc_afhds_channels(MProtocol_id); + packet_type = PACKET_STICKS; + packet_count = 0; + bind_reply = 0; + if(IS_AUTOBIND_FLAG_on) { + phase = BIND1; + BIND_IN_PROGRESS; + } + else { + phase = DATA1; + eeprom_read_block((void*)rxid,(const void*)EEPROMadress,4); + } + channel = 0; + return 50000; + } +#endif diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 5f5f6ba..be159b3 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -17,297 +17,9 @@ */ #if defined(FRSKYX_CC2500_INO) - - #include "iface_cc2500.h" - - uint8_t chanskip; - uint8_t calData[48][3]; - uint8_t channr; - uint8_t pass_ = 1 ; - uint8_t counter_rst; - uint8_t ctr; - uint8_t FS_flag=0; - // uint8_t ptr[4]={0x01,0x12,0x23,0x30}; - //uint8_t ptr[4]={0x00,0x11,0x22,0x33}; - - const PROGMEM uint8_t hop_data[]={ - 0x02, 0xD4, 0xBB, 0xA2, 0x89, - 0x70, 0x57, 0x3E, 0x25, 0x0C, - 0xDE, 0xC5, 0xAC, 0x93, 0x7A, - 0x61, 0x48, 0x2F, 0x16, 0xE8, - 0xCF, 0xB6, 0x9D, 0x84, 0x6B, - 0x52, 0x39, 0x20, 0x07, 0xD9, - 0xC0, 0xA7, 0x8E, 0x75, 0x5C, - 0x43, 0x2A, 0x11, 0xE3, 0xCA, - 0xB1, 0x98, 0x7F, 0x66, 0x4D, - 0x34, 0x1B, 0x00, 0x1D, 0x03 - }; - static uint8_t __attribute__((unused)) hop(uint8_t byte) - { - return pgm_read_byte_near(&hop_data[byte]); - } +#include "iface_cc2500.h" - static void __attribute__((unused)) set_start(uint8_t ch ) - { - cc2500_strobe(CC2500_SIDLE); - cc2500_writeReg(CC2500_23_FSCAL3, calData[ch][0]); - cc2500_writeReg(CC2500_24_FSCAL2, calData[ch][1]); - cc2500_writeReg(CC2500_25_FSCAL1, calData[ch][2]); - cc2500_writeReg(CC2500_0A_CHANNR, ch==47?0:pgm_read_word(&hop_data[ch])); - } - - static void __attribute__((unused)) frskyX_init() - { - CC2500_Reset(); - - for(uint8_t i=0;i<36;i++) - { - uint8_t reg=pgm_read_byte_near(&cc2500_conf[i][0]); - uint8_t val=pgm_read_byte_near(&cc2500_conf[i][1]); - - if(reg==CC2500_06_PKTLEN) - val=0x1E; - else - if(reg==CC2500_08_PKTCTRL0) - val=0x01; - else - if(reg==CC2500_0B_FSCTRL1) - val=0x0A; - else - if(reg==CC2500_10_MDMCFG4) - val=0x7B; - else - if(reg==CC2500_11_MDMCFG3) - val=0x61; - else - if(reg==CC2500_12_MDMCFG2) - val=0x13; - else - if(reg==CC2500_15_DEVIATN) - val=0x51; - - cc2500_writeReg(reg,val); - } - - cc2500_writeReg(CC2500_07_PKTCTRL1, 0x04); - cc2500_writeReg(CC2500_0C_FSCTRL0, option); - cc2500_strobe(CC2500_SIDLE); - // - for(uint8_t c=0;c < 47;c++){//calibrate hop channels - cc2500_strobe(CC2500_SIDLE); - cc2500_writeReg(CC2500_0A_CHANNR,pgm_read_word(&hop_data[c])); - cc2500_strobe(CC2500_SCAL); - delayMicroseconds(900);// - calData[c][0] = cc2500_readReg(CC2500_23_FSCAL3); - calData[c][1] = cc2500_readReg(CC2500_24_FSCAL2); - calData[c][2] = cc2500_readReg(CC2500_25_FSCAL1); - } - cc2500_strobe(CC2500_SIDLE); - cc2500_writeReg(CC2500_0A_CHANNR,0x00); - cc2500_strobe(CC2500_SCAL); - delayMicroseconds(900); - calData[47][0] = cc2500_readReg(CC2500_23_FSCAL3); - calData[47][1] = cc2500_readReg(CC2500_24_FSCAL2); - calData[47][2] = cc2500_readReg(CC2500_25_FSCAL1); - //#######END INIT######## - } - - static void __attribute__((unused)) initialize_data(uint8_t adr) - { - cc2500_writeReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack - cc2500_writeReg(CC2500_18_MCSM0, 0x8); - cc2500_writeReg(CC2500_09_ADDR, adr ? 0x03 : rx_tx_addr[3]); - cc2500_writeReg(CC2500_07_PKTCTRL1,0x05); - } - - static uint8_t __attribute__((unused)) crc_Byte( uint8_t byte ) - { - crc = (crc<<8) ^ pgm_read_word(&CRCTable[((uint8_t)(crc>>8) ^ byte) & 0xFF]); - return byte; - } - - static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i ) - { //mapped 860,2140(125%) range to 64,1984(PXX values); - return (uint16_t)(((Servo_data[i]-PPM_MIN)*3)>>1)+64; - } - - static void __attribute__((unused)) frskyX_build_bind_packet() - { - crc=0; - packet[0] = 0x1D; - packet[1] = 0x03; - packet[2] = 0x01; - // - packet[3] = crc_Byte(rx_tx_addr[3]); - packet[4] = crc_Byte(rx_tx_addr[2]); - int idx = ((state -FRSKY_BIND) % 10) * 5; - packet[5] = crc_Byte(idx); - packet[6] = crc_Byte(pgm_read_word(&hop_data[idx++])); - packet[7] = crc_Byte(pgm_read_word(&hop_data[idx++])); - packet[8] = crc_Byte(pgm_read_word(&hop_data[idx++])); - packet[9] = crc_Byte(pgm_read_word(&hop_data[idx++])); - packet[10] = crc_Byte(pgm_read_word(&hop_data[idx++])); - packet[11] = crc_Byte(0x02); - packet[12] = crc_Byte(RX_num); - // - for(uint8_t i=13;i<28;i++) - packet[i]=crc_Byte(0); - // - packet[28]=highByte(crc); - packet[29]=lowByte(crc); - // - } - - static void __attribute__((unused)) frskyX_data_frame() - { - //0x1D 0xB3 0xFD 0x02 0x56 0x07 0x15 0x00 0x00 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x96 0x12 - // - uint8_t lpass = pass_ ; - uint16_t chan_0 ; - uint16_t chan_1 ; - uint8_t flag2 = 0; - uint8_t startChan = 0; - crc = 0; - //static uint8_t p = 0; - // - packet[0] = 0x1D; - packet[1] = rx_tx_addr[3]; - packet[2] = rx_tx_addr[2]; - packet[3] = crc_Byte(0x02); - // - packet[4] = crc_Byte((ctr<<6)+channr); //*64 - packet[5] = crc_Byte(counter_rst); - packet[6] = crc_Byte(RX_num); - // FLAGS 00 - standard packet - //10, 12, 14, 16, 18, 1A, 1C, 1E - failsafe packet - //20 - range check packet - packet[7] = crc_Byte(FS_flag); - packet[8] = crc_Byte(flag2); - // - if ( lpass & 1 ) - startChan += 8 ; - - for(uint8_t i = 0; i <12 ; i+=3) - {//12 bytes - chan_0 = scaleForPXX(startChan); - if(lpass & 1 ) - chan_0+=2048; - - packet[9+i] = crc_Byte(lowByte(chan_0));//3 bytes*4 - startChan++; - chan_1 = scaleForPXX(startChan); - if(lpass & 1 ) - chan_1+= 2048; - - startChan++; - packet[9+i+1]=crc_Byte((((chan_0>>8) & 0x0F)|(chan_1 << 4))); - packet[9+i+2]=crc_Byte(chan_1>>4); - } - //packet[21]=crc_Byte(0x08);//first - packet[21]=crc_Byte(0x80);//??? when received first telemetry frame is changed to 0x80 - //packet[21]=crc_Byte(ptr[p]);//??? - //p=(p+1)%4;//repeating 4 bytes sequence pattern every 4th frame. - - pass_=lpass+1; - - for (uint8_t i=22;i<28;i++) - packet[i]=crc_Byte(0); - - packet[28]=highByte(crc); - packet[29]=lowByte(crc); - } - -<<<<<<< HEAD - uint16_t ReadFrSkyX() - { - switch(state) - { - default: - set_start(47); - CC2500_SetPower(); - cc2500_strobe(CC2500_SFRX); - // - frskyX_build_bind_packet(); - cc2500_strobe(CC2500_SIDLE); - cc2500_writeFifo(packet, packet[0]+1); - state++; - return 9000; - case FRSKY_BIND_DONE: - initialize_data(0); - channr=0; - BIND_DONE; - state++; - break; - case FRSKY_DATA1: - LED_ON; - CC2500_SetTxRxMode(TX_EN); - set_start(channr); - CC2500_SetPower(); - cc2500_strobe(CC2500_SFRX); - channr = (channr+chanskip)%47; - cc2500_strobe(CC2500_SIDLE); - cc2500_writeFifo(packet, packet[0]+1); - // - frskyX_data_frame(); - state++; - return 5500; - case FRSKY_DATA2: - CC2500_SetTxRxMode(RX_EN); - cc2500_strobe(CC2500_SIDLE); - state++; - return 200; - case FRSKY_DATA3: - cc2500_strobe(CC2500_SRX); - state++; - return 3000; - case FRSKY_DATA4: - len = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; - if (len &&(len>2; - //for test*************** - //rx_tx_addr[3]=0xB3; - //rx_tx_addr[2]=0xFD; - //************************ - frskyX_init(); - // - if(IS_AUTOBIND_FLAG_on) - { - state = FRSKY_BIND; - initialize_data(1); - } - else - { - state = FRSKY_DATA1; - initialize_data(0); - } - return 10000; - } -======= uint8_t chanskip; uint8_t counter_rst; uint8_t ctr; @@ -617,5 +329,4 @@ uint16_t initFrSkyX() seq_last_rcvd = 8; return 10000; } ->>>>>>> refs/remotes/pascallanger/master #endif \ No newline at end of file diff --git a/Multiprotocol/FrSky_cc2500.ino b/Multiprotocol/FrSky_cc2500.ino deleted file mode 100644 index ec17450..0000000 --- a/Multiprotocol/FrSky_cc2500.ino +++ /dev/null @@ -1,219 +0,0 @@ -/* - 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(FRSKY_CC2500_INO) - -#include "iface_cc2500.h" - -//##########Variables######## -//uint32_t state; -//uint8_t len; - -/* -enum { - FRSKY_BIND = 0, - FRSKY_BIND_DONE = 1000, - FRSKY_DATA1, - FRSKY_DATA2, - FRSKY_DATA3, - FRSKY_DATA4, - FRSKY_DATA5 -}; -*/ - -static void __attribute__((unused)) frsky2way_init(uint8_t bind) -{ - // Configure cc2500 for tx mode - CC2500_Reset(); - // - for(uint8_t i=0;i<36;i++) - { - uint8_t reg=pgm_read_byte_near(&cc2500_conf[i][0]); - uint8_t val=pgm_read_byte_near(&cc2500_conf[i][1]); - - if(reg==CC2500_0C_FSCTRL0) - val=option; - else - if(reg==CC2500_1B_AGCCTRL2) - val=bind ? 0x43 : 0x03; - cc2500_writeReg(reg,val); - } - - CC2500_SetTxRxMode(TX_EN); - CC2500_SetPower(); - - cc2500_strobe(CC2500_SIDLE); - - cc2500_writeReg(CC2500_09_ADDR, bind ? 0x03 : rx_tx_addr[3]); - cc2500_writeReg(CC2500_07_PKTCTRL1, 0x05); - cc2500_strobe(CC2500_SIDLE); // Go to idle... - // - cc2500_writeReg(CC2500_0A_CHANNR, 0x00); - cc2500_writeReg(CC2500_23_FSCAL3, 0x89); - cc2500_strobe(CC2500_SFRX); - //#######END INIT######## -} - -static uint8_t __attribute__((unused)) get_chan_num(uint16_t idx) -{ - uint8_t ret = (idx * 0x1e) % 0xeb; - if(idx == 3 || idx == 23 || idx == 47) - ret++; - if(idx > 47) - return 0; - return ret; -} - -static void __attribute__((unused)) frsky2way_build_bind_packet() -{ - //11 03 01 d7 2d 00 00 1e 3c 5b 78 00 00 00 00 00 00 01 - //11 03 01 19 3e 00 02 8e 2f bb 5c 00 00 00 00 00 00 01 - packet[0] = 0x11; - packet[1] = 0x03; - packet[2] = 0x01; - packet[3] = rx_tx_addr[3]; - packet[4] = rx_tx_addr[2]; - uint16_t idx = ((state -FRSKY_BIND) % 10) * 5; - packet[5] = idx; - packet[6] = get_chan_num(idx++); - packet[7] = get_chan_num(idx++); - packet[8] = get_chan_num(idx++); - packet[9] = get_chan_num(idx++); - packet[10] = get_chan_num(idx++); - packet[11] = 0x00; - packet[12] = 0x00; - packet[13] = 0x00; - packet[14] = 0x00; - packet[15] = 0x00; - packet[16] = 0x00; - packet[17] = 0x01; -} - -static void __attribute__((unused)) frsky2way_data_frame() -{//pachet[4] is telemetry user frame counter(hub) - //11 d7 2d 22 00 01 c9 c9 ca ca 88 88 ca ca c9 ca 88 88 - //11 57 12 00 00 01 f2 f2 f2 f2 06 06 ca ca ca ca 18 18 - packet[0] = 0x11; //Length - packet[1] = rx_tx_addr[3]; - packet[2] = rx_tx_addr[2]; - packet[3] = counter;// - #if defined TELEMETRY - packet[4] = telemetry_counter; - #else - packet[4] = 0x00; - #endif - - packet[5] = 0x01; - // - packet[10] = 0; - packet[11] = 0; - packet[16] = 0; - packet[17] = 0; - for(uint8_t i = 0; i < 8; i++) - { - uint16_t value; - value = convert_channel_frsky(i); - if(i < 4) - { - packet[6+i] = value & 0xff; - packet[10+(i>>1)] |= ((value >> 8) & 0x0f) << (4 *(i & 0x01)); - } - else - { - packet[8+i] = value & 0xff; - packet[16+((i-4)>>1)] |= ((value >> 8) & 0x0f) << (4 * ((i-4) & 0x01)); - } - } -} - -uint16_t initFrSky_2way() -{ - if(IS_AUTOBIND_FLAG_on) - { - frsky2way_init(1); - state = FRSKY_BIND;// - } - else - { - frsky2way_init(0); - state = FRSKY_DATA2; - } - return 10000; -} - -uint16_t ReadFrSky_2way() -{ - if (state < FRSKY_BIND_DONE) - { - frsky2way_build_bind_packet(); - cc2500_strobe(CC2500_SIDLE); - cc2500_writeReg(CC2500_0A_CHANNR, 0x00); - cc2500_writeReg(CC2500_23_FSCAL3, 0x89); - cc2500_strobe(CC2500_SFRX);//0x3A - cc2500_writeFifo(packet, packet[0]+1); - state++; - return 9000; - } - if (state == FRSKY_BIND_DONE) - { - state = FRSKY_DATA2; - frsky2way_init(0); - counter = 0; - BIND_DONE; - } - else - if (state == FRSKY_DATA5) - { - cc2500_strobe(CC2500_SRX);//0x34 RX enable - state = FRSKY_DATA1; - return 9200; - } - counter = (counter + 1) % 188; - if (state == FRSKY_DATA4) - { //telemetry receive - CC2500_SetTxRxMode(RX_EN); - cc2500_strobe(CC2500_SIDLE); - cc2500_writeReg(CC2500_0A_CHANNR, get_chan_num(counter % 47)); - cc2500_writeReg(CC2500_23_FSCAL3, 0x89); - state++; - return 1300; - } - else - { - if (state == FRSKY_DATA1) - { - len = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; - if (len<=MAX_PKT)//27 bytes - { - cc2500_readFifo(pkt, len); //received telemetry packets - #if defined(TELEMETRY) - //parse telemetry packet here - frsky_check_telemetry(pkt,len); //check if valid telemetry packets and buffer them. - #endif - } - CC2500_SetTxRxMode(TX_EN); - CC2500_SetPower(); // Set tx_power - } - cc2500_strobe(CC2500_SIDLE); - cc2500_writeReg(CC2500_0A_CHANNR, get_chan_num(counter % 47)); - cc2500_writeReg(CC2500_23_FSCAL3, 0x89); - cc2500_strobe(CC2500_SFRX); - frsky2way_data_frame(); - cc2500_writeFifo(packet, packet[0]+1); - state++; - } - return state == FRSKY_DATA4 ? 7500 : 9000; -} -#endif diff --git a/Multiprotocol/Hisky_nrf24l01.ino b/Multiprotocol/Hisky_nrf24l01.ino index ddf935b..a32cf67 100644 --- a/Multiprotocol/Hisky_nrf24l01.ino +++ b/Multiprotocol/Hisky_nrf24l01.ino @@ -122,7 +122,7 @@ static void __attribute__((unused)) build_ch_data() uint8_t i,j; for (i = 0; i< 8; i++) { j=CH_AETR[i]; - temp=map(limit_channel_100(j),servo_min_100,servo_max_100,0,1000); + temp=map(limit_channel_100(j),servo_min_100,servo_max_100,0,1000); if (j == THROTTLE) // It is clear that hisky's throttle stick is made reversely, so I adjust it here on purpose temp = 1000 -temp; if (j == AUX3) diff --git a/Multiprotocol/Hontai_nrf24l01.ino b/Multiprotocol/Hontai_nrf24l01.ino index 64f61a9..f522ef8 100644 --- a/Multiprotocol/Hontai_nrf24l01.ino +++ b/Multiprotocol/Hontai_nrf24l01.ino @@ -70,6 +70,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) } else { +/* if(sub_protocol == FORMAT_JJRCX1) packet[0] = GET_FLAG(Servo_AUX2, 0x02); // Arm else @@ -112,7 +113,60 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind) packet[9] = convert_channel_8b_scale(ELEVATOR, 0, 63)-31; // Elevator trim else packet[9] = convert_channel_8b_scale(ELEVATOR, 0, 32)-16; // Elevator trim +*/ + packet[1] = 0x00; + packet[2] = 0x00; + packet[3] = (convert_channel_8b_scale(THROTTLE, 0, 127) << 1); // Throttle + packet[4] = convert_channel_8b_scale(AILERON, 63, 0); // Aileron + packet[5] = convert_channel_8b_scale(ELEVATOR, 0, 63); // Elevator + packet[6] = convert_channel_8b_scale(RUDDER, 0, 63); // Rudder + if(sub_protocol == FORMAT_X5C1) + packet[7] = convert_channel_8b_scale(AILERON, 0, 63)-31; // Aileron trim + else + packet[7] = convert_channel_8b_scale(AILERON, 0, 32)-16; // Aileron trim + if (sub_protocol == FORMAT_X5C1) + packet[9] = convert_channel_8b_scale(ELEVATOR, 0, 63)-31; // Elevator trim + else + packet[9] = convert_channel_8b_scale(ELEVATOR, 0, 32)-16; // Elevator trim + switch(sub_protocol) { + case FORMAT_HONTAI: + packet[0] = 0x0b; + packet[3] |= GET_FLAG(Servo_AUX3, 0x01); // Picture + packet[4] |= GET_FLAG(Servo_AUX6, 0x80) // RTH + | GET_FLAG(Servo_AUX5, 0x40); // Headless + packet[5] |= GET_FLAG(Servo_AUX7, 0x80) // Calibrate + | GET_FLAG(Servo_AUX1, 0x40); // Flip + packet[6] |= GET_FLAG(Servo_AUX4, 0x80); // Video + packet[8] = convert_channel_8b_scale(RUDDER, 0, 32)-16; // Rudder trim + break; + case FORMAT_X5C1: + case FORMAT_JJRCX1: + packet[0] = GET_FLAG(Servo_AUX2, 0x02); //Arm + packet[3] |= GET_FLAG(Servo_AUX3, 0x01); // Picture + packet[4] |= 0x80; // unknown + if (sub_protocol == FORMAT_X5C1) + packet[4] |= GET_FLAG(Servo_AUX2, 0x40); // Lights (X5C1) + packet[5] |= GET_FLAG(Servo_AUX7, 0x80) // Calibrate + | GET_FLAG(Servo_AUX1, 0x40); // Flip + packet[6] |= GET_FLAG(Servo_AUX4, 0x80); // Video + packet[8] = 0xc0 // high rate, no rudder trim + | GET_FLAG(Servo_AUX6, 0x02) // RTH + | GET_FLAG(Servo_AUX5, 0x01); // Headless + break; + case FORMAT_FQ777: + // todo: add missing calibration flag + packet[0] = GET_FLAG(Servo_AUX3, 0x01) // Picture + | GET_FLAG(Servo_AUX4, 0x02); // Video + packet[3] |= GET_FLAG(Servo_AUX1, 0x01); // Flip + packet[4] |= 0xc0; // high rate (mid=0xa0, low=0x60) + packet[6] |= GET_FLAG(Servo_AUX5, 0x40); // Headless + if((packet[4] & 0x3f) > 0x3d && (packet[5] & 0x3f) < 3) + packet[5] |= 0x80; // accelerometer recalibration + break; + packet[8] = convert_channel_8b_scale(RUDDER, 0, 32)-16; // Rudder trim + } + packet_size=HONTAI_PACKET_SIZE; } crc16(packet, packet_size); @@ -172,7 +226,8 @@ static void __attribute__((unused)) HONTAI_init() const uint8_t PROGMEM hopping_frequency_nonels[][3] = { {0x05, 0x19, 0x28}, // Hontai - {0x0a, 0x1e, 0x2d}}; // JJRC X1 + {0x0a, 0x1e, 0x2d}, // JJRC X1 + {0x05, 0x19, 0x28}}; // FQ777-951 const uint8_t PROGMEM addr_vals[4][16] = { {0x24, 0x26, 0x2a, 0x2c, 0x32, 0x34, 0x36, 0x4a, 0x4c, 0x4e, 0x54, 0x56, 0x5a, 0x64, 0x66, 0x6a}, diff --git a/Multiprotocol/Hubsan_a7105.ino b/Multiprotocol/Hubsan_a7105.ino index de0c2bf..227134c 100644 --- a/Multiprotocol/Hubsan_a7105.ino +++ b/Multiprotocol/Hubsan_a7105.ino @@ -18,24 +18,51 @@ #if defined(HUBSAN_A7105_INO) #include "iface_a7105.h" +enum { + FORMAT_H107 = 0, + FORMAT_H301, + FORMAT_H501, +}; enum{ - // flags going to packet[9] (Normal) + // flags going to packet[9] (H107 Normal) HUBSAN_FLAG_VIDEO= 0x01, // record video HUBSAN_FLAG_FLIP = 0x08, // enable flips HUBSAN_FLAG_LED = 0x04 // enable LEDs }; enum{ - // flags going to packet[9] (Plus series) + // flags going to packet[9] (H107 Plus series) HUBSAN_FLAG_HEADLESS = 0x08, // headless mode }; - enum{ - // flags going to packet[13] (Plus series) + // flags going to packet[9] (H301) + FLAG_H301_VIDEO = 0x01, + FLAG_H301_STAB = 0x02, + FLAG_H301_LED = 0x10, + FLAG_H301_RTH = 0x40, +}; +enum{ + // flags going to packet[13] (H107 Plus series) HUBSAN_FLAG_SNAPSHOT = 0x01, HUBSAN_FLAG_FLIP_PLUS = 0x80, }; +enum{ + // flags going to packet[9] (H501S) + FLAG_H501_VIDEO = 0x01, + FLAG_H501_LED = 0x04, + FLAG_H501_RTH = 0x20, + FLAG_H501_HEADLESS1 = 0x40, + FLAG_H501_GPS_HOLD = 0x80, +}; + +enum{ + // flags going to packet[13] (H501S) + FLAG_H501_SNAPSHOT = 0x01, + FLAG_H501_HEADLESS2 = 0x02, + FLAG_H501_ALT_HOLD = 0x08, +}; + uint32_t sessionid,id_data; @@ -76,7 +103,7 @@ static void __attribute__((unused)) hubsan_build_bind_packet(uint8_t bind_state) packet[3] = (sessionid >> 16) & 0xFF; packet[4] = (sessionid >> 8) & 0xFF; packet[5] = (sessionid >> 0) & 0xFF; - if(id_data == ID_NORMAL) + if(id_data == ID_NORMAL && sub_protocol != FORMAT_H501) { packet[6] = 0x08; packet[7] = 0xe4; @@ -89,7 +116,7 @@ static void __attribute__((unused)) hubsan_build_bind_packet(uint8_t bind_state) packet[13] = 0x26; packet[14] = 0x79; } - else + else if(id_data == ID_PLUS || sub_protocol == FORMAT_H501) { //ID_PLUS if(phase >= BIND_3) { @@ -109,6 +136,7 @@ static void __attribute__((unused)) hubsan_build_bind_packet(uint8_t bind_state) static void __attribute__((unused)) hubsan_build_packet() { static uint8_t vtx_freq = 0; + static uint32_t h501_packet = 0; memset(packet, 0, 16); if(vtx_freq != option || packet_count==100) // set vTX frequency (H107D) { @@ -127,7 +155,7 @@ static void __attribute__((unused)) hubsan_build_packet() packet[4] = 0xFF - convert_channel_8b(RUDDER); //Rudder is reversed packet[6] = 0xFF - convert_channel_8b(ELEVATOR); //Elevator is reversed packet[8] = convert_channel_8b(AILERON); //Aileron - if(id_data == ID_NORMAL) + if(id_data == ID_NORMAL && sub_protocol == FORMAT_H107) // H107/L/C/D, H102D { if( packet_count < 100) { @@ -151,21 +179,50 @@ static void __attribute__((unused)) hubsan_build_packet() packet[13] = 0x26; packet[14] = 0x79; } - else - { //ID_PLUS - packet[3] = 0x64; - packet[5] = 0x64; - packet[7] = 0x64; - packet[9] = 0x06; - //FLIP|LIGHT|PICTURE|VIDEO|HEADLESS - if(Servo_AUX4) packet[9] |= HUBSAN_FLAG_VIDEO; - if(Servo_AUX5) packet[9] |= HUBSAN_FLAG_HEADLESS; - packet[10]= 0x19; - packet[12]= 0x5C; // ghost channel ? - packet[13] = 0; - if(Servo_AUX3) packet[13] = HUBSAN_FLAG_SNAPSHOT; - if(Servo_AUX1) packet[13] |= HUBSAN_FLAG_FLIP_PLUS; - packet[14]= 0x49; // ghost channel ? + else if( sub_protocol == FORMAT_H301) { + if(packet_count < 100) { + packet[9] = FLAG_H301_STAB; + packet_count++; + } else { + packet[9] = 0; + if(Servo_AUX1) packet[9] |= FLAG_H301_LED; + if(Servo_AUX2) packet[9] |= FLAG_H301_STAB; + if(Servo_AUX3) packet[9] |= FLAG_H301_RTH; + if(Servo_AUX4) packet[9] |= FLAG_H301_VIDEO; // H102D + } + packet[10] = 0x18; // ? + packet[12] = 0x5c; // ? + packet[14] = 0xf6; // ? + } else + { //ID_PLUS +FORMAT_H501 + packet[3] = sub_protocol == FORMAT_H501 ? 0x00 : 0x64; + packet[5] = sub_protocol == FORMAT_H501 ? 0x00 : 0x64; + packet[7] = sub_protocol == FORMAT_H501 ? 0x00 : 0x64; + if( sub_protocol == FORMAT_H501) { // H501S + packet[9] = 0x02; + if(Servo_AUX1) packet[9] |= HUBSAN_FLAG_FLIP; + if(Servo_AUX2) packet[9] |= FLAG_H501_LED; + if(Servo_AUX3) packet[9] |= FLAG_H501_RTH; + if(Servo_AUX4) packet[9] |= FLAG_H501_VIDEO; + if(Servo_AUX5) packet[9] |= FLAG_H501_HEADLESS1; + if(Servo_AUX6) packet[9] |= FLAG_H501_GPS_HOLD; + packet[13] = 0; + if(Servo_AUX5) packet[9] |= FLAG_H501_HEADLESS2; + if(Servo_AUX7) packet[9] |= FLAG_H501_ALT_HOLD; + if(Servo_AUX8) packet[9] |= FLAG_H501_SNAPSHOT; + } + else { // H107P/C+/D+ + packet[9] = 0x06; + //FLIP|LIGHT|PICTURE|VIDEO|HEADLESS + if(Servo_AUX4) packet[9] |= HUBSAN_FLAG_VIDEO; + if(Servo_AUX5) packet[9] |= HUBSAN_FLAG_HEADLESS; + packet[10]= sub_protocol == FORMAT_H501 ? 0x1a : 0x19; + packet[12]= 0x5C; // ghost channel ? + packet[13] = 0; + if(Servo_AUX3) packet[13] = HUBSAN_FLAG_SNAPSHOT; + if(Servo_AUX1) packet[13] |= HUBSAN_FLAG_FLIP_PLUS; + packet[14]= 0x49; // ghost channel ? + } if(packet_count < 100) { // set channels to neutral for first 100 packets packet[2] = 0x80; // throttle neutral is at mid stick on plus series @@ -176,6 +233,18 @@ static void __attribute__((unused)) hubsan_build_packet() packet[13]= 0x00; packet_count++; } + if(sub_protocol == FORMAT_H501) { + h501_packet++; + if(h501_packet == 10) { + memset(packet, 0, 16); + packet[0] = 0xe8; + } + else if(h501_packet == 20) { + memset(packet, 0, 16); + packet[0] = 0xe9; + } + if(h501_packet >= 20) h501_packet = 0; + } } hubsan_update_crc(); } @@ -205,7 +274,7 @@ uint16_t ReadHubsan() switch(phase) { case BIND_1: bind_count++; - if(bind_count >= 20) + if(bind_count >= 20 && sub_protocol != FORMAT_H501) { if(id_data == ID_NORMAL) id_data = ID_PLUS; @@ -287,7 +356,15 @@ uint16_t ReadHubsan() A7105_SetPower(); //Keep transmit power in sync hubsan_build_packet(); A7105_Strobe(A7105_STANDBY); - A7105_WriteData(16, phase == DATA_5 && id_data == ID_NORMAL ? channel + 0x23 : channel); + u8 ch; + if((phase == DATA_5 && id_data == ID_NORMAL) && sub_protocol == FORMAT_H107) { + ch = channel + 0x23; + } + else { + ch = channel; + } + A7105_WriteData( 16, ch); +// A7105_WriteData(16, phase == DATA_5 && id_data == ID_NORMAL ? channel + 0x23 : channel); if (phase == DATA_5) phase = DATA_1; else diff --git a/Multiprotocol/KN_nrf24l01.ino b/Multiprotocol/KN_nrf24l01.ino index 5675181..14e9566 100644 --- a/Multiprotocol/KN_nrf24l01.ino +++ b/Multiprotocol/KN_nrf24l01.ino @@ -246,11 +246,7 @@ static void __attribute__((unused)) kn_init() NRF24L01_Initialize(); -<<<<<<< HEAD - NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO)); -======= NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO)); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address @@ -263,11 +259,7 @@ static void __attribute__((unused)) kn_init() NRF24L01_Activate(0x73); NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 1); // Dynamic payload for data pipe 0 // Enable: Dynamic Payload Length to enable PCF -<<<<<<< HEAD - NRF24L01_WriteReg(NRF24L01_1D_FEATURE, BV(NRF2401_1D_EN_DPL)); -======= NRF24L01_WriteReg(NRF24L01_1D_FEATURE, _BV(NRF2401_1D_EN_DPL)); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_SetPower(); diff --git a/Multiprotocol/Lua Generateur.htm b/Multiprotocol/Lua Generateur.htm new file mode 100644 index 0000000..a70b4e4 --- /dev/null +++ b/Multiprotocol/Lua Generateur.htm @@ -0,0 +1,5468 @@ + +Lua Generateur + + +

Script LUA

+
+
Programmation :
+ +T :
+A :
+E :
+R :
+FLIP :
+HEADLESS :
+LIGHT :
+VIDEO :
+PICTURE :
+DEFAULT :
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 SERIAL 0.0. . . . .   42 ESKY 16.0. . . . .   NRF24L01 7ESKY
1 FLYSKY 1.0FLYSKY   A7105 9FLYSKY43 MT99XX 17.0MT99   NRF24L01 10MT99XXAuto
2 FLYSKY 1.1V9X9   A7105 9FLYSKY => V9X944 MT99XX 17.1H7   NRF24L01 10MT99XX => H7Auto
3 FLYSKY 1.2V6X6   A7105 13FLYSKY => V6X645 MT99XX 17.2YZ   NRF24L01 10MT99XX => YZAuto
4 FLYSKY 1.3V912   A7105 7FLYSKY => V91246 MT99XX 17.3LS   NRF24L01 10MT99XX => LSAuto
5 HUBSAN 2.0H107   A7105 10HUBSAN47 MJXQ 18.0WLH08   NRF24L01 14MJXQAuto
6 HUBSAN 2.1H301   A7105 9HUBSAN => H30148 MJXQ 18.1X600   NRF24L01 14MJXQ => X600Auto
7 HUBSAN 2.2H501   A7105 14HUBSAN => H50149 MJXQ 18.2X800   NRF24L01 14MJXQ => X800Auto
8 FRSKYD 3.0. . . . .   CC2500 8FRSKYD50 MJXQ 18.3H26D   NRF24L01 14MJXQ => H26DAuto
9 HISKY 4.0HISKY   NRF24L01 9HISKY51 MJXQ 18.4E010   NRF24L01 14MJXQ => E010Auto
10 HISKY 4.1HK310   NRF24L01 10HISKY => HK31052 SHENQI 19.0. . . . .   NRF24L01 5ShenqiAuto
11 V2X2 5.0. . . . .   NRF24L01 12V2X253 FY326 20.0FY326   NRF24L01 10Fy326
12 DSM 6.0DSM2_22   CYRF6936 12DSM54 FY326 20.1FY319   NRF24L01 10Fy326 => FY319
13 DSM 6.1DSM2_11   CYRF6936 12DSM => DSM2_1155 SFHSS 21.0. . . . .   CC2500 9SFHSS
14 DSM 6.2DSMX_22   CYRF6936 12DSM => DSMX_2256 J6PRO 22.0. . . . .   CYRF6936 13J6PRO
15 DSM 6.3DSMX_11   CYRF6936 12DSM => DSMX_1157 FQ777 23.0. . . . .   NRF24L01 9FQ777
16 DSM 6.4AUTO   CYRF6936 12DSM => AUTO58 ASSAN 24.0. . . . .   NRF24L01 11ASSAN
17 DEVO 7.0. . . . .   CYRF6936 9DEVO59 FRSKYV 25.0. . . . .   CC2500 4FRSKYV = FrSky 1 way
18 YD717 8.0YD717   NRF24L01 10YD717Auto60 HONTAI 26.0HONTAI   NRF24L01 12HONTAI
19 YD717 8.1SKYWLKR   NRF24L01 10YD717 => SKYWLKRAuto61 HONTAI 26.1JJRCX1   NRF24L01 7HONTAI => JJRCX1
20 YD717 8.2SYMAX4   NRF24L01 10YD717 => SYMAX4Auto62 HONTAI 26.2X5C1   NRF24L01 12HONTAI => X5C1
21 YD717 8.3XINXUN   NRF24L01 10YD717 => XINXUNAuto63 HONTAI 26.3FQ777   NRF24L01 9HONTAI => FQ777
22 YD717 8.4NIHUI   NRF24L01 10YD717 => NIHUIAuto64 OPENLRS 27.0. . . . .   Other OPENLRS
23 KN 9.0WLTOYS   NRF24L01 12KN65 JOYSWAY 40.0. . . . .   A7105 5Joysway
24 KN 9.1FEILUN   NRF24L01 12KN => FEILUN66 WK2X01 41.0WK2801   CYRF6936 9WK2x01
25 SYMAX 10.0SYMAX   NRF24L01 10SymaxAuto67 WK2X01 41.1WK2601   CYRF6936 8WK2x01 => WK2601
26 SYMAX 10.1SYMAX5C   NRF24L01 10Symax => SYMAX5CAuto68 WK2X01 41.2WK2401   CYRF6936 5WK2x01 => WK2401
27 SLT 11.0. . . . .   NRF24L01 7SLTAuto69 SKYARTEC 42.0. . . . .   CC2500 8SKYARTEC
28 CX10 12.0GREEN   NRF24L01 7CX10Auto70 UDI 44.0U816_V1   NRF24L01 11UDI
29 CX10 12.1BLUE   NRF24L01 9CX10 => BLUEAuto71 UDI 44.1U816_V2   NRF24L01 11UDI => U816_V2
30 CX10 12.2DM007   NRF24L01 10CX10 => DM007Auto72 UDI 44.2U839_2014   NRF24L01 11UDI => U839_2014
31 CX10 12.3Q282   NRF24L01 13CX10 => Q282 and Q242Auto73 FBL100 45.0FBL100   NRF24L01 9FBL100
32 CX10 12.4JC3015_1   NRF24L01 9CX10 => JC3015_1Auto74 FBL100 45.1HP100   NRF24L01 9FBL100 => HP100
33 CX10 12.5JC3015_2   NRF24L01 9CX10 => JC3015_2Auto75 HM830 50.0. . . . .   NRF24L01 6HM830
34 CX10 12.6MK33041   NRF24L01 11CX10 => MK33041Auto76 CFLIE 51.0. . . . .   NRF24L01 5CFLIE
35 CX10 12.7Q242   NRF24L01 13CX10 => Q282 and Q242Auto77 H377 52.0. . . . .   NRF24L01 9H377
36 CG023 13.0CG023   NRF24L01 10CG023Auto78 ESKY150 53.0. . . . .   NRF24L01 5ESKY150
37 CG023 13.1YD829   NRF24L01 10CG023 => YD829Auto79 BLUEFLY 54.0. . . . .   NRF24L01 7BLUEFLY
38 CG023 13.2H8_3D   NRF24L01 10CG023 => H8_3DAuto80 NE260 55.0. . . . .   NRF24L01 5NE260
39 BAYANG 14.0. . . . .   NRF24L01 11BAYANGAuto81 AFHDS2A 56.0. . . . .   A7105 15Flysky AFHDS2A
40 FRSKYX 15.0CH_16   CC2500 16FRSKYX82 INAV 57.0. . . . .   NRF24L01 1INAV
41 FRSKYX 15.1CH_8   CC2500 8FRSKYX => CH_8

+ +
+

SERIAL

+

. . . . .

+

+
+ + + +
+

Close

+ +
+

FLYSKY

+

FLYSKY

+

+
+ + Extended limits supported
Note that the RX ouput will be AETR.

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRCH5CH6CH7CH8Reset/Bind
+

Close

+ +
+

FLYSKY

+

V9X9

+

+
+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRFLIPLIGHTPICTUREVIDEOReset/Bind
+

Close

+ +
+

FLYSKY

+

V6X6

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSRTHXCALYCALReset/Bind
+

Close

+ +
+

FLYSKY

+

V912

+

+
+ + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH14
AETRBTMBTNTOPBTNReset/Bind
+

Close

+ +
+

HUBSAN

+

H107

+

+
+ + Models: Hubsan H102D, H107/L/C/D and Hubsan H107P/C+/D+
Autobind protocol
Telemetry enabled for battery voltage and TX RSSI
Option=vTX frequency (H107D) 5645 - 5900 MHz

+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

HUBSAN

+

H301

+

+
+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRLEDSTABRTHVIDEOReset/Bind
+

Close

+ +
+

HUBSAN

+

H501

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH0CH14
AETRFLIPLIGHTRTHVIDEOHEADLESSGPS_HOLDALT_HOLDSNAPSHOT---Reset/Bind
+

Close

+ +
+

FRSKYD

+

. . . . .

+

+ Modèle : FrSky receivers D4R and D8R. DIY RX-F801 and RX-F802 receivers.
+ Option : fine frequency tuning. This value is different +for each board. To determine the option value, find the two limits where + the RX loses connection then set the option value to half way between +them. If you have a 4in1 V2 board the value is around 40.
+ Extended limits supported
Telemetry enabled for A0, A1, RSSI, TSSI and Hub

+ + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8
------------------------
+

Close

+ +
+

HISKY

+

HISKY

+

+
+ + GYRO: -100%=6G, +100%=3G

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRGEARPITCHGYROCH8Reset/Bind
+

Close

+ +
+

HISKY

+

HK310

+

+ Modèle : RX HK-3000, HK3100 and XY3000 (TX are HK-300, HK-310 and TL-3C)
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH0CH14
TRAUXT_FSAFER_FSAFEAUX_FSAFEReset/Bind
+

Close

+ +
+

V2X2

+

. . . . .

+

+ Modèle : WLToys V202/252/272, JXD 385/388, JJRC H6C, Yizhan Tarantula X6 ...
+ + PICTURE: also automatic Missile Launcher and Hoist in one direction
VIDEO: also Sprayer, Bubbler, Missile Launcher(1), and Hoist in the other dir

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSMAG_CAL_XMAG_CAL_YReset/Bind
+

Close

+ +
+

DSM

+

DSM2_22

+

+
+ + Extended limits supported
Telemetry enabled for TSSI and plugins
option=number of channels from 4 to 12. An invalid option value will end up with 6 channels.
Notes:
- + model/type/number of channels indicated on the RX can be different from + what the RX is in fact wanting to see. So don't hesitate to test +different combinations until you have something working. Using Auto is +the best way to find these settings.
- RX ouput will always be TAER independently of the input AETR, RETA...
DSM2, Resolution 1024, refresh rate 22ms

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12
AETRCH5CH6CH7CH8CH9CH10CH11CH12
+

Close

+ +
+

DSM

+

DSM2_11

+

+
+ + DSM2, Resolution 2048, refresh rate 11ms

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12
AETRCH5CH6CH7CH8CH9CH10CH11CH12
+

Close

+ +
+

DSM

+

DSMX_22

+

+
+ + DSMX, Resolution 2048, refresh rate 22ms

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12
AETRCH5CH6CH7CH8CH9CH10CH11CH12
+

Close

+ +
+

DSM

+

DSMX_11

+

+
+ + DSMX, Resolution 2048, refresh rate 11ms

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12
AETRCH5CH6CH7CH8CH9CH10CH11CH12
+

Close

+ +
+

DSM

+

AUTO

+

+
+ + The "AUTO" feature enables the TX to automatically choose what are the + best settings for your DSM RX and update your model protocol settings +accordingly.
The current radio firmware which are able to use the +"AUTO" feature are ersky9x (9XR Pro, 9Xtreme, Taranis, ...) and er9x for + M128 (9XR) and M2561.
For these firmwares, you must have a telemetry enabled TX and you have to make sure you set the Telemetry "Usr proto" to "DSMx".
Also + on er9x you will need to be sure to match the polarity of the telemetry + serial (normal or inverted by bitbashing), while on ersky9x you can set + "Invert COM1" accordinlgy.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12
AETRCH5CH6CH7CH8CH9CH10CH11CH12
+

Close

+ +
+

DEVO

+

. . . . .

+

+
+ + Extended limits supported
Note that the RX ouput will be EATR.
Bind procedure using serial:
- + With the TX off, put the binding plug in and power on the RX (RX LED +slow blink), then power it down and remove the binding plug. Receiver +should now be in autobind mode.
- Turn on the TX, set protocol = Devo with option=0, turn off the TX (TX is now in autobind mode).
- 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.
- Change option to 1 to use the global ID.
- Do not touch option/RX_Num anymore.
Bind procedure using PPM:
- + With the TX off, put the binding plug in and power on the RX (RX LED +slow blink), then power it down and remove the binding plug. Receiver +should now be in autobind mode.
- Turn on RX (RX LED fast blink).
- Turn the dial to the model number running protocol DEVO on the module.
- Press the bind button and turn on the TX. TX is now in autobind mode.
- Release bind button after 1 second: RX LED solid, TX LED fast blink.
- 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.

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRCH5CH6CH7CH8Reset/Bind
+

Close

+ +
+

YD717

+

YD717

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

YD717

+

SKYWLKR

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

YD717

+

SYMAX4

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

YD717

+

XINXUN

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

YD717

+

NIHUI

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

KN

+

WLTOYS

+

+
+ + Dual Rate: +100%=full range, Throttle Hold: +100%=hold, Idle Up: +100%=3D, GYRO: -100%=6G, +100%=3G

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH14
AETRDRTHOLDIDLEUPGYROTtrimAtrimEtrimReset/Bind
+

Close

+ +
+

KN

+

FEILUN

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH14
AETRDRTHOLDIDLEUPGYROTtrimAtrimEtrimReset/Bind
+

Close

+ +
+

SYMAX

+

SYMAX

+ Autobind

+ Modèle : Syma X5C-1/X11/X11C/X12
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

SYMAX

+

SYMAX5C

+ Autobind

+
+ + Model: Syma X5C (original) and X2

+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

SLT

+

. . . . .

+ Autobind

+
+ + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH14
AETRGEARPITCHReset/Bind
+

Close

+ +
+

CX10

+

GREEN

+ Autobind

+ Modèle : Cheerson CX-10 green pcb
+ + Extended limits supported
Rate: -100%=rate 1, 0%=rate 2, +100%=rate 3

+ + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH14
AETRFLIPRATEReset/Bind
+

Close

+ +
+

CX10

+

BLUE

+ Autobind

+ Modèle : Cheerson CX-10 blue pcb & some newer red pcb, CX-10A, CX-10C, CX11, CX12, Floureon FX10, JJRC DHD D1
+ + Rate: -100%=rate 1, 0%=rate 2, +100%=rate 3 or headless for CX-10A

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRFLIPRATEPICTUREVIDEOReset/Bind
+

Close

+ +
+

CX10

+

DM007

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPMODEPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

CX10

+

Q282

+ Autobind

+
+ + Model: JXD 509 is using Q282 with CH12=Start/Stop motors

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHXCALYCALReset/Bind
+

Close

+ +
+

CX10

+

JC3015_1

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRFLIPMODEPICTUREVIDEOReset/Bind
+

Close

+ +
+

CX10

+

JC3015_2

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRFLIPMODELEDDFLIPReset/Bind
+

Close

+ +
+

CX10

+

MK33041

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH14
AETRFLIPMODEPICTUREVIDEOHEADLESSRTHReset/Bind
+

Close

+ +
+

CX10

+

Q242

+ Autobind

+
+ + Model: JXD 509 is using Q282 with CH12=Start/Stop motors

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHXCALYCALReset/Bind
+

Close

+ +
+

CG023

+

CG023

+ Autobind

+ Modèle : EAchine CG023/CG031/3D X4
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGHTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

CG023

+

YD829

+ Autobind

+ Modèle : Attop YD-822/YD-829/YD-829C ...
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

CG023

+

H8_3D

+ Autobind

+ Modèle : EAchine H8 mini 3D, JJRC H20/H22
+ + JJRC H20: OPT1=Headless, OPT2=RTH
JJRC H22: OPT1=RTH, OPT2=180/360° flip mode
H8 3D: OPT1=RTH then press a direction to enter headless mode (like stock TX), OPT2=switch 180/360° flip mode
CAL: calibrate accelerometers

+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLIGTHOPT1OPT2CALReset/Bind
+

Close

+ +
+

BAYANG

+

. . . . .

+ Autobind

+ Modèle : EAchine H8(C) mini, BayangToys X6/X7/X9, JJRC JJ850, Floureon H101 ...
+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH14
AETRFLIPRTHPICTUREVIDEOHEADLESSINVERTEDReset/Bind
+

Close

+ +
+

FRSKYX

+

CH_16

+

+ Modèle : FrSky receivers X4R, X6R and X8R.
+ Option : fine frequency tuning. This value is different +for each board. To determine the option value, find the two limits where + the RX loses connection then set the option value to half way between +them. If you have a 4in1 V2 board the value is around 40.
+ Extended limits supported
Telemetry enabled for A1 (RxBatt), A2, RSSI, TSSI and Hub

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14CH15CH16
-------------------------------------------------------
+

Close

+ +
+

FRSKYX

+

CH_8

+

+
+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8
------------------------
+

Close

+ +
+

ESKY

+

. . . . .

+

+
+ + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH14
AETRGYROPITCHReset/Bind
+

Close

+ +
+

MT99XX

+

MT99

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

MT99XX

+

H7

+ Autobind

+ Modèle : Eachine H7, Cheerson CX023
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

MT99XX

+

YZ

+ Autobind

+
+ + Model: Yi Zhan i6S
Only one model can be flown at the same time since the ID is hardcoded.

+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

MT99XX

+

LS

+ Autobind

+ Modèle : LS114, 124, 215
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPINVERTPICTUREVIDEOHEADLESSReset/Bind
+

Close

+ +
+

MJXQ

+

WLH08

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHAUTOFLIPPANTILTReset/Bind
+

Close

+ +
+

MJXQ

+

X600

+ Autobind

+
+ + Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHAUTOFLIPPANTILTReset/Bind
+

Close

+ +
+

MJXQ

+

X800

+ Autobind

+
+ + Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHAUTOFLIPPANTILTReset/Bind
+

Close

+ +
+

MJXQ

+

H26D

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHAUTOFLIPPANTILTReset/Bind
+

Close

+ +
+

MJXQ

+

E010

+ Autobind

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHAUTOFLIPPANTILTReset/Bind
+

Close

+ +
+

SHENQI

+

. . . . .

+ Autobind

+
+ + Model: Shenqiwei 1/20 Mini Motorcycle
Throttle +100%=full forward,0%=stop,-100%=full backward.

+ + + + + + + + + + + +
CH1CH2CH3CH4CH14
TRReset/Bind
+

Close

+ +
+

FY326

+

FY326

+

+
+ + Autobind

+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPHEADLESSRTHCalibrateExpertReset/Bind
+

Close

+ +
+

FY326

+

FY319

+

+
+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH14
AETRFLIPHEADLESSRTHCalibrateExpertReset/Bind
+

Close

+ +
+

SFHSS

+

. . . . .

+

+ Modèle : Futaba RXs and XK models.
+ Option : fine frequency tuning. This value is different +for each board. To determine the option value, find the two limits where + the RX loses connection then set the option value to half way between +them. If you have a 4in1 V2 board the value is around 40.
+ ***

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRCH5CH6CH7CH8Reset/Bind
+

Close

+ +
+

J6PRO

+

. . . . .

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH14
------------------------------------Reset/Bind
+

Close

+ +
+

FQ777

+

. . . . .

+

+
+ + Model: FQ777-124

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRFLIPRTHHEADLESSEXPERTReset/Bind
+

Close

+ +
+

ASSAN

+

. . . . .

+

+
+ + Extended limits supported
The transmitter must be close to the receiver while binding.

+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH14
------------------------------Reset/Bind
+

Close

+ +
+

FRSKYV

+

. . . . .

+

+ Modèle : FrSky receivers V8R4, V8R7 and V8FR.
+ Option : fine frequency tuning. This value is different +for each board. To determine the option value, find the two limits where + the RX loses connection then set the option value to half way between +them. If you have a 4in1 V2 board the value is around 40.
+ Extended limits supported

+ + + + + + + + + +
CH1CH2CH3CH4
------------
+

Close

+ +
+

HONTAI

+

HONTAI

+

+
+ + Autobind protocol

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHCALReset/Bind
+

Close

+ +
+

HONTAI

+

JJRCX1

+

+
+ + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH6CH0CH14
AETRARMReset/Bind
+

Close

+ +
+

HONTAI

+

X5C1

+

+
+ + X5C1 clone

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH14
AETRFLIPLEDPICTUREVIDEOHEADLESSRTHCALReset/Bind
+

Close

+ +
+

HONTAI

+

FQ777

+

+
+ + Format FQ777-951C

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH6CH7CH8CH9CH14
AETRFLIPSNAPSHOTVIDEOHEADLESSReset/Bind
+

Close

+ +
+

OPENLRS

+

. . . . .

+

+
+ + Empty protocol

+ +
+

Close

+ +
+

JOYSWAY

+

. . . . .

+

+
+ + + + + + + + + + + + + +
CH1CH2CH3CH4CH14
AETRReset/Bind
+

Close

+ +
+

WK2X01

+

WK2801

+

+
+ + Autobind

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
------------------------Reset/Bind
+

Close

+ +
+

WK2X01

+

WK2601

+

+
+ + Option:
0 = 5+1
2 = 6+1
..1 = Hélicoptère (. = autres options pour ce mode)
.01 = Hélicoptère normal
.11 = Hélicoptère avec pit inversé
0.1 = Pitch curve -100
1.1 = Pitch curve 100
CONF: Option 1 = Rate Throtle
Option 2 = Pitch

+ + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH14
---------------------Reset/Bind
+

Close

+ +
+

WK2X01

+

WK2401

+

+
+ + + + + + + + + + + + + +
CH1CH2CH3CH4CH14
------------Reset/Bind
+

Close

+ +
+

SKYARTEC

+

. . . . .

+

+
+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH14
? ? ? ? ? ? ?Reset/Bind
+

Close

+ +
+

UDI

+

U816_V1

+

+
+ + Modele: Known UDI 2.4GHz protocol variants, all using BK2421
* UDI U819 coaxial 3ch helicoper
* UDI U816/817/818 quadcopters
- "V1" with orange LED on TX, U816 RX labeled '' , U817/U818 RX labeled 'UD-U817B'
- "V2" with red LEDs on TX, U816 RX labeled '', U817/U818 RX labeled 'UD-U817OG'
- "V3" with green LEDs on TX. Did not get my hands on yet.
* U830 mini quadcopter with tilt steering ("Protocol 2014")
* U839 nano quadcopter ("Protocol 2014")
Autobind

+ + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH14
AETRFLIP 360FLIPVIDEOLEDMODE 2---Reset/Bind
+

Close

+ +
+

UDI

+

U816_V2

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH14
AETRFLIP 360FLIPVIDEOLEDMODE 2---Reset/Bind
+

Close

+ +
+

UDI

+

U839_2014

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH14
AETRFLIP 360FLIPVIDEOLEDMODE 2---Reset/Bind
+

Close

+ +
+

FBL100

+

FBL100

+

+
+ + Autobind

+ + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
? ? ? ? ? ? ? ?Reset/Bind
+

Close

+ +
+

FBL100

+

HP100

+

+
+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
? ? ? ? ? ? ? ?Reset/Bind
+

Close

+ +
+

HM830

+

. . . . .

+

+
+ + Modele: HM Hobby HM830 RC Paper Airplane
Autobind

+ + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH14
ATurboTTrimBoutonReset/Bind
+

Close

+ +
+

CFLIE

+

. . . . .

+

+
+ + Modele: CrazyFlie Nano quad
Autobind

+ + + + + + + + + + + +
CH1CH2CH3CH4CH14
AETRReset/Bind
+

Close

+ +
+

H377

+

. . . . .

+

+
+ + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH14
AETRCH5CH6CH7CH8Reset/Bind
+

Close

+ +
+

ESKY150

+

. . . . .

+

+
+ + Autobind

+ + + + + + + + + + + +
CH1CH2CH3CH4CH14
AETRReset/Bind
+

Close

+ +
+

BLUEFLY

+

. . . . .

+

+
+ + Autobind

+ + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH14
AETRGEARPITCHReset/Bind
+

Close

+ +
+

NE260

+

. . . . .

+

+
+ + Modele: Nine Eagles SoloPro
Autobind

+ + + + + + + + + + + +
CH1CH2CH3CH4CH14
AETRReset/Bind
+

Close

+ +
+

AFHDS2A

+

. . . . .

+

+
+ + Telemetry enabled for battery voltage and TX RSSI
Option= 0-PWM_IBUS 1-PPM_IBUS 2-PWM_SBUS 3-PPM_SBUS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CH1CH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14CH15
TCH2CH3CH4CH5CH6CH7CH8CH9CH10CH11CH12CH13CH14Failsave T
+

Close

+ +
+

INAV

+

. . . . .

+

+
+ + En cours de passage

+ + + +
CH14
Reset/Bind
+

Close

+ +
+
+

LUA Script       Close

+ +

Liste Protocoles       Close

+ +
+ \ No newline at end of file diff --git a/Multiprotocol/MJXQ_nrf24l01.ino b/Multiprotocol/MJXQ_nrf24l01.ino index a1cb14a..ae95060 100644 --- a/Multiprotocol/MJXQ_nrf24l01.ino +++ b/Multiprotocol/MJXQ_nrf24l01.ino @@ -12,11 +12,7 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ -<<<<<<< HEAD -// compatible with MJX WLH08, X600, X800, H26D -======= // compatible with MJX WLH08, X600, X800, H26D, Eachine E010 ->>>>>>> refs/remotes/pascallanger/master // Last sync with hexfet new_protocols/mjxq_nrf24l01.c dated 2016-01-17 #if defined(MJXQ_NRF24L01_INO) @@ -30,8 +26,6 @@ #define MJXQ_RF_NUM_CHANNELS 4 #define MJXQ_ADDRESS_LENGTH 5 -<<<<<<< HEAD -======= // haven't figured out txid<-->rf channel mapping for MJX models const uint8_t PROGMEM MJXQ_map_rfchan[][4] = { {0x0A, 0x46, 0x3A, 0x42}, @@ -43,7 +37,6 @@ const uint8_t PROGMEM MJXQ_map_txid[][3] = { {0x48, 0x6A, 0x40} }; ->>>>>>> refs/remotes/pascallanger/master #define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing #define MJXQ_PAN_DOWN 0x08 #define MJXQ_PAN_UP 0x04 @@ -57,16 +50,6 @@ static uint8_t __attribute__((unused)) MJXQ_pan_tilt_value() packet_count++; if(packet_count & MJXQ_PAN_TILT_COUNT) { -<<<<<<< HEAD - if(Servo_AUX8) - pan=MJXQ_PAN_UP; - if(Servo_data[AUX8]PPM_MIN_COMMAND) - pan=MJXQ_TILT_UP; - if(Servo_data[AUX9]PPM_MAX_COMMAND) pan=MJXQ_PAN_UP; if(Servo_data[AUX8]>>>>>> refs/remotes/pascallanger/master } return pan; } @@ -86,17 +68,10 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) packet[0] = convert_channel_8b(THROTTLE); packet[1] = convert_channel_s8b(RUDDER); packet[4] = 0x40; // rudder does not work well with dyntrim -<<<<<<< HEAD - packet[2] = convert_channel_s8b(ELEVATOR); - packet[5] = MJXQ_CHAN2TRIM(packet[2]); // trim elevator - packet[3] = convert_channel_s8b(AILERON); - packet[6] = MJXQ_CHAN2TRIM(packet[3]); // trim aileron -======= packet[2] = 0x80 ^ convert_channel_s8b(ELEVATOR); packet[5] = GET_FLAG(Servo_AUX5, 1) ? 0x40 : MJXQ_CHAN2TRIM(packet[2]); // trim elevator packet[3] = convert_channel_s8b(AILERON); packet[6] = GET_FLAG(Servo_AUX5, 1) ? 0x40 : MJXQ_CHAN2TRIM(packet[3]); // trim aileron ->>>>>>> refs/remotes/pascallanger/master packet[7] = rx_tx_addr[0]; packet[8] = rx_tx_addr[1]; packet[9] = rx_tx_addr[2]; @@ -121,10 +96,7 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) packet[10]=MJXQ_pan_tilt_value(); // fall through on purpose - no break case WLH08: -<<<<<<< HEAD -======= case E010: ->>>>>>> refs/remotes/pascallanger/master packet[10] += GET_FLAG(Servo_AUX6, 0x02) //RTH | GET_FLAG(Servo_AUX5, 0x01); //HEADLESS if (!bind) @@ -137,14 +109,6 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) } break; case X600: -<<<<<<< HEAD - if(Servo_AUX5) //HEADLESS - { // driven trims cause issues when headless is enabled - packet[5] = 0x40; - packet[6] = 0x40; - } -======= ->>>>>>> refs/remotes/pascallanger/master packet[10] = GET_FLAG(!Servo_AUX2, 0x02); //LED packet[11] = GET_FLAG(Servo_AUX6, 0x01); //RTH if (!bind) @@ -178,11 +142,7 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) if (sub_protocol == H26D) NRF24L01_SetTxRxMode(TX_EN); else -<<<<<<< HEAD - XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); -======= XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++ / 2]); hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated @@ -205,20 +165,12 @@ static void __attribute__((unused)) MJXQ_init() if (sub_protocol == WLH08) memcpy(hopping_frequency, "\x12\x22\x32\x42", MJXQ_RF_NUM_CHANNELS); else -<<<<<<< HEAD - if (sub_protocol == H26D) -======= if (sub_protocol == H26D || sub_protocol == E010) ->>>>>>> refs/remotes/pascallanger/master memcpy(hopping_frequency, "\x36\x3e\x46\x2e", MJXQ_RF_NUM_CHANNELS); else { memcpy(hopping_frequency, "\x0a\x35\x42\x3d", MJXQ_RF_NUM_CHANNELS); -<<<<<<< HEAD - memcpy(addr, "\x6d\x6a\x73\x73\x73", MJXQ_RF_NUM_CHANNELS); -======= memcpy(addr, "\x6d\x6a\x73\x73\x73", MJXQ_ADDRESS_LENGTH); ->>>>>>> refs/remotes/pascallanger/master } @@ -237,53 +189,25 @@ static void __attribute__((unused)) MJXQ_init() NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // no retransmits NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, MJXQ_PACKET_SIZE); // rx pipe 0 (used only for blue board) -<<<<<<< HEAD - NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps -======= if (sub_protocol == E010) NRF24L01_SetBitrate(NRF24L01_BR_250K); // 250K else NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps ->>>>>>> refs/remotes/pascallanger/master NRF24L01_SetPower(); } static void __attribute__((unused)) MJXQ_init2() { -<<<<<<< HEAD - // haven't figured out txid<-->rf channel mapping for MJX models - static const uint8_t rf_map[][4] = { - {0x0A, 0x46, 0x3A, 0x42}, - {0x0A, 0x3C, 0x36, 0x3F}, - {0x0A, 0x43, 0x36, 0x3F} }; - if (sub_protocol == H26D) - memcpy(hopping_frequency, "\x32\x3e\x42\x4e", MJXQ_RF_NUM_CHANNELS); - else - if (sub_protocol == WLH08) - memcpy(hopping_frequency, rf_map[rx_tx_addr[0]%3], MJXQ_RF_NUM_CHANNELS); -======= if (sub_protocol == H26D) memcpy(hopping_frequency, "\x32\x3e\x42\x4e", MJXQ_RF_NUM_CHANNELS); else if (sub_protocol != WLH08 && sub_protocol != E010) for(uint8_t i=0;i>>>>>> refs/remotes/pascallanger/master } static void __attribute__((unused)) MJXQ_initialize_txid() { -<<<<<<< HEAD - // haven't figured out txid<-->rf channel mapping for MJX models - static const uint8_t tx_map[][3]={ - {0xF8, 0x4F, 0x1C}, - {0xC8, 0x6E, 0x02}, - {0x48, 0x6A, 0x40} }; - if (sub_protocol == WLH08) - rx_tx_addr[0]&=0xF8; // txid must be multiple of 8 - else - memcpy(rx_tx_addr,tx_map[rx_tx_addr[0]%3],3); -======= rx_tx_addr[0]&=0xF8; if (sub_protocol == E010) { @@ -293,7 +217,6 @@ static void __attribute__((unused)) MJXQ_initialize_txid() else for(uint8_t i=0;i<3;i++) rx_tx_addr[i]=pgm_read_byte_near( &MJXQ_map_txid[rx_tx_addr[4]%3][i] ); ->>>>>>> refs/remotes/pascallanger/master } uint16_t MJXQ_callback() diff --git a/Multiprotocol/MT99xx_nrf24l01.ino b/Multiprotocol/MT99xx_nrf24l01.ino index dff51d7..4fb2d65 100644 --- a/Multiprotocol/MT99xx_nrf24l01.ino +++ b/Multiprotocol/MT99xx_nrf24l01.ino @@ -12,11 +12,7 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ -<<<<<<< HEAD -// compatible with MT99xx, Eachine H7, Yi Zhan i6S -======= // compatible with MT99xx, Eachine H7, Yi Zhan i6S and LS114/124 ->>>>>>> refs/remotes/pascallanger/master // Last sync with Goebish mt99xx_nrf24l01.c dated 2016-01-29 #if defined(MT99XX_NRF24L01_INO) @@ -41,8 +37,6 @@ enum{ FLAG_MT_FLIP = 0x80, }; -<<<<<<< HEAD -======= enum{ // flags going to packet[6] (LS) FLAG_LS_INVERT = 0x01, @@ -53,43 +47,12 @@ enum{ FLAG_LS_FLIP = 0x80, }; ->>>>>>> refs/remotes/pascallanger/master enum { MT99XX_INIT = 0, MT99XX_BIND, MT99XX_DATA }; -<<<<<<< HEAD -static void __attribute__((unused)) MT99XX_send_packet() -{ - const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60}; - const uint8_t mys_byte[] = { - 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14, - 0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10 - }; - static uint8_t yz_seq_num=0; - - if(sub_protocol != YZ) - { // MT99XX & H7 - packet[0] = convert_channel_8b_scale(THROTTLE,0x00,0xE1); // throttle - packet[1] = convert_channel_8b_scale(RUDDER ,0x00,0xE1); // rudder - packet[2] = convert_channel_8b_scale(AILERON ,0x00,0xE1); // aileron - packet[3] = convert_channel_8b_scale(ELEVATOR,0x00,0xE1); // elevator - packet[4] = 0x20; // pitch trim (0x3f-0x20-0x00) - packet[5] = 0x20; // roll trim (0x00-0x20-0x3f) - packet[6] = GET_FLAG( Servo_AUX1, FLAG_MT_FLIP ) - | GET_FLAG( Servo_AUX3, FLAG_MT_SNAPSHOT ) - | GET_FLAG( Servo_AUX4, FLAG_MT_VIDEO ); - if(sub_protocol==MT99) - packet[6] |= 0x40 | FLAG_MT_RATE2; - else - packet[6] |= FLAG_MT_RATE1; // max rate on H7 - // todo: mys_byte = next channel index ? - // low nibble: index in chan list ? - // high nibble: 0->start from start of list, 1->start from end of list ? - packet[7] = mys_byte[hopping_frequency_no]; -======= const uint8_t h7_mys_byte[] = { 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10 @@ -138,7 +101,6 @@ static void __attribute__((unused)) MT99XX_send_packet() ls_counter=0; } ->>>>>>> refs/remotes/pascallanger/master uint8_t result=checksum_offset; for(uint8_t i=0; i<8; i++) result += packet[i]; @@ -147,15 +109,9 @@ static void __attribute__((unused)) MT99XX_send_packet() else { // YZ packet[0] = convert_channel_8b_scale(THROTTLE,0x00,0x64); // throttle -<<<<<<< HEAD - packet[1] = convert_channel_8b_scale(RUDDER ,0x00,0x64); // rudder - packet[2] = convert_channel_8b_scale(ELEVATOR,0x00,0x64); // elevator - packet[3] = convert_channel_8b_scale(AILERON ,0x00,0x64); // aileron -======= packet[1] = convert_channel_8b_scale(RUDDER ,0x64,0x00); // rudder packet[2] = convert_channel_8b_scale(ELEVATOR,0x00,0x64); // elevator packet[3] = convert_channel_8b_scale(AILERON ,0x64,0x00); // aileron ->>>>>>> refs/remotes/pascallanger/master if(packet_count++ >= 23) { yz_seq_num ++; @@ -176,14 +132,10 @@ static void __attribute__((unused)) MT99XX_send_packet() packet[8] = 0xff; } -<<<<<<< HEAD - NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no] + channel_offset); -======= if(sub_protocol == LS) NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x2D); // LS always transmits on the same channel else NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no] + channel_offset); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); XN297_WritePayload(packet, MT99XX_PACKET_SIZE); @@ -201,16 +153,11 @@ static void __attribute__((unused)) MT99XX_send_packet() static void __attribute__((unused)) MT99XX_init() { NRF24L01_Initialize(); -<<<<<<< HEAD - NRF24L01_SetTxRxMode(TX_EN); - NRF24L01_FlushTx(); -======= if(sub_protocol == YZ) XN297_SetScrambledMode(XN297_UNSCRAMBLED); NRF24L01_SetTxRxMode(TX_EN); NRF24L01_FlushTx(); XN297_SetTXAddr((uint8_t *)"\xCC\xCC\xCC\xCC\xCC", 5); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only @@ -222,31 +169,18 @@ static void __attribute__((unused)) MT99XX_init() NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps NRF24L01_SetPower(); -<<<<<<< HEAD - XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP) | (sub_protocol == YZ ? BV(XN297_UNSCRAMBLED):0) ); - - XN297_SetTXAddr((uint8_t *)"\xCC\xCC\xCC\xCC\xCC", 5); -======= XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) ); ->>>>>>> refs/remotes/pascallanger/master } static void __attribute__((unused)) MT99XX_initialize_txid() { -<<<<<<< HEAD -======= rx_tx_addr[3] = 0xCC; rx_tx_addr[4] = 0xCC; ->>>>>>> refs/remotes/pascallanger/master if(sub_protocol == YZ) { rx_tx_addr[0] = 0x53; // test (SB id) rx_tx_addr[1] = 0x00; -<<<<<<< HEAD - } - checksum_offset = (rx_tx_addr[0] + rx_tx_addr[1]) & 0xff; -======= rx_tx_addr[2] = 0x00; } else @@ -255,7 +189,6 @@ static void __attribute__((unused)) MT99XX_initialize_txid() else //MT99 & H7 rx_tx_addr[2] = 0x00; checksum_offset = rx_tx_addr[0] + rx_tx_addr[1] + rx_tx_addr[2]; ->>>>>>> refs/remotes/pascallanger/master channel_offset = (((checksum_offset & 0xf0)>>4) + (checksum_offset & 0x0f)) % 8; } @@ -267,26 +200,16 @@ uint16_t MT99XX_callback() { if (bind_counter == 0) { -<<<<<<< HEAD - rx_tx_addr[2] = 0x00; - rx_tx_addr[3] = 0xCC; - rx_tx_addr[4] = 0xCC; -======= ->>>>>>> refs/remotes/pascallanger/master // set tx address for data packets XN297_SetTXAddr(rx_tx_addr, 5); BIND_DONE; } else { -<<<<<<< HEAD - NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); -======= if(sub_protocol == LS) NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x2D); // LS always transmits on the same channel else NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); ->>>>>>> refs/remotes/pascallanger/master NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); XN297_WritePayload(packet, MT99XX_PACKET_SIZE); // bind packet @@ -313,25 +236,6 @@ uint16_t initMT99XX(void) MT99XX_init(); packet[0] = 0x20; -<<<<<<< HEAD - if(sub_protocol!=YZ) - { // MT99 & H7 - packet_period = MT99XX_PACKET_PERIOD_MT; - packet[1] = 0x14; - packet[2] = 0x03; - packet[3] = 0x25; - } - else - { // YZ - packet_period = MT99XX_PACKET_PERIOD_YZ; - packet[1] = 0x15; - packet[2] = 0x05; - packet[3] = 0x06; - } - packet[4] = rx_tx_addr[0]; // 1st byte for data state tx address - packet[5] = rx_tx_addr[1]; // 2nd byte for data state tx address (always 0x00 on Yi Zhan ?) - packet[6] = 0x00; // 3rd byte for data state tx address (always 0x00 ?) -======= packet_period = MT99XX_PACKET_PERIOD_MT; switch(sub_protocol) { // MT99 & H7 @@ -356,7 +260,6 @@ uint16_t initMT99XX(void) packet[4] = rx_tx_addr[0]; packet[5] = rx_tx_addr[1]; packet[6] = rx_tx_addr[2]; ->>>>>>> refs/remotes/pascallanger/master packet[7] = checksum_offset; // checksum offset packet[8] = 0xAA; // fixed packet_count=0; diff --git a/Multiprotocol/Multiprotocol 2.zip b/Multiprotocol/Multiprotocol 2.zip new file mode 100644 index 0000000000000000000000000000000000000000..1f14be86ea6fe62f850a813fba99807d2f539385 GIT binary patch literal 304859 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

2S5e~AF_L5;EfQ= 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�H^+eaBO67`X|`yTLw}ysAVjkZf+8M5k-R*Sp$d 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

O1BA)WI4;9L7grw#JkeAAUj^&gIJ@sx|Cuc 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 E1H#9JA^-pY literal 0 HcmV?d00001 diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index fe73f45..7659c50 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -5,13 +5,8 @@ http://www.rcgroups.com/forums/showthread.php?t=2165676 https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/edit/master/README.md -<<<<<<< HEAD - Thanks to PhracturedBlue, Hexfet, Goebish and all protocol developers - Ported from deviation firmware -======= Thanks to PhracturedBlue, Hexfet, Goebish, Victzh and all protocol developers - Ported from deviation firmware ->>>>>>> refs/remotes/pascallanger/master + Ported from deviation firmware 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 @@ -26,21 +21,14 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ -#include + #include #include -<<<<<<< HEAD -#include -======= //#define DEBUG_TX #include "Pins.h" ->>>>>>> refs/remotes/pascallanger/master #include "Multiprotocol.h" //Multiprotocol module configuration file #include "_Config.h" -<<<<<<< HEAD - -======= #include "TX_Def.h" #ifdef XMEGA @@ -53,39 +41,29 @@ #define DSM_TELEMETRY // Enable DSM telemetry #endif ->>>>>>> refs/remotes/pascallanger/master //Global constants/variables uint32_t MProtocol_id;//tx id, uint32_t MProtocol_id_master; -uint32_t blink=0; +uint32_t blink=0; // uint16_t counter; -uint8_t channel; -uint8_t packet[40]; +uint8_t channel; +uint8_t packet[40]; #define NUM_CHN 16 // Servo data uint16_t Servo_data[NUM_CHN]; uint8_t Servo_AUX; -<<<<<<< HEAD -const uint8_t ch[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4}; - -// Protocol variables -uint8_t rx_tx_addr[5]; -uint8_t phase; -======= uint16_t servo_max_100,servo_min_100,servo_max_125,servo_min_125; // Protocol variables uint8_t cyrfmfg_id[6];//for dsm2 and devo -uint8_t rx_tx_addr[5]; -uint8_t phase; ->>>>>>> refs/remotes/pascallanger/master +uint8_t rx_tx_addr[5]; +uint8_t phase; uint16_t bind_counter; -uint8_t bind_phase; -uint8_t binding_idx; +uint8_t bind_phase; +uint8_t binding_idx; uint16_t packet_period; -<<<<<<< HEAD uint8_t packet_count; uint8_t packet_sent; uint8_t packet_length; @@ -96,38 +74,22 @@ uint8_t rf_ch_num; uint8_t throttle, rudder, elevator, aileron; uint8_t flags; uint16_t crc; -// -uint32_t state; -uint8_t len; -uint8_t RX_num; -======= -uint8_t packet_count; -uint8_t packet_sent; -uint8_t packet_length; -uint8_t hopping_frequency[23]; -uint8_t *hopping_frequency_ptr; -uint8_t hopping_frequency_no=0; -uint8_t rf_ch_num; -uint8_t throttle, rudder, elevator, aileron; -uint8_t flags; -uint16_t crc; uint8_t crc8; uint16_t seed; // uint16_t state; -uint8_t len; -uint8_t RX_num; +uint8_t len; +uint8_t RX_num; #if defined(FRSKYX_CC2500_INO) || defined(SFHSS_CC2500_INO) uint8_t calData[48]; #endif //Channel mapping for protocols -const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8}; -const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8}; -const uint8_t CH_RETA[]={RUDDER, ELEVATOR, THROTTLE, AILERON, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8}; -const uint8_t CH_EATR[]={ELEVATOR, AILERON, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8}; ->>>>>>> refs/remotes/pascallanger/master + const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10}; + const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10}; + const uint8_t CH_RETA[]={RUDDER, ELEVATOR, THROTTLE, AILERON, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10}; + const uint8_t CH_EATR[]={ELEVATOR, AILERON, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10}; // Mode_select variables uint8_t mode_select; @@ -136,20 +98,10 @@ uint8_t protocol_flags=0,protocol_flags2=0; // PPM variable volatile uint16_t PPM_data[NUM_CHN]; -<<<<<<< HEAD -// Serial variables -#define RXBUFFER_SIZE 25 -#define TXBUFFER_SIZE 12 -volatile uint8_t rx_buff[RXBUFFER_SIZE]; -volatile uint8_t rx_ok_buff[RXBUFFER_SIZE]; -volatile uint8_t tx_buff[TXBUFFER_SIZE]; -volatile uint8_t idx = 0; -======= #ifndef XMEGA -//Random variable -volatile uint32_t gWDT_entropy=0; + //Random variable + volatile uint32_t gWDT_entropy=0; #endif ->>>>>>> refs/remotes/pascallanger/master //Serial protocol uint8_t sub_protocol; @@ -192,11 +144,6 @@ volatile uint8_t discard_frame = 0; #define MAX_PKT 27 uint8_t pkt[MAX_PKT];//telemetry receiving packets #if defined(TELEMETRY) -<<<<<<< HEAD -uint8_t pktt[MAX_PKT];//telemetry receiving packets - volatile uint8_t tx_head; - volatile uint8_t tx_tail; -======= #ifdef INVERT_TELEMETRY // enable bit bash for serial #ifndef XMEGA @@ -212,7 +159,6 @@ uint8_t pktt[MAX_PKT];//telemetry receiving packets volatile uint8_t tx_head=0; volatile uint8_t tx_tail=0; #endif // BASH_SERIAL ->>>>>>> refs/remotes/pascallanger/master uint8_t v_lipo; int16_t RSSI_dBm; //const uint8_t RSSI_offset=72;//69 71.72 values db @@ -244,11 +190,11 @@ void setup() TCC1.PER = 0xFFFF ; TCNT1 = 0 ; TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) - #else + #else // General pinout // all inputs DDRB=0x00;DDRC=0x00;DDRD=0x00; - // outputs + // outputs SDI_output; SCLK_output; #ifdef A7105_INSTALLED @@ -268,12 +214,12 @@ void setup() PE2_output; SERIAL_TX_output; - // pullups + //pullup on dial (D10=PB2,D11=PB3,D12=PB4) and bind button 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); - BIND_port |= _BV(BIND_pin); + BIND_port |= _BV(BIND_pin); // Timer1 config TCCR1A = 0; @@ -284,19 +230,6 @@ void setup() #endif // Set Chip selects -<<<<<<< HEAD - CS_on; - CC25_CSN_on; - NRF_CSN_on; - CYRF_CSN_on; - // Set SPI lines - SDI_on; - SCK_off; - - // Timer1 config - TCCR1A = 0; - TCCR1B = (1 << CS11); //prescaler8, set timer1 to increment every 0.5us(16Mhz) and start timer -======= #ifdef A7105_INSTALLED A7105_CSN_on; #endif @@ -309,63 +242,32 @@ void setup() #ifdef NRF24L01_INSTALLED NRF_CSN_on; #endif - // Set SPI lines + // Set SPI lines SDI_on; SCLK_off; ->>>>>>> refs/remotes/pascallanger/master // Set servos positions for(uint8_t i=0;i>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0 - //********************************** -//mode_select=1; // here to test PPM - //********************************** - - // Update LED - LED_OFF; - LED_SET_OUTPUT; - - // Read or create protocol id - MProtocol_id_master=random_id(10,false); - - //Init RF modules - #ifdef CC2500_INSTALLED - CC2500_Reset(); - #endif - -======= Servo_data[THROTTLE]=servo_min_100; #ifdef ENABLE_PPM memcpy((void *)PPM_data,Servo_data, sizeof(Servo_data)); #endif - + //Wait for every component to start delayMilliseconds(100); // Read status of bind button if( IS_BIND_BUTTON_on ) - BIND_BUTTON_FLAG_on; // If bind button pressed save the status for protocol id reset under hubsan + BIND_BUTTON_FLAG_on; // If bind button pressed save the status for protocol id reset under hubsan // Read status of mode select binary switch // after this mode_select will be one of {0000, 0001, ..., 1111} #ifndef ENABLE_PPM mode_select = MODE_SERIAL ; // force serial mode #else - mode_select = +// mode_select=0x0F - ( ( (PINB>>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0 + 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) + @@ -379,66 +281,50 @@ void setup() //Init RF modules modules_reset(); -#ifndef XMEGA - //Init the seed with a random value created from watchdog timer for all protocols requiring random values - randomSeed(random_value()); -#endif + #ifndef XMEGA + //Init the seed with a random value created from watchdog timer for all protocols requiring random values + randomSeed(random_value()); + #endif // Read or create protocol id MProtocol_id_master=random_id(10,false); + + #ifdef ENABLE_PPM + //Protocol and interrupts initialization + if(mode_select != MODE_SERIAL) + { // PPM + mode_select--; + protocol = PPM_prot[mode_select].protocol; + cur_protocol[1] = protocol; + sub_protocol = PPM_prot[mode_select].sub_proto; + RX_num = PPM_prot[mode_select].rx_num; + MProtocol_id = RX_num + MProtocol_id_master; + option = PPM_prot[mode_select].option; + if(PPM_prot[mode_select].power) POWER_FLAG_on; + if(PPM_prot[mode_select].autobind) AUTOBIND_FLAG_on; + mode_select++; + servo_max_100=PPM_MAX_100; servo_min_100=PPM_MIN_100; + servo_max_125=PPM_MAX_125; servo_min_125=PPM_MIN_125; -#ifdef ENABLE_PPM ->>>>>>> refs/remotes/pascallanger/master - //Protocol and interrupts initialization - if(mode_select != MODE_SERIAL) - { // PPM - mode_select--; -<<<<<<< HEAD - cur_protocol[0] = PPM_prot[mode_select].protocol; -======= - protocol = PPM_prot[mode_select].protocol; - cur_protocol[1] = protocol; ->>>>>>> refs/remotes/pascallanger/master - sub_protocol = PPM_prot[mode_select].sub_proto; - RX_num = PPM_prot[mode_select].rx_num; - MProtocol_id = RX_num + MProtocol_id_master; - option = PPM_prot[mode_select].option; - if(PPM_prot[mode_select].power) POWER_FLAG_on; - if(PPM_prot[mode_select].autobind) AUTOBIND_FLAG_on; - mode_select++; -<<<<<<< HEAD - - protocol_init(); - - //Configure PPM interrupt - EICRA |=(1<>>>>>> refs/remotes/pascallanger/master - #endif - } - else -#endif //ENABLE_PPM + #if defined(TELEMETRY) + PPM_Telemetry_serial_init(); // Configure serial for telemetry + #endif + } + else + #endif //ENABLE_PPM { // Serial #ifdef ENABLE_SERIAL for(uint8_t i=0;i<3;i++) @@ -454,40 +340,7 @@ void setup() // Main // Protocol scheduler void loop() -<<<<<<< HEAD { - if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received - { - update_serial_data(); // Update protocol and data - update_aux_flags(); - if(IS_CHANGE_PROTOCOL_FLAG_on) - { // Protocol needs to be changed - LED_OFF; //led off during protocol init - module_reset(); //reset previous module - protocol_init(); //init new protocol - CHANGE_PROTOCOL_FLAG_off; //done - } - } - if(mode_select!=MODE_SERIAL && IS_PPM_FLAG_on) // PPM mode and a full frame has been received - { - for(uint8_t i=0;iPPM_SWITCH && !( (cur_protocol[0]&0x1F)==MODE_FRSKYD || (cur_protocol[0]&0x1F)==MODE_DSM || (cur_protocol[0]&0x1F)==MODE_AFHDS2A ) ) { CHANGE_PROTOCOL_FLAG_on; } // Rebind voie if(IS_CHANGE_PROTOCOL_FLAG_on) { // Protocol needs to be changed LED_off; //led off during protocol init @@ -574,10 +428,9 @@ void Update_All() #endif //ENABLE_PPM update_led_status(); #if defined(TELEMETRY) - if((protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) + if((protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) || (protocol==MODE_AFHDS2A) ) TelemetryUpdate(); - #endif ->>>>>>> refs/remotes/pascallanger/master + #endif } // Update Servo_AUX flags based on servo AUX positions @@ -594,13 +447,8 @@ static void update_led_status(void) { if(blink>>>>>> refs/remotes/pascallanger/master + blink+=BLINK_SERIAL_TIME; //blink slowly while waiting a valid serial input else if(remote_callback == 0) { // Invalid protocol @@ -611,58 +459,17 @@ static void update_led_status(void) } else if(IS_BIND_DONE_on) -<<<<<<< HEAD - LED_OFF; //bind completed -> led on + LED_off; //bind completed -> led on else blink+=BLINK_BIND_TIME; //blink fastly during binding - LED_TOGGLE; - } -} - -// Protocol scheduler -static void CheckTimer(uint16_t (*cb)(void)) -{ - uint16_t next_callback; - uint32_t prev; - if( (TIFR1 & (1< micros()) - { // Callback did not took more than requested time for next callback - if(next_callback>32000) - { // next_callback should not be more than 32767 so we will wait here... - delayMicroseconds(next_callback-2000); - cli(); // disable global int - OCR1A=TCNT1+4000; - sei(); // enable global int - } - else - { - cli(); // disable global int - OCR1A+=next_callback*2; // set compare A for callback - sei(); // enable global int - } - TIFR1=(1< led on - else - blink+=BLINK_BIND_TIME; //blink fastly during binding LED_toggle; } } inline void tx_pause() -{ +{ #ifdef TELEMETRY - #ifdef XMEGA + #ifdef XMEGA USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt #else #ifndef BASH_SERIAL @@ -677,7 +484,7 @@ inline void tx_resume() #ifdef TELEMETRY if(!IS_TX_PAUSE_on) { - #ifdef XMEGA + #ifdef XMEGA cli() ; USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt sei() ; @@ -686,11 +493,10 @@ inline void tx_resume() UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt #else resumeBashSerial() ; - #endif + #endif #endif } #endif ->>>>>>> refs/remotes/pascallanger/master } // Protocol start @@ -718,229 +524,26 @@ static void protocol_init() else BIND_DONE; -<<<<<<< HEAD - CTRL1_on; //NRF24L01 antenna RF3 by default - CTRL2_off; //NRF24L01 antenna RF3 by default - - switch(cur_protocol[0]&0x1F) // Init the requested protocol - { -#if defined(HM830_NRF24L01_INO) - case MODE_HM830: - next_callback=HM830_setup(); - remote_callback = HM830_callback; - break; -#endif -#if defined(CFlie_NRF24L01_INO) - case MODE_CFLIE: - next_callback=Cflie_setup(); - remote_callback = cflie_callback; - break; -#endif -#if defined(JOYSWAY_A7105_INO) - case MODE_JOYSWAY: - next_callback=JOYSWAY_Setup(); - remote_callback = joysway_cb; - break; -#endif -#if defined(H377_NRF24L01_INO) - case MODE_H377: - next_callback=h377_setup(); - remote_callback = h377_cb; - break; -#endif -#if defined(J6PRO_CYRF6936_INO) - case MODE_J6PRO: - next_callback=j6pro_setup(); - remote_callback = j6pro_cb; - break; -#endif -#if defined(WK2x01_CYRF6936_INO) - case MODE_WK2x01: - next_callback=wk_setup(); - remote_callback = wk_cb; - break; -#endif -#if defined(ESKY150_NRF24L01_INO) - case MODE_ESKY150: - next_callback=esky150_setup(); - remote_callback = esky150_callback; - break; -#endif -#if defined(BlueFly_NRF24L01_INO) - case MODE_BlueFly: - next_callback=BlueFly_setup(); - remote_callback = bluefly_cb; - break; -#endif -#if defined(HonTai_NRF24L01_INO) - case MODE_HonTai: - next_callback=ht_setup(); - remote_callback = ht_callback; - break; -#endif -#if defined(UDI_NRF24L01_INO) - case MODE_UDI: - next_callback=UDI_setup(); - remote_callback = UDI_callback; - break; -#endif -#if defined(NE260_NRF24L01_INO) - case MODE_NE260: - next_callback=NE260_setup(); - remote_callback = ne260_cb; - break; -#endif -#if defined(SKYARTEC_CC2500_INO) - case MODE_SKYARTEC: - next_callback=skyartec_setup(); - remote_callback = skyartec_cb; - break; -#endif -#if defined(FBL100_NRF24L01_INO) - case MODE_FBL100: - next_callback=fbl_setup(); - remote_callback = ne260_cb; - break; -#endif - -#if defined(FLYSKY_A7105_INO) - case MODE_FLYSKY: - CTRL1_off; //antenna RF1 - next_callback = initFlySky(); - remote_callback = ReadFlySky; - break; -#endif -#if defined(HUBSAN_A7105_INO) - case MODE_HUBSAN: - CTRL1_off; //antenna RF1 - if(IS_BIND_BUTTON_FLAG_on) random_id(10,true); // Generate new ID if bind button is pressed. - next_callback = initHubsan(); - remote_callback = ReadHubsan; - break; -#endif -#if defined(FRSKY_CC2500_INO) - case MODE_FRSKY: - CTRL1_off; //antenna RF2 - CTRL2_on; - next_callback = initFrSky_2way(); - remote_callback = ReadFrSky_2way; - break; -#endif -#if defined(FRSKYX_CC2500_INO) - case MODE_FRSKYX: - CTRL1_off; //antenna RF2 - CTRL2_on; - next_callback = initFrSkyX(); - remote_callback = ReadFrSkyX; - break; -#endif -#if defined(DSM2_CYRF6936_INO) - case MODE_DSM2: - CTRL2_on; //antenna RF4 - next_callback = initDsm2(); - //Servo_data[2]=1500;//before binding - remote_callback = ReadDsm2; - break; -#endif -#if defined(DEVO_CYRF6936_INO) - case MODE_DEVO: - CTRL2_on; //antenna RF4 - next_callback = DevoInit(); - remote_callback = devo_callback; - break; -#endif -#if defined(HISKY_NRF24L01_INO) - case MODE_HISKY: - next_callback=initHiSky(); - remote_callback = hisky_cb; - break; -#endif -#if defined(V2X2_NRF24L01_INO) - case MODE_V2X2: - next_callback = initV2x2(); - remote_callback = ReadV2x2; - break; -#endif -#if defined(YD717_NRF24L01_INO) - case MODE_YD717: - next_callback=initYD717(); - remote_callback = yd717_callback; - break; -#endif -#if defined(KN_NRF24L01_INO) - case MODE_KN: - next_callback = initKN(); - remote_callback = kn_callback; - break; -#endif -#if defined(SYMAX_NRF24L01_INO) - case MODE_SYMAX: - next_callback = initSymax(); - remote_callback = symax_callback; - break; -#endif -#if defined(SLT_NRF24L01_INO) - case MODE_SLT: - next_callback=initSLT(); - remote_callback = SLT_callback; - break; -#endif -#if defined(CX10_NRF24L01_INO) - case MODE_CX10: - next_callback=initCX10(); - remote_callback = CX10_callback; - break; -#endif -#if defined(CG023_NRF24L01_INO) - case MODE_CG023: - next_callback=initCG023(); - remote_callback = CG023_callback; - break; -#endif -#if defined(BAYANG_NRF24L01_INO) - case MODE_BAYANG: - next_callback=initBAYANG(); - remote_callback = BAYANG_callback; - break; -#endif -#if defined(ESKY_NRF24L01_INO) - case MODE_ESKY: - next_callback=initESKY(); - remote_callback = ESKY_callback; - break; -#endif -#if defined(MT99XX_NRF24L01_INO) - case MODE_MT99XX: - next_callback=initMT99XX(); - remote_callback = MT99XX_callback; - break; -#endif -#if defined(MJXQ_NRF24L01_INO) - case MODE_MJXQ: - next_callback=initMJXQ(); - remote_callback = MJXQ_callback; - break; -#endif -#if defined(SHENQI_NRF24L01_INO) - case MODE_SHENQI: - next_callback=initSHENQI(); - remote_callback = SHENQI_callback; - break; -#endif -#if defined(FY326_NRF24L01_INO) - case MODE_FY326: - next_callback=initFY326(); - remote_callback = FY326_callback; - break; -#endif - } -======= PE1_on; //NRF24L01 antenna RF3 by default - PE2_off; //NRF24L01 antenna RF3 by default - + PE2_off; //NRF24L01 antenna RF3 by default + switch(protocol) // Init the requested protocol { + #ifdef A7105_INSTALLED + #if defined(JOYSWAY_A7105_INO) + case MODE_JOYSWAY: + next_callback=JOYSWAY_Setup(); + remote_callback = joysway_cb; + break; + #endif + #if defined(AFHDS2A_A7105_INO) + case MODE_AFHDS2A: + next_callback=AFHDS2A_setup(); + remote_callback = afhds2a_cb; + break; + #endif + #if defined(FLYSKY_A7105_INO) case MODE_FLYSKY: PE1_off; //antenna RF1 @@ -958,6 +561,13 @@ static void protocol_init() #endif #endif #ifdef CC2500_INSTALLED + #if defined(SKYARTEC_CC2500_INO) + case MODE_SKYARTEC: + next_callback=skyartec_setup(); + remote_callback = skyartec_cb; + break; + #endif + #if defined(FRSKYD_CC2500_INO) case MODE_FRSKYD: PE1_off; //antenna RF2 @@ -992,6 +602,13 @@ static void protocol_init() #endif #endif #ifdef CYRF6936_INSTALLED + #if defined(WK2x01_CYRF6936_INO) + case MODE_WK2x01: + next_callback=wk_setup(); + remote_callback = wk_cb; + break; + #endif + #if defined(DSM_CYRF6936_INO) case MODE_DSM: PE2_on; //antenna RF4 @@ -1031,6 +648,61 @@ static void protocol_init() #endif #endif #ifdef NRF24L01_INSTALLED + #if defined(HM830_NRF24L01_INO) + case MODE_HM830: + next_callback=HM830_setup(); + remote_callback = HM830_callback; + break; + #endif + #if defined(CFlie_NRF24L01_INO) + case MODE_CFLIE: + next_callback=Cflie_setup(); + remote_callback = cflie_callback; + break; + #endif + #if defined(H377_NRF24L01_INO) + case MODE_H377: + next_callback=h377_setup(); + remote_callback = h377_cb; + break; + #endif + #if defined(ESKY150_NRF24L01_INO) + case MODE_ESKY150: + next_callback=esky150_setup(); + remote_callback = esky150_callback; + break; + #endif + #if defined(BlueFly_NRF24L01_INO) + case MODE_BlueFly: + next_callback=BlueFly_setup(); + remote_callback = bluefly_cb; + break; + #endif + #if defined(NE260_NRF24L01_INO) + case MODE_NE260: + next_callback=NE260_setup(); + remote_callback = ne260_cb; + break; + #endif + #if defined(UDI_NRF24L01_INO) + case MODE_UDI: + next_callback=UDI_setup(); + remote_callback = UDI_callback; + break; + #endif + #if defined(FBL100_NRF24L01_INO) + case MODE_FBL100: + next_callback=fbl_setup(); + remote_callback = ne260_cb; + break; + #endif + #if defined(INAV_NRF24L01_INO) + case MODE_INAV: + next_callback=INAV_setup(); + remote_callback = inav_cb; + break; + #endif + #if defined(HISKY_NRF24L01_INO) case MODE_HISKY: next_callback=initHiSky(); @@ -1135,85 +807,42 @@ static void protocol_init() #endif #endif } ->>>>>>> refs/remotes/pascallanger/master if(next_callback>32000) { // next_callback should not be more than 32767 so we will wait here... uint16_t temp=(next_callback>>10)-2; delayMilliseconds(temp); - next_callback-=temp<<10; // between 2-3ms left at this stage + next_callback-=temp<<10; // between 2-3ms left at this stage } -<<<<<<< HEAD cli(); // disable global int OCR1A=TCNT1+next_callback*2; // set compare A for callback sei(); // enable global int - TIFR1=(1<>>>>>> refs/remotes/pascallanger/master } void update_serial_data() { -<<<<<<< HEAD - if(rx_ok_buff[0]&0x20) //check range - RANGE_FLAG_on; - else - RANGE_FLAG_off; - if(rx_ok_buff[0]&0xC0) //check autobind(0x40) & bind(0x80) together - AUTOBIND_FLAG_on; - else - AUTOBIND_FLAG_off; - if(rx_ok_buff[1]&0x80) //if rx_ok_buff[1] ==1,power is low ,0-power high - POWER_FLAG_off; //power low - else - POWER_FLAG_on; //power high - - option=rx_ok_buff[2]; -======= RX_DONOTUPDTAE_on; - RX_FLAG_off; //data is being processed + RX_FLAG_off; //data is being processed if(rx_ok_buff[1]&0x20) //check range RANGE_FLAG_on; else - RANGE_FLAG_off; + RANGE_FLAG_off; if(rx_ok_buff[1]&0xC0) //check autobind(0x40) & bind(0x80) together AUTOBIND_FLAG_on; else AUTOBIND_FLAG_off; if(rx_ok_buff[2]&0x80) //if rx_ok_buff[2] ==1,power is low ,0-power high - POWER_FLAG_off; //power low + POWER_FLAG_off; //power low else - POWER_FLAG_on; //power high ->>>>>>> refs/remotes/pascallanger/master - + POWER_FLAG_on; //power high + option=rx_ok_buff[3]; - + if( (rx_ok_buff[0] != cur_protocol[0]) || ((rx_ok_buff[1]&0x5F) != (cur_protocol[1]&0x5F)) || ( (rx_ok_buff[2]&0x7F) != (cur_protocol[2]&0x7F) ) ) { // New model has been selected -<<<<<<< HEAD - prev_protocol=cur_protocol[0]&0x1F; //store previous protocol so we can reset the module - cur_protocol[1] = rx_ok_buff[1]&0x7F; //store current protocol - CHANGE_PROTOCOL_FLAG_on; //change protocol - sub_protocol=(rx_ok_buff[1]>>4)& 0x07; //subprotocol no (0-7) bits 4-6 - RX_num=rx_ok_buff[1]& 0x0F; - MProtocol_id=MProtocol_id_master+RX_num; //personalized RX bind + rx num // rx_num bits 0---3 - } - else - if( ((rx_ok_buff[0]&0x80)!=0) && ((cur_protocol[0]&0x80)==0) ) // Bind flag has been set - CHANGE_PROTOCOL_FLAG_on; //restart protocol with bind - cur_protocol[0] = rx_ok_buff[0]; //store current protocol - -// decode channel values - volatile uint8_t *p=rx_ok_buff+2; - uint8_t dec=-3; -======= - CHANGE_PROTOCOL_FLAG_on; //change protocol + CHANGE_PROTOCOL_FLAG_on; //change protocol protocol=(rx_ok_buff[0]==0x55?0:32) + (rx_ok_buff[1]&0x1F); //protocol no (0-63) bits 4-6 of buff[1] and bit 0 of buf[0] sub_protocol=(rx_ok_buff[2]>>4)& 0x07; //subprotocol no (0-7) bits 4-6 RX_num=rx_ok_buff[2]& 0x0F; // rx_num bits 0---3 @@ -1222,7 +851,7 @@ void update_serial_data() } else 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 + CHANGE_PROTOCOL_FLAG_on; //restart protocol with bind else CHANGE_PROTOCOL_FLAG_off; //no need to restart //store current protocol values @@ -1232,68 +861,32 @@ void update_serial_data() // decode channel values volatile uint8_t *p=rx_ok_buff+3; uint8_t dec=-3; ->>>>>>> refs/remotes/pascallanger/master for(uint8_t i=0;i=8) { -<<<<<<< HEAD - dec-=8; - p++; - } - p++; - Servo_data[i]=((((*((uint32_t *)p))>>dec)&0x7FF)*5)/8+860; //value range 860<->2140 -125%<->+125% - } - RX_FLAG_off; //data has been processed -} - -static void module_reset() -{ - if(remote_callback) - { // previous protocol loaded - remote_callback = 0; - switch(prev_protocol) - { - case MODE_FLYSKY: - case MODE_HUBSAN: - A7105_Reset(); - break; - case MODE_FRSKY: - case MODE_FRSKYX: - CC2500_Reset(); - break; - case MODE_DSM2: - case MODE_DEVO: - CYRF_Reset(); - break; - default: // MODE_HISKY, MODE_V2X2, MODE_YD717, MODE_KN, MODE_SYMAX, MODE_SLT, MODE_CX10, MODE_CG023, MODE_BAYANG, MODE_ESKY, MODE_MT99XX, MODE_MJXQ, MODE_SHENQI, MODE_FY326 - NRF24L01_Reset(); - break; - } -======= dec-=8; p++; } p++; - Servo_data[i]=((((*((uint32_t *)p))>>dec)&0x7FF)*5)/8+860; //value range 860<->2140 -125%<->+125% + Servo_data[i]=((((*((uint32_t *)p))>>dec)&0x7FF)*5)/8+860; //value range 860<->2140 -125%<->+125% } RX_DONOTUPDTAE_off; #ifdef XMEGA cli(); #else - UCSR0B &= ~_BV(RXCIE0); // RX interrupt disable + UCSR0B &= ~_BV(RXCIE0); // RX interrupt disable #endif - if(IS_RX_MISSED_BUFF_on) // If the buffer is still valid + if(IS_RX_MISSED_BUFF_on) // If the buffer is still valid { memcpy((void*)rx_ok_buff,(const void*)rx_buff,RXBUFFER_SIZE);// Duplicate the buffer - RX_FLAG_on; // data to be processed next time... + RX_FLAG_on; // data to be processed next time... RX_MISSED_BUFF_off; ->>>>>>> refs/remotes/pascallanger/master } #ifdef XMEGA sei(); #else - UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable + UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable #endif } @@ -1303,18 +896,18 @@ void modules_reset() CC2500_Reset(); #endif #ifdef A7105_INSTALLED - A7105_Reset(); + A7105_Reset(); #endif #ifdef CYRF6936_INSTALLED - CYRF_Reset(); + CYRF_Reset(); #endif #ifdef NRF24L01_INSTALLED - NRF24L01_Reset(); + NRF24L01_Reset(); #endif //Wait for every component to reset delayMilliseconds(100); - prev_power=0xFD; // unused power value + prev_power=0xFD; // unused power value } void Mprotocol_serial_init() @@ -1322,7 +915,7 @@ void Mprotocol_serial_init() #ifdef XMEGA PORTC.OUTSET = 0x08 ; PORTC.DIRSET = 0x08 ; - + USARTC0.BAUDCTRLA = 19 ; USARTC0.BAUDCTRLB = 0 ; @@ -1333,17 +926,17 @@ void Mprotocol_serial_init() #ifdef INVERT_TELEMETRY PORTC.PIN3CTRL |= 0x40 ; #endif - #else - #include + #else + #include UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE; UCSR0A = 0 ; // Clear X2 bit //Set frame format to 8 data bits, even parity, 2 stop bits - UCSR0C = _BV(UPM01)|_BV(USBS0)|_BV(UCSZ01)|_BV(UCSZ00); + UCSR0C = _BV(UPM01)|_BV(USBS0)|_BV(UCSZ01)|_BV(UCSZ00); while ( UCSR0A & (1 << RXC0) )//flush receive buffer UDR0; //enable reception and RC complete interrupt - UCSR0B = _BV(RXEN0)|_BV(RXCIE0);//rx enable and interrupt + UCSR0B = _BV(RXEN0)|_BV(RXCIE0);//rx enable and interrupt #ifndef DEBUG_TX #if defined(TELEMETRY) initTXSerial( SPEED_100K ) ; @@ -1353,37 +946,17 @@ void Mprotocol_serial_init() } #if defined(TELEMETRY) -void PPM_Telemetry_serial_init() -{ -<<<<<<< HEAD - if(Servo_data[ch]>PPM_MAX_100) - return PPM_MAX_100; - else - if (Servo_data[ch]>>>>>> refs/remotes/pascallanger/master -} + } #endif -<<<<<<< HEAD -#if defined(TELEMETRY) -void Serial_write(uint8_t data) -{ - cli(); // disable global int - if(++tx_head>=TXBUFFER_SIZE) - tx_head=0; - tx_buff[tx_head]=data; - sei(); // enable global int - UCSR0B |= (1<>>>>>> refs/remotes/pascallanger/master } static uint32_t random_value(void) { -<<<<<<< HEAD - #include - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - UCSR0A = 0 ; // Clear X2 bit - //Set frame format to 8 data bits, even parity, 2 stop bits - UCSR0C = (1<>>>>>> refs/remotes/pascallanger/master } #endif -#if defined(TELEMETRY) -static void PPM_Telemetry_serial_init() -{ - //9600 bauds - UBRR0H = 0x00; - UBRR0L = 0x67; - UCSR0A = 0 ; // Clear X2 bit - //Set frame format to 8 data bits, none, 1 stop bit - UCSR0C = (1<> 24) & 0xFF; - rx_tx_addr[1] = (id >> 16) & 0xFF; - rx_tx_addr[2] = (id >> 8) & 0xFF; - rx_tx_addr[3] = (id >> 0) & 0xFF; - rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port -} - static uint32_t random_id(uint16_t adress, uint8_t create_new) { + #define nb_txid 5 uint32_t id; - uint8_t txid[4]; + uint8_t txid[nb_txid]; - if(eeprom_read_byte((uint8_t*)(adress+10))==0xf0 && !create_new) + if (eeprom_read_byte((uint8_t*)(adress+10))==0xf0 && !create_new) { // TXID exists in EEPROM - eeprom_read_block((void*)txid,(const void*)adress,4); + eeprom_read_block((void*)txid,(const void*)adress,nb_txid); id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24)); if(id!=0x2AD141A7) //ID with seed=0 return id; @@ -1467,7 +1003,7 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) txid[1] = ((id >> 8) & 0xFF); txid[2] = ((id >> 16) & 0xFF); txid[3] = ((id >> 24) & 0xFF); - eeprom_write_block((const void*)txid,(void*)adress,4); + eeprom_write_block((const void*)txid,(void*)adress,nb_txid); eeprom_write_byte((uint8_t*)(adress+10),0xf0);//write bind flag in eeprom. return id; } @@ -1479,13 +1015,6 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) /**************************/ //PPM -<<<<<<< HEAD -ISR(INT1_vect) -{ // Interrupt on PPM pin - static int8_t chan=-1; - static uint16_t Prev_TCNT1=0; - uint16_t Cur_TCNT1; -======= #ifdef ENABLE_PPM #ifdef XMEGA #if PPM_pin == 2 @@ -1504,36 +1033,22 @@ ISR(INT1_vect) static int8_t chan=-1; static uint16_t Prev_TCNT1=0; uint16_t Cur_TCNT1; ->>>>>>> refs/remotes/pascallanger/master - - Cur_TCNT1 = TCNT1 - Prev_TCNT1 ; // Capture current Timer1 value + + Cur_TCNT1=TCNT1-Prev_TCNT1; // Capture current Timer1 value if(Cur_TCNT1<1000) - chan=-1; // bad frame + chan=-1; // bad frame else if(Cur_TCNT1>4840) { - chan=0; // start of frame - PPM_FLAG_on; // full frame present (even at startup since PPM_data has been initialized) + chan=0; // start of frame + PPM_FLAG_on; // full frame present (even at startup since PPM_data has been initialized) } -<<<<<<< HEAD - Prev_TCNT1+=Cur_TCNT1; -} - -//Serial RX -ISR(USART_RX_vect) -{ // RX interrupt - if((UCSR0A&0x1C)==0) // Check frame error, data overrun and parity error - { // received byte is ok to process - if(idx==0) - { // Let's try to sync at this point - if(UDR0==0x55) // If 1st byte is 0x55 it looks ok -======= else - if(chan!=-1) // need to wait for start of frame + if(chan!=-1) // need to wait for start of frame { //servo values between 500us and 2420us will end up here PPM_data[chan]= Cur_TCNT1>>1;; if(chan++>=NUM_CHN) - chan=-1; // don't accept any new channels + chan=-1; // don't accept any new channels } Prev_TCNT1+=Cur_TCNT1; } @@ -1547,21 +1062,21 @@ ISR(USART_RX_vect) ISR(USART_RX_vect) #endif { // RX interrupt - static uint8_t idx=0; + static uint8_t idx=0; #ifdef XMEGA - if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error + if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error #else - UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable + UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable sei() ; - if((UCSR0A&0x1C)==0) // Check frame error, data overrun and parity error + if((UCSR0A&0x1C)==0) // Check frame error, data overrun and parity error #endif { // received byte is ok to process if(idx==0||discard_frame==1) { // Let's try to sync at this point idx=0;discard_frame=0; - RX_MISSED_BUFF_off; // If rx_buff was good it's not anymore... - rx_buff[0]=UDR0; - if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok + RX_MISSED_BUFF_off; // If rx_buff was good it's not anymore... + rx_buff[0]=UDR0; + if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok { TX_RX_PAUSE_on; tx_pause(); @@ -1572,36 +1087,35 @@ ISR(USART_RX_vect) } } else ->>>>>>> refs/remotes/pascallanger/master { - rx_buff[idx++]=UDR0; // Store received byte - if(idx>=RXBUFFER_SIZE) + rx_buff[idx++]=UDR0; // Store received byte + if(idx>=RXBUFFER_SIZE) { // A full frame has been received if(!IS_RX_DONOTUPDTAE_on) { //Good frame received and main is not working on the buffer memcpy((void*)rx_ok_buff,(const void*)rx_buff,RXBUFFER_SIZE);// Duplicate the buffer - RX_FLAG_on; // flag for main to process servo data + RX_FLAG_on; // flag for main to process servo data } else - RX_MISSED_BUFF_on; // notify that rx_buff is good - discard_frame=1; // start again + RX_MISSED_BUFF_on; // notify that rx_buff is good + discard_frame=1; // start again } } } else { - idx=UDR0; // Dummy read - discard_frame=1; // Error encountered discard full frame... + idx=UDR0; // Dummy read + discard_frame=1; // Error encountered discard full frame... } if(discard_frame==1) { - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match TX_RX_PAUSE_off; tx_resume(); } #ifndef XMEGA cli() ; - UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable + UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable #endif } @@ -1613,60 +1127,34 @@ ISR(USART_RX_vect) #endif { // Timer1 compare B interrupt discard_frame=1; - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match tx_resume(); } #endif //ENABLE_SERIAL #ifndef XMEGA - // Random interrupt service routine called every time the WDT interrupt is triggered. - // It is only enabled at startup to generate a seed. - ISR(WDT_vect) +// Random interrupt service routine called every time the WDT interrupt is triggered. +// It is only enabled at startup to generate a seed. +ISR(WDT_vect) +{ + static uint8_t gWDT_buffer_position=0; + #define gWDT_buffer_SIZE 32 + static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; + gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) + gWDT_buffer_position++; // every time the WDT interrupt is triggered + if (gWDT_buffer_position >= gWDT_buffer_SIZE) { - static uint8_t gWDT_buffer_position=0; - #define gWDT_buffer_SIZE 32 - static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; - gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) - gWDT_buffer_position++; // every time the WDT interrupt is triggered - if (gWDT_buffer_position >= gWDT_buffer_SIZE) + // The following code is an implementation of Jenkin's one at a time hash + for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) { - // The following code is an implementation of Jenkin's one at a time hash - for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) - { - gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; - gWDT_entropy += (gWDT_entropy << 10); - gWDT_entropy ^= (gWDT_entropy >> 6); - } - gWDT_entropy += (gWDT_entropy << 3); - gWDT_entropy ^= (gWDT_entropy >> 11); - gWDT_entropy += (gWDT_entropy << 15); - WDTCSR = 0; // Disable Watchdog interrupt + gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; + gWDT_entropy += (gWDT_entropy << 10); + gWDT_entropy ^= (gWDT_entropy >> 6); } + gWDT_entropy += (gWDT_entropy << 3); + gWDT_entropy ^= (gWDT_entropy >> 11); + gWDT_entropy += (gWDT_entropy << 15); + WDTCSR = 0; // Disable Watchdog interrupt } -<<<<<<< HEAD } - -//Serial timer -ISR(TIMER1_COMPB_vect) -{ // Timer1 compare B interrupt - idx=0; -} - -#if defined(TELEMETRY) -//Serial TX -ISR(USART_UDRE_vect) -{ // Transmit interrupt - uint8_t t = tx_tail; - if(tx_head!=t) - { - if(++t>=TXBUFFER_SIZE)//head - t=0; - UDR0=tx_buff[t]; - tx_tail=t; - } - if (t == tx_head) - UCSR0B &= ~(1<>>>>>> refs/remotes/pascallanger/master -#endif +#endif \ No newline at end of file diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index dc740c5..c9073e5 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -94,6 +94,14 @@ static void NRF24L01_ReadPayload(uint8_t * data, uint8_t length) data[i] = SPI_Read(); NRF_CSN_on; } +static uint8_t NRF24L01_GetDynamicPayloadSize(void) +{ + NRF_CSN_off; + SPI_Write(R_RX_PL_WID); + uint8_t res = SPI_Read(); + NRF_CSN_on; + return res; +} static void NRF24L01_Strobe(uint8_t state) { @@ -234,11 +242,7 @@ uint8_t NRF24L01_packet_ack() /////////////// // XN297 emulation layer -<<<<<<< HEAD -uint8_t xn297_scramble_enabled; -======= uint8_t xn297_scramble_enabled=XN297_SCRAMBLED; //enabled by default ->>>>>>> refs/remotes/pascallanger/master uint8_t xn297_addr_len; uint8_t xn297_tx_addr[5]; uint8_t xn297_rx_addr[5]; @@ -251,16 +255,6 @@ static const uint8_t xn297_scramble[] = { 0x1b, 0x5d, 0x19, 0x10, 0x24, 0xd3, 0xdc, 0x3f, 0x8e, 0xc5, 0x2f}; -<<<<<<< HEAD -const uint16_t PROGMEM xn297_crc_xorout[] = { - 0x0000, 0x3d5f, 0xa6f1, 0x3a23, 0xaa16, 0x1caf, - 0x62b2, 0xe0eb, 0x0821, 0xbe07, 0x5f1a, 0xaf15, - 0x4f0a, 0xad24, 0x5e48, 0xed34, 0x068c, 0xf2c9, - 0x1852, 0xdf36, 0x129d, 0xb17c, 0xd5f5, 0x70d7, - 0xb798, 0x5133, 0x67db, 0xd94e}; - -======= ->>>>>>> refs/remotes/pascallanger/master const uint16_t PROGMEM xn297_crc_xorout_scrambled[] = { 0x0000, 0x3448, 0x9BA7, 0x8BBB, 0x85E1, 0x3E8C, 0x451E, 0x18E6, 0x6B24, 0xE7AB, 0x3828, 0x814B, @@ -334,14 +328,8 @@ void XN297_SetRXAddr(const uint8_t* addr, uint8_t len) NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, buf, 5); } -void XN297_Configure(uint16_t flags) +void XN297_Configure(uint8_t flags) { -<<<<<<< HEAD - xn297_scramble_enabled = !(flags & BV(XN297_UNSCRAMBLED)); - xn297_crc = !!(flags & BV(NRF24L01_00_EN_CRC)); - flags &= ~(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO)); - NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF); -======= xn297_crc = !!(flags & _BV(NRF24L01_00_EN_CRC)); flags &= ~(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO)); NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF); @@ -350,7 +338,6 @@ void XN297_Configure(uint16_t flags) void XN297_SetScrambledMode(const u8 mode) { xn297_scramble_enabled = mode; ->>>>>>> refs/remotes/pascallanger/master } void XN297_WritePayload(uint8_t* msg, uint8_t len) @@ -412,32 +399,6 @@ void XN297_ReadPayload(uint8_t* msg, uint8_t len) // End of XN297 emulation /////////////// -<<<<<<< HEAD -// LT8910 emulation layer -uint8_t LT8910_buffer[64]; -uint8_t LT8910_buffer_start; -uint16_t LT8910_buffer_overhead_bits; -uint8_t LT8910_addr[8]; -uint8_t LT8910_addr_size; -uint8_t LT8910_Preamble_Len; -uint8_t LT8910_Tailer_Len; -uint8_t LT8910_CRC_Initial_Data; -uint8_t LT8910_Flags; -#define LT8910_CRC_ON 6 -#define LT8910_SCRAMBLE_ON 5 -#define LT8910_PACKET_LENGTH_EN 4 -#define LT8910_DATA_PACKET_TYPE_1 3 -#define LT8910_DATA_PACKET_TYPE_0 2 -#define LT8910_FEC_TYPE_1 1 -#define LT8910_FEC_TYPE_0 0 - -void LT8910_Config(uint8_t preamble_len, uint8_t trailer_len, uint8_t flags, uint8_t crc_init) -{ - //Preamble 1 to 8 bytes - LT8910_Preamble_Len=preamble_len; - //Trailer 4 to 18 bits - LT8910_Tailer_Len=trailer_len; -======= // LT8900 emulation layer uint8_t LT8900_buffer[64]; uint8_t LT8900_buffer_start; @@ -462,37 +423,23 @@ void LT8900_Config(uint8_t preamble_len, uint8_t trailer_len, uint8_t flags, uin LT8900_Preamble_Len=preamble_len; //Trailer 4 to 18 bits LT8900_Tailer_Len=trailer_len; ->>>>>>> refs/remotes/pascallanger/master //Flags // CRC_ON: 1 on, 0 off // SCRAMBLE_ON: 1 on, 0 off // PACKET_LENGTH_EN: 1 1st byte of payload is payload size // DATA_PACKET_TYPE: 00 NRZ, 01 Manchester, 10 8bit/10bit line code, 11 interleave data type // FEC_TYPE: 00 No FEC, 01 FEC13, 10 FEC23, 11 reserved -<<<<<<< HEAD - LT8910_Flags=flags; - //CRC init constant - LT8910_CRC_Initial_Data=crc_init; -} - -void LT8910_SetChannel(uint8_t channel) -======= LT8900_Flags=flags; //CRC init constant LT8900_CRC_Initial_Data=crc_init; } void LT8900_SetChannel(uint8_t channel) ->>>>>>> refs/remotes/pascallanger/master { NRF24L01_WriteReg(NRF24L01_05_RF_CH, channel +2); //NRF24L01 is 2400+channel but LT8900 is 2402+channel } -<<<<<<< HEAD -void LT8910_SetTxRxMode(enum TXRX_State mode) -======= void LT8900_SetTxRxMode(enum TXRX_State mode) ->>>>>>> refs/remotes/pascallanger/master { if(mode == TX_EN) { @@ -518,35 +465,12 @@ void LT8900_SetTxRxMode(enum TXRX_State mode) NRF24L01_SetTxRxMode(TXRX_OFF); } -<<<<<<< HEAD -void LT8910_BuildOverhead() -======= void LT8900_BuildOverhead() ->>>>>>> refs/remotes/pascallanger/master { uint8_t pos; //Build overhead //preamble -<<<<<<< HEAD - memset(LT8910_buffer,LT8910_addr[0]&0x01?0xAA:0x55,LT8910_Preamble_Len-1); - pos=LT8910_Preamble_Len-1; - //address - for(uint8_t i=0;i5?5:pos; -} - -void LT8910_SetAddress(uint8_t *address,uint8_t addr_size) -======= memset(LT8900_buffer,LT8900_addr[0]&0x01?0xAA:0x55,LT8900_Preamble_Len-1); pos=LT8900_Preamble_Len-1; //address @@ -564,33 +488,10 @@ void LT8910_SetAddress(uint8_t *address,uint8_t addr_size) } void LT8900_SetAddress(uint8_t *address,uint8_t addr_size) ->>>>>>> refs/remotes/pascallanger/master { uint8_t addr[5]; //Address size (SyncWord) 2 to 8 bytes, 16/32/48/64 bits -<<<<<<< HEAD - LT8910_addr_size=addr_size; - memcpy(LT8910_addr,address,LT8910_addr_size); - - //Build overhead - LT8910_BuildOverhead(); - - //Set NRF RX&TX address based on overhead content - NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, LT8910_buffer_start-2); - for(uint8_t i=0;i>>>>>> refs/remotes/pascallanger/master //Read payload NRF24L01_ReadPayload(buffer,end+1); //Check address + trail for(i=0;i>>>>>> refs/remotes/pascallanger/master for(i=pos;i>8)&0xFF; } //Check len -<<<<<<< HEAD - if(LT8910_Flags&_BV(LT8910_PACKET_LENGTH_EN)) -======= if(LT8900_Flags&_BV(LT8900_PACKET_LENGTH_EN)) ->>>>>>> refs/remotes/pascallanger/master { crc=crc16_update(crc,buffer[pos]); if(bit_reverse(len)!=buffer[pos++]) @@ -652,11 +541,7 @@ uint8_t LT8900_ReadPayload(uint8_t* msg, uint8_t len) msg[i]=bit_reverse(buffer[pos++]); } //Check CRC -<<<<<<< HEAD - if(LT8910_Flags&_BV(LT8910_CRC_ON)) -======= if(LT8900_Flags&_BV(LT8900_CRC_ON)) ->>>>>>> refs/remotes/pascallanger/master { if(buffer[pos++]!=((crc>>8)&0xFF)) return 0; // wrong CRC... if(buffer[pos]!=(crc&0xFF)) return 0; // wrong CRC... @@ -665,21 +550,12 @@ uint8_t LT8900_ReadPayload(uint8_t* msg, uint8_t len) return 1; } -<<<<<<< HEAD -void LT8910_WritePayload(uint8_t* msg, uint8_t len) -{ - unsigned int crc=LT8910_CRC_Initial_Data,a,mask; - uint8_t i, pos=0,tmp, buffer[64], pos_final,shift; - //Add packet len - if(LT8910_Flags&_BV(LT8910_PACKET_LENGTH_EN)) -======= void LT8900_WritePayload(uint8_t* msg, uint8_t len) { unsigned int crc=LT8900_CRC_Initial_Data,a,mask; uint8_t i, pos=0,tmp, buffer[64], pos_final,shift; //Add packet len if(LT8900_Flags&_BV(LT8900_PACKET_LENGTH_EN)) ->>>>>>> refs/remotes/pascallanger/master { tmp=bit_reverse(len); buffer[pos++]=tmp; @@ -693,27 +569,12 @@ void LT8900_WritePayload(uint8_t* msg, uint8_t len) crc=crc16_update(crc,tmp); } //Add CRC -<<<<<<< HEAD - if(LT8910_Flags&_BV(LT8910_CRC_ON)) -======= if(LT8900_Flags&_BV(LT8900_CRC_ON)) ->>>>>>> refs/remotes/pascallanger/master { buffer[pos++]=crc>>8; buffer[pos++]=crc; } //Shift everything to fit behind the trailer (4 to 18 bits) -<<<<<<< HEAD - shift=LT8910_buffer_overhead_bits&0x7; - pos_final=LT8910_buffer_overhead_bits/8; - mask=~(0xFF<<(8-shift)); - LT8910_buffer[pos_final+pos]=0xFF; - for(i=pos-1;i!=0xFF;i--) - { - a=buffer[i]<<(8-shift); - LT8910_buffer[pos_final+i]=(LT8910_buffer[pos_final+i]&mask>>8)|a>>8; - LT8910_buffer[pos_final+i+1]=(LT8910_buffer[pos_final+i+1]&mask)|a; -======= shift=LT8900_buffer_overhead_bits&0x7; pos_final=LT8900_buffer_overhead_bits/8; mask=~(0xFF<<(8-shift)); @@ -723,17 +584,10 @@ void LT8900_WritePayload(uint8_t* msg, uint8_t len) a=buffer[i]<<(8-shift); LT8900_buffer[pos_final+i]=(LT8900_buffer[pos_final+i]&mask>>8)|a>>8; LT8900_buffer[pos_final+i+1]=(LT8900_buffer[pos_final+i+1]&mask)|a; ->>>>>>> refs/remotes/pascallanger/master } if(shift) pos++; //Send everything -<<<<<<< HEAD - NRF24L01_WritePayload(LT8910_buffer+LT8910_buffer_start,pos_final+pos-LT8910_buffer_start); -} -// End of LT8910 emulation -======= NRF24L01_WritePayload(LT8900_buffer+LT8900_buffer_start,pos_final+pos-LT8900_buffer_start); } // End of LT8900 emulation ->>>>>>> refs/remotes/pascallanger/master diff --git a/Multiprotocol/Nrf24l01_bluefly.ino b/Multiprotocol/Nrf24l01_bluefly.ino index 3a7f918..ae3db7a 100644 --- a/Multiprotocol/Nrf24l01_bluefly.ino +++ b/Multiprotocol/Nrf24l01_bluefly.ino @@ -51,7 +51,7 @@ static void bluefly_init() { NRF24L01_WriteReg(NRF24L01_05_RF_CH, 81); // binding packet must be set in channel 81 // 2-bytes CRC, radio on - NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address (byte -2) NRF24L01_SetBitrate(NRF24L01_BR_250K); // BlueFly - 250kbps NRF24L01_SetPower(); @@ -63,7 +63,7 @@ static void bluefly_ch_data() { uint32_t temp; int i; for (i = 0; i< 8; ++i) { - temp = (uint32_t)Servo_data[ch[i]] * 300/PPM_MAX + 500; // 200-800 range + temp = map(limit_channel_100(i),servo_min_100,servo_max_100,200,800); // 200-800 range if (temp < 0) ch_data_bluefly[i] = 0; else if (temp > 1000) @@ -140,6 +140,7 @@ static uint16_t bluefly_cb() { } static uint16_t BlueFly_setup() { + MProtocol_id = (MProtocol_id | ((uint32_t)txid[3]<<32)); hopping_frequency_start = ((MProtocol_id >> 8) % 47) + 2; bluefly_binding_packet(); bluefly_init(); diff --git a/Multiprotocol/Nrf24l01_cflie.ino b/Multiprotocol/Nrf24l01_cflie.ino index d4b0208..455b97c 100644 --- a/Multiprotocol/Nrf24l01_cflie.ino +++ b/Multiprotocol/Nrf24l01_cflie.ino @@ -13,12 +13,6 @@ along with Deviation. If not, see . */ -/* NB: Not implemented - Uncomment define below to enable telemetry. Also add CFlie protocol to TELEMETRY_SetTypeByProtocol to set type to DSM. -#define CFLIE_TELEMETRY - */ - - #if defined(CFlie_NRF24L01_INO) #include "iface_nrf24l01.h" @@ -59,30 +53,15 @@ enum { CFLIE_DATA }; -#ifdef CFLIE_TELEMETRY -static const char * const cflie_opts[] = { - _tr_noop("Telemetry"), _tr_noop("Off"), _tr_noop("On"), NULL, - NULL -}; -enum { - PROTOOPTS_TELEMETRY = 0, - LAST_PROTO_OPT, -}; -ctassert(LAST_PROTO_OPT <= NUM_PROTO_OPTS, too_many_protocol_opts); - -#define TELEM_OFF 0 -#define TELEM_ON 1 -#endif - -#define PACKET_CHKTIME 500 // time to wait if packet not yet acknowledged or timed out +#define PACKET_CFLIE_CHKTIME 500 // time to wait if packet not yet acknowledged or timed out static uint16_t dbg_cnt = 0; static uint8_t packet_ack() { if (++dbg_cnt > 50) { dbg_cnt = 0; } - switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT))) { - case BV(NRF24L01_07_TX_DS): + switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT))) { + case _BV(NRF24L01_07_TX_DS): return PKT_ACKED; - case BV(NRF24L01_07_MAX_RT): + case _BV(NRF24L01_07_MAX_RT): return PKT_TIMEOUT; } return PKT_PENDING; @@ -97,7 +76,7 @@ static void send_search_packet() { uint8_t buf[1]; buf[0] = 0xff; // clear packet status bits and TX FIFO - NRF24L01_WriteReg(NRF24L01_07_STATUS, (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT))); + NRF24L01_WriteReg(NRF24L01_07_STATUS, (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT))); NRF24L01_FlushTx(); if (rf_channel++ > 125) { @@ -119,7 +98,7 @@ static void send_search_packet() { NRF24L01_WritePayload(buf, sizeof(buf)); - ++packet_counter; + ++packet_count; } // Frac 16.16 @@ -151,33 +130,39 @@ static void send_cmd_packet() { // Channels in AETR order // Roll, aka aileron, float +- 50.0 in degrees - // float roll = -(float) Servo_data[AILERON]*50.0/10000; - uint32_t f_roll = -Servo_data[AILERON] * FRAC_SCALE / (10000 / 50); + uint32_t f_roll = -map(limit_channel_100(AILERON),servo_min_100,servo_max_100,-50,50); // Pitch, aka elevator, float +- 50.0 degrees - //float pitch = -(float) Servo_data[ELEVATOR]*50.0/10000; - uint32_t f_pitch = -Servo_data[ELEVATOR] * FRAC_SCALE / (10000 / 50); + uint32_t f_pitch = -map(limit_channel_100(ELEVATOR),servo_min_100,servo_max_100,-50,50); // Thrust, aka throttle 0..65535, working range 5535..65535 // No space for overshoot here, hard limit Channel3 by -10000..10000 uint32_t ch = Servo_data[THROTTLE]; - if (ch < PPM_MIN) { - ch = PPM_MIN; - } else if (ch > PPM_MAX) { - ch = PPM_MAX; + if (ch < servo_min_125) { + ch = servo_min_125; + } else if (ch > servo_max_125) { + ch = servo_max_125; } uint16_t thrust = ch*3L + 35535L; // Yaw, aka rudder, float +- 400.0 deg/s - // float yaw = -(float) Servo_data[RUDDER]*400.0/10000; - uint32_t f_yaw = - Servo_data[RUDDER] * FRAC_SCALE / (10000 / 400); + uint32_t f_yaw = - map(limit_channel_100(RUDDER),servo_min_100,servo_max_100,-40,40); frac2float(f_yaw, &yaw); - // Convert + to X. 181 / 256 = 0.70703125 ~= sqrt(2) / 2 - uint32_t f_x_roll = (f_roll + f_pitch) * 181 / 256; - frac2float(f_x_roll, &x_roll); - uint32_t f_x_pitch = (f_pitch - f_roll) * 181 / 256; - frac2float(f_x_pitch, &x_pitch); + // Switch on/off? + if(Servo_AUX1) + { + frac2float(f_roll, &x_roll); + frac2float(f_pitch, &x_pitch); + } + else + { + // Convert + to X. 181 / 256 = 0.70703125 ~= sqrt(2) / 2 + uint32_t f_x_roll = (f_roll + f_pitch) * 181 / 256; + frac2float(f_x_roll, &x_roll); + uint32_t f_x_pitch = (f_pitch - f_roll) * 181 / 256; + frac2float(f_x_pitch, &x_pitch); + } int bufptr = 0; buf[bufptr++] = 0x30; // Commander packet to channel 0 @@ -188,12 +173,12 @@ static void send_cmd_packet() { // clear packet status bits and TX FIFO - NRF24L01_WriteReg(NRF24L01_07_STATUS, (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT))); + NRF24L01_WriteReg(NRF24L01_07_STATUS, (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT))); NRF24L01_FlushTx(); NRF24L01_WritePayload(buf, sizeof(buf)); - ++packet_counter; + ++packet_count; NRF24L01_SetPower(); } @@ -203,7 +188,7 @@ static int cflie_init() { // CRC, radio on NRF24L01_SetTxRxMode(TX_EN); - NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); // NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowledgement NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x01); // Auto Acknowledgement for data pipe 0 NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 @@ -236,21 +221,6 @@ static int cflie_init() { return 50000; } - -#ifdef CFLIE_TELEMETRY -static void update_telemetry() { - static uint8_t frameloss = 0; - - frameloss += NRF24L01_ReadReg(NRF24L01_08_OBSERVE_TX) >> 4; - NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_channel); // reset packet loss counter - - Telemetry.p.dsm.flog.frameloss = frameloss; -// Telemetry.p.dsm.flog.volt[0] = read battery voltage from ack payload - TELEMETRY_SetUpdated(TELEM_DSM_FLOG_FRAMELOSS); -} -#endif - - static uint16_t cflie_callback() { switch (phase) { case CFLIE_INIT_SEARCH: @@ -264,7 +234,7 @@ static uint16_t cflie_callback() { case CFLIE_SEARCH: switch (packet_ack()) { case PKT_PENDING: - return PACKET_CHKTIME; // packet send not yet complete + return PACKET_CFLIE_CHKTIME; // packet send not yet complete case PKT_ACKED: phase = CFLIE_DATA; BIND_DONE; @@ -275,11 +245,8 @@ static uint16_t cflie_callback() { } break; case CFLIE_DATA: - #ifdef CFLIE_TELEMETRY - update_telemetry(); - #endif if (packet_ack() == PKT_PENDING) - return PACKET_CHKTIME; // packet send not yet complete + return PACKET_CFLIE_CHKTIME; // packet send not yet complete send_cmd_packet(); break; } @@ -287,31 +254,21 @@ static uint16_t cflie_callback() { } -// Generate address to use from TX id and manufacturer id (STM32 unique id) -static uint8_t initialize_rx_tx_addr() { +static uint16_t Cflie_setup() { rx_tx_addr[0] = rx_tx_addr[1] = rx_tx_addr[2] = rx_tx_addr[3] = rx_tx_addr[4] = 0xE7; // CFlie uses fixed address - data_rate = NRF24L01_BR_250K; - rf_channel = 0; - return CFLIE_INIT_SEARCH; - // return CFLIE_INIT_DATA; -} - -static uint16_t Cflie_setup() { - phase = initialize_rx_tx_addr(); - packet_counter = 0; + data_rate = NRF24L01_BR_250K; + rf_channel = 0; + packet_count = 0; int delay = cflie_init(); - #ifdef CFLIE_TELEMETRY - memset(&Telemetry, 0, sizeof(Telemetry)); - TELEMETRY_SetType(TELEM_DSM); - #endif - if (phase == CFLIE_INIT_SEARCH) { BIND_IN_PROGRESS; } + phase = CFLIE_INIT_SEARCH; + BIND_IN_PROGRESS; return delay; } diff --git a/Multiprotocol/Nrf24l01_esky150.ino b/Multiprotocol/Nrf24l01_esky150.ino index b3d9c43..5460561 100644 --- a/Multiprotocol/Nrf24l01_esky150.ino +++ b/Multiprotocol/Nrf24l01_esky150.ino @@ -32,15 +32,15 @@ enum { static uint8_t esky150_packet_ack() { - switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT))) { - case BV(NRF24L01_07_TX_DS): return PKT_ACKED; - case BV(NRF24L01_07_MAX_RT): return PKT_TIMEOUT; + switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT))) { + case _BV(NRF24L01_07_TX_DS): return PKT_ACKED; + case _BV(NRF24L01_07_MAX_RT): return PKT_TIMEOUT; } return PKT_PENDING; } // 2-bytes CRC -#define CRC_CONFIG (BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO)) +#define CRC_CONFIG (_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO)) static uint16_t esky150_init() { uint8_t rx_addr[ADDR_esky150_SIZE] = { 0x73, 0x73, 0x74, 0x63 }; uint8_t tx_addr[ADDR_esky150_SIZE] = { 0x71, 0x0A, 0x31, 0xF4 }; @@ -64,7 +64,7 @@ static uint16_t esky150_init() { NRF24L01_Activate(0x73); NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 1); // Dynamic payload for data pipe 0 // Enable: Dynamic Payload Length, Payload with ACK , W_TX_PAYLOAD_NOACK - NRF24L01_WriteReg(NRF24L01_1D_FEATURE, BV(NRF2401_1D_EN_DPL) | BV(NRF2401_1D_EN_ACK_PAY) | BV(NRF2401_1D_EN_DYN_ACK)); + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, _BV(NRF2401_1D_EN_DPL) | _BV(NRF2401_1D_EN_ACK_PAY) | _BV(NRF2401_1D_EN_DYN_ACK)); // Delay 50 ms return 50000; @@ -80,51 +80,26 @@ static uint16_t esky150_init2() { // Turn radio power on NRF24L01_SetTxRxMode(TX_EN); - NRF24L01_WriteReg(NRF24L01_00_CONFIG, CRC_CONFIG | BV(NRF24L01_00_PWR_UP)); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, CRC_CONFIG | _BV(NRF24L01_00_PWR_UP)); // delayMicroseconds(150); return 150; } -static void calc_fh_channels(uint32_t seed) { - // Use channels 2..79 - uint8_t first = seed % 37 + 2; - uint8_t second = first + 40; - hopping_frequency[0] = first; // 0x22; - hopping_frequency[1] = second; // 0x4a; -} - - -static uint8_t convert_channel(uint8_t num) { - uint32_t ch = Servo_data[num]; - if (ch < PPM_MIN) { ch = PPM_MIN; } - else if (ch > PPM_MAX) { ch = PPM_MAX; } - return (uint8_t) ((ch * 500 / PPM_MAX) + 1500); -} -static void read_controls(uint8_t* throttle, uint8_t* aileron, uint8_t* elevator, uint8_t* rudder) { - *throttle = convert_channel(THROTTLE); - *aileron = convert_channel(AILERON); - *elevator = convert_channel(ELEVATOR); - *rudder = convert_channel(RUDDER); -} - - static void esky150_send_packet() { uint8_t rf_ch = hopping_frequency[rf_ch_num]; rf_ch_num = 1 - rf_ch_num; - read_controls(&throttle, &aileron, &elevator, &rudder); - packet[0] = hopping_frequency[0]; packet[1] = hopping_frequency[1]; - packet[2] = (throttle >> 8) & 0xFF; - packet[3] = throttle & 0xFF; - packet[4] = (aileron >> 8) & 0xFF; - packet[5] = aileron & 0xFF; - packet[6] = (elevator >> 8) & 0xFF; - packet[7] = elevator & 0xFF; - packet[8] = (rudder >> 8) & 0xFF; - packet[9] = rudder & 0xFF; + packet[2] = highByte(Servo_data[THROTTLE]); + packet[3] = lowByte(Servo_data[THROTTLE]); + packet[4] = highByte(Servo_data[AILERON]); + packet[5] = lowByte(Servo_data[AILERON]); + packet[6] = highByte(Servo_data[ELEVATOR]); + packet[7] = lowByte(Servo_data[ELEVATOR]); + packet[8] = highByte(Servo_data[RUDDER]); + packet[9] = lowByte(Servo_data[RUDDER]); // Constant values 00 d8 18 f8 packet[10] = 0x00; packet[11] = 0xd8; @@ -166,6 +141,12 @@ static uint16_t esky150_callback() { static uint16_t esky150_setup() { total_packets = 0; uint16_t timeout = esky150_init(); + + // Use channels 2..79 + uint8_t first = MProtocol_id % 37 + 2; + uint8_t second = first + 40; + hopping_frequency[0] = first; // 0x22; + hopping_frequency[1] = second; // 0x4a; return timeout; } diff --git a/Multiprotocol/Nrf24l01_fbl100.ino b/Multiprotocol/Nrf24l01_fbl100.ino index f25e368..cdc7f94 100644 --- a/Multiprotocol/Nrf24l01_fbl100.ino +++ b/Multiprotocol/Nrf24l01_fbl100.ino @@ -93,7 +93,7 @@ static void config_nrf24l01() { NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // 0:No Auto Acknoledgement; 1:Auto Acknoledgement NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, packet_length); // fbl100/v922's packet size = 10, hp100 = 12 // 2-bytes CRC, radio off - NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address (byte -2) NRF24L01_SetBitrate(sub_protocol == HP100? NRF24L01_BR_250K:NRF24L01_BR_1M); //hp100:250kbps; fbl100: 1Mbps NRF24L01_SetPower(); @@ -108,7 +108,7 @@ static void fbl100_build_ch_data() { uint32_t temp; uint8_t i; for (i = 0; i< 8; i++) { - temp = (uint32_t)Servo_data[i] * 500/PPM_MAX + 500; + temp = (uint32_t)Servo_data[i] -1000; if (i == 2) { temp = 1000 -temp; } // It is clear that fbl100's thro stick is made reversely,so I adjust it here on purposely if (temp < 0) { fbl_data[i] = 0; } else if (temp > 1000) { fbl_data[i] = 1000; } @@ -131,11 +131,12 @@ static void hp100_build_ch_data() { uint32_t temp; uint8_t i; for (i = 0; i< 8; i++) { - temp = (uint32_t)Servo_data[i] * 300/PPM_MAX + 500; + temp=map(limit_channel_100(i),servo_min_100,servo_max_100,200,800); +/* temp = (uint32_t)Servo_data[i] * 300/PPM_MAX + 500; if (temp < 0) { temp = 0; } else if (temp > 1000) { temp = 1000; } if (i == 3 || i == 5) { temp = 1000 -temp; } // hp100's rudd and pit channel are made reversely,so I adjust them on purposely - +*/ fbl_data[i] = (unsigned int)temp; packet[i] = (uint8_t)fbl_data[i]; } diff --git a/Multiprotocol/Nrf24l01_h377.ino b/Multiprotocol/Nrf24l01_h377.ino index 439178d..0771dcf 100644 --- a/Multiprotocol/Nrf24l01_h377.ino +++ b/Multiprotocol/Nrf24l01_h377.ino @@ -90,7 +90,7 @@ static void h377_init() { // 2-bytes CRC, radio off NRF24L01_SetTxRxMode(TX_EN); - NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address (byte -2) NRF24L01_SetBitrate(0); // 1Mbps NRF24L01_SetPower(); @@ -100,10 +100,11 @@ static void h377_init() { // H377 channel sequence: AILE ELEV THRO RUDD GEAR PITH, channel data value is from 0 to 1000 static void h377_ch_data() { uint32_t temp; - uint8_t i; + uint8_t i,j; for (i = 0; i< 8; i++) { - temp = (uint32_t)Servo_data[i] * 450/PPM_MAX + 500; // max/min servo range is +-125% - if (i == 2) // It is clear that h377's thro stick is made reversely, so I adjust it here on purpose + j=CH_AETR[i]; + temp=map(limit_channel_100(j),servo_min_100,servo_max_100,0,1000); // max/min servo range is +-125% + if (j == THROTTLE) // It is clear that h377's thro stick is made reversely, so I adjust it here on purpose temp = 1000 -temp; //if (i == 0) // It is clear that h377's thro stick is made reversely, so I adjust it here on purpose // temp = 1000 -temp; diff --git a/Multiprotocol/Nrf24l01_hm830.ino b/Multiprotocol/Nrf24l01_hm830.ino index bb30d3a..d81d809 100644 --- a/Multiprotocol/Nrf24l01_hm830.ino +++ b/Multiprotocol/Nrf24l01_hm830.ino @@ -76,7 +76,7 @@ static uint8_t count; static uint8_t rf_ch[] = {0x08, 0x35, 0x12, 0x3f, 0x1c, 0x49, 0x26}; static uint8_t bind_addr[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xc2}; -static uint8_t crc8(uint32_t result, uint8_t *data, int len) { +static uint8_t HM830_crc8(uint32_t result, uint8_t *data, int len) { int polynomial = 0x01; for(int i = 0; i < len; i++) { result = result ^ data[i]; @@ -114,26 +114,26 @@ static void HM830_init() { static void build_bind_packet_hm830() { for(int i = 0; i < 6; i++) { packet[i] = rx_tx_addr[i]; } - packet[6] = crc8(0xa5, packet, 6); + packet[6] = HM830_crc8(0xa5, packet, 6); } static void build_data_packet() { uint8_t ail_sign = 0, trim_sign = 0; - throttle = (uint32_t)Servo_data[THROTTLE] * 50 / PPM_MAX + 50; + throttle = (uint32_t)map(limit_channel_100(THROTTLE),servo_min_100,servo_max_100,0,100); if (throttle < 0) { throttle = 0; } - aileron = (uint32_t)Servo_data[AILERON] * 8 / PPM_MAX; + aileron = (uint32_t)map(limit_channel_100(AILERON),servo_min_100,servo_max_100,-8,8); if (aileron < 0) { aileron = -aileron; ail_sign = 1; } if (aileron > 7) { aileron = 7; } - uint8_t turbo = (uint32_t)Servo_data[ELEVATOR] > 0 ? 1 : 0; + uint8_t turbo = Servo_data[ELEVATOR] > PPM_SWITCH ? 1 : 0; - uint8_t trim = ((uint32_t)Servo_data[RUDDER] * 0x1f / PPM_MAX); + uint8_t trim = map(limit_channel_100(RUDDER),servo_min_100,servo_max_100,-31,31); if (trim < 0) { trim = -trim; trim_sign = 1; } if (trim > 0x1f) { trim = 0x1f; } - uint8_t rbutton = (uint32_t)Servo_data[4] > 0 ? 1 : 0; + uint8_t rbutton = Servo_data[4] > PPM_SWITCH ? 1 : 0; packet[0] = throttle; packet[1] = aileron; if (ail_sign) { packet[1] |= 0x20; } @@ -141,7 +141,7 @@ static void build_data_packet() { if (rbutton) { packet[1] |= 0x80; } packet[5] = trim; if (trim_sign) { packet[5] |= 0x20;} - packet[6] = crc8(0xa5, packet, 6); + packet[6] = HM830_crc8(0xa5, packet, 6); } static void send_packet_hm830() { diff --git a/Multiprotocol/Nrf24l01_hontai.ino b/Multiprotocol/Nrf24l01_hontai.ino deleted file mode 100644 index 4408014..0000000 --- a/Multiprotocol/Nrf24l01_hontai.ino +++ /dev/null @@ -1,272 +0,0 @@ -/* - 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. - - Deviation 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 Deviation. If not, see . - */ - - -#if defined(HonTai_NRF24L01_INO) -#include "iface_nrf24l01.h" - -#define BIND_HT_COUNT 80 -#define PACKET_HT_PERIOD 13500 // Timeout for callback in uSec -//printf inside an interrupt handler is really dangerous -//this shouldn't be enabled even in debug builds without explicitly -//turning it on -#define dbgprintf if(0) printf - -#define INITIAL_HT_WAIT 500 -#define BIND_HT_PACKET_SIZE 10 -#define PACKET_HT_SIZE 12 -#define RF_BIND_HT_CHANNEL 0 - -enum { - FORMAT_HONTAI = 0, - FORMAT_JJRCX1, -}; - - -#define CHANNEL_LED AUX1 -#define CHANNEL_ARM AUX1 // for JJRC X1 -#define CHANNEL_FLIP AUX2 -#define CHANNEL_PICTURE AUX3 -#define CHANNEL_VIDEO AUX4 -#define CHANNEL_HEADLESS AUX5 -#define CHANNEL_RTH AUX6 -#define CHANNEL_CALIBRATE AUX7 - -enum { - HonTai_INIT1 = 0, - HonTai_BIND2, - HonTai_DATA -}; - -static uint8_t ht_txid[5]; - -static uint8_t rf_chan = 0; -static uint8_t rf_channels[][3] = {{0x05, 0x19, 0x28}, // Hontai - {0x0a, 0x1e, 0x2d}}; // JJRC X1 -static uint8_t rx_tx_ht_addr[] = {0xd2, 0xb5, 0x99, 0xb3, 0x4a}; -static uint8_t addr_vals[4][16] = { - {0x24, 0x26, 0x2a, 0x2c, 0x32, 0x34, 0x36, 0x4a, 0x4c, 0x4e, 0x54, 0x56, 0x5a, 0x64, 0x66, 0x6a}, - {0x92, 0x94, 0x96, 0x9a, 0xa4, 0xa6, 0xac, 0xb2, 0xb4, 0xb6, 0xca, 0xcc, 0xd2, 0xd4, 0xd6, 0xda}, - {0x93, 0x95, 0x99, 0x9b, 0xa5, 0xa9, 0xab, 0xad, 0xb3, 0xb5, 0xc9, 0xcb, 0xcd, 0xd3, 0xd5, 0xd9}, - {0x25, 0x29, 0x2b, 0x2d, 0x33, 0x35, 0x49, 0x4b, 0x4d, 0x59, 0x5b, 0x65, 0x69, 0x6b, 0x6d, 0x6e}}; - -// proudly swiped from http://www.drdobbs.com/implementing-the-ccitt-cyclical-redundan/199904926 -#define POLY 0x8408 -static uint16_t crc16(uint8_t *data_p, uint32_t length) -{ - uint8_t i; - uint32_t data; - uint32_t crc; - - crc = 0xffff; - - if (length == 0) return (~crc); - - length -= 2; - do { - for (i = 0, data = (uint8_t)0xff & *data_p++; - i < 8; - i++, data >>= 1) { - if ((crc & 0x0001) ^ (data & 0x0001)) - crc = (crc >> 1) ^ POLY; - else - crc >>= 1; - } - } while (--length); - - crc = ~crc; - data = crc; - crc = (crc << 8) | (data >> 8 & 0xFF); - *data_p++ = crc >> 8; - *data_p = crc & 0xff; - return crc; -} - -#define CHAN_RANGE (PPM_MAX - PPM_MIN) -static uint8_t scale_HT_channel(uint8_t ch, uint8_t start, uint8_t end) -{ - uint32_t range = end - start; - uint32_t chanval = Servo_data[ch]; - - if (chanval < PPM_MIN) chanval = PPM_MIN; - else if (chanval > PPM_MAX) chanval = PPM_MAX; - - uint32_t round = range < 0 ? 0 : CHAN_RANGE / range; // channels round up - if (start < 0) round = CHAN_RANGE / range / 2; // trims zero centered around zero - return (range * (chanval - PPM_MIN + round)) / CHAN_RANGE + start; -} - -#define GET_FLAG(ch, mask) (Servo_data[ch] > 0 ? mask : 0) -static void send_HT_packet(uint8_t bind) -{ - if (bind) { - memcpy(packet, ht_txid, 5); - memset(&packet[5], 0, 3); - } else { - if (sub_protocol == FORMAT_HONTAI) { - packet[0] = 0x0b; - } else { - packet[0] = GET_FLAG(CHANNEL_ARM, 0x02); - } - packet[1] = 0x00; - packet[2] = 0x00; - packet[3] = (scale_HT_channel(THROTTLE, 0, 127) << 1) // throttle - | GET_FLAG(CHANNEL_PICTURE, 0x01); - packet[4] = scale_HT_channel(AILERON, 63, 0); // aileron - if (sub_protocol == FORMAT_HONTAI) { - packet[4] |= GET_FLAG(CHANNEL_RTH, 0x80) - | GET_FLAG(CHANNEL_HEADLESS, 0x40); - } else { - packet[4] |= 0x80; // not sure what this bit does - } - packet[5] = scale_channel(CHANNEL2, 0, 63) // elevator - | GET_FLAG(CHANNEL_CALIBRATE, 0x80) - | GET_FLAG(CHANNEL_FLIP, 0x40); - packet[6] = scale_HT_channel(RUDDER, 0, 63) // rudder - | GET_FLAG(CHANNEL_VIDEO, 0x80); - packet[7] = scale_HT_channel(AILERON, -16, 16); // aileron trim - if (sub_protocol == FORMAT_HONTAI) { - packet[8] = scale_HT_channel(RUDDER, -16, 16); // rudder trim - } else { - packet[8] = 0xc0 // always in expert mode - | GET_FLAG(CHANNEL_RTH, 0x02) - | GET_FLAG(CHANNEL_HEADLESS, 0x01); - } - packet[9] = scale_HT_channel(ELEVATOR, -16, 16); // elevator trim - } - crc16(packet, bind ? BIND_HT_PACKET_SIZE : PACKET_HT_SIZE); - - // Power on, TX mode, 2byte CRC - if (sub_protocol == FORMAT_HONTAI) { - XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); - } else { - NRF24L01_SetTxRxMode(TX_EN); - } - - NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? RF_BIND_HT_CHANNEL : rf_channels[sub_protocol][rf_chan++]); - rf_chan %= sizeof(rf_channels); - - NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); - NRF24L01_FlushTx(); - - if (sub_protocol == FORMAT_HONTAI) { - XN297_WritePayload(packet, bind ? BIND_HT_PACKET_SIZE : PACKET_HT_SIZE); - } else { - NRF24L01_WritePayload(packet, bind ? BIND_HT_PACKET_SIZE : PACKET_HT_SIZE); - } - - NRF24L01_SetPower(); -} - -static void ht_init() -{ - NRF24L01_Initialize(); - - NRF24L01_SetTxRxMode(TX_EN); - - // SPI trace of stock TX has these writes to registers that don't appear in - // nRF24L01 or Beken 2421 datasheets. Uncomment if you have an XN297 chip? - // NRF24L01_WriteRegisterMulti(0x3f, "\x4c\x84\x67,\x9c,\x20", 5); - // NRF24L01_WriteRegisterMulti(0x3e, "\xc9\x9a\xb0,\x61,\xbb,\xab,\x9c", 7); - // NRF24L01_WriteRegisterMulti(0x39, "\x0b\xdf\xc4,\xa7,\x03,\xab,\x9c", 7); - - if (sub_protocol == FORMAT_HONTAI) { - XN297_SetTXAddr(rx_tx_ht_addr, sizeof(rx_tx_ht_addr)); - } else { - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_ht_addr, sizeof(rx_tx_ht_addr)); - } - - NRF24L01_FlushTx(); - NRF24L01_FlushRx(); - NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit - NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes - NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps - NRF24L01_SetPower(); - NRF24L01_Activate(0x73); // Activate feature register - if (sub_protocol == FORMAT_HONTAI) { - NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // no retransmits - NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes - NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x00); - NRF24L01_Activate(0x73); // Deactivate feature register - } else { - 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... - NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x07); - } -} - -static void ht_init2() -{ - uint8_t data_tx_addr[] = {0x2a, 0xda, 0xa5, 0x25, 0x24}; - - data_tx_addr[0] = addr_vals[0][ ht_txid[3] & 0x0f]; - data_tx_addr[1] = addr_vals[1][(ht_txid[3] >> 4) & 0x0f]; - data_tx_addr[2] = addr_vals[2][ ht_txid[4] & 0x0f]; - data_tx_addr[3] = addr_vals[3][(ht_txid[4] >> 4) & 0x0f]; - - if (sub_protocol == FORMAT_HONTAI) { - XN297_SetTXAddr(data_tx_addr, sizeof(data_tx_addr)); - } else { - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, data_tx_addr, sizeof(data_tx_addr)); - } -} - -static uint16_t ht_callback() -{ - switch (phase) { - case HonTai_INIT1: - phase = HonTai_BIND2; - break; - case HonTai_BIND2: - if (counter == 0) { - ht_init2(); - phase = HonTai_DATA; - BIND_DONE; - } else { - send_HT_packet(1); - counter -= 1; - } - break; - - case HonTai_DATA: - send_HT_packet(0); - break; - } - return PACKET_HT_PERIOD; -} - -static uint16_t ht_setup() -{ - counter = BIND_HT_COUNT; - - if (sub_protocol == FORMAT_HONTAI) { - ht_txid[0] = 0x4c; // first three bytes some kind of model id? - set same as stock tx - ht_txid[1] = 0x4b; - ht_txid[2] = 0x3a; - } else { - ht_txid[0] = 0x4b; // JJRC X1 - ht_txid[1] = 0x59; - ht_txid[2] = 0x3a; - } - ht_txid[3] = (MProtocol_id >> 8 ) & 0xff; - ht_txid[4] = MProtocol_id & 0xff; - - ht_init(); - phase = HonTai_INIT1; - - return INITIAL_HT_WAIT; -} -#endif - diff --git a/Multiprotocol/Nrf24l01_inav.ino b/Multiprotocol/Nrf24l01_inav.ino new file mode 100644 index 0000000..2d04acc --- /dev/null +++ b/Multiprotocol/Nrf24l01_inav.ino @@ -0,0 +1,733 @@ +/*** + * iNav Protocol + * + * Data rate is 250Kbps - lower data rate for better reliability and range + * + * Uses auto acknowledgment and dynamic payload size + * ACK payload is used for handshaking in bind phase and telemetry in data phase + * + * Bind payload size is 16 bytes + * Data payload size is 16 bytes dependent on variant of protocol, (small payload is read more quickly (marginal benefit)) + * + * Bind and data payloads are whitened (XORed with a pseudo-random bitstream) to remove strings of 0s or 1s in transmission + * packet. This improves reception by helping keep the TX and RX clocks in sync. + * + * Bind Phase + * uses address {0x4b,0x5c,0x6d,0x7e,0x8f} + * uses channel 0x4c (76) + * + * Data Phase + * 1) Uses the address received in bind packet + * + * 2) Hops between RF channels generated from the address received in bind packet. + * The number of RF hopping channels is set during bind handshaking: + * the transmitter requests a number of hopping channels in payload[7] + * the receiver sets ackPayload[7] with the number of hopping channels actually allocated - the transmitter must + * use this value. + * + * 3) There are 16 channels: eight 10-bit analog channels, two 8-bit analog channels, and six digital channels as follows: + * Channels 0 to 3, are the AETR channels, values 1000 to 2000 with resolution of 1 (10-bit channels) + * Channel AUX1 by deviation convention is used for rate, values 1000, 1500, 2000 + * Channels AUX2 to AUX6 are binary channels, values 1000 or 2000, + * by deviation convention these channels are used for: flip, picture, video, headless, and return to home + * Channels AUX7 to AUX10 are analog channels, values 1000 to 2000 with resolution of 1 (10-bit channels) + * Channels AUX11 and AUX12 are analog channels, values 1000 to 2000 with resolution of 4 (8-bit channels) +***/ + +// debug build flags +//#define NO_RF_CHANNEL_HOPPING + +#define USE_AUTO_ACKKNOWLEDGEMENT +#define USE_WHITENING + +#define INAV_TELEMETRY +//#define INAV_TELEMETRY_DEBUG + +#define UNUSED(x) (void)(x) + +#ifdef INAV_NRF24L01_INO + static uint8_t INAV_setup() { return 1000; } + static uint16_t inav_cb() {} +#endif +#if 0 +/* +*/ + + #include "iface_nrf24l01.h" + + #define BIND_COUNT 345 // 1.5 seconds + #define FIRST_PACKET_DELAY 12000 + + #define PACKET_PERIOD 4000 // Timeout for callback in uSec + #define INITIAL_WAIT 500 + + // For code readability + enum { + CHANNEL1 = 0, + CHANNEL2, + CHANNEL3, + CHANNEL4, + CHANNEL5, + CHANNEL6, + CHANNEL7, + CHANNEL8, + CHANNEL9, + CHANNEL10, + CHANNEL11, + CHANNEL12, + CHANNEL13, + CHANNEL14, + CHANNEL15, + CHANNEL16, + }; + + // Deviation transmitter channels + #define DEVIATION_CHANNEL_COUNT 12 // Max supported by Devo 7e + //#define CHANNEL_LED CHANNEL5 + #define CHANNEL_RATE CHANNEL5 + #define CHANNEL_FLIP CHANNEL6 + #define CHANNEL_PICTURE CHANNEL7 + #define CHANNEL_VIDEO CHANNEL8 + #define CHANNEL_HEADLESS CHANNEL9 + #define CHANNEL_RTH CHANNEL10 + #define CHANNEL_XCAL CHANNEL11 + #define CHANNEL_YCAL CHANNEL12 +// #define GET_FLAG(ch, mask) (Channels[ch] > 0 ? mask : 0) + + + enum { + RATE_LOW = 0, + RATE_MID = 1, + RATE_HIGH = 2, + }; + + enum { + FLAG_FLIP = 0x01, + FLAG_PICTURE = 0x02, + FLAG_VIDEO = 0x04, + FLAG_RTH = 0x08, + FLAG_HEADLESS = 0x10, + }; + + typedef enum { + PHASE_INAV_INIT = 0, + PHASE_INAV_BIND, + PHASE_INAV_DATA + }; + + typedef enum { + DATA_PACKET = 0, + BIND_PACKET = 1, + }; + + static const char * const inav_opts[] = { + #ifdef INAV_TELEMETRY + _tr_noop("Telemetry"), _tr_noop("On"), _tr_noop("Off"), NULL, + #endif + "RxTx Addr1", "-32768", "32767", "1", NULL, // todo: store that elsewhere + "RxTx Addr2", "-32768", "32767", "1", NULL, // ^^^^^^^^^^^^^^^^^^^^^^^^^^ + NULL + }; + + enum { + #ifdef INAV_TELEMETRY + PROTOOPTS_TELEMETRY, + #endif + PROTOOPTS_RX_TX_ADDR1, // todo: store that elsewhere + PROTOOPTS_RX_TX_ADDR2, // ^^^^^^^^^^^^^^^^^^^^^^^^^^ + LAST_PROTO_OPT + }; + + enum { + OPTS_6_CHANNELS = 0, + OPTS_12_CHANNELS + }; + + enum { + TELEM_ON = 0, + TELEM_OFF, + }; + + // Bit vector from bit position + #define BV(bit) (1 << bit) + + // Bit position mnemonics + enum { + + NRF24L01_1D_EN_DYN_ACK = 0, + NRF24L01_1D_EN_ACK_PAY = 1, + NRF24L01_1D_EN_DPL = 2, + }; + + // Pre-shifted and combined bits + enum { + NRF24L01_03_SETUP_AW_5BYTES = 0x03, + }; + + enum { + NRF24L01_MAX_PAYLOAD_SIZE = 32, + }; + + #define INAV_PROTOCOL_PAYLOAD_SIZE_MIN 8 + #define INAV_PROTOCOL_PAYLOAD_SIZE_DEFAULT 16 + #define INAV_PROTOCOL_PAYLOAD_SIZE_MAX 16 + + static uint32_t lost_packet_counter; + + #define RC_CHANNEL_COUNT_MIN 6 + #define RC_CHANNEL_COUNT_DEFAULT 16 + #define RC_CHANNEL_COUNT_MAX 18 + + static uint8_t rc_channel_count; + + static uint8_t tx_power; + + #define RX_TX_ADDR_LEN 5 + static const uint8_t rx_tx_addr_bind[RX_TX_ADDR_LEN] = {0x4b,0x5c,0x6d,0x7e,0x8f}; + static uint8_t rx_tx_addr[RX_TX_ADDR_LEN]; + #define RX_TX_ADDR_4 0xD2 // rxTxAddr[4] always set to this value + + #define BIND_PAYLOAD0 0xad // 10101101 + #define BIND_PAYLOAD1 0xc9 // 11001001 + #define BIND_ACK_PAYLOAD0 0x95 // 10010101 + #define BIND_ACK_PAYLOAD1 0xa9 // 10101001 + #define TELEMETRY_ACK_PAYLOAD0 0x5a // 01011010 + // TELEMETRY_ACK_PAYLOAD1 is sequence count + #define DATA_PAYLOAD0 0x00 + #define DATA_PAYLOAD1 0x00 + + #ifdef USE_AUTO_ACKKNOWLEDGEMENT + static uint8_t ackPayloadSize; + static uint8_t ackPayload[NRF24L01_MAX_PAYLOAD_SIZE]; + #endif + + // frequency channel management + #define RF_CHANNEL_COUNT_DEFAULT 4 + #define RF_CHANNEL_COUNT_MAX 4 + #define RF_CHANNEL_BIND 0x4c + static uint8_t rf_channel_index; + static uint8_t rf_channels[RF_CHANNEL_COUNT_MAX]; + static uint8_t rf_channel_count; + + static protocol_phase_t phase; + + #ifndef TELEM_LTM + // use DSM telemetry until LTM telemetry is implemented + #define TELEM_LTM TELEM_DSM + // repurpose the DSM FADESL, FADESR and HOLDS fields to display roll, pitch and yaw + #define TELEM_LTM_ATTITUDE_PITCH TELEM_DSM_FLOG_FADESL + #define TELEM_LTM_ATTITUDE_ROLL TELEM_DSM_FLOG_FADESR + #define TELEM_LTM_ATTITUDE_YAW TELEM_DSM_FLOG_HOLDS + // use DSM VOLT2, AMPS1 and AIRSPEED fields + #define TELEM_LTM_STATUS_VBAT TELEM_DSM_FLOG_VOLT2 + #define TELEM_LTM_STATUS_CURRENT TELEM_DSM_AMPS1 + #define TELEM_LTM_STATUS_RSSI TELEM_DSM_FLOG_FRAMELOSS + #define TELEM_LTM_STATUS_AIRSPEED TELEM_DSM_AIRSPEED + /* + currently unused LTM telemetry fields + TELEM_LTM_STATUS_ARMED + TELEM_LTM_STATUS_FAILSAFE + TELEM_LTM_STATUS_FLIGHTMODE + TELEM_LTM_NAVIGATION_GPS_MODE + TELEM_LTM_NAVIGATION_NAV_MODE + TELEM_LTM_NAVIGATION_ACTION + TELEM_LTM_NAVIGATION_WAYPOINT_NUMBER + TELEM_LTM_NAVIGATION_ERROR + TELEM_LTM_NAVIGATION_FLAGS + TELEM_LTM_GPSX_HDOP + TELEM_LTM_TUNING_P_ROLL + TELEM_LTM_TUNING_I_ROLL + TELEM_LTM_TUNING_D_ROLL + TELEM_LTM_TUNING_P_PITCH + TELEM_LTM_TUNING_I_PITCH + TELEM_LTM_TUNING_D_PITCH + TELEM_LTM_TUNING_P_YAW + TELEM_LTM_TUNING_I_YAW + TELEM_LTM_TUNING_D_YAW + TELEM_LTM_TUNING_RATES_ROLL + TELEM_LTM_TUNING_RATES_PITCH + TELEM_LTM_TUNING_RATES_YAW + */ + #endif + + /* + uint8_t convert_channel_8b(uint8_t channel) + { + return (uint8_t)(convert_channel(channel) >> 2); + } + */ + + static void whiten_payload(uint8_t *payload, uint8_t len) + { + #ifdef USE_WHITENING + uint8_t whitenCoeff = 0x6b; // 01101011 + while (len--) { + for (uint8_t m = 1; m; m <<= 1) { + if (whitenCoeff & 0x80) { + whitenCoeff ^= 0x11; + (*payload) ^= m; + } + whitenCoeff <<= 1; + } + payload++; + } + #else + UNUSED(payload); + UNUSED(len); + #endif + } + + static void build_bind_packet(void) + { + memset(packet, 0, INAV_PROTOCOL_PAYLOAD_SIZE_MAX); + packet[0] = BIND_PAYLOAD0; + packet[1] = BIND_PAYLOAD1; + packet[2] = rx_tx_addr[0]; + packet[3] = rx_tx_addr[1]; + packet[4] = rx_tx_addr[2]; + packet[5] = rx_tx_addr[3]; + packet[6] = rx_tx_addr[4]; + packet[7] = rf_channel_count; + packet[8] = packet_length; + packet[9] = rc_channel_count; + } + + static void build_data_packet(void) + { + packet[0] = 0; + packet[1] = 0; + // AETR channels have 10 bit resolution + const uint16_t aileron = convert_channel_10b(AILERON); + const uint16_t elevator = convert_channel_10b(ELEVATOR); + const uint16_t throttle = convert_channel_10b(THROTTLE); + const uint16_t rudder = convert_channel_10b(RUDDER); + packet[2] = aileron >> 2; + packet[3] = elevator >> 2; + packet[4] = throttle >> 2; + packet[5] = rudder >> 2; + // pack the AETR low bits + packet[6] = (aileron & 0x03) | ((elevator & 0x03) << 2) | ((throttle & 0x03) << 4) | ((rudder & 0x03) << 6); + + uint8_t rate = RATE_LOW; + if (Channels[CHANNEL_RATE] > 0) { + rate = RATE_HIGH; + } else if (Channels[CHANNEL_RATE] == 0) { + rate = RATE_MID; + } + packet[7] = rate; // rate, deviation channel 5, is mapped to AUX1 + + const uint8_t flags = GET_FLAG(CHANNEL_FLIP, FLAG_FLIP) + | GET_FLAG(CHANNEL_PICTURE, FLAG_PICTURE) + | GET_FLAG(CHANNEL_VIDEO, FLAG_VIDEO) + | GET_FLAG(CHANNEL_RTH, FLAG_RTH) + | GET_FLAG(CHANNEL_HEADLESS, FLAG_HEADLESS); + packet[8] = flags; // flags, deviation channels 6-10 are mapped to AUX2 t0 AUX6 + + // map deviation channels 9-12 to RC channels AUX7-AUX10, use 10 bit resolution + // deviation CHANNEL9 (headless) and CHANNEL10 (RTH) are mapped for a second time + // duplicate mapping makes maximum use of deviation's 12 channels + const uint16_t channel9 = convert_channel_10b(CHANNEL9); + const uint16_t channel10 = convert_channel_10b(CHANNEL10); + const uint16_t channel11 = convert_channel_10b(CHANNEL11); + const uint16_t channel12 = convert_channel_10b(CHANNEL12); + packet[9] = channel9 >> 2; + packet[10] = channel10 >> 2; + packet[11] = channel11 >> 2; + packet[12] = channel12 >> 2; + packet[13] = (channel9 & 0x03) | ((channel10 & 0x03) << 2) | ((channel11 & 0x03) << 4) | ((channel12 & 0x03) << 6); + + // map deviation channels 7 and 8 to RC channels AUX11 and AUX12, use 10 bit resolution + // deviation channels 7 (picture) and 8 (video) are mapped for a second time + packet[14] = convert_channel_8b(CHANNEL7); + packet[15] = convert_channel_8b(CHANNEL8); + } + + + static uint8_t packet_ack(void) + { + #ifdef USE_AUTO_ACKKNOWLEDGEMENT + const uint8_t status = NRF24L01_ReadReg(NRF24L01_07_STATUS); + if (status & BV(NRF24L01_07_TX_DS)) { // NRF24L01_07_TX_DS asserted when ack payload received + // ack payload recieved + ackPayloadSize = NRF24L01_GetDynamicPayloadSize(); + if (ackPayloadSize > NRF24L01_MAX_PAYLOAD_SIZE) { + ackPayloadSize = 0; + NRF24L01_FlushRx(); + return PKT_PENDING; + } + NRF24L01_ReadPayload(ackPayload, ackPayloadSize); + whiten_payload(ackPayload, ackPayloadSize); + NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_TX_DS)); // clear TX_DS interrupt + return PKT_ACKED; + } + if (status & BV(NRF24L01_07_MAX_RT)) { + // max retries exceeded + // clear MAX_RT interrupt to allow further transmission + NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_MAX_RT)); + NRF24L01_FlushTx(); // payload wasn't successfully transmitted, so remove it from TX FIFO + return PKT_TIMEOUT; + } + return PKT_PENDING; + #else + return PKT_TIMEOUT; // if not using AUTO ACK just return a timeout + #endif + } + + void transmit_packet(void) + { + // clear packet MAX_RT status bit so that transmission is not blocked + NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_MAX_RT)); + // set NRF24L01_00_MASK_TX_DS and clear NRF24L01_00_PRIM_RX to initiate transmit + // NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_PWR_UP) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_MASK_TX_DS) | BV(NRF24L01_00_MASK_MAX_RT)); + whiten_payload(packet, packet_length); + NRF24L01_WritePayload(packet, packet_length);// asynchronous call + } + + static void hop_to_next_channel(void) + { + #ifndef NO_RF_CHANNEL_HOPPING + if (phase == PHASE_INAV_BIND) { + return; + } + ++rf_channel_index; + if (rf_channel_index >= rf_channel_count) { + rf_channel_index = 0; + } + NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_channels[rf_channel_index]); + #endif + } + + static void send_packet(uint8_t packet_type) + { + if (packet_type == DATA_PACKET) { + build_data_packet(); + } else { + build_bind_packet(); + } + transmit_packet(); + hop_to_next_channel(); + ++packet_count; + + // Check and adjust transmission power. We do this after + // transmission to not bother with timeout after power + // settings change - we have plenty of time until next + // packet. + if (tx_power != Model.tx_power) { + //Keep transmit power updated + tx_power = Model.tx_power; + NRF24L01_SetPower(tx_power); + } + } + + static void set_data_phase(void) + { + packet_count = 0; + lost_packet_counter = 0; + phase = PHASE_INAV_DATA; + rf_channel_index = 0; + NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_channels[0]); + // RX_ADDR_P0 must equal TX_ADDR for auto ACK + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, RX_TX_ADDR_LEN); + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, RX_TX_ADDR_LEN); + } + + static void init_nrf24l01(void) + { + NRF24L01_Initialize(); + // sets PWR_UP, EN_CRC, CRCO - 2 byte CRC + NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_PWR_UP) | BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO)); + + #ifdef USE_AUTO_ACKKNOWLEDGEMENT + // Note that for some cheap NFR24L01 clones the NO_ACK bit in the packet control field is inverted, + // see https://ncrmnt.org/2015/03/13/how-do-i-cost-optimize-nrf24l01/ + // (see section 7.3.3, p28 of nRF24L01+ Product Specification for descripton of packet control field). + // This means AUTO_ACK will no work between them and genuine NRF24L01 modules, although AUTO_ACK + // between these clones should work. + NRF24L01_WriteReg(NRF24L01_01_EN_AA, BV(NRF24L01_01_ENAA_P0)); // auto acknowledgment on P0 + NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, BV(NRF24L01_02_ERX_P0)); // Enable RX on P0 for Auto Ack + #else + NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); + #endif + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, NRF24L01_03_SETUP_AW_5BYTES); // 5-byte RX/TX address + // ARD of 1500us is minimum required for 32 byte ACK payload in 250kbps mode (section 7.4.2, p33 of nRF24L01+ Product Specification) + NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, NRF24L01_04_ARD_2500us | NRF24L01_04_ARC_1); // 1 retry after 1500us + NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_CHANNEL_BIND); + // bitrate and power are set using regigister NRF24L01_06_RF_SETUP + NRF24L01_SetBitrate(NRF24L01_BR_250K); + NRF24L01_SetPower(Model.tx_power); + // Writing to the STATUS register clears the specified interrupt bits + NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_RX_DR) | BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT)); + // NRF24L01_08_OBSERVE_TX is read only register + // NRF24L01_09_RPD is read only register (called RPD for NRF24L01+, CD for NRF24L01) + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr_bind, RX_TX_ADDR_LEN); // RX_ADDR_P0 must equal TX_ADDR for auto ACK + // RX_ADDR for pipes P1-P5 (registers 0B to 0F) aret left at default values + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr_bind, RX_TX_ADDR_LEN); + // Payload Widths for P0-P5 (registers 11 to 16) aret left at default values + // NRF24L01_17_FIFO_STATUS is read only register for all non-reserved bits + // No registers with values 18 to 1B + #ifdef USE_AUTO_ACKKNOWLEDGEMENT + NRF24L01_ReadReg(NRF24L01_1D_FEATURE); + NRF24L01_Activate(0x73); // Activate feature register, needed for NRF24L01 (harmless for NRF24L01+) + NRF24L01_ReadReg(NRF24L01_1D_FEATURE); + NRF24L01_WriteReg(NRF24L01_1C_DYNPD, BV(NRF24L01_1C_DYNPD_P0)); // dynamic payload length on pipes P0 + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, BV(NRF24L01_1D_EN_ACK_PAY) | BV(NRF24L01_1D_EN_DPL)); + #endif + + NRF24L01_Activate(0x53); // switch bank back + + NRF24L01_SetTxRxMode(TX_EN); // enter transmit mode, sets up NRF24L01_00_CONFIG register + } + + // Generate address to use from TX id and manufacturer id (STM32 unique id) + static void initialize_rx_tx_addr(void) + { + uint32_t lfsr = 0xb2c54a2ful; + + #ifndef USE_FIXED_MFGID + uint8_t var[12]; + MCU_SerialNumber(var, 12); + for (int i = 0; i < 12; ++i) { + rand32_r(&lfsr, var[i]); + } + #endif + + if (Model.fixed_id) { + for (uint8_t i = 0, j = 0; i < sizeof(Model.fixed_id); ++i, j += 8) + rand32_r(&lfsr, (Model.fixed_id >> j) & 0xff); + } + // Pump zero bytes for LFSR to diverge more + for (uint8_t i = 0; i < sizeof(lfsr); ++i) rand32_r(&lfsr, 0); + + for (uint8_t i = 0; i < sizeof(rx_tx_addr)-1; ++i) { + rx_tx_addr[i] = lfsr & 0xff; + rand32_r(&lfsr, i); + } + rx_tx_addr[1] &= 0x7f; // clear top bit so saved Model.proto_opts value is positive + rx_tx_addr[3] &= 0x7f; // clear top bit so saved Model.proto_opts value is positive + rx_tx_addr[4] = RX_TX_ADDR_4; // set to constant, so variable part of rx_tx_addr can be stored in 32-bit value + } + + // The hopping channels are determined by the value of rx_tx_addr[0] + static void set_hopping_channels(void) + { + rf_channel_index = 0; + const uint8_t addr = rx_tx_addr[0]; + uint8_t ch = 0x10 + (addr & 0x07); + for (int i = 0; i < rf_channel_count; ++i) { + rf_channels[i] = ch; + ch += 0x0c; + } + } + + static void update_telemetry(void) + { + #ifdef INAV_TELEMETRY + const uint8_t observeTx = NRF24L01_ReadReg(NRF24L01_08_OBSERVE_TX); + const uint8_t lostPacketCount = (observeTx & NRF24L01_08_PLOS_CNT_MASK) >> 4; + // const uint8_t autoRetryCount = observeTx & NRF24L01_08_ARC_CNT_MASK; + NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_channels[rf_channel_index]); // reset packet loss counter + + lost_packet_counter += lostPacketCount; + Telemetry.value[TELEM_LTM_STATUS_RSSI] = 100 - 100 * lost_packet_counter / packet_count; + TELEMETRY_SetUpdated(TELEM_LTM_STATUS_RSSI); + + // ackPayload contains telemetry in LTM format. + // See https://github.com/stronnag/mwptools/blob/master/docs/ltm-definition.txt + // ackPayload[0] is a sequence count, LTM begins at ackPayload[2] + const uint8_t *ltm = &ackPayload[2]; + switch (ltm[0]) { // frame type + case 'G': // GPS frame + { + // LTM lat/long: int32 decimal degrees * 10,000,000 (1E7) + // LTM 1 degree = 1,000,000 + // Deviation longitude: +/-180degrees = +/- 180*60*60*1000; W if value<0, E if value>=0; -180degrees = 180degrees + // Deviation latitude: +/-90degrees = +/- 90*60*60*1000; S if value<0, N if value>=0 + // Deviation 1 degree = 3,600,000 + // Scale factor = 36/10 = 18/5 + uint32_t latitude; + memcpy(&latitude, <m[1], sizeof(uint32_t)); + Telemetry.gps.latitude = latitude * 18 / 5; + TELEMETRY_SetUpdated(TELEM_GPS_LAT); + + uint32_t longitude; + memcpy(&longitude, <m[5], sizeof(uint32_t)); + Telemetry.gps.longitude = longitude * 18 / 5; + TELEMETRY_SetUpdated(TELEM_GPS_LONG); + + Telemetry.gps.velocity = ltm[9] * 1000; // LTM m/s; DEV mm/s + TELEMETRY_SetUpdated(TELEM_GPS_SPEED); + + uint32_t altitude; + memcpy(&altitude, <m[10], sizeof(uint32_t)); + Telemetry.gps.altitude = altitude * 10; // LTM:cm; DEV:mm + TELEMETRY_SetUpdated(TELEM_GPS_ALT); + + Telemetry.gps.satcount = ltm[14] >> 2; + TELEMETRY_SetUpdated(TELEM_GPS_SATCOUNT); + } + break; + case 'A': // Attitude frame + { + const uint16_t heading = ltm[5] | (ltm[6] << 8); + Telemetry.gps.heading = heading; + TELEMETRY_SetUpdated(TELEM_GPS_HEADING); + + const s16 pitch = ltm[1] | (ltm[2] << 8); + Telemetry.value[TELEM_LTM_ATTITUDE_PITCH] = pitch; // LTM:degrees [-180,180] + TELEMETRY_SetUpdated(TELEM_LTM_ATTITUDE_PITCH); + + const s16 roll = ltm[3] | (ltm[4] << 8); + Telemetry.value[TELEM_LTM_ATTITUDE_ROLL] = roll; // LTM:degrees [-180,180] + TELEMETRY_SetUpdated(TELEM_LTM_ATTITUDE_ROLL); + + Telemetry.value[TELEM_LTM_ATTITUDE_YAW] = heading; + TELEMETRY_SetUpdated(TELEM_LTM_ATTITUDE_YAW); + } + break; + case 'S': // Status frame + { + const uint16_t vBat = ltm[1] | (ltm[2] << 8); + Telemetry.value[TELEM_LTM_STATUS_VBAT] = (uint32_t)(vBat); // LTM:mV; DEV:V/10 + TELEMETRY_SetUpdated(TELEM_LTM_STATUS_VBAT); + + const uint16_t amps = ltm[3] | (ltm[4] << 8); + Telemetry.value[TELEM_LTM_STATUS_CURRENT] = (uint32_t)(amps); // LTM:mA; DEV:A/10 + TELEMETRY_SetUpdated(TELEM_LTM_STATUS_CURRENT); + + Telemetry.value[TELEM_LTM_STATUS_AIRSPEED] = ltm[6]; + TELEMETRY_SetUpdated(TELEM_LTM_STATUS_AIRSPEED); + } + break; + default: + break; + } + #endif + } + + void save_rx_tx_addr(void) + { + Model.proto_opts[PROTOOPTS_RX_TX_ADDR1] = rx_tx_addr[0] | ((uint16_t)rx_tx_addr[1] << 8); + Model.proto_opts[PROTOOPTS_RX_TX_ADDR2] = rx_tx_addr[2] | ((uint16_t)rx_tx_addr[3] << 8); + } + + void load_rx_tx_addr(void) + { + rx_tx_addr[0] = (Model.proto_opts[PROTOOPTS_RX_TX_ADDR1]) & 0xff; + rx_tx_addr[1] = (Model.proto_opts[PROTOOPTS_RX_TX_ADDR1] >> 8) & 0xff; + rx_tx_addr[2] = (Model.proto_opts[PROTOOPTS_RX_TX_ADDR2]) & 0xff; + rx_tx_addr[3] = (Model.proto_opts[PROTOOPTS_RX_TX_ADDR2] >> 8) & 0xff; + rx_tx_addr[4] = RX_TX_ADDR_4; // set to constant, so variable part of rx_tx_addr can be stored in 32-bit value + } + + static void inav_init() + { + // check options before proceeding with initialiasation + packet_length = INAV_PROTOCOL_PAYLOAD_SIZE_DEFAULT; + rc_channel_count = RC_CHANNEL_COUNT_DEFAULT; + rf_channel_count = RF_CHANNEL_COUNT_DEFAULT; + if(IS_AUTOBIND_FLAG_on) { + initialize_rx_tx_addr(); + save_rx_tx_addr(); + } else { + load_rx_tx_addr(); + } + + packet_count = 0; + set_hopping_channels(); + } + + static uint16_t inav_cb() + { + static uint16_t bind_counter; + static uint8_t bind_acked; + + switch (phase) { + case PHASE_INAV_INIT: + phase = PHASE_INAV_BIND; + bind_counter = BIND_COUNT; + bind_acked = 0; + return FIRST_PACKET_DELAY; + break; + + case PHASE_INAV_BIND: + if (bind_counter == 0) { + set_data_phase(); + BIND_DONE; + } else { + if (packet_ack() == PKT_ACKED) { + bind_acked = 1; + } + if (bind_acked == 1) { + // bind packet acked, so set bind_counter to zero to enter data phase on next callback + bind_counter = 0; + return PACKET_PERIOD; + } + send_packet(BIND_PACKET); + --bind_counter; + } + break; + + case PHASE_INAV_DATA: + update_telemetry(); + /*#define PACKET_CHKTIME 500 // time to wait if packet not yet acknowledged or timed out + if (packet_ack() == PKT_PENDING) { + return PACKET_CHKTIME; // packet send not yet complete + }*/ + packet_ack(); + send_packet(DATA_PACKET); + break; + } + return PACKET_PERIOD; + } + + static uint8_t INAV_setup() + { + CLOCK_StopTimer(); + tx_power = Model.tx_power; + ackPayloadSize = 0; + memset(ackPayload, 0, NRF24L01_MAX_PAYLOAD_SIZE); + inav_init(bind); + init_nrf24l01(); + + #ifdef INAV_TELEMETRY + memset(&Telemetry, 0, sizeof(Telemetry)); + TELEMETRY_SetType(TELEM_LTM); + #endif + + if(IS_AUTOBIND_FLAG_on) { + phase = PHASE_INAV_INIT; +// PROTOCOL_SetBindState(BIND_COUNT * PACKET_PERIOD / 1000); + } else { + set_data_phase(); +// BIND_DONE; + } + return INITIAL_WAIT; + } +/* + const void *INAV_Cmds(enum ProtoCmds cmd) + { + switch(cmd) { + case PROTOCMD_INIT: initialize(INIT_BIND); return 0; + case PROTOCMD_DEINIT: + case PROTOCMD_RESET: + CLOCK_StopTimer(); + return (void *)(NRF24L01_Reset() ? 1L : -1L); + //case PROTOCMD_CHECK_AUTOBIND: return 0; + case PROTOCMD_CHECK_AUTOBIND: return (void *)1L; // always Autobind + case PROTOCMD_BIND: initialize(INIT_BIND); return 0; + case PROTOCMD_NUMCHAN: return (void *)((long)rc_channel_count); + case PROTOCMD_DEFAULT_NUMCHAN: return (void *)((long)RC_CHANNEL_COUNT_DEFAULT); + case PROTOCMD_CURRENT_ID: return 0; + case PROTOCMD_GETOPTIONS: return inav_opts; + #ifdef INAV_TELEMETRY + case PROTOCMD_TELEMETRYSTATE: return (void *)(long)(Model.proto_opts[PROTOOPTS_TELEMETRY] == TELEM_ON ? PROTO_TELEM_ON : PROTO_TELEM_OFF); + #else + case PROTOCMD_TELEMETRYSTATE: return (void *)(long)PROTO_TELEM_UNSUPPORTED; + #endif + default: break; + } + return 0; + } +*/ +#endif + diff --git a/Multiprotocol/Nrf24l01_ne260.ino b/Multiprotocol/Nrf24l01_ne260.ino index 598c15b..85f6ec3 100644 --- a/Multiprotocol/Nrf24l01_ne260.ino +++ b/Multiprotocol/Nrf24l01_ne260.ino @@ -189,9 +189,9 @@ static void ne260_init() { NRF24L01_WriteReg(NRF24L01_07_STATUS, vRX_DR | vTX_DS | vMAX_RT); // reset the IRQ flags } -static void send_data_packet() { +static void send_ne_data_packet() { for(int i = 0; i < 4; i++) { - uint32_t value = (uint32_t)Servo_data[NE_ch[i]] * 0x40 / PPM_MAX + 0x40; + uint32_t value = (uint32_t)map(limit_channel_100(NE_ch[i]),servo_min_100,servo_max_100,0,80); if (value > 0x7f) value = 0x7f; else if(value < 0) @@ -210,7 +210,7 @@ static void send_data_packet() { NRF24L01_WritePayload((uint8_t*) packet, PACKET_NE_LENGTH); } -static void send_bind_packet() { +static void send_ne_bind_packet() { packet[0] = 0xAA; //throttle packet[1] = 0xAA; //rudder packet[2] = 0xAA; //elevator @@ -243,7 +243,7 @@ static uint16_t ne260_cb() { } } NRF24L01_SetTxRxMode(TX_EN); - send_bind_packet(); + send_ne_bind_packet(); state = NE260_BINDRX; return 500; } else if (state == NE260_BINDRX) { @@ -259,7 +259,7 @@ static uint16_t ne260_cb() { else if (state == NE260_DATA1) { neChannel = 10; state = NE260_DATA2; } else if (state == NE260_DATA2) { neChannel = 30; state = NE260_DATA3; } else if (state == NE260_DATA3) { neChannel = 50; state = NE260_DATA1; } - send_data_packet(); + send_ne_data_packet(); return 2500; } diff --git a/Multiprotocol/Nrf24l01_udi.ino b/Multiprotocol/Nrf24l01_udi.ino index a8eac63..de078eb 100644 --- a/Multiprotocol/Nrf24l01_udi.ino +++ b/Multiprotocol/Nrf24l01_udi.ino @@ -112,9 +112,9 @@ static const uint8_t * rf_udi_channels = NULL; static uint8_t packet_udi_ack() { - switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT))) { - case BV(NRF24L01_07_TX_DS): return PKT_ACKED; - case BV(NRF24L01_07_MAX_RT): return PKT_TIMEOUT; + switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT))) { + case _BV(NRF24L01_07_TX_DS): return PKT_ACKED; + case _BV(NRF24L01_07_MAX_RT): return PKT_TIMEOUT; } return PKT_PENDING; } @@ -207,7 +207,7 @@ static void UDI_init2() // Turn radio power on NRF24L01_SetTxRxMode(TX_EN); - uint8_t config = BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP); + uint8_t config = _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP); NRF24L01_WriteReg(NRF24L01_00_CONFIG, config); // Implicit delay in callback // delayMicroseconds(150); @@ -239,15 +239,11 @@ static void add_pkt_checksum() static uint8_t convert_channel(uint8_t num, uint8_t chn_max, uint8_t sign_ofs) { - uint32_t ch = Servo_data[num]; - if (ch < PPM_MIN) { - ch = PPM_MIN; - } else if (ch > PPM_MAX) { - ch = PPM_MAX; - } + uint32_t ch = map(limit_channel_100(num),servo_min_100,servo_max_100,-1000, 1000); + uint32_t chn_val; - if (sign_ofs) chn_val = (((ch * chn_max / PPM_MAX) + sign_ofs) >> 1); - else chn_val = (ch * chn_max / PPM_MAX); + if (sign_ofs) chn_val = (((ch * chn_max / servo_max_100) + sign_ofs) >> 1); + else chn_val = (ch * chn_max / servo_max_100); if (chn_val < 0) chn_val = 0; else if (chn_val > chn_max) chn_val = chn_max; return (uint8_t) chn_val; @@ -260,8 +256,8 @@ static void read_controls(uint8_t* throttle, uint8_t* rudder, uint8_t* elevator, // Protocol is registered AETRG, that is // Aileron is channel 0, Elevator - 1, Throttle - 2, Rudder - 3 // Sometimes due to imperfect calibration or mixer settings - // throttle can be less than PPM_MIN or larger than - // PPM_MAX. As we have no space here, we hard-limit + // throttle can be less than servo_min_100 or larger than + // servo_max_100. As we have no space here, we hard-limit // channels values by min..max range // Channel 3: throttle is 0-100 @@ -277,28 +273,28 @@ static void read_controls(uint8_t* throttle, uint8_t* rudder, uint8_t* elevator, *aileron = convert_channel(AILERON, 0x3f, 0x20); // Channel 5 - if (Servo_data[AUX1] <= 0) *flags &= ~UDI_FLIP360; - else *flags |= UDI_FLIP360; + if (Servo_AUX1) *flags |= UDI_FLIP360; + else *flags &= ~UDI_FLIP360; // Channel 6 - if (Servo_data[AUX2] <= 0) *flags &= ~UDI_FLIP; - else *flags |= UDI_FLIP; + if (Servo_AUX2) *flags |= UDI_FLIP; + else *flags &= ~UDI_FLIP; // Channel 7 - if (Servo_data[AUX3] <= 0) *flags &= ~UDI_CAMERA; - else *flags |= UDI_CAMERA; + if (Servo_AUX3) *flags |= UDI_CAMERA; + else *flags &= ~UDI_CAMERA; // Channel 8 - if (Servo_data[AUX4] <= 0) *flags &= ~UDI_VIDEO; - else *flags |= UDI_VIDEO; + if (Servo_AUX4) *flags |= UDI_VIDEO; + else *flags &= ~UDI_VIDEO; // Channel 9 - if (Servo_data[AUX5] <= 0) *flags &= ~UDI_LIGHTS; - else *flags |= UDI_LIGHTS; + if (Servo_AUX5) *flags |= UDI_LIGHTS; + else *flags &= ~UDI_LIGHTS; // Channel 10 - if (Servo_data[AUX6] <= 0) *flags &= ~UDI_MODE2; - else *flags |= UDI_MODE2; + if (Servo_AUX6) *flags |= UDI_MODE2; + else *flags &= ~UDI_MODE2; } static void send_udi_packet(uint8_t bind) @@ -325,7 +321,7 @@ static void send_udi_packet(uint8_t bind) packet[5] = randoms[1]; packet[6] = randoms[2]; if (sub_protocol == U839_2014) { - packet[7] = (packet_counter < 4) ? 0x3f : 0x04; // first four packets use 0x3f here, then 0x04 + packet[7] = (packet_count < 4) ? 0x3f : 0x04; // first four packets use 0x3f here, then 0x04 } } else if (bind == 2) { // Bind phase 2 @@ -374,7 +370,7 @@ static void send_udi_packet(uint8_t bind) uint8_t status = NRF24L01_ReadReg(NRF24L01_07_STATUS); NRF24L01_WriteReg(NRF24L01_07_STATUS,status); - if (packet_sent && bind && (status & BV(NRF24L01_07_TX_DS))) { + if (packet_sent && bind && (status & _BV(NRF24L01_07_TX_DS))) { bind_step_success = 1; } @@ -396,7 +392,7 @@ static void send_udi_packet(uint8_t bind) } NRF24L01_FlushTx(); NRF24L01_WritePayload(packet, payload_size); - ++packet_counter; + ++packet_count; packet_sent = 1; } @@ -433,7 +429,7 @@ static uint16_t UDI_callback() { break; case UDI_BIND1_RX: // Check if data has been received - if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR) ) { + if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR) ) { uint8_t data[UDI_PAYLOADSIZE]; NRF24L01_ReadPayload(data, payload_size); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x4E); // On original TX this is done on LAST packet check only ! @@ -514,7 +510,7 @@ static uint16_t UDI_callback() { case UDI_BIND2_RX: // Check if data has been received - if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR) ) { + if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR) ) { uint8_t data[UDI_PAYLOADSIZE]; NRF24L01_ReadPayload(data, payload_size); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x4E); @@ -570,7 +566,7 @@ static uint16_t UDI_callback() { static uint16_t UDI_setup() { - packet_counter = 0; + packet_count = 0; UDI_init(); phase = UDI_INIT2; diff --git a/Multiprotocol/README.md b/Multiprotocol/README.md new file mode 100644 index 0000000..037ea5f --- /dev/null +++ b/Multiprotocol/README.md @@ -0,0 +1,230 @@ +# DIY-Multiprotocol-TX-Module + +![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/t7952733-114-thumb-P4100002.JPG?d=1433910155) ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/t7952734-189-thumb-P4100003.JPG?d=1433910159) + +Fork du projet https://github.com/pascallanger/DIY-Multiprotocol-TX-Module + +Afin d'ajouter : +- Un rebind hardware en PPM +- La radio TARANIS (TAERB, B = rebind ;-) ) et redéclaration des radios + + + +Programme des évolutions : +- Ajout du futur protocole INAV + + +#Schematic +![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/a8443844-119-multiprotocol_diagram_rotary_serial_2.jpg) + +Notes: +- Attention: All modules are 3.3V only, never power them with 5V. + + +#Protocoles ajoutés mais non testés (Issue de Deviation) +##Other +###OPENLRS +Empty protocol + +##CYRF6936 RF Module +###J6PRO +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 +---|---|---|---|---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 + +###WK2x01 +Autobind + +####Sub_protocol WK2401 +CH1|CH2|CH3|CH4 +---|---|---|--- +CH1|CH2|CH3|CH4 + + +####Sub_protocol WK2601 +Option: + + 0 = 5+1 + 2 = 6+1 + ..1 = Hélicoptère (. = autres options pour ce mode) + .01 = Hélicoptère normal + .11 = Hélicoptère avec pit inversé + 0.1 = Pitch curve -100 + 1.1 = Pitch curve 100 + +CH1|CH2|CH3|CH4|CH5|CH6|CH7 +---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|???|CONF|Gyro & Rudder mix + +CONF: Option 1 = Rate Throtle + + Option 2 = Pitch + + +####Sub_protocol WK2801 +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 + + +##A7105 RF Module +###Flysky AFHDS2A +Telemetry enabled for battery voltage and TX RSSI +Option= 0-PWM_IBUS 1-PPM_IBUS 2-PWM_SBUS 3-PPM_SBUS + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +T|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|Failsave T + +###HUBSAN +Models: Hubsan H102D, H107/L/C/D and Hubsan H107P/C+/D+ + +Autobind protocol + +Telemetry enabled for battery voltage and TX RSSI + +Option=vTX frequency (H107D) 5645 - 5900 MHz + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS +####Sub_protocol H301 +CH5|CH6|CH7|CH8 +---|---|---|--- +LED|STAB|RTH|VIDEO + +####Sub_protocol H501 +CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 +---|---|---|---|---|---|---|---|---|---|---|--- +FLIP|LIGHT|RTH|VIDEO|HEADLESS|GPS_HOLD|ALT_HOLD|SNAPSHOT + +###Joysway +CH1|CH2|CH3|CH4 +---|---|---|--- +A|E|T|R + +##CC2500 RF Module +###SKYARTEC +CH1|CH2|CH3|CH4|CH5|CH6|CH7 +---|---|---|---|---|---|--- + ? | ? | ? | ? | ? | ? | ? + +##NRF24L01 RF Module +###BLUEFLY +Autobind + +CH1|CH2|CH3|CH4|CH5|CH6 +---|---|---|---|---|--- +A|E|T|R|GEAR|PITCH + +###CFLIE +Modele: CrazyFlie Nano quad + +Autobind + +CH1|CH2|CH3|CH4 +---|---|---|--- +A|E|T|R + +###ESKY150 + +Autobind + +CH1|CH2|CH3|CH4 +---|---|---|--- +A|E|T|R + +###FBL100 +Autobind + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- + ? | ? | ? | ? | ? | ? | ? | ? + +####Sub_protocol HP100 +Same channels assignement as above. + +###Fy326 +Autobind + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|HEADLESS|RTH|Calibrate|Expert + +####Sub_protocol FY319 +Same channels assignement as above. + +###H377 +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +A|E|T|R|CH5|CH6|CH7|CH8 + +###HM830 +Modele: HM Hobby HM830 RC Paper Airplane + +Autobind + +CH1|CH2|CH3|CH4|CH5 +---|---|---|--- +A|Turbo|T|Trim|Bouton + +###HONTAI +Autobind protocol + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|---|---|---|----|---- +A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|CAL + +####Sub_protocol HONTAI +####Sub_protocol JJRCX1 +CH6| +---| +ARM| + +####Sub_protocol X5C1 +X5C1 clone +CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|----|---- +FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|CAL +####Sub_protocol FQ777 +Format FQ777-951C + +CH6|CH7|CH8|CH9 +---|---|---|--- +FLIP|SNAPSHOT|VIDEO|HEADLESS + +###INAV +En cours de passage + +###NE260 +Modele: Nine Eagles SoloPro + +Autobind + +CH1|CH2|CH3|CH4 +---|---|---|--- +A|E|T|R + +###UDI +Modele: Known UDI 2.4GHz protocol variants, all using BK2421 +* UDI U819 coaxial 3ch helicoper +* UDI U816/817/818 quadcopters + - "V1" with orange LED on TX, U816 RX labeled '' , U817/U818 RX labeled 'UD-U817B' + - "V2" with red LEDs on TX, U816 RX labeled '', U817/U818 RX labeled 'UD-U817OG' + - "V3" with green LEDs on TX. Did not get my hands on yet. +* U830 mini quadcopter with tilt steering ("Protocol 2014") +* U839 nano quadcopter ("Protocol 2014") + +Autobind + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 +---|---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP 360|FLIP|VIDEO|LED|MODE 2 + +####Sub_protocol U816_V1 (orange) +####Sub_protocol U816_V2 (red) +####Sub_protocol U839_2014 +Same channels assignement as above. + + +###D'autres à venir \ No newline at end of file diff --git a/Multiprotocol/SHENQI_nrf24l01.ino b/Multiprotocol/SHENQI_nrf24l01.ino index b8ab94b..2ffc2fc 100644 --- a/Multiprotocol/SHENQI_nrf24l01.ino +++ b/Multiprotocol/SHENQI_nrf24l01.ino @@ -1,5 +1,3 @@ -<<<<<<< HEAD -======= /* 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 @@ -15,7 +13,6 @@ along with Multiprotocol. If not, see . */ ->>>>>>> refs/remotes/pascallanger/master #if defined(SHENQI_NRF24L01_INO) #include "iface_nrf24l01.h" @@ -42,17 +39,10 @@ void SHENQI_init() NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5 bytes rx/tx address -<<<<<<< HEAD - LT8910_Config(4, 8, _BV(LT8910_CRC_ON)|_BV(LT8910_PACKET_LENGTH_EN), 0xAA); - LT8910_SetChannel(2); - LT8910_SetAddress((uint8_t *)"\x9A\x9A\x9A\x9A",4); - LT8910_SetTxRxMode(RX_EN); -======= LT8900_Config(4, 8, _BV(LT8900_CRC_ON)|_BV(LT8900_PACKET_LENGTH_EN), 0xAA); LT8900_SetChannel(2); LT8900_SetAddress((uint8_t *)"\x9A\x9A\x9A\x9A",4); LT8900_SetTxRxMode(RX_EN); ->>>>>>> refs/remotes/pascallanger/master } void SHENQI_send_packet() @@ -61,16 +51,6 @@ void SHENQI_send_packet() if(packet_count==0) { uint8_t bind_addr[4]; -<<<<<<< HEAD - bind_addr[0]=0x9A; - bind_addr[1]=0x9A; - bind_addr[2]=rx_tx_addr[2]; - bind_addr[3]=rx_tx_addr[3]; - LT8910_SetAddress(bind_addr,4); - LT8910_SetChannel(2); - packet[1]=rx_tx_addr[1]; - packet[2]=rx_tx_addr[0]; -======= bind_addr[0]=rx_tx_addr[0]; bind_addr[1]=rx_tx_addr[1]; bind_addr[2]=0x9A; @@ -79,39 +59,24 @@ void SHENQI_send_packet() LT8900_SetChannel(2); packet[1]=rx_tx_addr[2]; packet[2]=rx_tx_addr[3]; ->>>>>>> refs/remotes/pascallanger/master packet_period=2508; } else { -<<<<<<< HEAD - LT8910_SetAddress(rx_tx_addr,4); - packet[1]=255-convert_channel_8b(RUDDER); - packet[2]=255-convert_channel_8b_scale(THROTTLE,0x60,0xA0); - uint8_t freq=pgm_read_byte_near(&SHENQI_Freq[hopping_frequency_no])+(rx_tx_addr[1]&0x0F); - LT8910_SetChannel(freq); -======= LT8900_SetAddress(rx_tx_addr,4); packet[1]=255-convert_channel_8b(RUDDER); packet[2]=255-convert_channel_8b_scale(THROTTLE,0x60,0xA0); uint8_t freq=pgm_read_byte_near(&SHENQI_Freq[hopping_frequency_no])+(rx_tx_addr[2]&0x0F); LT8900_SetChannel(freq); ->>>>>>> refs/remotes/pascallanger/master hopping_frequency_no++; if(hopping_frequency_no==60) hopping_frequency_no=0; packet_period=1750; } // Send packet + 1 retransmit - not sure why but needed (not present on original TX...) -<<<<<<< HEAD - LT8910_WritePayload(packet,3); - while(NRF24L01_packet_ack()!=PKT_ACKED); - LT8910_WritePayload(packet,3); -======= LT8900_WritePayload(packet,3); while(NRF24L01_packet_ack()!=PKT_ACKED); LT8900_WritePayload(packet,3); ->>>>>>> refs/remotes/pascallanger/master packet_count++; if(packet_count==7) @@ -129,16 +94,6 @@ uint16_t SHENQI_callback() SHENQI_send_packet(); else { -<<<<<<< HEAD - if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) - { - if(LT8910_ReadPayload(packet, 3)) - { - BIND_DONE; - rx_tx_addr[3]=packet[1]; - rx_tx_addr[2]=packet[2]; - LT8910_SetTxRxMode(TX_EN); -======= if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) { if(LT8900_ReadPayload(packet, 3)) @@ -147,7 +102,6 @@ uint16_t SHENQI_callback() rx_tx_addr[0]=packet[1]; rx_tx_addr[1]=packet[2]; LT8900_SetTxRxMode(TX_EN); ->>>>>>> refs/remotes/pascallanger/master packet_period=14000; } NRF24L01_FlushRx(); @@ -162,11 +116,7 @@ uint16_t initSHENQI() SHENQI_init(); hopping_frequency_no = 0; packet_count=0; -<<<<<<< HEAD - packet_period=100; -======= packet_period=500; ->>>>>>> refs/remotes/pascallanger/master return 1000; } diff --git a/Multiprotocol/TX_Def.h b/Multiprotocol/TX_Def.h index 08e131a..66193d0 100644 --- a/Multiprotocol/TX_Def.h +++ b/Multiprotocol/TX_Def.h @@ -22,6 +22,16 @@ #define PPM_MIN_125 1000 // 125% #endif +// TAARANIS PPM and channels +#if defined(TX_TARANIS) + #define PPM_MAX_100 1900 // 100% + #define PPM_MIN_100 1100 // 100% + #define PPM_MAX_125 2000 // 125% + #define PPM_MIN_125 1000 // 125% + + #define INVERT_TELEMETRY +#endif + // HISKY #if defined(TX_HISKY) #define PPM_MAX_100 1900 // 100% @@ -37,7 +47,6 @@ #define PPM_MAX_125 2050 // 125% #define PPM_MIN_125 1150 // 125% #endif - //Serial MIN MAX values #define SERIAL_MAX_100 2012 // 100% #define SERIAL_MIN_100 988 // 100% diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index ad5e419..af368ad 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -1,178 +1,3 @@ -<<<<<<< HEAD -//************************************* -// FrSky Telemetry serial code * -// By Midelic on RCGroups * -//************************************* - -#if defined TELEMETRY - #if defined FRSKYX_CC2500_INO - #define SPORT_TELEMETRY - #endif - #if defined FRSKY_CC2500_INO - #define HUB_TELEMETRY - #endif - #if defined SPORT_TELEMETRY - #define SPORT_TELEMETRY - #define SPORT_TIME 12000 - uint32_t last=0; - uint8_t sport_counter=0; - uint8_t RxBt=0; - uint8_t rssi; - uint8_t ADC2; - #endif - #if defined HUB_TELEMETRY - #define MAX_PKTX 10 - uint8_t pktx[MAX_PKTX]; - uint8_t index; - uint8_t prev_index; - uint8_t pass = 0; - #endif - #define USER_MAX_BYTES 6 - uint8_t frame[18]; - - void frskySendStuffed() - { - Serial_write(0x7E); - for (uint8_t i = 0; i < 9; i++) - { - if ((frame[i] == 0x7e) || (frame[i] == 0x7d)) - { - Serial_write(0x7D); - frame[i] ^= 0x20; - } - Serial_write(frame[i]); - } - Serial_write(0x7E); - } - - void compute_RSSIdbm(){ - - RSSI_dBm = (((uint16_t)(pktt[len-2])*18)>>5); - if(pktt[len-2] >=128) - RSSI_dBm -= 82; - else - RSSI_dBm += 65; - } - - void frsky_check_telemetry(uint8_t *pkt,uint8_t len) - { - if(pkt[1] != rx_tx_addr[3] || pkt[2] != rx_tx_addr[2] || len != pkt[0] + 3) - {//only packets with the required id and packet length - for(uint8_t i=3;i<6;i++) - pktt[i]=0; - return; - } - else - { - for (uint8_t i=3;i0) - telemetry_counter=(telemetry_counter+1)%32; - } - } - - void frsky_link_frame() - { - frame[0] = 0xFE; - if ((cur_protocol[0]&0x1F)==MODE_FRSKY) - { - compute_RSSIdbm(); - frame[1] = pktt[3]; - frame[2] = pktt[4]; - frame[3] = (uint8_t)RSSI_dBm; - frame[4] = pktt[5]*2; - } - else - if ((cur_protocol[0]&0x1F)==MODE_HUBSAN) - { - frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V - frame[2] = frame[1]; - frame[3] = 0x00; - frame[4] = (uint8_t)RSSI_dBm; - } - frame[5] = frame[6] = frame[7] = frame[8] = 0; - frskySendStuffed(); - } - - #if defined HUB_TELEMETRY - void frsky_user_frame() - { - uint8_t indexx = 0, c=0, j=8, n=0, i; - - if(pktt[6]>0 && pktt[6]<=MAX_PKTX) - {//only valid hub frames - frame[0] = 0xFD; - frame[1] = 0; - frame[2] = pktt[7]; - - switch(pass) - { - case 0: - indexx=pktt[6]; - for(i=0;i>>>>>> refs/remotes/pascallanger/master 7E 98 10 05 F1 20 23 0F 00 A6 SWR_ID 7E 98 10 01 F1 33 00 00 00 C9 RSSI_ID 7E 98 10 04 F1 58 00 00 00 A1 BATT_ID @@ -417,24 +242,15 @@ pkt[6]|(counter++)|00 01 02 03 04 05 06 07 08 09 7E BA 10 03 F1 E2 00 00 00 18 ADC2_ID -<<<<<<< HEAD - Telemetry frames(RF) SPORT info 15 bytes - SPORT frame 6+3 bytes -======= Telemetry frames(RF) SPORT info 15 bytes payload SPORT frame valid 6+3 bytes ->>>>>>> refs/remotes/pascallanger/master [00] PKLEN 0E 0E 0E 0E [01] TXID1 DD DD DD DD [02] TXID2 6D 6D 6D 6D [03] CONST 02 02 02 02 [04] RS/RB 2C D0 2C CE //D0;CE=2*RSSI;....2C = RX battery voltage(5V from Bec) -<<<<<<< HEAD - [05] ????? 03 10 21 32 //TX/RX telemetry hand-shake bytes -======= [05] HD-SK 03 10 21 32 //TX/RX telemetry hand-shake bytes ->>>>>>> refs/remotes/pascallanger/master [06] NO.BT 00 00 06 03 //No.of valid SPORT frame bytes in the frame [07] STRM1 00 00 7E 00 [08] STRM2 00 00 1A 00 @@ -442,146 +258,6 @@ pkt[6]|(counter++)|00 01 02 03 04 05 06 07 08 09 [10] STRM4 03 03 03 03 [11] STRM5 F1 F1 F1 F1 [12] STRM6 D1 D1 D0 D0 -<<<<<<< HEAD - [13] CHKSUM1 - [14] CHKSUM2 - */ - - - void sportSend(uint8_t *p) - { - uint16_t crc_s = 0; - Serial_write(0x7e);//+9 - for (uint8_t i = 0; i < 9; i++) - { - if (i == 8) - p[i] = 0xff - crc_s; - if ((p[i] == 0x7e) || (p[i] == 0x7d)) - { - Serial_write(0x7d); - Serial_write(0x20 ^ p[i]); - } - else - Serial_write(p[i]); - if (i>0) - { - crc_s += p[i]; //0-1FF - crc_s += crc_s >> 8; //0-100 - crc_s &= 0x00ff; - } - } - } - - void sportIdle() - { - Serial_write(0x7e); - } - - void sportSendFrame() - { - //at the moment only SWR RSSI,RxBt and A2. - sport_counter = (sport_counter + 1) %9; - - for (uint8_t i=5;i<8;i++) - frame[i]=0; - - switch (sport_counter) - { - case 0: // SWR - frame[0] = 0x98; - frame[1] = 0x10; - frame[2] = 0x05; - frame[3] = 0xf1; - frame[4] = 0x20;//dummy values if swr 20230f00 - frame[5] = 0x23; - frame[6] = 0x0F; - frame[7] = 0x00; - break; - case 1: // RSSI - frame[0] = 0x98; - frame[1] = 0x10; - frame[2] = 0x01; - frame[3] = 0xf1; - frame[4] = rssi; - break; - case 2: //BATT - frame[0] = 0x98; - frame[1] = 0x10; - frame[2] = 0x04; - frame[3] = 0xf1; - frame[4] = RxBt;//a1; - break; - case 3: //ADC2(A2) - frame[0] = 0x1A; - frame[1] = 0x10; - frame[2] = 0x03; - frame[3] = 0xf1; - frame[4] = ADC2;//a2;; - break; - default: - sportIdle(); - return; - } - sportSend(frame); - } - - void process_sport_data()//only for ADC2 - { - uint8_t j=7; - if(pktt[6]>0 && pktt[6]<=USER_MAX_BYTES) - { - for(uint8_t i=0;i<6;i++) - if(pktt[j++]==0x03) - if(pktt[j]==0xF1) - { - ADC2=pktt[j+1]; - break; - } - pktt[6]=0;//new frame - } - } - #endif - - - void frskyUpdate() - { - if(telemetry_link && (cur_protocol[0]&0x1F) != MODE_FRSKYX ) - { - frsky_link_frame(); - telemetry_link=0; - return; - } - #if defined HUB_TELEMETRY - if(!telemetry_link && (cur_protocol[0]&0x1F) != MODE_HUBSAN && (cur_protocol[0]&0x1F) != MODE_FRSKYX) - { - frsky_user_frame(); - return; - } - #endif - #if defined SPORT_TELEMETRY - if ((cur_protocol[0]&0x1F)==MODE_FRSKYX) - { - if(telemetry_link) - { - process_sport_data(); - if(pktt[4]>0x36) - rssi=pktt[4]/2; - else - RxBt=pktt[4]; - telemetry_link=0; - } - uint32_t now = micros(); - if ((now - last) > SPORT_TIME) - { - sportSendFrame(); - last = now; - } - } - #endif - } - -#endif -======= [13] CHKSUM1 --|2 CRC bytes sent by RX (calculated on RX side crc16/table) [14] CHKSUM2 --| +2 appended bytes automatically RSSI and LQI/CRC bytes(len=0x0E+3); @@ -732,92 +408,92 @@ void proces_sport_data(uint8_t data) void TelemetryUpdate() { -#if defined SPORT_TELEMETRY - if (protocol==MODE_FRSKYX) - { // FrSkyX - if(telemetry_link) - { - if(pktt[4] & 0x80) - rssi=pktt[4] & 0x7F ; - else - RxBt = (pktt[4]<<1) + 1 ; - for (uint8_t i=0; i < pktt[6]; i++) - proces_sport_data(pktt[7+i]); - telemetry_link=0; + #if defined SPORT_TELEMETRY + if (protocol==MODE_FRSKYX) + { // FrSkyX + if(telemetry_link) + { + if(pktt[4] & 0x80) + rssi=pktt[4] & 0x7F ; + else + RxBt = (pktt[4]<<1) + 1 ; + for (uint8_t i=0; i < pktt[6]; i++) + proces_sport_data(pktt[7+i]); + telemetry_link=0; + } } - } -#endif + #endif // check for space in tx buffer -#ifdef BASH_SERIAL - uint8_t h ; - uint8_t t ; - h = SerialControl.head ; - t = SerialControl.tail ; - if ( h >= t ) - { - t += 64 - h ; - } - else - { - t -= h ; - } - if ( t < 32 ) - { - return ; - } + #ifdef BASH_SERIAL + uint8_t h ; + uint8_t t ; + h = SerialControl.head ; + t = SerialControl.tail ; + if ( h >= t ) + { + t += 64 - h ; + } + else + { + t -= h ; + } + if ( t < 32 ) + { + return ; + } -#else - uint8_t h ; - uint8_t t ; - h = tx_head ; - t = tx_tail ; - if ( h >= t ) - { - t += TXBUFFER_SIZE - h ; - } - else - { - t -= h ; - } - if ( t < 16 ) - { - return ; - } -#endif + #else + uint8_t h ; + uint8_t t ; + h = tx_head ; + t = tx_tail ; + if ( h >= t ) + { + t += TXBUFFER_SIZE - h ; + } + else + { + t -= h ; + } + if ( t < 16 ) + { + return ; + } + #endif #if defined DSM_TELEMETRY - if(telemetry_link && protocol == MODE_DSM ) - { // DSM - DSM_frame(); - telemetry_link=0; - return; - } + if(telemetry_link && protocol == MODE_DSM ) + { // DSM + DSM_frame(); + telemetry_link=0; + return; + } #endif if(telemetry_link && protocol != MODE_FRSKYX ) - { // FrSky + Hubsan + { // FrSky + Hubsan + Flysky AFHDS2A frsky_link_frame(); telemetry_link=0; return; } #if defined HUB_TELEMETRY - if(!telemetry_link && protocol == MODE_FRSKYD) - { // FrSky - frsky_user_frame(); - return; - } + if(!telemetry_link && protocol == MODE_FRSKYD) + { // FrSky + frsky_user_frame(); + return; + } #endif #if defined SPORT_TELEMETRY - if (protocol==MODE_FRSKYX) - { // FrSkyX - uint32_t now = micros(); - if ((now - last) > SPORT_TIME) - { - sportSendFrame(); - last += SPORT_TIME ; + if (protocol==MODE_FRSKYX) + { // FrSkyX + uint32_t now = micros(); + if ((now - last) > SPORT_TIME) + { + sportSendFrame(); + last += SPORT_TIME ; + } } - } #endif } @@ -846,19 +522,19 @@ void initTXSerial( uint8_t speed) #ifdef ENABLE_PPM if(speed==SPEED_9600) { // 9600 - #ifdef XMEGA - USARTC0.BAUDCTRLA = 207 ; - USARTC0.BAUDCTRLB = 0 ; - USARTC0.CTRLB = 0x18 ; - USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; - USARTC0.CTRLC = 0x03 ; - #else - //9600 bauds - UBRR0H = 0x00; - UBRR0L = 0x67; - UCSR0A = 0 ; // Clear X2 bit - //Set frame format to 8 data bits, none, 1 stop bit - UCSR0C = (1<>= 7 ; // Top bit if ( SerialControl.speed == SPEED_100K ) { - #ifdef INVERT_SERIAL - byteLo |= 0x02 ; // Parity bit - #else - byteLo |= 0xFC ; // Stop bits - #endif - // calc parity +#ifdef INVERT_SERIAL + byteLo |= 0x02 ; // Parity bit +#else + byteLo |= 0xFC ; // Stop bits +#endif + // calc parity temp = byte ; temp >>= 4 ; temp = byte ^ temp ; @@ -975,21 +651,21 @@ void Serial_write( uint8_t byte ) temp1 <<= 1 ; temp ^= temp1 ; temp &= 0x02 ; - #ifdef INVERT_SERIAL - byteLo ^= temp ; - #else - byteLo |= temp ; - #endif +#ifdef INVERT_SERIAL + byteLo ^= temp ; +#else + byteLo |= temp ; +#endif } else { byteLo |= 0xFE ; // Stop bit } byte <<= 1 ; - #ifdef INVERT_SERIAL - byte |= 1 ; // Start bit - #endif - uint8_t next = (SerialControl.head + 2) & 0x3f ; +#ifdef INVERT_SERIAL + byte |= 1 ; // Start bit +#endif + uint8_t next = (SerialControl.head + 2) & 0x3f ; if ( next != SerialControl.tail ) { SerialControl.data[SerialControl.head] = byte ; @@ -1007,11 +683,11 @@ void resumeBashSerial() { sei() ; // Start the transmission here - #ifdef INVERT_SERIAL - GPIOR2 = 0 ; - #else - GPIOR2 = 0x01 ; - #endif +#ifdef INVERT_SERIAL + GPIOR2 = 0 ; +#else + GPIOR2 = 0x01 ; +#endif if ( SerialControl.speed == SPEED_100K ) { GPIOR1 = 1 ; @@ -1149,4 +825,4 @@ ISR(TIMER0_OVF_vect) #endif // BASH_SERIAL #endif // TELEMETRY ->>>>>>> refs/remotes/pascallanger/master + diff --git a/Multiprotocol/YD717_nrf24l01.ino b/Multiprotocol/YD717_nrf24l01.ino index e3a3756..4e6a634 100644 --- a/Multiprotocol/YD717_nrf24l01.ino +++ b/Multiprotocol/YD717_nrf24l01.ino @@ -34,16 +34,6 @@ #define YD717_PAYLOADSIZE 8 // receive data pipes set to this size, but unused -<<<<<<< HEAD -enum { - YD717_INIT1 = 0, - YD717_BIND2, - YD717_BIND3, - YD717_DATA -}; - -======= ->>>>>>> refs/remotes/pascallanger/master static void __attribute__((unused)) yd717_send_packet(uint8_t bind) { uint8_t rudder_trim, elevator_trim, aileron_trim; @@ -149,11 +139,6 @@ static void __attribute__((unused)) yd717_init() NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x07); // Set feature bits on NRF24L01_Activate(0x73); -<<<<<<< HEAD -static void __attribute__((unused)) YD717_init1() -{ -======= ->>>>>>> refs/remotes/pascallanger/master // for bind packets set address to prearranged value known to receiver uint8_t bind_rx_tx_addr[] = {0x65, 0x65, 0x65, 0x65, 0x65}; @@ -168,16 +153,6 @@ static void __attribute__((unused)) YD717_init1() NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, bind_rx_tx_addr, 5); } -<<<<<<< HEAD -static void __attribute__((unused)) YD717_init2() -{ - // set rx/tx address for data phase - NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, 5); - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 5); -} - -======= ->>>>>>> refs/remotes/pascallanger/master uint16_t yd717_callback() { if(IS_BIND_DONE_on) diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 17c740a..556eea7 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -13,85 +13,6 @@ along with Multiprotocol. If not, see . */ -<<<<<<< HEAD -/** Multiprotocol module configuration file ***/ - -//Uncomment your TX type -#define TARANIS //TARANIS TAER (1100<->1900µs) -//#define TX_ER9X //ER9X AETR (988<->2012µs) -//#define TX_DEVO7 //DEVO7 EATR (1120<->1920µs) -//#define TX_SPEKTRUM //Spektrum TAER (1100<->1900µs) -//#define TX_HISKY //HISKY AETR (1100<->1900µs) - -//Uncomment to enable telemetry -#define TELEMETRY - -//Comment if a module is not installed -#define A7105_INSTALLED -#define CYRF6936_INSTALLED -//#define CC2500_INSTALLED -#define NFR24L01_INSTALLED - -//Comment a protocol to exclude it from compilation -#ifdef A7105_INSTALLED - #define JOYSWAY_A7105_INO - - #define FLYSKY_A7105_INO - #define HUBSAN_A7105_INO -#endif -#ifdef CYRF6936_INSTALLED - #define J6PRO_CYRF6936_INO - #define WK2x01_CYRF6936_INO - - #define DEVO_CYRF6936_INO - #define DSM2_CYRF6936_INO -#endif -#ifdef CC2500_INSTALLED - #define SKYARTEC_CC2500_INO - - #define FRSKY_CC2500_INO - #define FRSKYX_CC2500_INO -#endif -#ifdef NFR24L01_INSTALLED - #define HM830_NRF24L01_INO - #define CFlie_NRF24L01_INO - #define H377_NRF24L01_INO - #define ESKY150_NRF24L01_INO - #define HonTai_NRF24L01_INO - #define UDI_NRF24L01_INO - #define NE260_NRF24L01_INO - #define BlueFly_NRF24L01_INO //probleme gene id - #define FBL100_NRF24L01_INO // finir id - - #define BAYANG_NRF24L01_INO - #define CG023_NRF24L01_INO - #define CX10_NRF24L01_INO - #define ESKY_NRF24L01_INO - #define HISKY_NRF24L01_INO - #define KN_NRF24L01_INO - #define SLT_NRF24L01_INO - #define SYMAX_NRF24L01_INO - #define V2X2_NRF24L01_INO - #define YD717_NRF24L01_INO - #define MT99XX_NRF24L01_INO - #define MJXQ_NRF24L01_INO - #define SHENQI_NRF24L01_INO - #define FY326_NRF24L01_INO -#endif - -//Update this table to set which protocol and all associated settings are called for the corresponding dial number -const PPM_Parameters PPM_prot[15]= { -// Dial Protocol Sub protocol RX_Num Power Auto Bind Option -/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , AUTOBIND , 0 }, -/* 2 */ {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 3 */ {MODE_FRSKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 0xD7 }, // D7 fine tuning -/* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 6 */ {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // 6 channels @ 11ms -/* 7 */ {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 9 */ {MODE_KN , FEILUN , 0 , P_HIGH , AUTOBIND , 0 }, -======= /**********************************************/ /** Multiprotocol module configuration file ***/ /**********************************************/ @@ -102,7 +23,7 @@ const PPM_Parameters PPM_prot[15]= { //Modify the channel order based on your TX: AETR, TAER, RETA... //Examples: Flysky & DEVO is AETR, JR/Spektrum radio is TAER, Multiplex is AERT... //Default is AETR. -#define AETR +#define EATR /**************************/ @@ -112,10 +33,10 @@ const PPM_Parameters PPM_prot[15]= { //If a chip is not installed all associated protocols are disabled. //4-in-1 modules have all RF chips installed //!!!If a RF chip is present it MUST be marked as installed!!! or weird things will happen you have been warned. -#define A7105_INSTALLED -#define CYRF6936_INSTALLED -#define CC2500_INSTALLED -#define NRF24L01_INSTALLED + #define A7105_INSTALLED + #define CYRF6936_INSTALLED +// #define CC2500_INSTALLED + #define NRF24L01_INSTALLED /****************************/ @@ -126,39 +47,55 @@ const PPM_Parameters PPM_prot[15]= { //Comment the protocols you are not using with "//" to save Flash space. //The protocols below need an A7105 to be installed -#define FLYSKY_A7105_INO -#define HUBSAN_A7105_INO + #define AFHDS2A_A7105_INO +// #define JOYSWAY_A7105_INO + #define FLYSKY_A7105_INO + #define HUBSAN_A7105_INO //The protocols below need a CYRF6936 to be installed -#define DEVO_CYRF6936_INO -#define DSM_CYRF6936_INO -#define J6PRO_CYRF6936_INO +// #define WK2x01_CYRF6936_INO //!\\ //pb voie + + #define DEVO_CYRF6936_INO + #define DSM_CYRF6936_INO +// #define J6PRO_CYRF6936_INO //The protocols below need a CC2500 to be installed -#define FRSKYD_CC2500_INO -#define FRSKYV_CC2500_INO -#define FRSKYX_CC2500_INO -#define SFHSS_CC2500_INO + #define SKYARTEC_CC2500_INO + + #define FRSKYD_CC2500_INO + #define FRSKYV_CC2500_INO + #define FRSKYX_CC2500_INO + #define SFHSS_CC2500_INO //The protocols below need a NRF24L01 to be installed -#define BAYANG_NRF24L01_INO -#define CG023_NRF24L01_INO -#define CX10_NRF24L01_INO -#define ESKY_NRF24L01_INO -#define HISKY_NRF24L01_INO -#define KN_NRF24L01_INO -#define SLT_NRF24L01_INO -#define SYMAX_NRF24L01_INO -#define V2X2_NRF24L01_INO -#define YD717_NRF24L01_INO -#define MT99XX_NRF24L01_INO -#define MJXQ_NRF24L01_INO -#define SHENQI_NRF24L01_INO -#define FY326_NRF24L01_INO -#define FQ777_NRF24L01_INO -#define ASSAN_NRF24L01_INO -#define HONTAI_NRF24L01_INO - + #define HM830_NRF24L01_INO +// #define CFlie_NRF24L01_INO //!\\ //pb voie gaz +// #define H377_NRF24L01_INO +// #define ESKY150_NRF24L01_INO +// #define HonTai_NRF24L01_INO +// #define UDI_NRF24L01_INO +// #define NE260_NRF24L01_INO +// #define BlueFly_NRF24L01_INO //probleme gene id +// #define FBL100_NRF24L01_INO // finir id //!\\ //pb voie ??? + #define INAV_NRF24L01_INO + + #define BAYANG_NRF24L01_INO + #define CG023_NRF24L01_INO + #define CX10_NRF24L01_INO + #define ESKY_NRF24L01_INO +// #define HISKY_NRF24L01_INO + #define KN_NRF24L01_INO + #define SLT_NRF24L01_INO + #define SYMAX_NRF24L01_INO + #define V2X2_NRF24L01_INO + #define YD717_NRF24L01_INO +// #define MT99XX_NRF24L01_INO +// #define MJXQ_NRF24L01_INO +// #define SHENQI_NRF24L01_INO +// #define FY326_NRF24L01_INO +// #define FQ777_NRF24L01_INO +// #define ASSAN_NRF24L01_INO +// #define HONTAI_NRF24L01_INO /**************************/ /*** TELEMETRY SETTINGS ***/ @@ -173,9 +110,9 @@ const PPM_Parameters PPM_prot[15]= { //#define INVERT_TELEMETRY //Comment a line to disable a protocol telemetry -#define DSM_TELEMETRY -#define SPORT_TELEMETRY -#define HUB_TELEMETRY + #define DSM_TELEMETRY + #define SPORT_TELEMETRY + #define HUB_TELEMETRY /****************************/ @@ -200,7 +137,8 @@ const PPM_Parameters PPM_prot[15]= { //It is important for the module to know the endpoints of your radio. //Below are some standard transmitters already preconfigured. //Uncomment only the one which matches your transmitter. -#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs) +//#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs) +#define TX_TARANIS //TARANIS TAER (1100<->1900µs) //#define TX_DEVO7 //DEVO (1120<->1920µs) //#define TX_SPEKTRUM //Spektrum (1100<->1900µs) //#define TX_HISKY //HISKY (1100<->1900µs) @@ -225,7 +163,7 @@ const PPM_Parameters PPM_prot[15]= { //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]= { // Dial Protocol Sub protocol RX_Num Power Auto Bind Option -/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , AUTOBIND , 0 }, /* 2 */ {MODE_HUBSAN, 0 , 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 }, @@ -234,7 +172,6 @@ const PPM_Parameters PPM_prot[15]= { /* 7 */ {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, ->>>>>>> refs/remotes/pascallanger/master /* 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 }, @@ -242,11 +179,7 @@ const PPM_Parameters PPM_prot[15]= { /* 14 */ {MODE_BAYANG, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 15 */ {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } }; -<<<<<<< HEAD -/* Available protocols and associated sub protocols: -======= /* Available protocols and associated sub protocols to pick and choose from ->>>>>>> refs/remotes/pascallanger/master MODE_FLYSKY Flysky V9X9 @@ -254,28 +187,18 @@ const PPM_Parameters PPM_prot[15]= { V912 MODE_HUBSAN NONE -<<<<<<< HEAD - MODE_FRSKY -======= MODE_FRSKYD ->>>>>>> refs/remotes/pascallanger/master NONE MODE_HISKY Hisky HK310 MODE_V2X2 NONE -<<<<<<< HEAD - MODE_DSM2 - DSM2 - DSMX -======= MODE_DSM DSM2_22 DSM2_11 DSMX_22 DSMX_11 ->>>>>>> refs/remotes/pascallanger/master MODE_DEVO NONE MODE_YD717 @@ -308,142 +231,26 @@ const PPM_Parameters PPM_prot[15]= { MODE_BAYANG NONE MODE_FRSKYX -<<<<<<< HEAD - NONE -======= CH_16 CH_8 ->>>>>>> refs/remotes/pascallanger/master MODE_ESKY NONE MODE_MT99XX MT99 H7 YZ -<<<<<<< HEAD -======= LS ->>>>>>> refs/remotes/pascallanger/master MODE_MJXQ WLH08 X600 X800 H26D -<<<<<<< HEAD + E010 MODE_SHENQI NONE MODE_FY326 FY326 FY319 - -RX_Num value between 0 and 15 - -Power P_HIGH or P_LOW - -Auto Bind AUTOBIND or NO_AUTOBIND - -Option value between 0 and 255. 0xD7 or 0x00 for Frsky fine tuning. -*/ - -//****************** -//TX definitions with timing endpoints and channels order - -// Turnigy PPM and channels -#if defined(TX_ER9X) - #define PPM_MAX 2140 - #define PPM_MIN 860 - #define PPM_MAX_100 2012 - #define PPM_MIN_100 988 - #define AETR -#endif - -// Devo PPM and channels -#if defined(TX_DEVO7) - #define PPM_MAX 2100 - #define PPM_MIN 900 - #define PPM_MAX_100 1920 - #define PPM_MIN_100 1120 - #define EATR -#endif - -// SPEKTRUM PPM and channels -#if defined(TX_SPEKTRUM) - #define PPM_MAX 2000 - #define PPM_MIN 1000 - #define PPM_MAX_100 1900 - #define PPM_MIN_100 1100 - #define TAER -#endif - -// TARANIS PPM and channels -#if defined(TARANIS) - #define PPM_MAX 2000 - #define PPM_MIN 1000 - #define PPM_MAX_100 1900 - #define PPM_MIN_100 1100 - #define EATR -#endif - -// HISKY -#if defined(TX_HISKY) - #define PPM_MAX 2000 - #define PPM_MIN 1000 - #define PPM_MAX_100 1900 - #define PPM_MIN_100 1100 - #define AETR -#endif - -#if defined(EATR) - enum chan_order{ - ELEVATOR=0, - AILERON, - THROTTLE, - RUDDER, - }; -#endif - -#if defined(TAER) - enum chan_order{ - THROTTLE=0, - AILERON, - ELEVATOR, - RUDDER, - }; -#endif - -#if defined(AETR) - enum chan_order{ - AILERON =0, - ELEVATOR, - THROTTLE, - RUDDER, - }; -#endif -enum chan_orders{ - AUX1 =4, - AUX2, - AUX3, - AUX4, - AUX5, - AUX6, - AUX7, - AUX8, - AUX9 -}; - -#define PPM_MIN_COMMAND 1250 -#define PPM_SWITCH 1550 -#define PPM_MAX_COMMAND 1750 - -//Uncoment the desired serial speed -#define BAUD 100000 -//#define BAUD 125000 -======= - E010 - MODE_SHENQI - NONE - MODE_FY326 - NONE MODE_SFHSS NONE MODE_J6PRO @@ -458,6 +265,7 @@ enum chan_orders{ FORMAT_HONTAI FORMAT_JJRCX1 FORMAT_X5C1 + FQ777-951 */ // RX_Num is used for model match. Using RX_Num values different for each receiver will prevent starting a model with the false config loaded... @@ -471,5 +279,4 @@ enum chan_orders{ // As an exxample, it's usefull for the WLTOYS F929/F939/F949/F959 (all using the Flysky protocol) which requires a bind at each power up. // Option: the value is between -127 and +127. -// The option value is only valid for some protocols, read this page for more information: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/Protocols_Details.md ->>>>>>> refs/remotes/pascallanger/master +// The option value is only valid for some protocols, read this page for more information: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/Protocols_Details.md \ No newline at end of file diff --git a/Multiprotocol/_EEPROM.txt b/Multiprotocol/_EEPROM.txt new file mode 100644 index 0000000..4e78f4e --- /dev/null +++ b/Multiprotocol/_EEPROM.txt @@ -0,0 +1,4 @@ +0-4 rx Flysky afhds2a +10+ 0-4 tx id + +10 réf gene id +30+6 devo reset Autobind auto \ No newline at end of file diff --git a/Multiprotocol/calcul chanel.ods b/Multiprotocol/calcul chanel.ods new file mode 100644 index 0000000000000000000000000000000000000000..4f8f154691595740efa31c6e6ad0388389c88476 GIT binary patch literal 19588 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 Yl+Xd*tiYo*fV=pCumD*8{BsBK0POsd(f|Me literal 0 HcmV?d00001 diff --git a/Multiprotocol/iface_a7105.h b/Multiprotocol/iface_a7105.h index f8792d9..5df2714 100644 --- a/Multiprotocol/iface_a7105.h +++ b/Multiprotocol/iface_a7105.h @@ -89,6 +89,7 @@ enum A7105_MASK { enum { INIT_FLYSKY, + INIT_FLYSKY_AFHDS2A, INIT_HUBSAN }; diff --git a/Multiprotocol/iface_nrf24l01.h b/Multiprotocol/iface_nrf24l01.h index 6aab6c1..cc8b6fe 100644 --- a/Multiprotocol/iface_nrf24l01.h +++ b/Multiprotocol/iface_nrf24l01.h @@ -103,13 +103,8 @@ enum { //#define NOP 0xFF // XN297 emulation layer -<<<<<<< HEAD -#define XN297_UNSCRAMBLED 8 - -======= enum { XN297_UNSCRAMBLED = 0, XN297_SCRAMBLED }; ->>>>>>> refs/remotes/pascallanger/master #endif \ No newline at end of file diff --git a/Multiprotocol/multi.lua b/Multiprotocol/multi.lua deleted file mode 100644 index 07721ae..0000000 --- a/Multiprotocol/multi.lua +++ /dev/null @@ -1,94 +0,0 @@ --- Multiprotocole Midelic et Pascallanger -local debut = 0 -local tps = 0 -local tpsact = 1024 -local mix, mixe -local channel - -local inp = { - { "Protocole", VALUE, 1, 26, 2 }, - { "Switch", SOURCE } -} --- 6 7 8 15 16 17 24 25 26 --- 4 5 12 13 14 21 22 23 --- 1 2 3 9 10 11 18 19 20 -local out = { "Bind", "Gaz", "Aile", "Prof", "Dir" } - -local function run_func(proto, sw) - -- test mixage lua - if debut == 0 then - -- passage en lua - for channel = 0, 3, 1 do - local mix = model.getMix(channel, 0) - mix_source = mix["source"] - if mix_source < 33 or 1 then - model.deleteMix(channel, 0) - mix["source"] = channel + 34 - mix["name"] = "Lua " - model.insertMix(channel, 0, mix) - end - end - end - -- inter install - channel = 4 - mix = { name="Raz Bind", source=33, weight=100, switch=0, multiplex=REPLACE } - count = model.getMixesCount(channel + 0) - if count == 0 and inter == 1 then - model.insertMix(channel + 0, 0, mix) - elseif count == 1 and inter == 0 then - mixe = model.getMix(channel, 0) - if mixe["name"] == mix["name"] then - model.deleteMix(channel, 0) - end - end - - -- delais init - if proto ~= debut then - tps = getTime() + 250 -- delai pour mini 12 cycle PPM - tpsact = 1024 - debut = proto - end - - local gaz = 1024 - local ail = 0 - local dir = 0 - local pro = 0 - - if tpsact == 0 and sw < 100 then - -- reprise valeur input - pro = getValue(1) - ail = getValue(2) - gaz = getValue(3) - dir = getValue(4) - elseif tpsact ~= 0 then - -- decallage pour position memo (centre) - if proto > 4 then proto = proto + 1 end - - -- calcul position - -- decallage pour > 18 - if proto > 18 then - ail = 1024 - proto = proto - 18 - end - -- decallage pour > 9 - if proto > 9 then - ail = -1024 - proto = proto - 9 - end - - if proto < 4 then pro = -1024 end - if proto > 6 then pro = 1024 end - - if proto % 3 == 1 then dir = -1024 end - if proto % 3 == 0 then dir = 1024 end - - if tps < getTime() then - tpsact = tpsact - 512 - if tpsact>-20 then tps = getTime() + 250 end - end - sw = tpsact - end - - return sw, gaz, ail, pro, dir -end -return { run=run_func, input=inp, output=out} diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index 672b922..3ca59f2 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -16,7 +16,7 @@ // Check selected board type #ifndef XMEGA #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) - #error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini" +// #error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini" #endif #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) #error You must select the processor type "ATmega328(5V, 16MHz)" @@ -24,10 +24,27 @@ #endif //****************** -// Protocols +// Protocols max 31 x2 //****************** enum PROTOCOLS { + MODE_JOYSWAY = 40, // =>A7105 + MODE_WK2x01 = 41, // =>CYRF6936 + MODE_SKYARTEC = 42, // =>CC2500 + + MODE_UDI = 44, // =>NRF24L01 + MODE_FBL100 = 45, // =>NRF24L01 + + MODE_HM830 = 50, // =>NRF24L01 + MODE_CFLIE = 51, // =>NRF24L01 + MODE_H377 = 52, // =>NRF24L01 + MODE_ESKY150 = 53, // =>NRF24L01 + MODE_BlueFly = 54, // =>NRF24L01 + MODE_NE260 = 55, // =>NRF24L01 + + MODE_AFHDS2A = 31, // =>A7105 + MODE_INAV = 57, // =>NRF24L01 + MODE_SERIAL = 0, // Serial commands MODE_FLYSKY = 1, // =>A7105 MODE_HUBSAN = 2, // =>A7105 @@ -57,18 +74,17 @@ enum PROTOCOLS MODE_HONTAI = 26, // =>NRF24L01 MODE_OPENLRS = 27, // =>OpenLRS hardware }; - enum Flysky { - Flysky = 0, - V9X9 = 1, - V6X6 = 2, - V912 = 3 + Flysky=0, + V9X9=1, + V6X6=2, + V912=3 }; enum Hisky { - Hisky = 0, - HK310 = 1 + Hisky=0, + HK310=1 }; enum DSM { @@ -80,38 +96,38 @@ enum DSM }; enum YD717 { - YD717 = 0, - SKYWLKR = 1, - SYMAX4 = 2, - XINXUN = 3, - NIHUI = 4 + YD717=0, + SKYWLKR=1, + SYMAX4=2, + XINXUN=3, + NIHUI=4 }; enum KN { - WLTOYS = 0, - FEILUN = 1 + WLTOYS=0, + FEILUN=1 }; enum SYMAX { - SYMAX = 0, - SYMAX5C = 1 + SYMAX=0, + SYMAX5C=1 }; enum CX10 { - CX10_GREEN = 0, - CX10_BLUE = 1, // also compatible with CX10-A, CX12 - DM007 = 2, - Q282 = 3, - JC3015_1 = 4, - JC3015_2 = 5, - MK33041 = 6, - Q242 = 7 + CX10_GREEN = 0, + CX10_BLUE=1, // also compatible with CX10-A, CX12 + DM007=2, + Q282=3, + JC3015_1=4, + JC3015_2=5, + MK33041=6, + Q242=7 }; enum CG023 { - CG023 = 0, - YD829 = 1, - H8_3D = 2 + CG023 = 0, + YD829 = 1, + H8_3D = 2 }; enum MT99XX { @@ -135,9 +151,41 @@ enum FRSKYX }; enum HONTAI { - FORMAT_HONTAI = 0, + FORMAT_HONTAI = 0, FORMAT_JJRCX1 = 1, - FORMAT_X5C1 = 2 + FORMAT_X5C1 = 2, + FORMAT_FQ777 = 3 +}; + +enum HUBSAN +{ + H107 = 0, + H301 = 1, + H501 = 2 +}; +enum FY326 +{ + FY326 = 0, + FY319 = 1 +}; + +enum WK2X01 +{ + WK2801 = 0, + WK2601 = 1, + WK2401 = 2 +}; + +enum UDI +{ + U816_V1 = 0, + U816_V2 = 1, + U839_2014 = 2 +}; +enum FBL100 +{ + FBL100 = 0, + HP100 = 1 }; #define NONE 0 @@ -188,7 +236,7 @@ struct PPM_Parameters #define IS_RX_FLAG_on ( ( protocol_flags & _BV(0) ) !=0 ) // #define CHANGE_PROTOCOL_FLAG_on protocol_flags |= _BV(1) -#define CHANGE_PROTOCOL_FLAG_off protocol_flags &= ~_BV(1) +#define CHANGE_PROTOCOL_FLAG_off protocol_flags &= ~_BV(1) #define IS_CHANGE_PROTOCOL_FLAG_on ( ( protocol_flags & _BV(1) ) !=0 ) // #define POWER_FLAG_on protocol_flags |= _BV(2) @@ -206,8 +254,9 @@ struct PPM_Parameters #define BIND_BUTTON_FLAG_on protocol_flags |= _BV(5) #define BIND_BUTTON_FLAG_off protocol_flags &= ~_BV(5) #define IS_BIND_BUTTON_FLAG_on ( ( protocol_flags & _BV(5) ) !=0 ) + //PPM RX OK -#define PPM_FLAG_off protocol_flags &= ~_BV(6) +#define PPM_FLAG_off protocol_flags &= ~_BV(6) #define PPM_FLAG_on protocol_flags |= _BV(6) #define IS_PPM_FLAG_on ( ( protocol_flags & _BV(6) ) !=0 ) //Bind flag @@ -227,19 +276,21 @@ struct PPM_Parameters #define RX_MISSED_BUFF_on protocol_flags2 |= _BV(2) #define IS_RX_MISSED_BUFF_on ( ( protocol_flags2 & _BV(2) ) !=0 ) //TX Pause -#define TX_MAIN_PAUSE_off protocol_flags2 &= ~_BV(3) -#define TX_MAIN_PAUSE_on protocol_flags2 |= _BV(3) -#define IS_TX_MAIN_PAUSE_on ( ( protocol_flags2 & _BV(3) ) !=0 ) +#define TX_MAIN_PAUSE_off protocol_flags2 &= ~_BV(3) +#define TX_MAIN_PAUSE_on protocol_flags2 |= _BV(3) +#define IS_TX_MAIN_PAUSE_on ( ( protocol_flags2 & _BV(3) ) !=0 ) + #define TX_RX_PAUSE_off protocol_flags2 &= ~_BV(4) -#define TX_RX_PAUSE_on protocol_flags2 |= _BV(4) -#define IS_TX_RX_PAUSE_on ( ( protocol_flags2 & _BV(4) ) !=0 ) +#define TX_RX_PAUSE_on protocol_flags2 |= _BV(4) +#define IS_TX_RX_PAUSE_on ( ( protocol_flags2 & _BV(4) ) !=0 ) + #define IS_TX_PAUSE_on ( ( protocol_flags2 & (_BV(4)|_BV(3)) ) !=0 ) //******************** //*** Blink timing *** //******************** -#define BLINK_BIND_TIME 100 -#define BLINK_SERIAL_TIME 500 +#define BLINK_BIND_TIME 100 +#define BLINK_SERIAL_TIME 500 #define BLINK_BAD_PROTO_TIME_LOW 1000 #define BLINK_BAD_PROTO_TIME_HIGH 50 @@ -416,30 +467,30 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- RxNum value is 0..15 (bits 0..3) Type is 0..7 <<4 (bit 4..6) sub_protocol==Flysky - Flysky 0 - V9x9 1 - V6x6 2 - V912 3 + Flysky 0 + V9x9 1 + V6x6 2 + V912 3 sub_protocol==Hisky - Hisky 0 - HK310 1 + Hisky 0 + HK310 1 sub_protocol==DSM DSM2_22 0 DSM2_11 1 DSMX_22 2 DSMX_11 3 sub_protocol==YD717 - YD717 0 - SKYWLKR 1 - SYMAX4 2 - XINXUN 3 - NIHUI 4 + YD717 0 + SKYWLKR 1 + SYMAX4 2 + XINXUN 3 + NIHUI 4 sub_protocol==KN - WLTOYS 0 - FEILUN 1 + WLTOYS 0 + FEILUN 1 sub_protocol==SYMAX - SYMAX 0 - SYMAX5C 1 + SYMAX 0 + SYMAX5C 1 sub_protocol==CX10 CX10_GREEN 0 CX10_BLUE 1 // also compatible with CX10-A, CX12 @@ -464,14 +515,18 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- X800 2 H26D 3 E010 4 + sub_protocol==FY326 + FY326 0 + FY319 1 sub_protocol==FRSKYX CH_16 0 CH_8 1 sub_protocol==HONTAI - FORMAT_HONTAI 0 - FORMAT_JJRCX1 1 - FORMAT_X5C1 2 - Power value => 0x80 0=High/1=Low + HONTAI 0 + JJRCX1 1 + X5C1 2 + FQ777-521 3 + Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; option_protocol value is -127..127 Stream[4] to [25] = Channels @@ -483,3 +538,4 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol */ + diff --git a/Multiprotocol/opentx-multi-2015-24-12.bin b/Multiprotocol/opentx-multi-2015-24-12.bin deleted file mode 100644 index fe1836e7e5e2ddc5d8ea5bdd6facd0cd5ea034a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362852 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

nU^30%Xmx_3Fk>w;p$o6Gj0d_60`S);=FomNNTf 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≧K*L%BUCvXm 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 diff --git a/Multiprotocol/opentx.bin b/Multiprotocol/opentx.bin deleted file mode 100644 index 8e886c42a6124e07e42f51ab36b361274825ac8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228420 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%0DYKT495;W&8fO?RU0}70G_6 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 rU<7OfxblzN{@SQsl}CU2%7^hy diff --git a/Multiprotocol/sync.ffs_db b/Multiprotocol/sync.ffs_db new file mode 100644 index 0000000000000000000000000000000000000000..1d9eca37de4989b7134c95087de83d9f11ac52d1 GIT binary patch literal 942 zcmV;f15x}&a%E*kX>4Uvd2V9>2><{90RR915C8xG6}jz98GuD5n~;0J#ko*5fdc>l z0ssI20K)+Q000000516G{ShwB(BQ>={Nes?Jj~z6A2S>rxSE`I#fljprV72}yC(Lf z!g2?JnFbo3!Zvo1ha0X`@oI2z`_~R%04|`QDmF|DOU)WyL$G^plFGvyDOXDif_cx| z{8bjy>1I=)$m|)RG?j+snR70g4_MOI*Lk4VQ1WC!P57jB*YOY|{ZK<{^1O@r!HYGq^&a(NXty&FiSmA{H$Z8V&3OTxAnK)4Se(FCen3P^D z5te?9jXDquRg6_D#=B$iEYCKiRN|>r*gk9=cVtqjU5bZMde}gMw+SUo8*Ky<-)_(t z9TGN{lcB^3nda$)jk#PM3H0q1ntpNZ4 z00sa600000cwTjs+bhFi7{`CMp)@W?A&CnS+iqu=^Z7KBQZAKUI;8jml-;@_H7Ux4 z+{p#ETsf4IB_bJy%^YGmOxf1g#rIv$YPCK+eV+GuzVExzoZx^K{TQR)&w%~NYf6g# z(rX(PA>t=-ZqQOvuZdeNF`ksbZ33?ZA1vm+rE#9D4UgTC{{rXvUfm{MCHSiaZWs6& z=E`t;$$t)>yD~|<2A+e>ed1TB&vf{S*9v{>1dk6Mqm}nxhWhosE%Mic8w&S`Hwe5D zT%Gp@eLZ=c%Qg5~_>%lh@RW>lUbE&{jylb~$lMQ4nljff^7TwFkiQvzmA8QJnwO|v zi}%$h+{0F3|M%$I5#hYbQJ<&e-X?e+gm>{M@OF4+viTi3!H+GRyAE?@jPO1KLS9dp zD_zMk1a2tee4qdKuhhQ?{1yDr$>(_k@1J09!dyEA-1i;z)>Ga?P?+lj^{(+-%Dn@A z=M?8?7V_#8cv#4*OQ`P_cn|opGS?UUPM43)KacmK{;xXV$x`lNuh91g{y7`pp9pyV Q5bwD#?n%@B0IsWEV38Tn)&Kwi literal 0 HcmV?d00001 From 950ee9ddc2349fcef44fe7078096bc9b70397552 Mon Sep 17 00:00:00 2001 From: tipouic Date: Wed, 5 Oct 2016 22:56:39 +0200 Subject: [PATCH 2/6] Correction init A7105 --- .gitignore | 1 + Multiprotocol/A7105_SPI.ino | 10 +++++----- Multiprotocol/Flysky_afhds2a_a7105.ino | 12 ++++++++---- Multiprotocol/_Config.h | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e49c47f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.ffs_db \ No newline at end of file diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index 349de65..accf5ba 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -159,10 +159,10 @@ const uint8_t PROGMEM FLYSKY_A7105_regs[] = { 0x13, 0xc3, 0x00, 0xff, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, 0x01, 0x0f, 0xff }; -const uint8_t AFHDS2A_regs[] = { - -1 , 0x42 | (1<<5), 0x00, 0x25, 0x00, -1, -1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3c, 0x05, 0x00, 0x50, // 00 - 0f - 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x4f, 0x62, 0x80, -1, -1, 0x2a, 0x32, 0xc3, 0x1f, // 10 - 1f - 0x1e, -1, 0x00, -1, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f +const uint8_t PROGMEM AFHDS2A_regs[] = { + 0xFF , 0x42 | (1<<5), 0x00, 0x25, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3c, 0x05, 0x00, 0x50, // 00 - 0f + 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x4f, 0x62, 0x80, 0xFF, 0xFF, 0x2a, 0x32, 0xc3, 0x1f, // 10 - 1f + 0x1e, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f 0x01, 0x0f // 30 - 31 }; #define ID_NORMAL 0x55201041 @@ -185,7 +185,7 @@ void A7105_Init(uint8_t protocol) A7105_Regs=(void *)HUBSAN_A7105_regs; } for (uint8_t i = 0; i < 0x33; i++){ - if( pgm_read_byte_near((uint16_t)(A7105_Regs)+i) != 0xFF) + if( pgm_read_byte_near((uint16_t)(A7105_Regs)+i != 0xFF) A7105_WriteReg(i, pgm_read_byte_near((uint16_t)(A7105_Regs)+i)); } A7105_Strobe(A7105_STANDBY); diff --git a/Multiprotocol/Flysky_afhds2a_a7105.ino b/Multiprotocol/Flysky_afhds2a_a7105.ino index c83a582..abc4278 100644 --- a/Multiprotocol/Flysky_afhds2a_a7105.ino +++ b/Multiprotocol/Flysky_afhds2a_a7105.ino @@ -9,6 +9,7 @@ #define TXID_SIZE 4 #define RXID_SIZE 4 + static uint8_t txid[RXID_SIZE]; static uint8_t rxid[RXID_SIZE]; static uint8_t packet_type; static uint8_t bind_reply; @@ -39,7 +40,7 @@ switch(type) { case PACKET_STICKS: packet[0] = 0x58; - memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[1], txid, 4); memcpy( &packet[5], rxid, 4); for(uint8_t ch=0; ch<14; ch++) { packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF; @@ -50,7 +51,7 @@ case PACKET_SETTINGS: packet[0] = 0xaa; - memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[1], txid, 4); memcpy( &packet[5], rxid, 4); packet[9] = 0xfd; packet[10]= 0xff; @@ -75,7 +76,7 @@ case PACKET_FAILSAFE: packet[0] = 0x56; - memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[1], txid, 4); memcpy( &packet[5], rxid, 4); for(uint8_t ch=0; ch<14; ch++) { if(ch==0) { @@ -133,7 +134,7 @@ static void afhds2a_build_bind_packet() { uint8_t ch; - memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[1], txid, 4); memset( &packet[5], 0xff, 4); packet[10]= 0x00; for(ch=0; ch<16; ch++) { @@ -298,6 +299,9 @@ static uint16_t AFHDS2A_setup() { A7105_Init(INIT_FLYSKY_AFHDS2A); //flysky_init(); + for (u8 i = 0; i < TXID_SIZE; ++i) { + txid[i] = rx_tx_addr[0]; + } calc_afhds_channels(MProtocol_id); packet_type = PACKET_STICKS; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 556eea7..6c99ab0 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -138,7 +138,7 @@ //Below are some standard transmitters already preconfigured. //Uncomment only the one which matches your transmitter. //#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs) -#define TX_TARANIS //TARANIS TAER (1100<->1900µs) +#define TX_TARANIS //TARANIS AETR (1100<->1900µs) //#define TX_DEVO7 //DEVO (1120<->1920µs) //#define TX_SPEKTRUM //Spektrum (1100<->1900µs) //#define TX_HISKY //HISKY (1100<->1900µs) From 7c17fec35f07caccd4f7da4517d9931ce1c203c0 Mon Sep 17 00:00:00 2001 From: tipouic Date: Wed, 19 Oct 2016 21:07:30 +0200 Subject: [PATCH 3/6] teste flysky afhds2a STM2 --- .gitignore | 5 +- Multiprotocol/A7105_SPI.ino | 85 +- Multiprotocol/A7105_joysway.ino | 109 +-- Multiprotocol/Arduino.ino | 21 +- Multiprotocol/CC2500_SPI.ino | 4 +- Multiprotocol/CG023_nrf24l01.ino | 29 +- Multiprotocol/CYRF6936_SPI.ino | 24 +- Multiprotocol/Convert.ino | 11 - Multiprotocol/DSM_cyrf6936.ino | 32 +- Multiprotocol/Devo_cyrf6936.ino | 2 +- Multiprotocol/Flysky_afhds2a_a7105.ino | 591 ++++++------ Multiprotocol/FrSkyX_cc2500.ino | 11 +- Multiprotocol/MT99xx_nrf24l01.ino | 2 +- .../{Makefile.xmega => Makefile.orangetx} | 0 ...nge.cpp.xmega => MultiOrange.cpp.orangetx} | 2 +- Multiprotocol/Multiprotocol.ino | 411 +++++--- Multiprotocol/NRF24l01_SPI.ino | 10 +- Multiprotocol/Nrf24l01_hm830.ino | 9 +- Multiprotocol/Pins.h | 511 ++++++---- Multiprotocol/README.md | 34 + Multiprotocol/SPI.ino | 195 ++-- Multiprotocol/TX_Def.h | 240 ++--- Multiprotocol/Telemetry.ino | 709 +++++++------- Multiprotocol/V2X2_nrf24l01.ino | 38 +- Multiprotocol/Validate.h | 96 ++ .../{WMath.cpp.xmega => WMath.cpp.orangetx} | 0 Multiprotocol/_Config.h | 28 +- Multiprotocol/boards.txt | 890 ++++++++++++++++++ Multiprotocol/iface_a7105.h | 1 + Multiprotocol/multiprotocol.h | 42 +- 30 files changed, 2744 insertions(+), 1398 deletions(-) rename Multiprotocol/{Makefile.xmega => Makefile.orangetx} (100%) rename Multiprotocol/{MultiOrange.cpp.xmega => MultiOrange.cpp.orangetx} (99%) create mode 100644 Multiprotocol/Validate.h rename Multiprotocol/{WMath.cpp.xmega => WMath.cpp.orangetx} (100%) create mode 100644 Multiprotocol/boards.txt diff --git a/.gitignore b/.gitignore index e49c47f..0d39bda 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -*.ffs_db \ No newline at end of file +*.ffs_db +*.ffs_db +*.ffs_db +*.hc \ No newline at end of file diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index accf5ba..975130e 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -15,6 +15,7 @@ /********************/ /** A7105 routines **/ /********************/ +#ifdef A7105_INSTALLED #include "iface_a7105.h" void A7105_WriteData(uint8_t len, uint8_t channel) @@ -36,7 +37,7 @@ void A7105_ReadData(uint8_t len=16) { A7105_CSN_off; SPI_Write(0x45); for (i=0;i= 500) - return 0; - A7105_Strobe(A7105_STANDBY); - if_calibration1 = A7105_ReadReg(0x22); - if(if_calibration1 & A7105_MASK_FBCF) { - //Calibration failed...what do we do? - return 0; - } - - //VCO Current Calibration - A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet - A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet - - A7105_WriteID(MProtocol_id_master); - A7105_Strobe(A7105_PLL); - A7105_WriteReg(0x02, 1); - ms = micros(); - while(micros() - ms < 500) { - if(! A7105_ReadReg(0x02)) - break; - } - if (micros() - ms >= 500) - return 0; - A7105_Strobe(A7105_STANDBY); - if_calibration1 = A7105_ReadReg(0x22); - if(if_calibration1 & A7105_MASK_FBCF) { - //Calibration failed...what do we do? - return 0; - } - A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet - A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet - - A7105_SetTxRxMode(TX_EN); - A7105_SetPower(); - - A7105_Strobe(A7105_STANDBY); - return 1; -} static void joysway_build_packet() { @@ -101,16 +29,15 @@ static void joysway_build_packet() //Center = 0x5d9 //1 % = 5 packet[0] = phase == 0 ? 0xdd : 0xff; - packet[1] = (MProtocol_id_master >> 24) & 0xff; - packet[2] = (MProtocol_id_master >> 16) & 0xff; - packet[3] = (MProtocol_id_master >> 8) & 0xff; - packet[4] = (MProtocol_id_master >> 0) & 0xff; + packet[1] = (binding_idx >> 24) & 0xff; + packet[2] = (binding_idx >> 16) & 0xff; + packet[3] = (binding_idx >> 8) & 0xff; + packet[4] = (binding_idx >> 0) & 0xff; packet[5] = 0x00; static const int chmap[4] = {6, 7, 10, 11}; for (i = 0; i < 4; i++) { // if (i >= Model.num_channels) { packet[chmap[i]] = 0x64; continue; } - uint32_t value = map(limit_channel_100(i),servo_min_100,servo_max_100,0,204); - packet[chmap[i]] = value; + packet[chmap[i]] = map(limit_channel_100(i),servo_min_100,servo_max_100,0,204); } packet[8] = 0x64; packet[9] = 0x64; @@ -124,39 +51,35 @@ static void joysway_build_packet() static uint16_t joysway_cb() { - uint8_t ch; if (phase == 254) { phase = 0; A7105_WriteID(0x5475c52a); - ch = 0x0a; + hopping_frequency_no = 0x0a; } else if (phase == 2) { - A7105_WriteID(MProtocol_id_master); - ch = 0x30; + A7105_WriteID(binding_idx); + hopping_frequency_no = 0x30; } else { if ((phase & 0x01) ^ EVEN_ODD) { - ch = 0x30; + hopping_frequency_no = 0x30; } else { - ch = next_ch; + hopping_frequency_no = rf_ch_num; } } if (! ((phase & 0x01) ^ EVEN_ODD)) { - next_ch++; - if (next_ch == 0x45) - next_ch = 0x30; + rf_ch_num++; + if (rf_ch_num == 0x45) + rf_ch_num = 0x30; } joysway_build_packet(); A7105_Strobe(A7105_STANDBY); - A7105_WriteData(16, ch); + A7105_WriteData(16, hopping_frequency_no); phase++; return 6000; } static uint16_t JOYSWAY_Setup() { - while(1) { - A7105_Reset(); - if (joysway_init()) - break; - } + binding_idx = MProtocol_id_master | 0xf8000000; + A7105_Init(INIT_JOYSWAY); return 2400; } #endif diff --git a/Multiprotocol/Arduino.ino b/Multiprotocol/Arduino.ino index 7382ac9..0074077 100644 --- a/Multiprotocol/Arduino.ino +++ b/Multiprotocol/Arduino.ino @@ -12,9 +12,23 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ +#ifndef STM32_BOARD +/************************************/ /************************************/ /** Arduino replacement routines **/ /************************************/ +// replacement map() +int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max) +{ +// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + long y ; + x -= in_min ; + y = out_max - out_min ; + y *= x ; + x = y / (in_max - in_min) ; + return x + out_min ; +} + // replacement millis() and micros() // These work polled, no interrupts // micros() MUST be called at least once every 32 milliseconds @@ -106,7 +120,7 @@ void delayMicroseconds(unsigned int us) return; us <<= 2; // * 4 us -= 2; // - 2 -#ifdef XMEGA +#ifdef ORANGE_TX __asm__ __volatile__ ( "1: sbiw %0,1" "\n\t" // 2 cycles "nop \n" @@ -123,11 +137,12 @@ void delayMicroseconds(unsigned int us) #endif } -#ifndef XMEGA +#ifndef ORANGE_TX void init() { // this needs to be called before setup() or some functions won't work there sei(); } -#endif //XMEGA +#endif //ORANGE_TX +#endif //STM32_BOARD diff --git a/Multiprotocol/CC2500_SPI.ino b/Multiprotocol/CC2500_SPI.ino index 4628b03..ac39670 100644 --- a/Multiprotocol/CC2500_SPI.ino +++ b/Multiprotocol/CC2500_SPI.ino @@ -1,3 +1,4 @@ + /* 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 @@ -17,6 +18,7 @@ //CC2500 SPI routines //------------------------------- //------------------------------- +#ifdef CC2500_INSTALLED #include "iface_cc2500.h" //---------------------------- @@ -152,4 +154,4 @@ void CC2500_SetPower() prev_power=power; } } - +#endif \ No newline at end of file diff --git a/Multiprotocol/CG023_nrf24l01.ino b/Multiprotocol/CG023_nrf24l01.ino index 8169b8f..5f6f3a2 100644 --- a/Multiprotocol/CG023_nrf24l01.ino +++ b/Multiprotocol/CG023_nrf24l01.ino @@ -56,18 +56,23 @@ enum YD829_FLAGS { }; enum H8_3D_FLAGS { - // flags going to packet[17] - H8_3D_FLAG_FLIP = 0x01, - H8_3D_FLAG_RATE_MID = 0x02, - H8_3D_FLAG_RATE_HIGH = 0x04, - H8_3D_FLAG_LIGTH = 0x08, // Light on H22 - H8_3D_FLAG_HEADLESS = 0x10, // RTH + headless on H8, headless on JJRC H20, RTH on H22 - H8_3D_FLAG_RTH = 0x20, // 360 flip mode on H8 3D and H22, RTH on JJRC H20 + // flags going to packet[17] + H8_3D_FLAG_FLIP = 0x01, + H8_3D_FLAG_RATE_MID = 0x02, + H8_3D_FLAG_RATE_HIGH = 0x04, + H8_3D_FLAG_LIGTH = 0x08, // Light on H22 + H8_3D_FLAG_HEADLESS = 0x10, // RTH + headless on H8, headless on JJRC H20, RTH on H22 + H8_3D_FLAG_RTH = 0x20, // 360 flip mode on H8 3D and H22, RTH on JJRC H20 }; enum H8_3D_FLAGS_2 { - // flags going to packet[18] - H8_3D_FLAG_CALIBRATE = 0x20, // accelerometer calibration + // flags going to packet[18] + H8_3D_FLAG_CAM_UP = 0x04, + H8_3D_FLAG_CAM_DOWN = 0x08, + H8_3D_FLAG_CALIBRATE2 = 0x10, // acc calib. (H11D, H20) + H8_3D_FLAG_CALIBRATE = 0x20, // acc calib. (H8 3D), headless calib (H20) + H8_3D_FLAG_SNAPSHOT = 0x40, + H8_3D_FLAG_VIDEO = 0x80, }; static void __attribute__((unused)) CG023_send_packet(uint8_t bind) @@ -119,8 +124,10 @@ static void __attribute__((unused)) CG023_send_packet(uint8_t bind) | GET_FLAG(Servo_AUX2,H8_3D_FLAG_LIGTH) //H22 light | GET_FLAG(Servo_AUX3,H8_3D_FLAG_HEADLESS) | GET_FLAG(Servo_AUX4,H8_3D_FLAG_RTH); // 180/360 flip mode on H8 3D - if(Servo_AUX5) - packet[18] = H8_3D_FLAG_CALIBRATE; + packet[18] = GET_FLAG(Servo_AUX5,H8_3D_FLAG_CALIBRATE) + | GET_FLAG(Servo_AUX5,H8_3D_FLAG_CALIBRATE2) + | GET_FLAG(Servo_AUX6, H8_3D_FLAG_SNAPSHOT) + | GET_FLAG(Servo_AUX7, H8_3D_FLAG_VIDEO); } uint8_t sum = packet[9]; for (uint8_t i=10; i < H8_3D_PACKET_SIZE-1; i++) diff --git a/Multiprotocol/CYRF6936_SPI.ino b/Multiprotocol/CYRF6936_SPI.ino index 2b2d52a..96fd9c8 100644 --- a/Multiprotocol/CYRF6936_SPI.ino +++ b/Multiprotocol/CYRF6936_SPI.ino @@ -12,9 +12,9 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ +#ifdef CYRF6936_INSTALLED #include "iface_cyrf6936.h" - void CYRF_WriteRegister(uint8_t address, uint8_t data) { CYRF_CSN_off; @@ -182,11 +182,6 @@ void CYRF_WritePreamble(uint32_t preamble) /* * */ -static void CYRF_StartReceive() -{ - CYRF_WriteRegister(CYRF_05_RX_CTRL,0x87); -} - /*static void CYRF_ReadDataPacket(uint8_t dpbuffer[]) { CYRF_ReadRegisterMulti(CYRF_21_RX_BUFFER, dpbuffer, 0x10); @@ -243,10 +238,14 @@ void CYRF_FindBestChannels(uint8_t *channels, uint8_t len, uint8_t minspace, uin for(i = 0; i < NUM_FREQ; i++) { CYRF_ConfigRFChannel(i); - CYRF_ReadRegister(CYRF_13_RSSI); - CYRF_StartReceive(); - delayMicroseconds(10); - rssi[i] = CYRF_ReadRegister(CYRF_13_RSSI); + delayMicroseconds(270); //slow channel require 270usec for synthesizer to settle + if( !(CYRF_ReadRegister(CYRF_05_RX_CTRL) & 0x80)) { + CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x80); //Prepare to receive + delayMicroseconds(15); + CYRF_ReadRegister(CYRF_13_RSSI); //dummy read + delayMicroseconds(15); //The conversion can occur as often as once every 12us + } + rssi[i] = CYRF_ReadRegister(CYRF_13_RSSI)&0x1F; } for (i = 0; i < len; i++) @@ -262,7 +261,9 @@ void CYRF_FindBestChannels(uint8_t *channels, uint8_t len, uint8_t minspace, uin rssi[j] = 0xff; } } + CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Abort RX operation CYRF_SetTxRxMode(TX_EN); + CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Clear abort RX } #if defined(DEVO_CYRF6936_INO) || defined(J6PRO_CYRF6936_INO) @@ -297,4 +298,5 @@ static void __attribute__((unused)) CYRF_PROGMEM_ConfigSOPCode(const uint8_t *da for(uint8_t i=0;i<8;i++) code[i]=pgm_read_byte_near(&data[i]); CYRF_ConfigSOPCode(code); -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Multiprotocol/Convert.ino b/Multiprotocol/Convert.ino index 3e2920e..07e7b2c 100644 --- a/Multiprotocol/Convert.ino +++ b/Multiprotocol/Convert.ino @@ -15,17 +15,6 @@ /************************/ /** Convert routines **/ /************************/ -int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max) -{ -// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; - long y ; - x -= in_min ; - y = out_max - out_min ; - y *= x ; - x = y / (in_max - in_min) ; - return x + out_min ; -} - // Channel value is converted to 8bit values full scale uint8_t convert_channel_8b(uint8_t num) { diff --git a/Multiprotocol/DSM_cyrf6936.ino b/Multiprotocol/DSM_cyrf6936.ino index 85c5735..acc4331 100644 --- a/Multiprotocol/DSM_cyrf6936.ino +++ b/Multiprotocol/DSM_cyrf6936.ino @@ -135,8 +135,7 @@ static uint8_t __attribute__((unused)) get_pn_row(uint8_t channel) } const uint8_t PROGMEM init_vals[][2] = { - {CYRF_02_TX_CTRL, 0x03}, // TX interrupt complete and error enabled - //0x00 in deviation but needed to know when transmit is over + {CYRF_02_TX_CTRL, 0x00}, // All TX interrupt disabled {CYRF_05_RX_CTRL, 0x00}, // All RX interrupt disabled {CYRF_28_CLK_EN, 0x02}, // Force receive clock enable {CYRF_32_AUTO_CAL_TIME, 0x3c}, // Default init value @@ -369,13 +368,13 @@ static uint8_t __attribute__((unused)) DSM_Check_RX_packet() uint16_t ReadDsm() { #define DSM_CH1_CH2_DELAY 4010 // Time between write of channel 1 and channel 2 -#define DSM_WRITE_DELAY 1550 // Time after write to verify write complete +#define DSM_WRITE_DELAY 1950 // Time after write to verify write complete #define DSM_READ_DELAY 600 // Time before write to check read phase, and switch channels. Was 400 but 600 seems what the 328p needs to read a packet - uint16_t start; #if defined DSM_TELEMETRY uint8_t rx_phase; uint8_t len; #endif + uint8_t start; switch(phase) { @@ -451,19 +450,28 @@ uint16_t ReadDsm() return DSM_WRITE_DELAY; case DSM_CH1_CHECK_A: case DSM_CH1_CHECK_B: - start=micros(); - while ((uint16_t)micros()-start < 500) // Wait max 500µs - if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02) - break; - set_sop_data_crc(); - phase++; // change from CH1_CHECK to CH2_WRITE - return DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY; case DSM_CH2_CHECK_A: case DSM_CH2_CHECK_B: start=micros(); - while ((uint16_t)micros()-start < 500) // Wait max 500µs + while ((uint8_t)micros()-start < 100) // Wait max 100µs, max I've seen is 50µs if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02) break; + if(phase==DSM_CH1_CHECK_A || phase==DSM_CH1_CHECK_B) + { + #if defined DSM_TELEMETRY + // reset cyrf6936 if freezed after switching from TX to RX + if (((CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x22) == 0x20) || (CYRF_ReadRegister(CYRF_02_TX_CTRL) & 0x80)) + { + CYRF_Reset(); + cyrf_config(); + cyrf_configdata(); + CYRF_SetTxRxMode(TX_EN); + } + #endif + set_sop_data_crc(); + phase++; // change from CH1_CHECK to CH2_WRITE + return DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY; + } if (phase == DSM_CH2_CHECK_A) CYRF_SetPower(0x28); //Keep transmit power in sync #if defined DSM_TELEMETRY diff --git a/Multiprotocol/Devo_cyrf6936.ino b/Multiprotocol/Devo_cyrf6936.ino index a677de9..885e6c0 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((uint8_t*)(30+mode_select),0x01); // Set fixed id mode for the current model + eeprom_write_byte((EE_ADDR)(30+mode_select),0x01); // Set fixed id mode for the current model option=1; } BIND_SET_OUTPUT; diff --git a/Multiprotocol/Flysky_afhds2a_a7105.ino b/Multiprotocol/Flysky_afhds2a_a7105.ino index abc4278..5fcf6c4 100644 --- a/Multiprotocol/Flysky_afhds2a_a7105.ino +++ b/Multiprotocol/Flysky_afhds2a_a7105.ino @@ -1,321 +1,314 @@ // adaptation de https://github.com/goebish/deviation/blob/c5dd9fcc1441fc05fe9effa4c378886aeb3938d4/src/protocol/flysky_afhds2a_a7105.c #ifdef AFHDS2A_A7105_INO - #define EEPROMadress 0 // rx ID 32bit - #define SERVO_HZ 0 //Frequency's servo 0=50 1=400 2=5 - - #define TXPACKET_SIZE 38 - #define RXPACKET_SIZE 37 - #define NUMFREQ 16 - #define TXID_SIZE 4 - #define RXID_SIZE 4 +#define EEPROMadress 0 // rx ID 32bit +#define SERVO_HZ 50 //Frequency's servo 0=50 1=400 2=5 - static uint8_t txid[RXID_SIZE]; - static uint8_t rxid[RXID_SIZE]; - static uint8_t packet_type; - static uint8_t bind_reply; +#define TXPACKET_SIZE 38 +#define RXPACKET_SIZE 37 +#define NUMFREQ 16 + +static uint8_t txid[4]; +static uint8_t rxid[4]; +static uint8_t packet_type; +static uint8_t bind_reply; - enum{ - PACKET_STICKS, - PACKET_SETTINGS, - PACKET_FAILSAFE, - }; +enum{ + PACKET_STICKS, + PACKET_SETTINGS, + PACKET_FAILSAFE, +}; - enum{ - BIND1, - BIND2, - BIND3, - BIND4, - DATA1, - }; - enum { - PWM_IBUS = 0, - PPM_IBUS, - PWM_SBUS, - PPM_SBUS - }; +enum{ + BIND1, + BIND2, + BIND3, + BIND4, + DATA1, +}; +enum { + PWM_IBUS = 0, + PPM_IBUS, + PWM_SBUS, + PPM_SBUS +}; - static void build_packet(uint8_t type) { - switch(type) { - case PACKET_STICKS: - packet[0] = 0x58; - memcpy( &packet[1], txid, 4); - memcpy( &packet[5], rxid, 4); - for(uint8_t ch=0; ch<14; ch++) { - packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF; - packet[10 + ch*2] = (Servo_data[CH_AETR[ch]]>>8)&0xFF; +static void build_packet(uint8_t type) { + switch(type) { + case PACKET_STICKS: + packet[0] = 0x58; + memcpy( &packet[1], txid, 4); + memcpy( &packet[5], rxid, 4); + for(uint8_t ch=0; ch<14; ch++) { + packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF; + packet[10 + ch*2] = (Servo_data[CH_AETR[ch]]>>8)&0xFF; + } + packet[37] = 0x00; + break; + + case PACKET_FAILSAFE: + packet[0] = 0x56; + memcpy( &packet[1], txid, 4); + memcpy( &packet[5], rxid, 4); + for(uint8_t ch=0; ch<14; ch++) { + if(ch==0) { + // if(ch < Model.num_channels && (Model.limits[ch].flags & CH_FAILSAFE_EN)) { + packet[9 + ch*2] = Servo_data[AUX11] & 0xff; + packet[10+ ch*2] = (Servo_data[AUX11] >> 8) & 0xff; } - packet[37] = 0x00; + else { + packet[9 + ch*2] = 0xff; + packet[10+ ch*2] = 0xff; + } + } + packet[37] = 0x00; + break; + + case PACKET_SETTINGS: + packet[0] = 0xaa; + memcpy( &packet[1], txid, 4); + memcpy( &packet[5], rxid, 4); + packet[9] = 0xfd; + packet[10]= 0xff; + packet[11]= SERVO_HZ & 0xff; + packet[12]= (SERVO_HZ >> 8) & 0xff; + if(option == PPM_IBUS || option == PPM_SBUS) + packet[13] = 0x01; // PPM output enabled + else + packet[13] = 0x00; + packet[14]= 0x00; + for(uint8_t i=15; i<37; i++) + packet[i] = 0xff; + packet[18] = 0x05; // ? + packet[19] = 0xdc; // ? + packet[20] = 0x05; // ? + if(option == PWM_SBUS || option == PPM_SBUS) + packet[21] = 0xdd; // SBUS output enabled + else + packet[21] = 0xde; + packet[37] = 0x00; + break; + } +} + +// telemetry sensors ID +enum{ + SENSOR_RX_VOLTAGE = 0x00, + SENSOR_RX_ERR_RATE = 0xfe, + SENSOR_RX_RSSI = 0xfc, + SENSOR_RX_NOISE = 0xfb, + SENSOR_RX_SNR = 0xfa, +}; + +static void update_telemetry() { + // AA | TXID | RXID | sensor id | sensor # | value 16 bit big endian | sensor id ...... + // max 7 sensors per packet + + for(uint8_t sensor=0; sensor<7; sensor++) { + uint8_t index = 9+(4*sensor); + switch(packet[index]) { + case SENSOR_RX_VOLTAGE: + v_lipo = packet[index+3]<<8 | packet[index+2]; + telemetry_link=1; break; - - case PACKET_SETTINGS: - packet[0] = 0xaa; - memcpy( &packet[1], txid, 4); - memcpy( &packet[5], rxid, 4); - packet[9] = 0xfd; - packet[10]= 0xff; - packet[11]= SERVO_HZ & 0xff; - packet[12]= (SERVO_HZ >> 8) & 0xff; - if(option == PPM_IBUS || option == PPM_SBUS) - packet[13] = 0x01; // PPM output enabled - else - packet[13] = 0x00; - packet[14]= 0x00; - for(uint8_t i=15; i<37; i++) - packet[i] = 0xff; - packet[18] = 0x05; // ? - packet[19] = 0xdc; // ? - packet[20] = 0x05; // ? - if(option == PWM_SBUS || option == PPM_SBUS) - packet[21] = 0xdd; // SBUS output enabled - else - packet[21] = 0xde; - packet[37] = 0x00; + case SENSOR_RX_ERR_RATE: + // packet[index+2]; break; - - case PACKET_FAILSAFE: - packet[0] = 0x56; - memcpy( &packet[1], txid, 4); - memcpy( &packet[5], rxid, 4); - for(uint8_t ch=0; ch<14; ch++) { - if(ch==0) { - // if(ch < Model.num_channels && (Model.limits[ch].flags & CH_FAILSAFE_EN)) { - uint32_t value = ((uint32_t)Servo_data[AUX11] + 100) * 5 + 1000; - packet[9 + ch*2] = value & 0xff; - packet[10+ ch*2] = (value >> 8) & 0xff; + case SENSOR_RX_RSSI: + RSSI_dBm = -packet[index+2]; + break; + case 0xff: + return; + default: + // unknown sensor ID + break; + } + } +} + +static void afhds2a_build_bind_packet() { + uint8_t ch; + memcpy( &packet[1], txid, 4); + memset( &packet[5], 0xff, 4); + packet[10]= 0x00; + for(ch=0; ch<16; ch++) { + packet[11+ch] = hopping_frequency[ch]; + } + memset( &packet[27], 0xff, 10); + packet[37] = 0x00; + switch(phase) { + case BIND1: + packet[0] = 0xbb; + packet[9] = 0x01; + break; + case BIND2: + case BIND3: + case BIND4: + packet[0] = 0xbc; + if(phase == BIND4) { + memcpy( &packet[5], &rxid, 4); + memset( &packet[11], 0xff, 16); + } + packet[9] = phase-1; + if(packet[9] > 0x02) + packet[9] = 0x02; + packet[27]= 0x01; + packet[28]= 0x80; + break; + } +} + +static void calc_afhds_channels() { + int idx = 0; + uint32_t rnd = MProtocol_id; + while (idx < NUMFREQ) { + int i; + int count_1_42 = 0, count_43_85 = 0, count_86_128 = 0, count_129_168=0; + rnd = rnd * 0x0019660D + 0x3C6EF35F; // Randomization + + uint8_t next_ch = ((rnd >> (idx%32)) % 0xa8) + 1; + // Keep the distance 2 between the channels - either odd or even + if (((next_ch ^ MProtocol_id) & 0x01 )== 0) + continue; + // Check that it's not duplicate and spread uniformly + for (i = 0; i < idx; i++) { + if(hopping_frequency[i] == next_ch) + break; + if(hopping_frequency[i] <= 42) + count_1_42++; + else if (hopping_frequency[i] <= 85) + count_43_85++; + else if (hopping_frequency[i] <= 128) + count_86_128++; + else + count_129_168++; + } + if (i != idx) + continue; + if ((next_ch <= 42 && count_1_42 < 5) + ||(next_ch >= 43 && next_ch <= 85 && count_43_85 < 5) + ||(next_ch >= 86 && next_ch <=128 && count_86_128 < 5) + ||(next_ch >= 129 && count_129_168 < 5)) + { + hopping_frequency[idx++] = next_ch; + } + } +} + +#define WAIT_WRITE 0x80 +static uint16_t afhds2a_cb() { + switch(phase) { + case BIND1: + case BIND2: + case BIND3: + A7105_Strobe(A7105_STANDBY); + afhds2a_build_bind_packet(); + A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); + if(A7105_ReadReg(0) == 0x1b) { // todo: replace with check crc+fec + A7105_Strobe(A7105_RST_RDPTR); + A7105_ReadData(RXPACKET_SIZE); + if(packet[0] == 0xbc) { + for(uint8_t i=0; i<4; i++) { + rxid[i] = packet[5+i]; } - else { - packet[9 + ch*2] = 0xff; - packet[10+ ch*2] = 0xff; - } - } - packet[37] = 0x00; - break; - } - } - - #if defined(TELEMETRY) - // telemetry sensors ID - enum{ - SENSOR_RX_VOLTAGE = 0x00, - SENSOR_RX_ERR_RATE = 0xfe, - SENSOR_RX_RSSI = 0xfc, - SENSOR_RX_NOISE = 0xfb, - SENSOR_RX_SNR = 0xfa, - }; - - static void update_telemetry() { - // AA | TXID | RXID | sensor id | sensor # | value 16 bit big endian | sensor id ...... - // max 7 sensors per packet - - for(uint8_t sensor=0; sensor<7; sensor++) { - uint8_t index = 9+(4*sensor); - switch(packet[index]) { - case SENSOR_RX_VOLTAGE: - v_lipo = packet[index+3]<<8 | packet[index+2]; - telemetry_link=1; - break; - case SENSOR_RX_ERR_RATE: - // packet[index+2]; - break; - case SENSOR_RX_RSSI: - RSSI_dBm = -packet[index+2]; - break; - case 0xff: - return; - default: - // unknown sensor ID - break; + eeprom_write_block((const void*)rxid,(EE_ADDR)EEPROMadress,4); + if(packet[9] == 0x01) + phase = BIND4; } } - } - #endif - - static void afhds2a_build_bind_packet() { - uint8_t ch; - memcpy( &packet[1], txid, 4); - memset( &packet[5], 0xff, 4); - packet[10]= 0x00; - for(ch=0; ch<16; ch++) { - packet[11+ch] = hopping_frequency[ch]; - } - memset( &packet[27], 0xff, 10); - packet[37] = 0x00; - switch(phase) { - case BIND1: - packet[0] = 0xbb; - packet[9] = 0x01; - break; - case BIND2: - case BIND3: - case BIND4: - packet[0] = 0xbc; - if(phase == BIND4) { - memcpy( &packet[5], &rxid, 4); - memset( &packet[11], 0xff, 16); - } - packet[9] = phase-1; - if(packet[9] > 0x02) - packet[9] = 0x02; - packet[27]= 0x01; - packet[28]= 0x80; - break; - } - } - - static void calc_afhds_channels(uint32_t seed) { - int idx = 0; - uint32_t rnd = seed; - while (idx < NUMFREQ) { - int i; - int count_1_42 = 0, count_43_85 = 0, count_86_128 = 0, count_129_168=0; - rnd = rnd * 0x0019660D + 0x3C6EF35F; // Randomization - - uint8_t next_ch = ((rnd >> (idx%32)) % 0xa8) + 1; - // Keep the distance 2 between the channels - either odd or even - if (((next_ch ^ seed) & 0x01 )== 0) - continue; - // Check that it's not duplicate and spread uniformly - for (i = 0; i < idx; i++) { - if(hopping_frequency[i] == next_ch) - break; - if(hopping_frequency[i] <= 42) - count_1_42++; - else if (hopping_frequency[i] <= 85) - count_43_85++; - else if (hopping_frequency[i] <= 128) - count_86_128++; - else - count_129_168++; - } - if (i != idx) - continue; - if ((next_ch <= 42 && count_1_42 < 5) - ||(next_ch >= 43 && next_ch <= 85 && count_43_85 < 5) - ||(next_ch >= 86 && next_ch <=128 && count_86_128 < 5) - ||(next_ch >= 129 && count_129_168 < 5)) - { - hopping_frequency[idx++] = next_ch; - } - } - } - - #define WAIT_WRITE 0x80 - static uint16_t afhds2a_cb() { - switch(phase) { - case BIND1: - case BIND2: - case BIND3: - A7105_Strobe(A7105_STANDBY); - afhds2a_build_bind_packet(); - A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); - if(A7105_ReadReg(0) == 0x1b) { // todo: replace with check crc+fec + packet_count++; + phase |= WAIT_WRITE; + return 1700; + case BIND1|WAIT_WRITE: + case BIND2|WAIT_WRITE: + case BIND3|WAIT_WRITE: + A7105_Strobe(A7105_RX); + phase &= ~WAIT_WRITE; + phase++; + if(phase > BIND3) + phase = BIND1; + return 2150; + case BIND4: + A7105_Strobe(A7105_STANDBY); + afhds2a_build_bind_packet(); + A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); + packet_count++; + bind_reply++; + if(bind_reply>=4) { + packet_count=0; + channel=1; + phase = DATA1; + BIND_DONE; + } + phase |= WAIT_WRITE; + return 1700; + case BIND4|WAIT_WRITE: + A7105_Strobe(A7105_RX); + phase &= ~WAIT_WRITE; + return 2150; + case DATA1: + A7105_Strobe(A7105_STANDBY); + build_packet(packet_type); + A7105_WriteData(38, hopping_frequency[channel++]); + if(channel >= 16) + channel = 0; + if(!(packet_count % 1313)) + packet_type = PACKET_SETTINGS; + else if(!(packet_count % 1569)) + packet_type = PACKET_FAILSAFE; + else + packet_type = PACKET_STICKS; // todo : check for settings changes + // got some data from RX ? + // we've no way to know if RX fifo has been filled + // as we can't poll GIO1 or GIO2 to check WTR + // we can't check A7105_MASK_TREN either as we know + // it's currently in transmit mode. + if(!(A7105_ReadReg(0) & (1<<5 | 1<<6))) { // FECF+CRCF Ok + A7105_Strobe(A7105_RST_RDPTR); + A7105_ReadData(1); + if(packet[0] == 0xaa) { A7105_Strobe(A7105_RST_RDPTR); A7105_ReadData(RXPACKET_SIZE); - if(packet[0] == 0xbc) { - for(uint8_t i=0; i<4; i++) { - rxid[i] = packet[5+i]; - } - eeprom_write_block((const void*)rxid,(void*)EEPROMadress,4); - if(packet[9] == 0x01) - phase = BIND4; + if(packet[9] == 0xfc) { // rx is asking for settings + packet_type=PACKET_SETTINGS; + } + else { + update_telemetry(); } } - packet_count++; - phase |= WAIT_WRITE; - return 1700; - case BIND1|WAIT_WRITE: - case BIND2|WAIT_WRITE: - case BIND3|WAIT_WRITE: - A7105_Strobe(A7105_RX); - phase &= ~WAIT_WRITE; - phase++; - if(phase > BIND3) - phase = BIND1; - return 2150; - case BIND4: - A7105_Strobe(A7105_STANDBY); - afhds2a_build_bind_packet(); - A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); - packet_count++; - bind_reply++; - if(bind_reply>=4) { - packet_count=0; - channel=1; - phase = DATA1; - BIND_DONE; - } - phase |= WAIT_WRITE; - return 1700; - case BIND4|WAIT_WRITE: - A7105_Strobe(A7105_RX); - phase &= ~WAIT_WRITE; - return 2150; - case DATA1: - A7105_Strobe(A7105_STANDBY); - build_packet(packet_type); - A7105_WriteData(38, hopping_frequency[channel++]); - if(channel >= 16) - channel = 0; - if(!(packet_count % 1313)) - packet_type = PACKET_SETTINGS; - else if(!(packet_count % 1569)) - packet_type = PACKET_FAILSAFE; - else - packet_type = PACKET_STICKS; // todo : check for settings changes - // got some data from RX ? - // we've no way to know if RX fifo has been filled - // as we can't poll GIO1 or GIO2 to check WTR - // we can't check A7105_MASK_TREN either as we know - // it's currently in transmit mode. - if(!(A7105_ReadReg(0) & (1<<5 | 1<<6))) { // FECF+CRCF Ok - A7105_Strobe(A7105_RST_RDPTR); - A7105_ReadData(1); - if(packet[0] == 0xaa) { - A7105_Strobe(A7105_RST_RDPTR); - A7105_ReadData(RXPACKET_SIZE); - if(packet[9] == 0xfc) { // rx is asking for settings - packet_type=PACKET_SETTINGS; - } - else { - #if defined(TELEMETRY) - update_telemetry(); - #endif - } - } - } - packet_count++; - phase |= WAIT_WRITE; - return 1700; - case DATA1|WAIT_WRITE: - phase &= ~WAIT_WRITE; - A7105_Strobe(A7105_RX); - return 2150; - } - return 3850; // never reached, please the compiler + } + packet_count++; + phase |= WAIT_WRITE; + return 1700; + case DATA1|WAIT_WRITE: + phase &= ~WAIT_WRITE; + A7105_Strobe(A7105_RX); + return 2150; + } + return 3850; // never reached, please the compiler +} + +static uint16_t AFHDS2A_setup() +{ + A7105_Init(INIT_FLYSKY_AFHDS2A); //flysky_init(); + for (uint8_t i = 0; i < 4; ++i) { + txid[i] = rx_tx_addr[i]; } - static uint16_t AFHDS2A_setup() - { - A7105_Init(INIT_FLYSKY_AFHDS2A); //flysky_init(); - for (u8 i = 0; i < TXID_SIZE; ++i) { - txid[i] = rx_tx_addr[0]; - } - - calc_afhds_channels(MProtocol_id); - packet_type = PACKET_STICKS; - packet_count = 0; - bind_reply = 0; - if(IS_AUTOBIND_FLAG_on) { - phase = BIND1; - BIND_IN_PROGRESS; - } - else { - phase = DATA1; - eeprom_read_block((void*)rxid,(const void*)EEPROMadress,4); - } - channel = 0; - return 50000; + calc_afhds_channels(); + packet_type = PACKET_STICKS; + packet_count = 0; + bind_reply = 0; + if(IS_AUTOBIND_FLAG_on) { + phase = BIND1; + BIND_IN_PROGRESS; } + else { + phase = DATA1; + eeprom_read_block((void*)rxid,(EE_ADDR)EEPROMadress,4); + } + channel = 0; + return 50000; +} #endif diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index be159b3..e0a2113 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -274,13 +274,14 @@ uint16_t ReadFrSkyX() return 3000; case FRSKY_DATA4: len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; - if (len && (len. */ - #include #include //#define DEBUG_TX -#include "Pins.h" #include "Multiprotocol.h" //Multiprotocol module configuration file #include "_Config.h" +#include "Pins.h" #include "TX_Def.h" +#include "Validate.h" -#ifdef XMEGA - #undef ENABLE_PPM // Disable PPM for OrangeTX module - #undef A7105_INSTALLED // Disable A7105 for OrangeTX module - #undef CC2500_INSTALLED // Disable CC2500 for OrangeTX module - #undef NRF24L01_INSTALLED // Disable NRF for OrangeTX module - #define TELEMETRY // Enable telemetry - #define INVERT_TELEMETRY // Enable invert telemetry - #define DSM_TELEMETRY // Enable DSM telemetry +#ifndef STM32_BOARD + #include +#else +/* + #include + #include + #include + #include + #include + HardwareTimer timer(2); + void PPM_decode(); + void ISR_COMPB(); + extern "C" + { + void __irq_usart2(void); + void __irq_usart3(void); + } +*/ #endif //Global constants/variables @@ -58,7 +68,7 @@ uint16_t servo_max_100,servo_min_100,servo_max_125,servo_min_125; // Protocol variables uint8_t cyrfmfg_id[6];//for dsm2 and devo -uint8_t rx_tx_addr[5]; +uint8_t rx_tx_addr[5]; uint8_t phase; uint16_t bind_counter; uint8_t bind_phase; @@ -98,7 +108,7 @@ uint8_t protocol_flags=0,protocol_flags2=0; // PPM variable volatile uint16_t PPM_data[NUM_CHN]; -#ifndef XMEGA +#ifndef ORANGE_TX //Random variable volatile uint32_t gWDT_entropy=0; #endif @@ -118,35 +128,13 @@ volatile uint8_t rx_buff[RXBUFFER_SIZE]; volatile uint8_t rx_ok_buff[RXBUFFER_SIZE]; volatile uint8_t discard_frame = 0; -//Make sure telemetry is selected correctly -#ifndef TELEMETRY - #undef INVERT_TELEMETRY - #undef DSM_TELEMETRY - #undef SPORT_TELEMETRY - #undef HUB_TELEMETRY -#else - #if not defined(CYRF6936_INSTALLED) || not defined(DSM_CYRF6936_INO) - #undef DSM_TELEMETRY - #endif - #if (not defined(CC2500_INSTALLED) || not defined(FRSKYD_CC2500_INO)) && (not defined(A7105_INSTALLED) || not defined(HUBSAN_A7105_INO)) - #undef HUB_TELEMETRY - #endif - #if not defined(CC2500_INSTALLED) || not defined(FRSKYX_CC2500_INO) - #undef SPORT_TELEMETRY - #endif -#endif -#if not defined(DSM_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(SPORT_TELEMETRY) - #undef TELEMETRY - #undef INVERT_TELEMETRY -#endif - // Telemetry #define MAX_PKT 27 uint8_t pkt[MAX_PKT];//telemetry receiving packets #if defined(TELEMETRY) #ifdef INVERT_TELEMETRY - // enable bit bash for serial - #ifndef XMEGA + #if not defined(ORANGE_TX) && not defined(STM32_BOARD) + // enable bit bash for serial #define BASH_SERIAL 1 #endif #define INVERT_SERIAL 1 @@ -161,9 +149,9 @@ uint8_t pkt[MAX_PKT];//telemetry receiving packets #endif // BASH_SERIAL uint8_t v_lipo; int16_t RSSI_dBm; - //const uint8_t RSSI_offset=72;//69 71.72 values db uint8_t telemetry_link=0; uint8_t telemetry_counter=0; + uint8_t telemetry_lost; #endif // Callback @@ -173,8 +161,9 @@ void_function_t remote_callback = 0; // Init void setup() { - #ifdef XMEGA // General pinout + #ifdef ORANGE_TX + //XMEGA PORTD.OUTSET = 0x17 ; PORTD.DIRSET = 0xB2 ; PORTD.DIRCLR = 0x4D ; @@ -190,11 +179,43 @@ void setup() TCC1.PER = 0xFFFF ; TCNT1 = 0 ; TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) + #elif defined STM32_BOARD + //STM32 + pinMode(A7105_CSN_pin,OUTPUT); + pinMode(CC25_CSN_pin,OUTPUT); + pinMode(NRF_CSN_pin,OUTPUT); + pinMode(CYRF_CSN_pin,OUTPUT); + pinMode(CYRF_RST_pin,OUTPUT); + pinMode(PE1_pin,OUTPUT); + pinMode(PE2_pin,OUTPUT); + #if defined TELEMETRY + pinMode(TX_INV_pin,OUTPUT); + pinMode(RX_INV_pin,OUTPUT); + #if defined INVERT_SERIAL + TX_INV_on;//activated inverter for both serial TX and RX signals + RX_INV_on; + #else + TX_INV_off; + RX_INV_off; + #endif + #endif + pinMode(BIND_pin,INPUT_PULLUP); + pinMode(PPM_pin,INPUT); + pinMode(S1_pin,INPUT_PULLUP);//dial switch + pinMode(S2_pin,INPUT_PULLUP); + pinMode(S3_pin,INPUT_PULLUP); + pinMode(S4_pin,INPUT_PULLUP); + //Random pins + pinMode(PB0, INPUT_ANALOG); // set up pin for analog input + pinMode(PB1, INPUT_ANALOG); // set up pin for analog input + + //select the counter clock. + start_timer2();//0.5us #else - // General pinout + //ATMEGA328p // all inputs DDRB=0x00;DDRC=0x00;DDRD=0x00; - // outputs + // outputs SDI_output; SCLK_output; #ifdef A7105_INSTALLED @@ -243,8 +264,12 @@ void setup() NRF_CSN_on; #endif // Set SPI lines - SDI_on; - SCLK_off; + #ifdef STM32_BOARD + initSPI2(); + #else + SDI_on; + SCLK_off; + #endif // Set servos positions for(uint8_t i=0;iregs->IDR)>>4)&0x0F); #else // mode_select=0x0F - ( ( (PINB>>2)&0x07 ) | ( (PINC<<3)&0x08) );//encoder dip switches 1,2,4,8=>B2,B3,B4,C0 mode_select = @@ -281,9 +308,13 @@ void setup() //Init RF modules modules_reset(); - #ifndef XMEGA + #ifndef ORANGE_TX //Init the seed with a random value created from watchdog timer for all protocols requiring random values - randomSeed(random_value()); + #ifdef STM32_BOARD + randomSeed((uint32_t)analogRead(PB0) << 10 | analogRead(PB1)); + #else + randomSeed(random_value()); + #endif #endif // Read or create protocol id @@ -308,16 +339,20 @@ void setup() protocol_init(); - //Configure PPM interrupt - #if PPM_pin == 2 - EICRA |= _BV(ISC01); // The rising edge of INT0 pin D2 generates an interrupt request - EIMSK |= _BV(INT0); // INT0 interrupt enable - #elif PPM_pin == 3 - EICRA |=_BV(ISC11); // The rising edge of INT1 pin D3 generates an interrupt request - EIMSK |= _BV(INT1); // INT1 interrupt enable - #else - #error PPM pin can only be 2 or 3 - #endif + #ifndef STM32_BOARD + //Configure PPM interrupt + #if PPM_pin == 2 + EICRA |= _BV(ISC01); // The rising edge of INT0 pin D2 generates an interrupt request + EIMSK |= _BV(INT0); // INT0 interrupt enable + #elif PPM_pin == 3 + EICRA |=_BV(ISC11); // The rising edge of INT1 pin D3 generates an interrupt request + EIMSK |= _BV(INT1); // INT1 interrupt enable + #else + #error PPM pin can only be 2 or 3 + #endif + #else + attachInterrupt(PPM_pin,PPM_decode,FALLING); + #endif #if defined(TELEMETRY) PPM_Telemetry_serial_init(); // Configure serial for telemetry @@ -353,14 +388,25 @@ void loop() } while(remote_callback==0); } - if( (TIFR1 & OCF1A_bm) != 0) - { - cli(); // Disable global int due to RW of 16 bits registers - OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point. - sei(); // Enable global int - } - else - while((TIFR1 & OCF1A_bm) == 0); // Wait before callback + #ifndef STM32_BOARD + if( (TIFR1 & OCF1A_bm) != 0) + { + cli(); // Disable global int due to RW of 16 bits registers + OCR1A=TCNT1; // Callback should already have been called... Use "now" as new sync point. + sei(); // Enable global int + } + else + while((TIFR1 & OCF1A_bm) == 0); // Wait before callback + #else + if((TIMER2_BASE->SR & TIMER_SR_CC1IF)!=0) + { + cli(); + OCR1A = TCNT1; + sei(); + } + else + while((TIMER2_BASE->SR & TIMER_SR_CC1IF )==0); // Wait before callback + #endif do { TX_MAIN_PAUSE_on; @@ -373,18 +419,30 @@ void loop() next_callback-=2000; // We will wait below for 2ms cli(); // Disable global int due to RW of 16 bits registers OCR1A += 2000*2 ; // set compare A for callback + #ifndef STM32_BOARD TIFR1=OCF1A_bm; // clear compare A=callback flag + #else + TIMER2_BASE->SR &= ~TIMER_SR_CC1IF; //clear compare Flag + #endif sei(); // enable global int Update_All(); if(IS_CHANGE_PROTOCOL_FLAG_on) break; // Protocol has been changed - while((TIFR1 & OCF1A_bm) == 0); // wait 2ms... + #ifndef STM32_BOARD + while((TIFR1 & OCF1A_bm) == 0); // wait 2ms... + #else + while((TIMER2_BASE->SR & TIMER_SR_CC1IF)==0);//2ms wait + #endif } // at this point we have a maximum of 4ms in next_callback next_callback *= 2 ; cli(); // Disable global int due to RW of 16 bits registers OCR1A+= next_callback ; // set compare A for callback - TIFR1=OCF1A_bm; // clear compare A=callback flag + #ifndef STM32_BOARD + TIFR1=OCF1A_bm; // clear compare A=callback flag + #else + TIMER2_BASE->SR &= ~TIMER_SR_CC1IF; //clear compare Flag write zero + #endif diff=OCR1A-TCNT1; // compare timer and comparator sei(); // enable global int } @@ -400,13 +458,6 @@ void Update_All() { update_serial_data(); // Update protocol and data update_aux_flags(); - if(Servo_data[AUX10]>PPM_SWITCH && !( (cur_protocol[0]&0x1F)==MODE_FRSKYD || (cur_protocol[0]&0x1F)==MODE_DSM || (cur_protocol[0]&0x1F)==MODE_AFHDS2A ) ) { CHANGE_PROTOCOL_FLAG_on; } // Rebind voie - if(IS_CHANGE_PROTOCOL_FLAG_on) - { // Protocol needs to be changed - LED_off; //led off during protocol init - modules_reset(); //reset all modules - protocol_init(); //init new protocol - } } #endif //ENABLE_SERIAL #ifdef ENABLE_PPM @@ -440,6 +491,16 @@ static void update_aux_flags(void) for(uint8_t i=0;i<8;i++) if(Servo_data[AUX1+i]>PPM_SWITCH) Servo_AUX|=1<PPM_SWITCH && !( (cur_protocol[0]&0x1F)==MODE_FRSKYD || (cur_protocol[0]&0x1F)==MODE_DSM || (cur_protocol[0]&0x1F)==MODE_AFHDS2A ) ) { CHANGE_PROTOCOL_FLAG_on; } // Rebind voie + if(IS_CHANGE_PROTOCOL_FLAG_on) + { // Protocol needs to be changed + LED_off; //led off during protocol init + modules_reset(); //reset all modules + #ifdef ENABLE_PPM + AUTOBIND_FLAG_on; + #endif //ENABLE_PPM + protocol_init(); //init new protocol + } } // Update led status based on binding and serial @@ -468,12 +529,14 @@ static void update_led_status(void) inline void tx_pause() { - #ifdef TELEMETRY - #ifdef XMEGA - USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt - #else - #ifndef BASH_SERIAL - UCSR0B &= ~_BV(UDRIE0); // Pause telemetry by disabling transmitter interrupt + #ifndef STM32_BOARD + #ifdef TELEMETRY + #ifdef ORANGE_TX + USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt + #else + #ifndef BASH_SERIAL + UCSR0B &= ~_BV(UDRIE0); // Pause telemetry by disabling transmitter interrupt + #endif #endif #endif #endif @@ -481,24 +544,41 @@ inline void tx_pause() inline void tx_resume() { - #ifdef TELEMETRY - if(!IS_TX_PAUSE_on) - { - #ifdef XMEGA - cli() ; - USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt - sei() ; - #else - #ifndef BASH_SERIAL - UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt + #ifndef STM32_BOARD + #ifdef TELEMETRY + if(!IS_TX_PAUSE_on) + { + #ifdef ORANGE_TX + cli() ; + USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt + sei() ; #else - resumeBashSerial() ; - #endif - #endif - } + #ifndef BASH_SERIAL + UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt + #else + resumeBashSerial() ; + #endif + #endif + } + #endif #endif } +#ifdef STM32_BOARD + void start_timer2() + { + // Pause the timer while we're configuring it + timer.pause(); + TIMER2_BASE->PSC = 35; //36-1;for 72 MHZ /0.5sec/(35+1) + TIMER2_BASE->ARR = 0xFFFF; //count till max + timer.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE); + timer.setMode(TIMER_CH2, TIMER_OUTPUT_COMPARE); + // Refresh the timer's count, prescale, and overflow + timer.refresh(); + timer.resume(); + } +#endif + // Protocol start static void protocol_init() { @@ -510,6 +590,7 @@ static void protocol_init() tx_pause(); pass=0; telemetry_link=0; + telemetry_lost=1; #ifndef BASH_SERIAL tx_tail=0; tx_head=0; @@ -624,12 +705,12 @@ static void protocol_init() { if(IS_BIND_BUTTON_FLAG_on) { - eeprom_write_byte((uint8_t*)(30+mode_select),0x00); // reset to autobind mode for the current model + eeprom_write_byte((EE_ADDR)(30+mode_select),0x00); // reset to autobind mode for the current model option=0; } else { - option=eeprom_read_byte((uint8_t*)(30+mode_select)); // load previous mode: autobind or fixed id + option=eeprom_read_byte((EE_ADDR)(30+mode_select)); // load previous mode: autobind or fixed id if(option!=1) option=0; // if not fixed id mode then it should be autobind } } @@ -817,7 +898,11 @@ static void protocol_init() cli(); // disable global int OCR1A=TCNT1+next_callback*2; // set compare A for callback sei(); // enable global int - TIFR1 = OCF1A_bm ; // clear compare A flag + #ifndef STM32_BOARD + TIFR1 = OCF1A_bm ; // clear compare A flag + #else + TIMER2_BASE->SR &= ~TIMER_SR_CC1IF; //clear compare Flag write zero + #endif BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change } @@ -873,7 +958,7 @@ void update_serial_data() Servo_data[i]=((((*((uint32_t *)p))>>dec)&0x7FF)*5)/8+860; //value range 860<->2140 -125%<->+125% } RX_DONOTUPDTAE_off; - #ifdef XMEGA + #ifdef ORANGE_TX cli(); #else UCSR0B &= ~_BV(RXCIE0); // RX interrupt disable @@ -883,7 +968,7 @@ void update_serial_data() RX_FLAG_on; // data to be processed next time... RX_MISSED_BUFF_off; } - #ifdef XMEGA + #ifdef ORANGE_TX sei(); #else UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable @@ -912,7 +997,7 @@ void modules_reset() void Mprotocol_serial_init() { - #ifdef XMEGA + #ifdef ORANGE_TX PORTC.OUTSET = 0x08 ; PORTC.DIRSET = 0x08 ; @@ -923,10 +1008,17 @@ void Mprotocol_serial_init() USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; USARTC0.CTRLC = 0x2B ; UDR0 ; - #ifdef INVERT_TELEMETRY + #ifdef INVERT_SERIAL PORTC.PIN3CTRL |= 0x40 ; #endif + #elif defined STM32_BOARD + Serial1.begin(100000,SERIAL_8E2);//USART2 + Serial2.begin(100000,SERIAL_8E2);//USART3 + USART2_BASE->CR1 |= USART_CR1_PCE_BIT; + USART3_BASE->CR1 &= ~ USART_CR1_RE;//disable + USART2_BASE->CR1 &= ~ USART_CR1_TE;//disable transmit #else + //ATMEGA328p #include UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE; @@ -942,7 +1034,7 @@ void Mprotocol_serial_init() initTXSerial( SPEED_100K ) ; #endif //TELEMETRY #endif //DEBUG_TX - #endif //XMEGA + #endif //ORANGE_TX } #if defined(TELEMETRY) @@ -967,7 +1059,7 @@ static void set_rx_tx_addr(uint32_t id) rx_tx_addr[4] = (rx_tx_addr[2]&0xF0)|(rx_tx_addr[3]&0x0F); } -#ifndef XMEGA +#if not defined (ORANGE_TX) && not defined (STM32_BOARD) static void random_init(void) { cli(); // Temporarily turn off interrupts, until WDT configured @@ -986,25 +1078,35 @@ static uint32_t random_value(void) static uint32_t random_id(uint16_t adress, uint8_t create_new) { - #define nb_txid 5 - uint32_t id; - uint8_t txid[nb_txid]; + uint32_t id=0; - if (eeprom_read_byte((uint8_t*)(adress+10))==0xf0 && !create_new) + if(eeprom_read_byte((EE_ADDR)(adress+10))==0xf0 && !create_new) { // TXID exists in EEPROM - eeprom_read_block((void*)txid,(const void*)adress,nb_txid); - id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24)); +// eeprom_read_block((void*)txid,(const void*)adress,nb_txid); +// id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24)); + for(uint8_t i=4;i>0;i--) + { + id<<=8; + id|=eeprom_read_byte((EE_ADDR)adress+i-1); + } if(id!=0x2AD141A7) //ID with seed=0 return id; } // Generate a random ID id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); - txid[0]= (id &0xFF); +/* txid[0]= (id &0xFF); txid[1] = ((id >> 8) & 0xFF); txid[2] = ((id >> 16) & 0xFF); txid[3] = ((id >> 24) & 0xFF); eeprom_write_block((const void*)txid,(void*)adress,nb_txid); eeprom_write_byte((uint8_t*)(adress+10),0xf0);//write bind flag in eeprom. +*/ + for(uint8_t i=0;i<4;i++) + { + eeprom_write_byte((EE_ADDR)adress+i,id); + id>>=8; + } + eeprom_write_byte((EE_ADDR)(adress+10),0xf0);//write bind flag in eeprom. return id; } @@ -1016,12 +1118,14 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) //PPM #ifdef ENABLE_PPM - #ifdef XMEGA + #ifdef ORANGE_TX #if PPM_pin == 2 ISR(PORTD_INT0_vect) #else ISR(PORTD_INT1_vect) #endif + #elif defined STM32_BOARD + void PPM_decode() #else #if PPM_pin == 2 ISR(INT0_vect, ISR_NOBLOCK) @@ -1056,15 +1160,19 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) //Serial RX #ifdef ENABLE_SERIAL - #ifdef XMEGA + #ifdef ORANGE_TX ISR(USARTC0_RXC_vect) + #elif defined STM32_BOARD + void __irq_usart2() #else ISR(USART_RX_vect) #endif { // RX interrupt static uint8_t idx=0; - #ifdef XMEGA + #ifdef ORANGE_TX if((USARTC0.STATUS & 0x1C)==0) // Check frame error, data overrun and parity error + #elif defined STM32_BOARD + if((USART2_BASE->SR & USART_SR_RXNE) && (USART2_BASE->SR &0x0F)==0) #else UCSR0B &= ~_BV(RXCIE0) ; // RX interrupt disable sei() ; @@ -1078,11 +1186,18 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) rx_buff[0]=UDR0; if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok { - TX_RX_PAUSE_on; - tx_pause(); - OCR1B = TCNT1+(6500L) ; // Full message should be received within timer of 3250us - TIFR1 = OCF1B_bm ; // clear OCR1B match flag - SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match + #if defined STM32_BOARD + uint16_t OCR1B; + OCR1B =TCNT1+(6500L); + timer.setCompare(TIMER_CH2,OCR1B); + timer.attachCompare2Interrupt(ISR_COMPB); + #else + TX_RX_PAUSE_on; + tx_pause(); + OCR1B = TCNT1+(6500L) ; // Full message should be received within timer of 3250us + TIFR1 = OCF1B_bm ; // clear OCR1B match flag + SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match + #endif idx++; } } @@ -1109,52 +1224,62 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) } if(discard_frame==1) { - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - TX_RX_PAUSE_off; - tx_resume(); + #ifdef STM32_BOARD + detachInterrupt(2); // Disable interrupt on ch2 + #else + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match + TX_RX_PAUSE_off; + tx_resume(); + #endif } - #ifndef XMEGA + #if not defined (ORANGE_TX) && not defined (STM32_BOARD) cli() ; UCSR0B |= _BV(RXCIE0) ; // RX interrupt enable #endif } //Serial timer - #ifdef XMEGA + #ifdef ORANGE_TX ISR(TCC1_CCB_vect) + #elif defined STM32_BOARD + void ISR_COMPB() #else ISR(TIMER1_COMPB_vect, ISR_NOBLOCK ) #endif { // Timer1 compare B interrupt discard_frame=1; - CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - tx_resume(); + #ifdef STM32_BOARD + detachInterrupt(2); // Disable interrupt on ch2 + #else + CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match + tx_resume(); + #endif } #endif //ENABLE_SERIAL -#ifndef XMEGA -// Random interrupt service routine called every time the WDT interrupt is triggered. -// It is only enabled at startup to generate a seed. -ISR(WDT_vect) -{ - static uint8_t gWDT_buffer_position=0; - #define gWDT_buffer_SIZE 32 - static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; - gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) - gWDT_buffer_position++; // every time the WDT interrupt is triggered - if (gWDT_buffer_position >= gWDT_buffer_SIZE) +#if not defined (ORANGE_TX) && not defined (STM32_BOARD) + // Random interrupt service routine called every time the WDT interrupt is triggered. + // It is only enabled at startup to generate a seed. + ISR(WDT_vect) { - // The following code is an implementation of Jenkin's one at a time hash - for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) + static uint8_t gWDT_buffer_position=0; + #define gWDT_buffer_SIZE 32 + static uint8_t gWDT_buffer[gWDT_buffer_SIZE]; + gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) + gWDT_buffer_position++; // every time the WDT interrupt is triggered + if (gWDT_buffer_position >= gWDT_buffer_SIZE) { - gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; - gWDT_entropy += (gWDT_entropy << 10); - gWDT_entropy ^= (gWDT_entropy >> 6); + // The following code is an implementation of Jenkin's one at a time hash + for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter) + { + gWDT_entropy += gWDT_buffer[gWDT_loop_counter]; + gWDT_entropy += (gWDT_entropy << 10); + gWDT_entropy ^= (gWDT_entropy >> 6); + } + gWDT_entropy += (gWDT_entropy << 3); + gWDT_entropy ^= (gWDT_entropy >> 11); + gWDT_entropy += (gWDT_entropy << 15); + WDTCSR = 0; // Disable Watchdog interrupt } - gWDT_entropy += (gWDT_entropy << 3); - gWDT_entropy ^= (gWDT_entropy >> 11); - gWDT_entropy += (gWDT_entropy << 15); - WDTCSR = 0; // Disable Watchdog interrupt } -} #endif \ No newline at end of file diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index c9073e5..37faed1 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -14,9 +14,7 @@ */ -//--------------------------- -// AVR nrf chip bitbang SPI functions -//--------------------------- +#ifdef NRF24L01_INSTALLED #include "iface_nrf24l01.h" @@ -189,7 +187,8 @@ void NRF24L01_SetTxRxMode(enum TXRX_State mode) NRF_CE_on; } else - if (mode == RX_EN) { + if (mode == RX_EN) + { NRF_CE_off; NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // reset the flag(s) NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x0F); // switch to RX mode @@ -335,7 +334,7 @@ void XN297_Configure(uint8_t flags) NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF); } -void XN297_SetScrambledMode(const u8 mode) +void XN297_SetScrambledMode(const uint8_t mode) { xn297_scramble_enabled = mode; } @@ -591,3 +590,4 @@ void LT8900_WritePayload(uint8_t* msg, uint8_t len) NRF24L01_WritePayload(LT8900_buffer+LT8900_buffer_start,pos_final+pos-LT8900_buffer_start); } // End of LT8900 emulation +#endif diff --git a/Multiprotocol/Nrf24l01_hm830.ino b/Multiprotocol/Nrf24l01_hm830.ino index d81d809..6dd6f43 100644 --- a/Multiprotocol/Nrf24l01_hm830.ino +++ b/Multiprotocol/Nrf24l01_hm830.ino @@ -1,10 +1,11 @@ /* - 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. - Deviation 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 Deviation. If not, see . + 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. + Deviation 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 Deviation. If not, see . */ -/* This protocol is for the HM Hobby HM830 RC Paper Airplane +/* + This protocol is for the HM Hobby HM830 RC Paper Airplane Protocol spec: Channel data: AA BB CC DD EE FF GG diff --git a/Multiprotocol/Pins.h b/Multiprotocol/Pins.h index 463d395..d82975a 100644 --- a/Multiprotocol/Pins.h +++ b/Multiprotocol/Pins.h @@ -15,195 +15,338 @@ //******************* //*** Pinouts *** //******************* +#ifndef STM32_BOARD + // TX + #define SERIAL_TX_pin 1 //PD1 + #define SERIAL_TX_port PORTD + #define SERIAL_TX_ddr DDRD + #define SERIAL_TX_output SERIAL_TX_ddr |= _BV(SERIAL_TX_pin) + #define SERIAL_TX_on SERIAL_TX_port |= _BV(SERIAL_TX_pin) + #define SERIAL_TX_off SERIAL_TX_port &= ~_BV(SERIAL_TX_pin) + #ifdef DEBUG_TX + #define DEBUG_TX_on SERIAL_TX_on + #define DEBUG_TX_off SERIAL_TX_off + #define DEBUG_TX_toggle SERIAL_TX_port ^= _BV(SERIAL_TX_pin) + #else + #define DEBUG_TX_on + #define DEBUG_TX_off + #define DEBUG_TX_toggle + #endif -// TX -#define SERIAL_TX_pin 1 //PD1 -#define SERIAL_TX_port PORTD -#define SERIAL_TX_ddr DDRD -#define SERIAL_TX_output SERIAL_TX_ddr |= _BV(SERIAL_TX_pin) -#define SERIAL_TX_on SERIAL_TX_port |= _BV(SERIAL_TX_pin) -#define SERIAL_TX_off SERIAL_TX_port &= ~_BV(SERIAL_TX_pin) -#ifdef DEBUG_TX - #define DEBUG_TX_on SERIAL_TX_ON - #define DEBUG_TX_off SERIAL_TX_OFF - #define DEBUG_TX_toggle SERIAL_TX_port ^= _BV(SERIAL_TX_pin) -#else - #define DEBUG_TX_on - #define DEBUG_TX_off - #define DEBUG_TX_toggle + // 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 + + // PPM + #define PPM_pin 3 //D3 = PD3 + #define PPM_port PORTD + + // SDIO + #define SDI_pin 5 //D5 = PD5 + #define SDI_port PORTD + #define SDI_ipr PIND + #define SDI_ddr DDRD + #ifdef ORANGE_TX + #define SDI_on SDI_port.OUTSET = _BV(SDI_pin) + #define SDI_off SDI_port.OUTCLR = _BV(SDI_pin) + #else + #define SDI_on SDI_port |= _BV(SDI_pin) + #define SDI_off SDI_port &= ~_BV(SDI_pin) + #define SDI_1 (SDI_ipr & _BV(SDI_pin)) + #define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00 + #endif + #define SDI_input SDI_ddr &= ~_BV(SDI_pin) + #define SDI_output SDI_ddr |= _BV(SDI_pin) + + //SDO + #define SDO_pin 6 //D6 = PD6 + #define SDO_port PORTD + #define SDO_ipr PIND + #ifdef ORANGE_TX + #define SDO_1 (SDO_port.IN & _BV(SDO_pin)) + #define SDO_0 (SDO_port.IN & _BV(SDO_pin)) == 0x00 + #else + #define SDO_1 (SDO_ipr & _BV(SDO_pin)) + #define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00 + #endif + + // SCLK + #define SCLK_port PORTD + #define SCLK_ddr DDRD + #ifdef ORANGE_TX + #define SCLK_pin 7 //PD7 + #define SCLK_on SCLK_port.OUTSET = _BV(SCLK_pin) + #define SCLK_off SCLK_port.OUTCLR = _BV(SCLK_pin) + #else + #define SCLK_pin 4 //D4 = PD4 + #define SCLK_output SCLK_ddr |= _BV(SCLK_pin) + #define SCLK_on SCLK_port |= _BV(SCLK_pin) + #define SCLK_off SCLK_port &= ~_BV(SCLK_pin) + #endif + + // A7105 + #define A7105_CSN_pin 2 //D2 = PD2 + #define A7105_CSN_port PORTD + #define A7105_CSN_ddr DDRD + #define A7105_CSN_output A7105_CSN_ddr |= _BV(A7105_CSN_pin) + #define A7105_CSN_on A7105_CSN_port |= _BV(A7105_CSN_pin) + #define A7105_CSN_off A7105_CSN_port &= ~_BV(A7105_CSN_pin) + + // CC2500 + #define CC25_CSN_pin 7 //D7 = PD7 + #define CC25_CSN_port PORTD + #define CC25_CSN_ddr DDRD + #define CC25_CSN_output CC25_CSN_ddr |= _BV(CC25_CSN_pin) + #define CC25_CSN_on CC25_CSN_port |= _BV(CC25_CSN_pin) + #define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin) + + // NRF24L01 + #define NRF_CSN_pin 0 //D8 = PB0 + #define NRF_CSN_port PORTB + #define NRF_CSN_ddr DDRB + #define NRF_CSN_output NRF_CSN_ddr |= _BV(NRF_CSN_pin) + #define NRF_CSN_on NRF_CSN_port |= _BV(NRF_CSN_pin) + #define NRF_CSN_off NRF_CSN_port &= ~_BV(NRF_CSN_pin) + #define NRF_CE_on + #define NRF_CE_off + + // CYRF6936 + #ifdef ORANGE_TX + #define CYRF_CSN_pin 4 //PD4 + #define CYRF_CSN_port PORTD + #define CYRF_CSN_ddr DDRD + #define CYRF_CSN_on CYRF_CSN_port.OUTSET = _BV(CYRF_CSN_pin) + #define CYRF_CSN_off CYRF_CSN_port.OUTCLR = _BV(CYRF_CSN_pin) + + #define CYRF_RST_pin 0 //PE0 + #define CYRF_RST_port PORTE + #define CYRF_RST_ddr DDRE + #define CYRF_RST_HI CYRF_RST_port.OUTSET = _BV(CYRF_RST_pin) + #define CYRF_RST_LO CYRF_RST_port.OUTCLR = _BV(CYRF_RST_pin) + #else + #define CYRF_CSN_pin 1 //D9 = PB1 + #define CYRF_CSN_port PORTB + #define CYRF_CSN_ddr DDRB + #define CYRF_CSN_output CYRF_CSN_ddr |= _BV(CYRF_CSN_pin) + #define CYRF_CSN_on CYRF_CSN_port |= _BV(CYRF_CSN_pin) + #define CYRF_CSN_off CYRF_CSN_port &= ~_BV(CYRF_CSN_pin) + + #define CYRF_RST_pin 5 //A5 = PC5 + #define CYRF_RST_port PORTC + #define CYRF_RST_ddr DDRC + #define CYRF_RST_output CYRF_RST_ddr |= _BV(CYRF_RST_pin) + #define CYRF_RST_HI CYRF_RST_port |= _BV(CYRF_RST_pin) + #define CYRF_RST_LO CYRF_RST_port &= ~_BV(CYRF_RST_pin) + #endif + + //RF Switch + #ifdef ORANGE_TX + #define PE1_on + #define PE1_off + #define PE2_on + #define PE2_off + #else + #define PE1_pin 1 //A1 = PC1 + #define PE1_port PORTC + #define PE1_ddr DDRC + #define PE1_output PE1_ddr |= _BV(PE1_pin) + #define PE1_on PE1_port |= _BV(PE1_pin) + #define PE1_off PE1_port &= ~_BV(PE1_pin) + + #define PE2_pin 2 //A2 = PC2 + #define PE2_port PORTC + #define PE2_ddr DDRC + #define PE2_output PE2_ddr |= _BV(PE2_pin) + #define PE2_on PE2_port |= _BV(PE2_pin) + #define PE2_off PE2_port &= ~_BV(PE2_pin) + #endif + + // LED + #ifdef ORANGE_TX + #define LED_pin 1 //PD1 + #define LED_port PORTD + #define LED_ddr DDRD + #define LED_on LED_port.OUTCLR = _BV(LED_pin) + #define LED_off LED_port.OUTSET = _BV(LED_pin) + #define LED_toggle LED_port.OUTTGL = _BV(LED_pin) + #define LED_output LED_port.DIRSET = _BV(LED_pin) + #define IS_LED_on (LED_port.OUT & _BV(LED_pin)) + #else + #define LED_pin 5 //D13 = PB5 + #define LED_port PORTB + #define LED_ddr DDRB + #define LED_on LED_port |= _BV(LED_pin) + #define LED_off LED_port &= ~_BV(LED_pin) + #define LED_toggle LED_port ^= _BV(LED_pin) + #define LED_output LED_ddr |= _BV(LED_pin) + #define IS_LED_on (LED_port & _BV(LED_pin)) + #endif + + //BIND + #ifdef ORANGE_TX + #define BIND_pin 2 //PD2 + #define BIND_port PORTD + #define IS_BIND_BUTTON_on ( (BIND_port.IN & _BV(BIND_pin)) == 0x00 ) + #else + #define BIND_pin 5 //D13 = PB5 + #define BIND_port PORTB + #define BIND_ipr PINB + #define BIND_ddr DDRB + #define BIND_SET_INPUT BIND_ddr &= ~_BV(BIND_pin) + #define BIND_SET_OUTPUT BIND_ddr |= _BV(BIND_pin) + #define BIND_SET_PULLUP BIND_port |= _BV(BIND_pin) + #define IS_BIND_BUTTON_on ( (BIND_ipr & _BV(BIND_pin)) == 0x00 ) + #endif +#else //STM32_BOARD + #define BIND_pin PA0 + #define LED_pin PA1 + // + #define PPM_pin PA8 //PPM 5V tolerant + // + #define S1_pin PA4 //Dial switch pins + #define S2_pin PA5 + #define S3_pin PA6 + #define S4_pin PA7 + // + #define PE1_pin PB4 //PE1 + #define PE2_pin PB5 //PE2 + //CS pins + #define CC25_CSN_pin PB6 //CC2500 + #define NRF_CSN_pin PB7 //NRF24L01 + #define CYRF_RST_pin PB8 //CYRF RESET + #define A7105_CSN_pin PB9 //A7105 + #define CYRF_CSN_pin PB12 //CYRF CSN + //SPI pins + #define SCK_pin PB13 //SCK + #define SDO_pin PB14 //MISO + #define SDI_pin PB15 //MOSI + // + #define TX_INV_pin PB3 + #define RX_INV_pin PB1 + // + #define PE1_on digitalWrite(PE1_pin,HIGH) + #define PE1_off digitalWrite(PE1_pin,LOW) + // + #define PE2_on digitalWrite(PE2_pin,HIGH) + #define PE2_off digitalWrite(PE2_pin,LOW) + + #define A7105_CSN_on digitalWrite(A7105_CSN_pin,HIGH) + #define A7105_CSN_off digitalWrite(A7105_CSN_pin,LOW) + + #define NRF_CE_on + #define NRF_CE_off + + #define SCK_on digitalWrite(SCK_pin,HIGH) + #define SCK_off digitalWrite(SCK_pin,LOW) + + #define SDI_on digitalWrite(SDI_pin,HIGH) + #define SDI_off digitalWrite(SDI_pin,LOW) + + #define SDI_1 (digitalRead(SDI_pin)==HIGH) + #define SDI_0 (digitalRead(SDI_pin)==LOW) + + #define CC25_CSN_on digitalWrite(CC25_CSN_pin,HIGH) + #define CC25_CSN_off digitalWrite(CC25_CSN_pin,LOW) + + #define NRF_CSN_on digitalWrite(NRF_CSN_pin,HIGH) + #define NRF_CSN_off digitalWrite(NRF_CSN_pin,LOW) + + #define CYRF_CSN_on digitalWrite(CYRF_CSN_pin,HIGH) + #define CYRF_CSN_off digitalWrite(CYRF_CSN_pin,LOW) + + #define CYRF_RST_HI digitalWrite(CYRF_RST_pin,HIGH) //reset cyrf + #define CYRF_RST_LO digitalWrite(CYRF_RST_pin,LOW) // + + #define SDO_1 (digitalRead(SDO_pin)==HIGH) + #define SDO_0 (digitalRead(SDO_pin)==LOW) + + #define TX_INV_on digitalWrite(TX_INV_pin,HIGH) + #define TX_INV_off digitalWrite(TX_INV_pin,LOW) + + #define RX_INV_on digitalWrite(RX_INV_pin,HIGH) + #define RX_INV_off digitalWrite(RX_INV_pin,LOW) + + #define LED_on digitalWrite(LED_pin,HIGH) + #define LED_off digitalWrite(LED_pin,LOW) + #define LED_toggle digitalWrite(LED_pin ,!digitalRead(LED_pin)) + #define LED_output pinMode(LED_pin,OUTPUT) + #define IS_LED_on ( digitalRead(LED_pin)==HIGH) + + #define BIND_SET_INPUT pinMode(BIND_pin,INPUT) + #define BIND_SET_PULLUP digitalWrite(BIND_pin,HIGH) + #define BIND_SET_OUTPUT pinMode(BIND_pin,OUTPUT) + #define IS_BIND_BUTTON_on (digitalRead(BIND_pin)==LOW) + + #define cli() noInterrupts() + #define sei() interrupts() + #define delayMilliseconds(x) delay(x) + //TX Pause + #undef TX_MAIN_PAUSE_off + #undef TX_MAIN_PAUSE_on + #undef IS_TX_MAIN_PAUSE_on + #undef TX_RX_PAUSE_off + #undef TX_RX_PAUSE_on + #undef IS_TX_RX_PAUSE_on + #undef IS_TX_PAUSE_on + #define TX_MAIN_PAUSE_off + #define TX_MAIN_PAUSE_on + #define IS_TX_MAIN_PAUSE_on + #define TX_RX_PAUSE_off + #define TX_RX_PAUSE_on + #define IS_TX_RX_PAUSE_on + #define IS_TX_PAUSE_on #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 - -// PPM -#define PPM_pin 3 //D3 = PD3 -#define PPM_port PORTD - -// SDIO -#define SDI_pin 5 //D5 = PD5 -#define SDI_port PORTD -#define SDI_ipr PIND -#define SDI_ddr DDRD -#ifdef XMEGA - #define SDI_on SDI_port.OUTSET = _BV(SDI_pin) - #define SDI_off SDI_port.OUTCLR = _BV(SDI_pin) +//******************* +//*** Timer *** +//******************* +#ifdef ORANGE_TX + #define TIFR1 TCC1.INTFLAGS + #define OCF1A_bm TC1_CCAIF_bm + #define OCR1A TCC1.CCA + #define TCNT1 TCC1.CNT + #define UDR0 USARTC0.DATA + #define OCF1B_bm TC1_CCBIF_bm + #define OCR1B TCC1.CCB + #define TIMSK1 TCC1.INTCTRLB + #define SET_TIMSK1_OCIE1B TIMSK1 = (TIMSK1 & 0xF3) | 0x04 + #define CLR_TIMSK1_OCIE1B TIMSK1 &= 0xF3 #else - #define SDI_on SDI_port |= _BV(SDI_pin) - #define SDI_off SDI_port &= ~_BV(SDI_pin) - #define SDI_1 (SDI_ipr & _BV(SDI_pin)) - #define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00 -#endif -#define SDI_input SDI_ddr &= ~_BV(SDI_pin) -#define SDI_output SDI_ddr |= _BV(SDI_pin) - -//SDO -#define SDO_pin 6 //D6 = PD6 -#define SDO_port PORTD -#define SDO_ipr PIND -#ifdef XMEGA - #define SDO_1 (SDO_port.IN & _BV(SDO_pin)) - #define SDO_0 (SDO_port.IN & _BV(SDO_pin)) == 0x00 -#else - #define SDO_1 (SDO_ipr & _BV(SDO_pin)) - #define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00 + #ifdef STM32_BOARD + #define OCR1A TIMER2_BASE->CCR1 + #define TCNT1 TIMER2_BASE->CNT + #define UDR0 USART2_BASE->DR + #define TIFR1 TIMER2_BASE->SR + #define OCF1A_bm TIMER_SR_CC1IF + #define UCSR0B USART2_BASE->CR1 + #define RXCIE0 USART_CR1_RXNEIE_BIT + #define TXCIE0 USART_CR1_TXEIE_BIT + //#define TIFR1 TIMER2_BASE->SR + #else + #define OCF1A_bm _BV(OCF1A) + #define OCF1B_bm _BV(OCF1B) + #define SET_TIMSK1_OCIE1B TIMSK1 |= _BV(OCIE1B) + #define CLR_TIMSK1_OCIE1B TIMSK1 &=~_BV(OCIE1B) + #endif #endif -// SCLK -#define SCLK_port PORTD -#define SCLK_ddr DDRD -#ifdef XMEGA - #define SCLK_pin 7 //PD7 - #define SCLK_on SCLK_port.OUTSET = _BV(SCLK_pin) - #define SCLK_off SCLK_port.OUTCLR = _BV(SCLK_pin) +//******************* +//*** EEPROM *** +//******************* +#ifdef STM32_BOARD + #define EE_ADDR uint16 + #define eeprom_write_byte EEPROM.write + #define eeprom_read_byte EEPROM.read #else - #define SCLK_pin 4 //D4 = PD4 - #define SCLK_output SCLK_ddr |= _BV(SCLK_pin) - #define SCLK_on SCLK_port |= _BV(SCLK_pin) - #define SCLK_off SCLK_port &= ~_BV(SCLK_pin) -#endif - -// A7105 -#define A7105_CSN_pin 2 //D2 = PD2 -#define A7105_CSN_port PORTD -#define A7105_CSN_ddr DDRD -#define A7105_CSN_output A7105_CSN_ddr |= _BV(A7105_CSN_pin) -#define A7105_CSN_on A7105_CSN_port |= _BV(A7105_CSN_pin) -#define A7105_CSN_off A7105_CSN_port &= ~_BV(A7105_CSN_pin) - -// CC2500 -#define CC25_CSN_pin 7 //D7 = PD7 -#define CC25_CSN_port PORTD -#define CC25_CSN_ddr DDRD -#define CC25_CSN_output CC25_CSN_ddr |= _BV(CC25_CSN_pin) -#define CC25_CSN_on CC25_CSN_port |= _BV(CC25_CSN_pin) -#define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin) - -// NRF24L01 -#define NRF_CSN_pin 0 //D8 = PB0 -#define NRF_CSN_port PORTB -#define NRF_CSN_ddr DDRB -#define NRF_CSN_output NRF_CSN_ddr |= _BV(NRF_CSN_pin) -#define NRF_CSN_on NRF_CSN_port |= _BV(NRF_CSN_pin) -#define NRF_CSN_off NRF_CSN_port &= ~_BV(NRF_CSN_pin) -#define NRF_CE_on -#define NRF_CE_off - -// CYRF6936 -#ifdef XMEGA - #define CYRF_CSN_pin 4 //PD4 - #define CYRF_CSN_port PORTD - #define CYRF_CSN_ddr DDRD - #define CYRF_CSN_on CYRF_CSN_port.OUTSET = _BV(CYRF_CSN_pin) - #define CYRF_CSN_off CYRF_CSN_port.OUTCLR = _BV(CYRF_CSN_pin) - - #define CYRF_RST_pin 0 //PE0 - #define CYRF_RST_port PORTE - #define CYRF_RST_ddr DDRE - #define CYRF_RST_HI CYRF_RST_port.OUTSET = _BV(CYRF_RST_pin) - #define CYRF_RST_LO CYRF_RST_port.OUTCLR = _BV(CYRF_RST_pin) -#else - #define CYRF_CSN_pin 1 //D9 = PB1 - #define CYRF_CSN_port PORTB - #define CYRF_CSN_ddr DDRB - #define CYRF_CSN_output CYRF_CSN_ddr |= _BV(CYRF_CSN_pin) - #define CYRF_CSN_on CYRF_CSN_port |= _BV(CYRF_CSN_pin) - #define CYRF_CSN_off CYRF_CSN_port &= ~_BV(CYRF_CSN_pin) - - #define CYRF_RST_pin 5 //A5 = PC5 - #define CYRF_RST_port PORTC - #define CYRF_RST_ddr DDRC - #define CYRF_RST_output CYRF_RST_ddr |= _BV(CYRF_RST_pin) - #define CYRF_RST_HI CYRF_RST_port |= _BV(CYRF_RST_pin) - #define CYRF_RST_LO CYRF_RST_port &= ~_BV(CYRF_RST_pin) -#endif - -//RF Switch -#ifdef XMEGA - #define PE1_on - #define PE1_off - #define PE2_on - #define PE2_off -#else - #define PE1_pin 1 //A1 = PC1 - #define PE1_port PORTC - #define PE1_ddr DDRC - #define PE1_output PE1_ddr |= _BV(PE1_pin) - #define PE1_on PE1_port |= _BV(PE1_pin) - #define PE1_off PE1_port &= ~_BV(PE1_pin) - - #define PE2_pin 2 //A2 = PC2 - #define PE2_port PORTC - #define PE2_ddr DDRC - #define PE2_output PE2_ddr |= _BV(PE2_pin) - #define PE2_on PE2_port |= _BV(PE2_pin) - #define PE2_off PE2_port &= ~_BV(PE2_pin) -#endif - -// LED -#ifdef XMEGA - #define LED_pin 1 //PD1 - #define LED_port PORTD - #define LED_ddr DDRD - #define LED_on LED_port.OUTCLR = _BV(LED_pin) - #define LED_off LED_port.OUTSET = _BV(LED_pin) - #define LED_toggle LED_port.OUTTGL = _BV(LED_pin) - #define LED_output LED_port.DIRSET = _BV(LED_pin) - #define IS_LED_on (LED_port.OUT & _BV(LED_pin)) -#else - #define LED_pin 5 //D13 = PB5 - #define LED_port PORTB - #define LED_ddr DDRB - #define LED_on LED_port |= _BV(LED_pin) - #define LED_off LED_port &= ~_BV(LED_pin) - #define LED_toggle LED_port ^= _BV(LED_pin) - #define LED_output LED_ddr |= _BV(LED_pin) - #define IS_LED_on (LED_port & _BV(LED_pin)) -#endif - -//BIND -#ifdef XMEGA - #define BIND_pin 2 //PD2 - #define BIND_port PORTD - #define IS_BIND_BUTTON_on ( (BIND_port.IN & _BV(BIND_pin)) == 0x00 ) -#else - #define BIND_pin 5 //D13 = PB5 - #define BIND_port PORTB - #define BIND_ipr PINB - #define BIND_ddr DDRB - #define BIND_SET_INPUT BIND_ddr &= ~_BV(BIND_pin) - #define BIND_SET_OUTPUT BIND_ddr |= _BV(BIND_pin) - #define BIND_SET_PULLUP BIND_port |= _BV(BIND_pin) - #define IS_BIND_BUTTON_on ( (BIND_ipr & _BV(BIND_pin)) == 0x00 ) + #define EE_ADDR uint8_t* #endif diff --git a/Multiprotocol/README.md b/Multiprotocol/README.md index 037ea5f..bd35dd9 100644 --- a/Multiprotocol/README.md +++ b/Multiprotocol/README.md @@ -126,6 +126,22 @@ CH1|CH2|CH3|CH4 ---|---|---|--- A|E|T|R +###CG023 +###Sub_protocol H8_3D +Models: EAchine H8 mini 3D, JJRC H20/H22, JJRC H11D + +CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|--- +FLIP|LIGTH|OPT1|OPT2|CAL|SNAPSHOT|VIDEO + +JJRC H20: OPT1=Headless, OPT2=RTH + +JJRC H22: OPT1=RTH, OPT2=180/360° flip mode + +H8 3D: OPT1=RTH then press a direction to enter headless mode (like stock TX), OPT2=switch 180/360° flip mode + +CAL: calibrate accelerometers + ###ESKY150 Autobind @@ -159,6 +175,9 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|CH5|CH6|CH7|CH8 +###HISKY +####Sub_protocol HK310 + ###HM830 Modele: HM Hobby HM830 RC Paper Airplane @@ -226,5 +245,20 @@ A|E|T|R|FLIP 360|FLIP|VIDEO|LED|MODE 2 ####Sub_protocol U839_2014 Same channels assignement as above. +###V2X2 +####Sub_protocol V2X2 +Models: WLToys V202/252/272, JXD 385/388, JJRC H6C, Yizhan Tarantula X6 ... + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|---|---|---|----|---- +A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS|MAG_CAL_X|MAG_CAL_Y + +PICTURE: also automatic Missile Launcher and Hoist in one direction + +VIDEO: also Sprayer, Bubbler, Missile Launcher(1), and Hoist in the other dir +####Sub_protocol JXD-506 +CH10|CH11|CH12 +----|----|---- +ARM|EMERGENCY|PAN CAMERA ###D'autres à venir \ No newline at end of file diff --git a/Multiprotocol/SPI.ino b/Multiprotocol/SPI.ino index fcf2936..d652fc1 100644 --- a/Multiprotocol/SPI.ino +++ b/Multiprotocol/SPI.ino @@ -15,72 +15,145 @@ /********************/ /** SPI routines **/ /********************/ -#ifdef XMEGA - #define XNOP() NOP() +#ifdef STM32_BOARD + + SPIClass SPI_2(2); //Create an instance of the SPI Class called SPI_2 that uses the 2nd SPI Port + + void initSPI2() + { + //SPI_DISABLE(); + SPI_2.end(); + SPI2_BASE->CR1 &= ~SPI_CR1_DFF_8_BIT; //8 bits format This bit should be written only when SPI is disabled (SPE = ?0?) for correct operation. + SPI_2.begin(); //Initialize the SPI_2 port. + + SPI_2.setBitOrder(MSBFIRST); // Set the SPI_2 bit order + SPI_2.setDataMode(SPI_MODE0); // Set the SPI_2 data mode 0 + SPI_2.setClockDivider(SPI_CLOCK_DIV8); // Set the speed (36 / 8 = 4.5 MHz SPI_2 speed) + } + + void SPI_Write(uint8_t command) + {//working OK + SPI2_BASE->DR = command; //Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag). + while (!(SPI2_BASE->SR & SPI_SR_RXNE)); + command = SPI2_BASE->DR; // ... and read the last received data. + } + + uint8_t SPI_Read(void) + { + SPI_Write(0x00); + return SPI2_BASE->DR; + } + + uint8_t SPI_SDI_Read() + { + uint8_t rx=0; + cli(); //Fix Hubsan droputs?? + while(!(SPI2_BASE->SR & SPI_SR_TXE)); + while((SPI2_BASE->SR & SPI_SR_BSY)); + // + SPI_DISABLE(); + SPI_SET_BIDIRECTIONAL(); + volatile uint8_t x = SPI2_BASE->DR; + (void)x; + SPI_ENABLE(); + // + SPI_DISABLE(); + while(!(SPI2_BASE->SR& SPI_SR_RXNE)); + rx=SPI2_BASE->DR; + SPI_SET_UNIDIRECTIONAL(); + SPI_ENABLE(); + sei();//fix Hubsan dropouts?? + return rx; + } + + void SPI_ENABLE() + { + SPI2_BASE->CR1 |= SPI_CR1_SPE; + } + + void SPI_DISABLE() + { + SPI2_BASE->CR1 &= ~SPI_CR1_SPE; + } + + void SPI_SET_BIDIRECTIONAL() + { + SPI2_BASE->CR1 |= SPI_CR1_BIDIMODE; + SPI2_BASE->CR1 &= ~ SPI_CR1_BIDIOE;//receive only + } + + void SPI_SET_UNIDIRECTIONAL() + { + SPI2_BASE->CR1 &= ~SPI_CR1_BIDIMODE; + } #else - #define XNOP() -#endif + #ifdef ORANGE_TX + #define XNOP() NOP() + #else + #define XNOP() + #endif -void SPI_Write(uint8_t command) -{ - uint8_t n=8; - - SCLK_off;//SCK start low - XNOP(); - SDI_off; - XNOP(); - do + void SPI_Write(uint8_t command) { - if(command&0x80) - SDI_on; - else - SDI_off; - XNOP(); - SCLK_on; - XNOP(); - XNOP(); - command = command << 1; - SCLK_off; - XNOP(); - } - while(--n) ; - SDI_on; -} + uint8_t n=8; -uint8_t SPI_Read(void) -{ - uint8_t result=0,i; - for(i=0;i<8;i++) + SCLK_off;//SCK start low + XNOP(); + SDI_off; + XNOP(); + do + { + if(command&0x80) + SDI_on; + else + SDI_off; + XNOP(); + SCLK_on; + XNOP(); + XNOP(); + command = command << 1; + SCLK_off; + XNOP(); + } + while(--n) ; + SDI_on; + } + + uint8_t SPI_Read(void) { - result=result<<1; - if(SDO_1) - result |= 0x01; - SCLK_on; - XNOP(); - XNOP(); - NOP(); - SCLK_off; - XNOP(); - XNOP(); + uint8_t result=0,i; + for(i=0;i<8;i++) + { + result=result<<1; + if(SDO_1) + result |= 0x01; + SCLK_on; + XNOP(); + XNOP(); + NOP(); + SCLK_off; + XNOP(); + XNOP(); + } + return result; } - return result; -} -#ifdef A7105_INSTALLED -uint8_t SPI_SDIO_Read(void) -{ - uint8_t result=0; - SDI_input; - for(uint8_t i=0;i<8;i++) - { - result=result<<1; - if(SDI_1) ///if SDIO =1 - result |= 0x01; - SCLK_on; - NOP(); - SCLK_off; + #ifdef A7105_INSTALLED + uint8_t SPI_SDI_Read(void) + { + uint8_t result=0; + SDI_input; + for(uint8_t i=0;i<8;i++) + { + result=result<<1; + if(SDI_1) ///if SDIO =1 + result |= 0x01; + SCLK_on; + NOP(); + SCLK_off; + } + SDI_output; + return result; } - SDI_output; - return result; -} -#endif + #endif +#endif//STM32_BOARD \ No newline at end of file diff --git a/Multiprotocol/TX_Def.h b/Multiprotocol/TX_Def.h index 66193d0..caef39d 100644 --- a/Multiprotocol/TX_Def.h +++ b/Multiprotocol/TX_Def.h @@ -60,199 +60,151 @@ //Channel definitions #ifdef AETR -enum { - AILERON =0, - ELEVATOR, - THROTTLE, - RUDDER, -}; + #define AILERON 0 + #define ELEVATOR 1 + #define THROTTLE 2 + #define RUDDER 3 #endif #ifdef AERT -enum { - AILERON =0, - ELEVATOR, - RUDDER, - THROTTLE, -}; + #define AILERON 0 + #define ELEVATOR 1 + #define THROTTLE 3 + #define RUDDER 2 #endif #ifdef ARET -enum { - AILERON =0, - RUDDER, - ELEVATOR, - THROTTLE, -}; + #define AILERON 0 + #define ELEVATOR 2 + #define THROTTLE 3 + #define RUDDER 1 #endif #ifdef ARTE -enum { - AILERON =0, - RUDDER, - THROTTLE, - ELEVATOR, -}; + #define AILERON 0 + #define ELEVATOR 3 + #define THROTTLE 2 + #define RUDDER 1 #endif #ifdef ATRE -enum { - AILERON =0, - THROTTLE, - RUDDER, - ELEVATOR, -}; + #define AILERON 0 + #define ELEVATOR 3 + #define THROTTLE 1 + #define RUDDER 2 #endif #ifdef ATER -enum { - AILERON =0, - THROTTLE, - ELEVATOR, - RUDDER, -}; + #define AILERON 0 + #define ELEVATOR 2 + #define THROTTLE 1 + #define RUDDER 3 #endif #ifdef EATR -enum { - ELEVATOR =0, - AILERON, - THROTTLE, - RUDDER, -}; + #define AILERON 1 + #define ELEVATOR 0 + #define THROTTLE 2 + #define RUDDER 3 #endif #ifdef EART -enum { - ELEVATOR =0, - AILERON, - RUDDER, - THROTTLE, -}; + #define AILERON 1 + #define ELEVATOR 0 + #define THROTTLE 3 + #define RUDDER 2 #endif #ifdef ERAT -enum { - ELEVATOR =0, - RUDDER, - AILERON, - THROTTLE, -}; + #define AILERON 2 + #define ELEVATOR 0 + #define THROTTLE 3 + #define RUDDER 1 #endif #ifdef ERTA -enum { - ELEVATOR =0, - RUDDER, - THROTTLE, - AILERON, -}; + #define AILERON 3 + #define ELEVATOR 0 + #define THROTTLE 2 + #define RUDDER 1 #endif #ifdef ETRA -enum { - ELEVATOR =0, - THROTTLE, - RUDDER, - AILERON, -}; + #define AILERON 3 + #define ELEVATOR 0 + #define THROTTLE 1 + #define RUDDER 2 #endif #ifdef ETAR -enum { - ELEVATOR =0, - THROTTLE, - AILERON, - RUDDER, -}; + #define AILERON 2 + #define ELEVATOR 0 + #define THROTTLE 1 + #define RUDDER 3 #endif #ifdef TEAR -enum { - THROTTLE =0, - ELEVATOR, - AILERON, - RUDDER, -}; + #define AILERON 2 + #define ELEVATOR 1 + #define THROTTLE 0 + #define RUDDER 3 #endif #ifdef TERA -enum { - THROTTLE =0, - ELEVATOR, - RUDDER, - AILERON, -}; + #define AILERON 3 + #define ELEVATOR 1 + #define THROTTLE 0 + #define RUDDER 2 #endif #ifdef TREA -enum { - THROTTLE =0, - RUDDER, - ELEVATOR, - AILERON, -}; + #define AILERON 3 + #define ELEVATOR 2 + #define THROTTLE 0 + #define RUDDER 1 #endif #ifdef TRAE -enum { - THROTTLE =0, - RUDDER, - AILERON, - ELEVATOR, -}; + #define AILERON 2 + #define ELEVATOR 3 + #define THROTTLE 0 + #define RUDDER 1 #endif #ifdef TARE -enum { - THROTTLE =0, - AILERON, - RUDDER, - ELEVATOR, -}; + #define AILERON 1 + #define ELEVATOR 3 + #define THROTTLE 0 + #define RUDDER 2 #endif #ifdef TAER -enum { - THROTTLE =0, - AILERON, - ELEVATOR, - RUDDER, -}; + #define AILERON 1 + #define ELEVATOR 2 + #define THROTTLE 0 + #define RUDDER 3 #endif #ifdef RETA -enum { - RUDDER =0, - ELEVATOR, - THROTTLE, - AILERON, -}; + #define AILERON 3 + #define ELEVATOR 1 + #define THROTTLE 2 + #define RUDDER 0 #endif #ifdef REAT -enum { - RUDDER =0, - ELEVATOR, - AILERON, - THROTTLE, -}; + #define AILERON 2 + #define ELEVATOR 1 + #define THROTTLE 3 + #define RUDDER 0 #endif #ifdef RAET -enum { - RUDDER =0, - AILERON, - ELEVATOR, - THROTTLE, -}; + #define AILERON 1 + #define ELEVATOR 2 + #define THROTTLE 3 + #define RUDDER 0 #endif #ifdef RATE -enum { - RUDDER =0, - AILERON, - THROTTLE, - ELEVATOR, -}; + #define AILERON 1 + #define ELEVATOR 3 + #define THROTTLE 2 + #define RUDDER 0 #endif #ifdef RTAE -enum { - RUDDER =0, - THROTTLE, - AILERON, - ELEVATOR, -}; + #define AILERON 2 + #define ELEVATOR 3 + #define THROTTLE 1 + #define RUDDER 0 #endif #ifdef RTEA -enum { - RUDDER =0, - THROTTLE, - ELEVATOR, - AILERON, -}; + #define AILERON 3 + #define ELEVATOR 2 + #define THROTTLE 1 + #define RUDDER 0 #endif #define AUX1 4 diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index af368ad..3db2eb4 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -38,7 +38,7 @@ #define MAX_PKTX 10 uint8_t pktx[MAX_PKTX]; uint8_t pktx1[MAX_PKTX]; -uint8_t index; +uint8_t indx; uint8_t frame[18]; #ifdef BASH_SERIAL @@ -94,6 +94,7 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) for (uint8_t i=3;i= FRSKY_SPORT_PACKET_SIZE) + if (indx >= FRSKY_SPORT_PACKET_SIZE) {//8 bytes no crc if ( sport ) { @@ -408,22 +413,6 @@ void proces_sport_data(uint8_t data) void TelemetryUpdate() { - #if defined SPORT_TELEMETRY - if (protocol==MODE_FRSKYX) - { // FrSkyX - if(telemetry_link) - { - if(pktt[4] & 0x80) - rssi=pktt[4] & 0x7F ; - else - RxBt = (pktt[4]<<1) + 1 ; - for (uint8_t i=0; i < pktt[6]; i++) - proces_sport_data(pktt[7+i]); - telemetry_link=0; - } - } - #endif - // check for space in tx buffer #ifdef BASH_SERIAL @@ -463,6 +452,33 @@ void TelemetryUpdate() } #endif + #if defined SPORT_TELEMETRY + if (protocol==MODE_FRSKYX) + { // FrSkyX + if(telemetry_link) + { + if(pktt[4] & 0x80) + rssi=pktt[4] & 0x7F ; + else + RxBt = (pktt[4]<<1) + 1 ; + if(pktt[6]<=6) + for (uint8_t i=0; i < pktt[6]; i++) + proces_sport_data(pktt[7+i]); + telemetry_link=0; + } + uint32_t now = micros(); + if ((now - last) > SPORT_TIME) + { + sportSendFrame(); + #ifdef STM32_BOARD + last=now; + #else + last += SPORT_TIME ; + #endif + } + } + #endif + #if defined DSM_TELEMETRY if(telemetry_link && protocol == MODE_DSM ) { // DSM @@ -484,17 +500,6 @@ void TelemetryUpdate() return; } #endif - #if defined SPORT_TELEMETRY - if (protocol==MODE_FRSKYX) - { // FrSkyX - uint32_t now = micros(); - if ((now - last) > SPORT_TIME) - { - sportSendFrame(); - last += SPORT_TIME ; - } - } - #endif } @@ -505,323 +510,361 @@ void TelemetryUpdate() /**************************/ #ifndef BASH_SERIAL -// Routines for normal serial output -void Serial_write(uint8_t data) -{ - uint8_t nextHead ; - nextHead = tx_head + 1 ; - if ( nextHead >= TXBUFFER_SIZE ) - nextHead = 0 ; - tx_buff[nextHead]=data; - tx_head = nextHead ; - tx_resume(); -} - -void initTXSerial( uint8_t speed) -{ - #ifdef ENABLE_PPM - if(speed==SPEED_9600) - { // 9600 - #ifdef XMEGA - USARTC0.BAUDCTRLA = 207 ; - USARTC0.BAUDCTRLB = 0 ; - USARTC0.CTRLB = 0x18 ; - USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; - USARTC0.CTRLC = 0x03 ; - #else - //9600 bauds - UBRR0H = 0x00; - UBRR0L = 0x67; - UCSR0A = 0 ; // Clear X2 bit - //Set frame format to 8 data bits, none, 1 stop bit - UCSR0C = (1<=TXBUFFER_SIZE)//head - tx_tail=0; - UDR0=tx_buff[tx_tail]; + uint8_t nextHead ; + nextHead = tx_head + 1 ; + if ( nextHead >= TXBUFFER_SIZE ) + nextHead = 0 ; + tx_buff[nextHead]=data; + tx_head = nextHead ; + tx_resume(); } - if (tx_tail == tx_head) - tx_pause(); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt -} + + void initTXSerial( uint8_t speed) + { + #ifdef ENABLE_PPM + if(speed==SPEED_9600) + { // 9600 + #ifdef ORANGE_TX + USARTC0.BAUDCTRLA = 207 ; + USARTC0.BAUDCTRLB = 0 ; + USARTC0.CTRLB = 0x18 ; + USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; + USARTC0.CTRLC = 0x03 ; + #else + #ifdef STM32_BOARD + Serial2.begin(9600); //USART3 + USART3_BASE->CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled + #else + UBRR0H = 0x00; + UBRR0L = 0x67; + UCSR0A = 0 ; // Clear X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled + #else + UBRR0H = 0x00; + UBRR0L = 0x22; + UCSR0A = 0x02 ; // Set X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled + #else + UBRR0H = 0x00; + UBRR0L = 0x07; + UCSR0A = 0x00 ; // Clear X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<SR & USART_SR_TXE) + { + #endif + if(tx_head!=tx_tail) + { + if(++tx_tail>=TXBUFFER_SIZE)//head + tx_tail=0; + #ifdef STM32_BOARD + USART3_BASE->DR=tx_buff[tx_tail];//clears TXE bit + #else + UDR0=tx_buff[tx_tail]; + #endif + } + if (tx_tail == tx_head) + #ifdef STM32_BOARD + USART3_BASE->CR1 &= ~USART_CR1_TXEIE;//disable interrupt + } + #else + tx_pause(); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt + #endif + } + #if defined STM32_BOARD + #ifdef __cplusplus + } + #endif + #endif //STM32_BOARD #else //BASH_SERIAL -// Routines for bit-bashed serial output + // Routines for bit-bashed serial output + + // Speed is 0 for 100K and 1 for 9600 + void initTXSerial( uint8_t speed) + { + TIMSK0 = 0 ; // Stop all timer 0 interrupts + #ifdef INVERT_SERIAL + SERIAL_TX_off; + #else + SERIAL_TX_on; + #endif + UCSR0B &= ~(1<>= 7 ; // Top bit - if ( SerialControl.speed == SPEED_100K ) - { -#ifdef INVERT_SERIAL - byteLo |= 0x02 ; // Parity bit -#else - byteLo |= 0xFC ; // Stop bits -#endif - // calc parity - temp = byte ; - temp >>= 4 ; - temp = byte ^ temp ; - temp1 = temp ; - temp1 >>= 2 ; - temp = temp ^ temp1 ; - temp1 = temp ; - temp1 <<= 1 ; - temp ^= temp1 ; - temp &= 0x02 ; -#ifdef INVERT_SERIAL - byteLo ^= temp ; -#else - byteLo |= temp ; -#endif - } - else - { - byteLo |= 0xFE ; // Stop bit - } - byte <<= 1 ; -#ifdef INVERT_SERIAL - byte |= 1 ; // Start bit -#endif - uint8_t next = (SerialControl.head + 2) & 0x3f ; - if ( next != SerialControl.tail ) - { - SerialControl.data[SerialControl.head] = byte ; - SerialControl.data[SerialControl.head+1] = byteLo ; - SerialControl.head = next ; - } - if(!IS_TX_PAUSE_on) - tx_resume(); -} - -void resumeBashSerial() -{ - cli() ; - if ( SerialControl.busy == 0 ) - { - sei() ; - // Start the transmission here -#ifdef INVERT_SERIAL - GPIOR2 = 0 ; -#else - GPIOR2 = 0x01 ; -#endif + byteLo = byte ; + byteLo >>= 7 ; // Top bit if ( SerialControl.speed == SPEED_100K ) { - GPIOR1 = 1 ; - OCR0B = TCNT0 + 40 ; - OCR0A = OCR0B + 210 ; - TIFR0 = (1<>= 4 ; + temp = byte ^ temp ; + temp1 = temp ; + temp1 >>= 2 ; + temp = temp ^ temp1 ; + temp1 = temp ; + temp1 <<= 1 ; + temp ^= temp1 ; + temp &= 0x02 ; + #ifdef INVERT_SERIAL + byteLo ^= temp ; + #else + byteLo |= temp ; + #endif } else { - GPIOR1 = 1 ; - TIFR0 = (1<>= 1 - GPIOR0 = byte ; - if ( --GPIOR1 == 0 ) - { - TIMSK0 &= ~(1<>= 1 - GPIOR2 = byte ; - if ( --GPIOR1 == 0 ) - { - if ( IS_TX_PAUSE_on ) + byteLo |= 0xFE ; // Stop bit + } + byte <<= 1 ; + #ifdef INVERT_SERIAL + byte |= 1 ; // Start bit + #endif + uint8_t next = (SerialControl.head + 2) & 0x3f ; + if ( next != SerialControl.tail ) { - SerialControl.busy = 0 ; - TIMSK0 &= ~(1<>= 1 + GPIOR0 = byte ; + if ( --GPIOR1 == 0 ) + { + TIMSK0 &= ~(1<>= 1 + GPIOR2 = byte ; + if ( --GPIOR1 == 0 ) + { + if ( IS_TX_PAUSE_on ) + { + SerialControl.busy = 0 ; + TIMSK0 &= ~(1<head != ptr->tail ) + { + GPIOR0 = ptr->data[ptr->tail] ; + GPIOR2 = ptr->data[ptr->tail+1] ; + ptr->tail = ( ptr->tail + 2 ) & 0x3F ; + GPIOR1 = 8 ; + OCR0A = OCR0B + 40 ; + OCR0B = OCR0A + 8 * 20 ; + TIMSK0 |= (1< 2 ) + { + byte = GPIOR0 ; + } + else + { + byte = GPIOR2 ; + } + if ( byte & 0x01 ) + SERIAL_TX_on; + else + SERIAL_TX_off; + byte /= 2 ; // Generates shorter code than byte >>= 1 + if ( GPIOR1 > 2 ) + { + GPIOR0 = byte ; + } + else + { + GPIOR2 = byte ; + } + if ( --GPIOR1 == 0 ) + { + // prepare next byte struct t_serial_bash *ptr = &SerialControl ; if ( ptr->head != ptr->tail ) { GPIOR0 = ptr->data[ptr->tail] ; GPIOR2 = ptr->data[ptr->tail+1] ; ptr->tail = ( ptr->tail + 2 ) & 0x3F ; - GPIOR1 = 8 ; - OCR0A = OCR0B + 40 ; - OCR0B = OCR0A + 8 * 20 ; - TIMSK0 |= (1< 2 ) - { - byte = GPIOR0 ; - } - else - { - byte = GPIOR2 ; - } - if ( byte & 0x01 ) - SERIAL_TX_on; - else - SERIAL_TX_off; - byte /= 2 ; // Generates shorter code than byte >>= 1 - if ( GPIOR1 > 2 ) - { - GPIOR0 = byte ; - } - else - { - GPIOR2 = byte ; - } - if ( --GPIOR1 == 0 ) - { - // prepare next byte - struct t_serial_bash *ptr = &SerialControl ; - if ( ptr->head != ptr->tail ) - { - GPIOR0 = ptr->data[ptr->tail] ; - GPIOR2 = ptr->data[ptr->tail+1] ; - ptr->tail = ( ptr->tail + 2 ) & 0x3F ; - GPIOR1 = 10 ; - } - else - { - SerialControl.busy = 0 ; - TIMSK0 &= ~(1<= CHAN_MIN_VALUE/2) *flags2 &= ~FLAG_CAMERA_DN; + else *flags2 |= JXD_FLAG_CAMERA_DN; + + // Channel 12 up + if (num_channels < 11 || Channels[CHANNEL11] <= CHAN_MAX_VALUE/2) *flags2 &= ~FLAG_CAMERA_UP; + else *flags2 |= JXD_FLAG_CAMERA_UP; +*/ + } else { + // Channel 10 + if (Servo_AUX6) + flags2 |= V2X2_FLAG_MAG_CAL_X; + // Channel 11 + if (Servo_AUX7) + flags2 |= V2X2_FLAG_MAG_CAL_Y; + } } // TX id packet[7] = rx_tx_addr[1]; diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h new file mode 100644 index 0000000..d274c48 --- /dev/null +++ b/Multiprotocol/Validate.h @@ -0,0 +1,96 @@ +// Check selected board type +#if defined (STM32_BOARD) && defined (ORANGE_TX) + #error You must comment the board type STM32_BOARD in _Config.h to compile ORANGE_TX +#endif +#if not defined (ORANGE_TX) && not defined (STM32_BOARD) + //Atmega328p + #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) + #error You must select one of these boards: "Multi 4-in-1", "Arduino Pro or Pro Mini" or "Arduino Mini" + #endif + #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) + #error You must select the processor type "ATmega328(5V, 16MHz)" + #endif +#endif +#if defined (STM32_BOARD) && not defined (ORANGE_TX) + //STM32 + #ifndef ARDUINO_GENERIC_STM32F103C + #error You must select the board type "Generic STM32F103C series" + #endif +#endif + +//Change/Force configuration if OrangeTX +#ifdef ORANGE_TX + #undef ENABLE_PPM // Disable PPM for OrangeTX module + #undef A7105_INSTALLED // Disable A7105 for OrangeTX module + #undef CC2500_INSTALLED // Disable CC2500 for OrangeTX module + #undef NRF24L01_INSTALLED // Disable NRF for OrangeTX module + #define TELEMETRY // Enable telemetry + #define INVERT_TELEMETRY // Enable invert telemetry + #define DSM_TELEMETRY // Enable DSM telemetry +#endif + +//Make sure protocols are selected correctly +#ifndef A7105_INSTALLED + #undef FLYSKY_A7105_INO + #undef HUBSAN_A7105_INO +#endif +#ifndef CYRF6936_INSTALLED + #undef DEVO_CYRF6936_INO + #undef DSM_CYRF6936_INO + #undef J6PRO_CYRF6936_INO +#endif +#ifndef CC2500_INSTALLED + #undef FRSKYD_CC2500_INO + #undef FRSKYV_CC2500_INO + #undef FRSKYX_CC2500_INO + #undef SFHSS_CC2500_INO +#endif +#ifndef NRF24L01_INSTALLED + #undef BAYANG_NRF24L01_INO + #undef CG023_NRF24L01_INO + #undef CX10_NRF24L01_INO + #undef ESKY_NRF24L01_INO + #undef HISKY_NRF24L01_INO + #undef KN_NRF24L01_INO + #undef SLT_NRF24L01_INO + #undef SYMAX_NRF24L01_INO + #undef V2X2_NRF24L01_INO + #undef YD717_NRF24L01_INO + #undef MT99XX_NRF24L01_INO + #undef MJXQ_NRF24L01_INO + #undef SHENQI_NRF24L01_INO + #undef FY326_NRF24L01_INO + #undef FQ777_NRF24L01_INO + #undef ASSAN_NRF24L01_INO + #undef HONTAI_NRF24L01_INO +#endif + +//Make sure telemetry is selected correctly +#ifndef TELEMETRY + #undef INVERT_TELEMETRY + #undef DSM_TELEMETRY + #undef SPORT_TELEMETRY + #undef HUB_TELEMETRY +#else + #if not defined(CYRF6936_INSTALLED) || not defined(DSM_CYRF6936_INO) + #undef DSM_TELEMETRY + #endif + #if (not defined(CC2500_INSTALLED) || not defined(FRSKYD_CC2500_INO)) && (not defined(A7105_INSTALLED) || not defined(HUBSAN_A7105_INO)) + #undef HUB_TELEMETRY + #endif + #if not defined(CC2500_INSTALLED) || not defined(FRSKYX_CC2500_INO) + #undef SPORT_TELEMETRY + #endif + #if not defined(DSM_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(SPORT_TELEMETRY) + #undef TELEMETRY + #undef INVERT_TELEMETRY + #endif +#endif + +//Make sure TX is defined correctly +#ifndef AILERON + #error You must select a correct channel order. +#endif +#if not defined(PPM_MAX_100) || not defined(PPM_MIN_100) || not defined(PPM_MAX_125) || not defined(PPM_MIN_125) + #error You must set correct TX end points. +#endif diff --git a/Multiprotocol/WMath.cpp.xmega b/Multiprotocol/WMath.cpp.orangetx similarity index 100% rename from Multiprotocol/WMath.cpp.xmega rename to Multiprotocol/WMath.cpp.orangetx diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 6c99ab0..2d61949 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -17,6 +17,14 @@ /** Multiprotocol module configuration file ***/ /**********************************************/ +/********************/ +/*** BOARD TYPE ***/ +/********************/ +//Uncomment one of the line below if you have a different module not based on the original Multi Atmega328p design which includes the 4-in-1. +//If you don't know then leave them commented. +//#define STM32_BOARD + + /*******************/ /*** TX SETTINGS ***/ /*******************/ @@ -43,7 +51,7 @@ /*** PROTOCOLS TO INCLUDE ***/ /****************************/ //In this section select the protocols you want to be accessible when using the module. -//All the protocols will not fit in the module so you need to pick and choose. +//All the protocols will not fit in the Atmega328p module so you need to pick and choose. //Comment the protocols you are not using with "//" to save Flash space. //The protocols below need an A7105 to be installed @@ -138,17 +146,17 @@ //Below are some standard transmitters already preconfigured. //Uncomment only the one which matches your transmitter. //#define TX_ER9X //ER9X/ERSKY9X/OpenTX ( 988<->2012µs) -#define TX_TARANIS //TARANIS AETR (1100<->1900µs) -//#define TX_DEVO7 //DEVO (1120<->1920µs) -//#define TX_SPEKTRUM //Spektrum (1100<->1900µs) -//#define TX_HISKY //HISKY (1100<->1900µs) -//#define TX_MPX //Multiplex MC2020 (1250<->1950µs) -//#define TX_CUSTOM //Custom +#define TX_TARANIS //TARANIS AETR (1100<->1900µs) +//#define TX_DEVO7 //DEVO (1120<->1920µs) +//#define TX_SPEKTRUM //Spektrum (1100<->1900µs) +//#define TX_HISKY //HISKY (1100<->1900µs) +//#define TX_MPX //Multiplex MC2020 (1250<->1950µs) +//#define TX_CUSTOM //Custom // The lines below are used to set the end points in microseconds (µs) if you have selected TX_CUSTOM. -// A few things to considered: +// A few things to consider: // - If you put too big values compared to your TX you won't be able to reach the extremes which is bad for throttle as an example -// - If you put too low values you won't be able to use your full stick range, it will be maxed out before reaching the end +// - If you put too low values you won't be able to use your full stick range, it will be maxed out before reaching the ends // - Centered stick value is usually 1500. It should match the middle between MIN and MAX, ie Center=(MAX-MIN)/2+MIN. If your TX is not centered you can adjust the value MIN or MAX. // - 100% is the value when the model is by default, 125% is the value when you extend the servo travel which is only used by some protocols #if defined(TX_CUSTOM) @@ -276,7 +284,7 @@ const PPM_Parameters PPM_prot[15]= { // Auto Bind AUTOBIND or NO_AUTOBIND // For protocols which does not require binding at each power up (like Flysky, FrSky...), you might still want a bind to be initiated each time you power up the TX. -// As an exxample, it's usefull for the WLTOYS F929/F939/F949/F959 (all using the Flysky protocol) which requires a bind at each power up. +// As an example, it's usefull for the WLTOYS F929/F939/F949/F959 (all using the Flysky protocol) which requires a bind at each power up. // Option: the value is between -127 and +127. // The option value is only valid for some protocols, read this page for more information: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/Protocols_Details.md \ No newline at end of file diff --git a/Multiprotocol/boards.txt b/Multiprotocol/boards.txt new file mode 100644 index 0000000..70dc5a6 --- /dev/null +++ b/Multiprotocol/boards.txt @@ -0,0 +1,890 @@ +# See: http://code.google.com/p/arduino/wiki/Platforms + +menu.cpu=Processor + +############################################################## + +yun.name=Arduino Yún +yun.upload.via_ssh=true + +yun.vid.0=0x2341 +yun.pid.0=0x0041 +yun.vid.1=0x2341 +yun.pid.1=0x8041 +yun.vid.2=0x2A03 +yun.pid.2=0x0041 +yun.vid.3=0x2A03 +yun.pid.3=0x8041 + +yun.upload.tool=avrdude +yun.upload.protocol=avr109 +yun.upload.maximum_size=28672 +yun.upload.maximum_data_size=2560 +yun.upload.speed=57600 +yun.upload.disable_flushing=true +yun.upload.use_1200bps_touch=true +yun.upload.wait_for_upload_port=true + +yun.bootloader.tool=avrdude +yun.bootloader.low_fuses=0xff +yun.bootloader.high_fuses=0xd8 +yun.bootloader.extended_fuses=0xfb +yun.bootloader.file=caterina/Caterina-Yun.hex +yun.bootloader.unlock_bits=0x3F +yun.bootloader.lock_bits=0x2F + +yun.build.mcu=atmega32u4 +yun.build.f_cpu=16000000L +yun.build.vid=0x2341 +yun.build.pid=0x8041 +yun.build.usb_product="Arduino Yun" +yun.build.board=AVR_YUN +yun.build.core=arduino +yun.build.variant=yun +yun.build.extra_flags={build.usb_flags} + +############################################################## + +uno.name=Arduino/Genuino Uno + +uno.vid.0=0x2341 +uno.pid.0=0x0043 +uno.vid.1=0x2341 +uno.pid.1=0x0001 +uno.vid.2=0x2A03 +uno.pid.2=0x0043 +uno.vid.3=0x2341 +uno.pid.3=0x0243 + +uno.upload.tool=avrdude +uno.upload.protocol=arduino +uno.upload.maximum_size=32256 +uno.upload.maximum_data_size=2048 +uno.upload.speed=115200 + +uno.bootloader.tool=avrdude +uno.bootloader.low_fuses=0xFF +uno.bootloader.high_fuses=0xDE +uno.bootloader.extended_fuses=0x05 +uno.bootloader.unlock_bits=0x3F +uno.bootloader.lock_bits=0x0F +uno.bootloader.file=optiboot/optiboot_atmega328.hex + +uno.build.mcu=atmega328p +uno.build.f_cpu=16000000L +uno.build.board=AVR_UNO +uno.build.core=arduino +uno.build.variant=standard + +############################################################## + +diecimila.name=Arduino Duemilanove or Diecimila + +diecimila.upload.tool=avrdude +diecimila.upload.protocol=arduino + +diecimila.bootloader.tool=avrdude +diecimila.bootloader.low_fuses=0xFF +diecimila.bootloader.unlock_bits=0x3F +diecimila.bootloader.lock_bits=0x0F + +diecimila.build.f_cpu=16000000L +diecimila.build.board=AVR_DUEMILANOVE +diecimila.build.core=arduino +diecimila.build.variant=standard + +## Arduino Duemilanove or Diecimila w/ ATmega328 +## --------------------------------------------- +diecimila.menu.cpu.atmega328=ATmega328 + +diecimila.menu.cpu.atmega328.upload.maximum_size=30720 +diecimila.menu.cpu.atmega328.upload.maximum_data_size=2048 +diecimila.menu.cpu.atmega328.upload.speed=57600 + +diecimila.menu.cpu.atmega328.bootloader.high_fuses=0xDA +diecimila.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +diecimila.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex + +diecimila.menu.cpu.atmega328.build.mcu=atmega328p + +## Arduino Duemilanove or Diecimila w/ ATmega168 +## --------------------------------------------- +diecimila.menu.cpu.atmega168=ATmega168 + +diecimila.menu.cpu.atmega168.upload.maximum_size=14336 +diecimila.menu.cpu.atmega168.upload.maximum_data_size=1024 +diecimila.menu.cpu.atmega168.upload.speed=19200 + +diecimila.menu.cpu.atmega168.bootloader.high_fuses=0xdd +diecimila.menu.cpu.atmega168.bootloader.extended_fuses=0x00 +diecimila.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex + +diecimila.menu.cpu.atmega168.build.mcu=atmega168 + +############################################################## + +nano.name=Arduino Nano + +nano.upload.tool=avrdude +nano.upload.protocol=arduino + +nano.bootloader.tool=avrdude +nano.bootloader.unlock_bits=0x3F +nano.bootloader.lock_bits=0x0F + +nano.build.f_cpu=16000000L +nano.build.board=AVR_NANO +nano.build.core=arduino +nano.build.variant=eightanaloginputs + +## Arduino Nano w/ ATmega328 +## ------------------------- +nano.menu.cpu.atmega328=ATmega328 + +nano.menu.cpu.atmega328.upload.maximum_size=30720 +nano.menu.cpu.atmega328.upload.maximum_data_size=2048 +nano.menu.cpu.atmega328.upload.speed=57600 + +nano.menu.cpu.atmega328.bootloader.low_fuses=0xFF +nano.menu.cpu.atmega328.bootloader.high_fuses=0xDA +nano.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +nano.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex + +nano.menu.cpu.atmega328.build.mcu=atmega328p + +## Arduino Nano w/ ATmega168 +## ------------------------- +nano.menu.cpu.atmega168=ATmega168 + +nano.menu.cpu.atmega168.upload.maximum_size=14336 +nano.menu.cpu.atmega168.upload.maximum_data_size=1024 +nano.menu.cpu.atmega168.upload.speed=19200 + +nano.menu.cpu.atmega168.bootloader.low_fuses=0xff +nano.menu.cpu.atmega168.bootloader.high_fuses=0xdd +nano.menu.cpu.atmega168.bootloader.extended_fuses=0x00 +nano.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex + +nano.menu.cpu.atmega168.build.mcu=atmega168 + +############################################################## + +mega.name=Arduino/Genuino Mega or Mega 2560 + +mega.vid.0=0x2341 +mega.pid.0=0x0010 +mega.vid.1=0x2341 +mega.pid.1=0x0042 +mega.vid.2=0x2A03 +mega.pid.2=0x0010 +mega.vid.3=0x2A03 +mega.pid.3=0x0042 +mega.vid.4=0x2341 +mega.pid.4=0x0210 +mega.vid.5=0x2341 +mega.pid.5=0x0242 + +mega.upload.tool=avrdude +mega.upload.maximum_data_size=8192 + +mega.bootloader.tool=avrdude +mega.bootloader.low_fuses=0xFF +mega.bootloader.unlock_bits=0x3F +mega.bootloader.lock_bits=0x0F + +mega.build.f_cpu=16000000L +mega.build.core=arduino +mega.build.variant=mega +# default board may be overridden by the cpu menu +mega.build.board=AVR_MEGA2560 + +## Arduino/Genuino Mega w/ ATmega2560 +## ------------------------- +mega.menu.cpu.atmega2560=ATmega2560 (Mega 2560) + +mega.menu.cpu.atmega2560.upload.protocol=wiring +mega.menu.cpu.atmega2560.upload.maximum_size=253952 +mega.menu.cpu.atmega2560.upload.speed=115200 + +mega.menu.cpu.atmega2560.bootloader.high_fuses=0xD8 +mega.menu.cpu.atmega2560.bootloader.extended_fuses=0xFD +mega.menu.cpu.atmega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex + +mega.menu.cpu.atmega2560.build.mcu=atmega2560 +mega.menu.cpu.atmega2560.build.board=AVR_MEGA2560 + +## Arduino Mega w/ ATmega1280 +## ------------------------- +mega.menu.cpu.atmega1280=ATmega1280 + +mega.menu.cpu.atmega1280.upload.protocol=arduino +mega.menu.cpu.atmega1280.upload.maximum_size=126976 +mega.menu.cpu.atmega1280.upload.speed=57600 + +mega.menu.cpu.atmega1280.bootloader.high_fuses=0xDA +mega.menu.cpu.atmega1280.bootloader.extended_fuses=0xF5 +mega.menu.cpu.atmega1280.bootloader.file=atmega/ATmegaBOOT_168_atmega1280.hex + +mega.menu.cpu.atmega1280.build.mcu=atmega1280 +mega.menu.cpu.atmega1280.build.board=AVR_MEGA + +############################################################## + +megaADK.name=Arduino Mega ADK + +megaADK.vid.0=0x2341 +megaADK.pid.0=0x003f +megaADK.vid.1=0x2341 +megaADK.pid.1=0x0044 +megaADK.vid.2=0x2A03 +megaADK.pid.2=0x003f +megaADK.vid.3=0x2A03 +megaADK.pid.3=0x0044 + +megaADK.upload.tool=avrdude +megaADK.upload.protocol=wiring +megaADK.upload.maximum_size=253952 +megaADK.upload.maximum_data_size=8192 +megaADK.upload.speed=115200 + +megaADK.bootloader.tool=avrdude +megaADK.bootloader.low_fuses=0xFF +megaADK.bootloader.high_fuses=0xD8 +megaADK.bootloader.extended_fuses=0xFD +megaADK.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex +megaADK.bootloader.unlock_bits=0x3F +megaADK.bootloader.lock_bits=0x0F + +megaADK.build.mcu=atmega2560 +megaADK.build.f_cpu=16000000L +megaADK.build.board=AVR_ADK +megaADK.build.core=arduino +megaADK.build.variant=mega + +############################################################## + +leonardo.name=Arduino Leonardo +leonardo.vid.0=0x2341 +leonardo.pid.0=0x0036 +leonardo.vid.1=0x2341 +leonardo.pid.1=0x8036 +leonardo.vid.2=0x2A03 +leonardo.pid.2=0x0036 +leonardo.vid.3=0x2A03 +leonardo.pid.3=0x8036 + +leonardo.upload.tool=avrdude +leonardo.upload.protocol=avr109 +leonardo.upload.maximum_size=28672 +leonardo.upload.maximum_data_size=2560 +leonardo.upload.speed=57600 +leonardo.upload.disable_flushing=true +leonardo.upload.use_1200bps_touch=true +leonardo.upload.wait_for_upload_port=true + +leonardo.bootloader.tool=avrdude +leonardo.bootloader.low_fuses=0xff +leonardo.bootloader.high_fuses=0xd8 +leonardo.bootloader.extended_fuses=0xcb +leonardo.bootloader.file=caterina/Caterina-Leonardo.hex +leonardo.bootloader.unlock_bits=0x3F +leonardo.bootloader.lock_bits=0x2F + +leonardo.build.mcu=atmega32u4 +leonardo.build.f_cpu=16000000L +leonardo.build.vid=0x2341 +leonardo.build.pid=0x8036 +leonardo.build.usb_product="Arduino Leonardo" +leonardo.build.board=AVR_LEONARDO +leonardo.build.core=arduino +leonardo.build.variant=leonardo +leonardo.build.extra_flags={build.usb_flags} + +############################################################## + +micro.name=Arduino/Genuino Micro + +micro.vid.0=0x2341 +micro.pid.0=0x0037 +micro.vid.1=0x2341 +micro.pid.1=0x8037 +micro.vid.2=0x2A03 +micro.pid.2=0x0037 +micro.vid.3=0x2A03 +micro.pid.3=0x8037 + +micro.vid.4=0x2341 +micro.pid.4=0x0237 +# If the board is a 2341:0237 use 2341:8237 for build and set +# other parameters as well +micro.vid.4.build.vid=0x2341 +micro.vid.4.build.pid=0x8237 +micro.vid.4.build.usb_product="Genuino Micro" +micro.vid.4.bootloader.file=caterina/Caterina-Genuino-Micro.hex + +micro.vid.5=0x2341 +micro.pid.5=0x8237 +# If the board is a 2341:8237 use 2341:8237 for build and set +# other paramters as well +micro.vid.5.build.vid=0x2341 +micro.vid.5.build.pid=0x8237 +micro.vid.5.build.usb_product="Genuino Micro" +micro.vid.5.bootloader.file=caterina/Caterina-Genuino-Micro.hex + +micro.upload.tool=avrdude +micro.upload.protocol=avr109 +micro.upload.maximum_size=28672 +micro.upload.maximum_data_size=2560 +micro.upload.speed=57600 +micro.upload.disable_flushing=true +micro.upload.use_1200bps_touch=true +micro.upload.wait_for_upload_port=true + +micro.bootloader.tool=avrdude +micro.bootloader.low_fuses=0xff +micro.bootloader.high_fuses=0xd8 +micro.bootloader.extended_fuses=0xcb +micro.bootloader.file=caterina/Caterina-Micro.hex +micro.bootloader.unlock_bits=0x3F +micro.bootloader.lock_bits=0x2F + +micro.build.mcu=atmega32u4 +micro.build.f_cpu=16000000L +micro.build.vid=0x2341 +micro.build.pid=0x8037 +micro.build.usb_product="Arduino Micro" +micro.build.board=AVR_MICRO +micro.build.core=arduino +micro.build.variant=micro +micro.build.extra_flags={build.usb_flags} + +############################################################## + +esplora.name=Arduino Esplora +esplora.vid.0=0x2341 +esplora.pid.0=0x003C +esplora.vid.1=0x2341 +esplora.pid.1=0x803C +esplora.vid.2=0x2A03 +esplora.pid.2=0x003C +esplora.vid.3=0x2A03 +esplora.pid.3=0x803C + +esplora.upload.tool=avrdude +esplora.upload.protocol=avr109 +esplora.upload.maximum_size=28672 +esplora.upload.maximum_data_size=2560 +esplora.upload.speed=57600 +esplora.upload.disable_flushing=true +esplora.upload.use_1200bps_touch=true +esplora.upload.wait_for_upload_port=true + +esplora.bootloader.tool=avrdude +esplora.bootloader.low_fuses=0xff +esplora.bootloader.high_fuses=0xd8 +esplora.bootloader.extended_fuses=0xcb +esplora.bootloader.file=caterina/Caterina-Esplora.hex +esplora.bootloader.unlock_bits=0x3F +esplora.bootloader.lock_bits=0x2F + +esplora.build.mcu=atmega32u4 +esplora.build.f_cpu=16000000L +esplora.build.vid=0x2341 +esplora.build.pid=0x803c +esplora.build.usb_product="Arduino Esplora" +esplora.build.board=AVR_ESPLORA +esplora.build.core=arduino +esplora.build.variant=leonardo +esplora.build.extra_flags={build.usb_flags} + +############################################################## + +mini.name=Arduino Mini + +mini.upload.tool=avrdude +mini.upload.protocol=arduino + +mini.bootloader.tool=avrdude +mini.bootloader.low_fuses=0xff +mini.bootloader.unlock_bits=0x3F +mini.bootloader.lock_bits=0x0F + +mini.build.f_cpu=16000000L +mini.build.board=AVR_MINI +mini.build.core=arduino +mini.build.variant=eightanaloginputs + +## Arduino Mini w/ ATmega328 +## ------------------------- +mini.menu.cpu.atmega328=ATmega328 + +mini.menu.cpu.atmega328.upload.maximum_size=28672 +mini.menu.cpu.atmega328.upload.maximum_data_size=2048 +mini.menu.cpu.atmega328.upload.speed=115200 + +mini.menu.cpu.atmega328.bootloader.high_fuses=0xd8 +mini.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +mini.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328-Mini.hex + +mini.menu.cpu.atmega328.build.mcu=atmega328p + +## Arduino Mini w/ ATmega168 +## ------------------------- +mini.menu.cpu.atmega168=ATmega168 + +mini.menu.cpu.atmega168.upload.maximum_size=14336 +mini.menu.cpu.atmega168.upload.maximum_data_size=1024 +mini.menu.cpu.atmega168.upload.speed=19200 + +mini.menu.cpu.atmega168.bootloader.high_fuses=0xdd +mini.menu.cpu.atmega168.bootloader.extended_fuses=0x00 +mini.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex + +mini.menu.cpu.atmega168.build.mcu=atmega168 + +############################################################## + +ethernet.name=Arduino Ethernet + +ethernet.upload.tool=avrdude +ethernet.upload.protocol=arduino +ethernet.upload.maximum_size=32256 +ethernet.upload.maximum_data_size=2048 +ethernet.upload.speed=115200 + +ethernet.bootloader.tool=avrdude +ethernet.bootloader.low_fuses=0xff +ethernet.bootloader.high_fuses=0xde +ethernet.bootloader.extended_fuses=0x05 +ethernet.bootloader.file=optiboot/optiboot_atmega328.hex +ethernet.bootloader.unlock_bits=0x3F +ethernet.bootloader.lock_bits=0x0F + +ethernet.build.variant=ethernet +ethernet.build.mcu=atmega328p +ethernet.build.f_cpu=16000000L +ethernet.build.board=AVR_ETHERNET +ethernet.build.core=arduino + +############################################################## + +fio.name=Arduino Fio + +fio.upload.tool=avrdude +fio.upload.protocol=arduino +fio.upload.maximum_size=30720 +fio.upload.maximum_data_size=2048 +fio.upload.speed=57600 + +fio.bootloader.tool=avrdude +fio.bootloader.low_fuses=0xFF +fio.bootloader.high_fuses=0xDA +fio.bootloader.extended_fuses=0x05 +fio.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex +fio.bootloader.unlock_bits=0x3F +fio.bootloader.lock_bits=0x0F + +fio.build.mcu=atmega328p +fio.build.f_cpu=8000000L +fio.build.board=AVR_FIO +fio.build.core=arduino +fio.build.variant=eightanaloginputs + +############################################################## + +bt.name=Arduino BT + +bt.upload.tool=avrdude +bt.upload.protocol=arduino +bt.upload.speed=19200 +bt.upload.disable_flushing=true + +bt.bootloader.tool=avrdude +bt.bootloader.low_fuses=0xff +bt.bootloader.unlock_bits=0x3F +bt.bootloader.lock_bits=0x0F + +bt.build.f_cpu=16000000L +bt.build.board=AVR_BT +bt.build.core=arduino +bt.build.variant=eightanaloginputs + +## Arduino BT w/ ATmega328 +## ----------------------- +bt.menu.cpu.atmega328=ATmega328 +bt.menu.cpu.atmega328.upload.maximum_size=28672 +bt.menu.cpu.atmega328.upload.maximum_data_size=2048 + +bt.menu.cpu.atmega328.bootloader.high_fuses=0xd8 +bt.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +bt.menu.cpu.atmega328.bootloader.file=bt/ATmegaBOOT_168_atmega328_bt.hex + +bt.menu.cpu.atmega328.build.mcu=atmega328p + +## Arduino BT w/ ATmega168 +## ----------------------- +bt.menu.cpu.atmega168=ATmega168 +bt.menu.cpu.atmega168.upload.maximum_size=14336 +bt.menu.cpu.atmega168.upload.maximum_data_size=1024 + +bt.menu.cpu.atmega168.bootloader.high_fuses=0xdd +bt.menu.cpu.atmega168.bootloader.extended_fuses=0x00 +bt.menu.cpu.atmega168.bootloader.file=bt/ATmegaBOOT_168.hex + +bt.menu.cpu.atmega168.build.mcu=atmega168 + +############################################################## + +LilyPadUSB.name=LilyPad Arduino USB +LilyPadUSB.vid.0=0x1B4F +LilyPadUSB.pid.0=0x9207 +LilyPadUSB.vid.1=0x1B4F +LilyPadUSB.pid.1=0x9208 + +LilyPadUSB.upload.tool=avrdude +LilyPadUSB.upload.protocol=avr109 +LilyPadUSB.upload.maximum_size=28672 +LilyPadUSB.upload.maximum_data_size=2560 +LilyPadUSB.upload.speed=57600 +LilyPadUSB.upload.disable_flushing=true +LilyPadUSB.upload.use_1200bps_touch=true +LilyPadUSB.upload.wait_for_upload_port=true + +LilyPadUSB.bootloader.tool=avrdude +LilyPadUSB.bootloader.low_fuses=0xff +LilyPadUSB.bootloader.high_fuses=0xd8 +LilyPadUSB.bootloader.extended_fuses=0xce +LilyPadUSB.bootloader.file=caterina-LilyPadUSB/Caterina-LilyPadUSB.hex +LilyPadUSB.bootloader.unlock_bits=0x3F +LilyPadUSB.bootloader.lock_bits=0x2F + +LilyPadUSB.build.mcu=atmega32u4 +LilyPadUSB.build.f_cpu=8000000L +LilyPadUSB.build.vid=0x1B4F +LilyPadUSB.build.pid=0x9208 +LilyPadUSB.build.usb_product="LilyPad USB" +LilyPadUSB.build.board=AVR_LILYPAD_USB +LilyPadUSB.build.core=arduino +LilyPadUSB.build.variant=leonardo +LilyPadUSB.build.extra_flags={build.usb_flags} + +############################################################## + +lilypad.name=LilyPad Arduino + +lilypad.upload.tool=avrdude +lilypad.upload.protocol=arduino + +lilypad.bootloader.tool=avrdude +lilypad.bootloader.unlock_bits=0x3F +lilypad.bootloader.lock_bits=0x0F + +lilypad.build.f_cpu=8000000L +lilypad.build.board=AVR_LILYPAD +lilypad.build.core=arduino +lilypad.build.variant=standard + +## LilyPad Arduino w/ ATmega328 +## ---------------------------- +lilypad.menu.cpu.atmega328=ATmega328 + +lilypad.menu.cpu.atmega328.upload.maximum_size=30720 +lilypad.menu.cpu.atmega328.upload.maximum_data_size=2048 +lilypad.menu.cpu.atmega328.upload.speed=57600 + +lilypad.menu.cpu.atmega328.bootloader.low_fuses=0xFF +lilypad.menu.cpu.atmega328.bootloader.high_fuses=0xDA +lilypad.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +lilypad.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex + +lilypad.menu.cpu.atmega328.build.mcu=atmega328p + +## LilyPad Arduino w/ ATmega168 +## ---------------------------- +lilypad.menu.cpu.atmega168=ATmega168 + +lilypad.menu.cpu.atmega168.upload.maximum_size=14336 +lilypad.menu.cpu.atmega168.upload.maximum_data_size=1024 +lilypad.menu.cpu.atmega168.upload.speed=19200 + +lilypad.menu.cpu.atmega168.bootloader.low_fuses=0xe2 +lilypad.menu.cpu.atmega168.bootloader.high_fuses=0xdd +lilypad.menu.cpu.atmega168.bootloader.extended_fuses=0x00 +lilypad.menu.cpu.atmega168.bootloader.file=lilypad/LilyPadBOOT_168.hex + +lilypad.menu.cpu.atmega168.build.mcu=atmega168 + +############################################################## + +pro.name=Arduino Pro or Pro Mini + +pro.upload.tool=avrdude +pro.upload.protocol=arduino + +pro.bootloader.tool=avrdude +pro.bootloader.unlock_bits=0x3F +pro.bootloader.lock_bits=0x0F + +pro.build.board=AVR_PRO +pro.build.core=arduino +pro.build.variant=eightanaloginputs + +## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 +## ------------------------------------------------- +pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz) + +pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720 +pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 +pro.menu.cpu.16MHzatmega328.upload.speed=57600 + +pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF +pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA +pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05 +pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex + +pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p +pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L + +## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 +## -------------------------------------------------- +pro.menu.cpu.8MHzatmega328=ATmega328 (3.3V, 8 MHz) + +pro.menu.cpu.8MHzatmega328.upload.maximum_size=30720 +pro.menu.cpu.8MHzatmega328.upload.maximum_data_size=2048 +pro.menu.cpu.8MHzatmega328.upload.speed=57600 + +pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF +pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA +pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05 +pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex + +pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p +pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L + +## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 +## ------------------------------------------------- +pro.menu.cpu.16MHzatmega168=ATmega168 (5V, 16 MHz) + +pro.menu.cpu.16MHzatmega168.upload.maximum_size=14336 +pro.menu.cpu.16MHzatmega168.upload.maximum_data_size=1024 +pro.menu.cpu.16MHzatmega168.upload.speed=19200 + +pro.menu.cpu.16MHzatmega168.bootloader.low_fuses=0xff +pro.menu.cpu.16MHzatmega168.bootloader.high_fuses=0xdd +pro.menu.cpu.16MHzatmega168.bootloader.extended_fuses=0x00 +pro.menu.cpu.16MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex + +pro.menu.cpu.16MHzatmega168.build.mcu=atmega168 +pro.menu.cpu.16MHzatmega168.build.f_cpu=16000000L + +## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 +## -------------------------------------------------- +pro.menu.cpu.8MHzatmega168=ATmega168 (3.3V, 8 MHz) + +pro.menu.cpu.8MHzatmega168.upload.maximum_size=14336 +pro.menu.cpu.8MHzatmega168.upload.maximum_data_size=1024 +pro.menu.cpu.8MHzatmega168.upload.speed=19200 + +pro.menu.cpu.8MHzatmega168.bootloader.low_fuses=0xc6 +pro.menu.cpu.8MHzatmega168.bootloader.high_fuses=0xdd +pro.menu.cpu.8MHzatmega168.bootloader.extended_fuses=0x00 +pro.menu.cpu.8MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex + +pro.menu.cpu.8MHzatmega168.build.mcu=atmega168 +pro.menu.cpu.8MHzatmega168.build.f_cpu=8000000L + +############################################################## + +atmegang.name=Arduino NG or older + +atmegang.upload.tool=avrdude +atmegang.upload.protocol=arduino +atmegang.upload.speed=19200 + +atmegang.bootloader.tool=avrdude +atmegang.bootloader.unlock_bits=0x3F +atmegang.bootloader.lock_bits=0x0F + +atmegang.build.mcu=atmegang +atmegang.build.f_cpu=16000000L +atmegang.build.board=AVR_NG +atmegang.build.core=arduino +atmegang.build.variant=standard + +## Arduino NG or older w/ ATmega168 +## -------------------------------- +atmegang.menu.cpu.atmega168=ATmega168 + +atmegang.menu.cpu.atmega168.upload.maximum_size=14336 +atmegang.menu.cpu.atmega168.upload.maximum_data_size=1024 + +atmegang.menu.cpu.atmega168.bootloader.low_fuses=0xff +atmegang.menu.cpu.atmega168.bootloader.high_fuses=0xdd +atmegang.menu.cpu.atmega168.bootloader.extended_fuses=0x00 +atmegang.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex + +atmegang.menu.cpu.atmega168.build.mcu=atmega168 + +## Arduino NG or older w/ ATmega8 +## ------------------------------ +atmegang.menu.cpu.atmega8=ATmega8 + +atmegang.menu.cpu.atmega8.upload.maximum_size=7168 +atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024 + +atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xdf +atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca +atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex + +atmegang.menu.cpu.atmega8.build.mcu=atmega8 + +############################################################## + +robotControl.name=Arduino Robot Control +robotControl.vid.0=0x2341 +robotControl.pid.0=0x0038 +robotControl.vid.1=0x2341 +robotControl.pid.1=0x8038 +robotControl.vid.2=0x2A03 +robotControl.pid.2=0x0038 +robotControl.vid.3=0x2A03 +robotControl.pid.3=0x8038 + +robotControl.upload.tool=avrdude +robotControl.upload.protocol=avr109 +robotControl.upload.maximum_size=28672 +robotControl.upload.maximum_data_size=2560 +robotControl.upload.speed=57600 +robotControl.upload.disable_flushing=true +robotControl.upload.use_1200bps_touch=true +robotControl.upload.wait_for_upload_port=true + +robotControl.bootloader.tool=avrdude +robotControl.bootloader.low_fuses=0xff +robotControl.bootloader.high_fuses=0xd8 +robotControl.bootloader.extended_fuses=0xcb +robotControl.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Control.hex +robotControl.bootloader.unlock_bits=0x3F +robotControl.bootloader.lock_bits=0x2F + +robotControl.build.mcu=atmega32u4 +robotControl.build.f_cpu=16000000L +robotControl.build.vid=0x2341 +robotControl.build.pid=0x8038 +robotControl.build.usb_product="Robot Control" +robotControl.build.board=AVR_ROBOT_CONTROL +robotControl.build.core=arduino +robotControl.build.variant=robot_control +robotControl.build.extra_flags={build.usb_flags} + +############################################################## + +robotMotor.name=Arduino Robot Motor +robotMotor.vid.0=0x2341 +robotMotor.pid.0=0x0039 +robotMotor.vid.1=0x2341 +robotMotor.pid.1=0x8039 +robotMotor.vid.2=0x2A03 +robotMotor.pid.2=0x0039 +robotMotor.vid.3=0x2A03 +robotMotor.pid.3=0x8039 + +robotMotor.upload.tool=avrdude +robotMotor.upload.protocol=avr109 +robotMotor.upload.maximum_size=28672 +robotMotor.upload.maximum_data_size=2560 +robotMotor.upload.speed=57600 +robotMotor.upload.disable_flushing=true +robotMotor.upload.use_1200bps_touch=true +robotMotor.upload.wait_for_upload_port=true + +robotMotor.bootloader.tool=avrdude +robotMotor.bootloader.low_fuses=0xff +robotMotor.bootloader.high_fuses=0xd8 +robotMotor.bootloader.extended_fuses=0xcb +robotMotor.bootloader.file=caterina-Arduino_Robot/Caterina-Robot-Motor.hex +robotMotor.bootloader.unlock_bits=0x3F +robotMotor.bootloader.lock_bits=0x2F + +robotMotor.build.mcu=atmega32u4 +robotMotor.build.f_cpu=16000000L +robotMotor.build.vid=0x2341 +robotMotor.build.pid=0x8039 +robotMotor.build.usb_product="Robot Motor" +robotMotor.build.board=AVR_ROBOT_MOTOR +robotMotor.build.core=arduino +robotMotor.build.variant=robot_motor +robotMotor.build.extra_flags={build.usb_flags} + +############################################################## + +gemma.vid.0=0x2341 +gemma.pid.0=0x0c9f + +gemma.name=Arduino Gemma + +gemma.bootloader.low_fuses=0xF1 +gemma.bootloader.high_fuses=0xD5 +gemma.bootloader.extended_fuses=0xFE +gemma.bootloader.tool=avrdude +gemma.bootloader.lock_bits= +gemma.bootloader.unlock_bits= +gemma.bootloader.file=gemma/gemma_v1.hex + +gemma.build.mcu=attiny85 +gemma.build.f_cpu=8000000L +gemma.build.core=arduino +gemma.build.variant=gemma +gemma.build.board=AVR_GEMMA + +gemma.upload.tool=avrdude +gemma.upload.maximum_size=5310 + +############################################################## + +## Multi 4-in-1 (3.3V, 16 MHz) w/ ATmega328 +## -------------------------------------------------- +multi.name=Multi 4-in-1 + +multi.upload.tool=avrdude +multi.upload.protocol=arduino + +multi.bootloader.tool=avrdude +multi.bootloader.unlock_bits=0x3F +multi.bootloader.lock_bits=0x0F + +multi.build.board=AVR_PRO +multi.build.core=arduino +multi.build.variant=eightanaloginputs + +multi.menu.cpu.16MHzatmega328=ATmega328 (3.3V, 16 MHz) + +multi.menu.cpu.16MHzatmega328.upload.maximum_size=32768 +multi.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 +multi.menu.cpu.16MHzatmega328.upload.speed=57600 +multi.menu.cpu.16MHzatmega328.upload.using=arduino:arduinoisp + +multi.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF +multi.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xD2 +multi.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0xFD +multi.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex + +multi.menu.cpu.16MHzatmega328.build.mcu=atmega328p +multi.menu.cpu.16MHzatmega328.build.f_cpu=16000000L +## -------------------------------------------------- +multi.menu.cpu.16MHzatmega328opti=ATmega328 Opti (3.3V, 16 MHz) + +multi.menu.cpu.16MHzatmega328opti.upload.maximum_size=32768 +multi.menu.cpu.16MHzatmega328opti.upload.maximum_data_size=2048 +multi.menu.cpu.16MHzatmega328opti.upload.speed=57600 +multi.menu.cpu.16MHzatmega328opti.upload.using=arduino:arduinoisp + +multi.menu.cpu.16MHzatmega328opti.bootloader.low_fuses=0xFF +multi.menu.cpu.16MHzatmega328opti.bootloader.high_fuses=0xD6 +multi.menu.cpu.16MHzatmega328opti.bootloader.extended_fuses=0xFD +multi.menu.cpu.16MHzatmega328opti.bootloader.file=atmega/optiboot_atmega328_16.hex + +multi.menu.cpu.16MHzatmega328opti.build.mcu=atmega328p +multi.menu.cpu.16MHzatmega328opti.build.f_cpu=16000000L + +############################################################## diff --git a/Multiprotocol/iface_a7105.h b/Multiprotocol/iface_a7105.h index 5df2714..11e206c 100644 --- a/Multiprotocol/iface_a7105.h +++ b/Multiprotocol/iface_a7105.h @@ -90,6 +90,7 @@ enum A7105_MASK { enum { INIT_FLYSKY, INIT_FLYSKY_AFHDS2A, + INIT_JOYSWAY, INIT_HUBSAN }; diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index 3ca59f2..a218efc 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -13,16 +13,6 @@ along with Multiprotocol. If not, see . */ -// Check selected board type -#ifndef XMEGA - #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) -// #error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini" - #endif - #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) - #error You must select the processor type "ATmega328(5V, 16MHz)" - #endif -#endif - //****************** // Protocols max 31 x2 //****************** @@ -168,7 +158,10 @@ enum FY326 FY326 = 0, FY319 = 1 }; - +enum{ + FORMAT_V202 = 0, + FORMAT_JXD506 = 1, +}; enum WK2X01 { WK2801 = 0, @@ -207,27 +200,6 @@ struct PPM_Parameters // Macros #define NOP() __asm__ __volatile__("nop") -//******************* -//*** Timer *** -//******************* -#ifdef XMEGA - #define TIFR1 TCC1.INTFLAGS - #define OCF1A_bm TC1_CCAIF_bm - #define OCR1A TCC1.CCA - #define TCNT1 TCC1.CNT - #define UDR0 USARTC0.DATA - #define OCF1B_bm TC1_CCBIF_bm - #define OCR1B TCC1.CCB - #define TIMSK1 TCC1.INTCTRLB - #define SET_TIMSK1_OCIE1B TIMSK1 = (TIMSK1 & 0xF3) | 0x04 - #define CLR_TIMSK1_OCIE1B TIMSK1 &= 0xF3 -#else - #define OCF1A_bm _BV(OCF1A) - #define OCF1B_bm _BV(OCF1B) - #define SET_TIMSK1_OCIE1B TIMSK1 |= _BV(OCIE1B) - #define CLR_TIMSK1_OCIE1B TIMSK1 &=~_BV(OCIE1B) -#endif - //*************** //*** Flags *** //*************** @@ -522,9 +494,9 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- CH_16 0 CH_8 1 sub_protocol==HONTAI - HONTAI 0 - JJRCX1 1 - X5C1 2 + FORMAT_HONTAI 0 + FORMAT_JJRCX1 1 + FORMAT_X5C1 2 FQ777-521 3 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; From 349e5a6404827cdf0cc48658b3756878834bef7b Mon Sep 17 00:00:00 2001 From: tipouic Date: Wed, 19 Oct 2016 21:08:47 +0200 Subject: [PATCH 4/6] maj multipotocol.h --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0d39bda..5ea1407 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.ffs_db *.ffs_db *.ffs_db -*.hc \ No newline at end of file +*.hc +*.ffs_db \ No newline at end of file From f12ff1c58d62a3628e3e60415c2986a627891cfe Mon Sep 17 00:00:00 2001 From: tipouic Date: Fri, 11 Nov 2016 20:49:00 +0100 Subject: [PATCH 5/6] maj --- Multiprotocol/A7105_SPI.ino | 178 +++++---- Multiprotocol/A7105_joysway.ino | 56 ++- Multiprotocol/AFHDS2A_a7105.ino | 351 ++++++++++++++++++ Multiprotocol/Build_orangetx.cmd | 20 + Multiprotocol/CG023_nrf24l01.ino | 4 +- Multiprotocol/FlySky_a7105.ino | 2 +- Multiprotocol/Flysky_afhds2a_a7105.ino | 314 ---------------- Multiprotocol/FrSkyX_cc2500.ino | 4 +- Multiprotocol/Hubsan_a7105.ino | 17 +- Multiprotocol/J6Pro_cyrf6936.ino | 78 ++-- Multiprotocol/MJXQ_nrf24l01.ino | 67 ++-- Multiprotocol/Multiprotocol.ino | 98 ++--- Multiprotocol/Nrf24l01_inav.ino | 64 ++-- Multiprotocol/Nrf24l01_q303.ino | 152 ++++++++ Multiprotocol/PPM_SERIE.txt | 89 +++++ Multiprotocol/Pins.h | 17 +- Multiprotocol/README.md | 11 + Multiprotocol/Telemetry.ino | 486 +++++++++++++------------ Multiprotocol/Validate.h | 13 +- Multiprotocol/_Config.h | 18 +- Multiprotocol/iface_a7105.h | 7 - Multiprotocol/multiprotocol.h | 21 +- Multiprotocol/sync.ffs_db | Bin 942 -> 1094 bytes 23 files changed, 1233 insertions(+), 834 deletions(-) create mode 100644 Multiprotocol/AFHDS2A_a7105.ino create mode 100644 Multiprotocol/Build_orangetx.cmd delete mode 100644 Multiprotocol/Flysky_afhds2a_a7105.ino create mode 100644 Multiprotocol/Nrf24l01_q303.ino create mode 100644 Multiprotocol/PPM_SERIE.txt diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index 975130e..fe54cfd 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -23,19 +23,25 @@ void A7105_WriteData(uint8_t len, uint8_t channel) uint8_t i; A7105_CSN_off; SPI_Write(A7105_RST_WRPTR); - SPI_Write(0x05); + SPI_Write(A7105_05_FIFO_DATA); for (i = 0; i < len; i++) SPI_Write(packet[i]); A7105_CSN_on; - A7105_WriteReg(0x0F, channel); + if(protocol!=MODE_FLYSKY) + { + A7105_Strobe(A7105_STANDBY); //Force standby mode, ie cancel any TX or RX... + A7105_SetTxRxMode(TX_EN); //Switch to PA + } + A7105_WriteReg(A7105_0F_PLL_I, channel); A7105_Strobe(A7105_TX); } -void A7105_ReadData(uint8_t len=16) { +void A7105_ReadData(uint8_t len) +{ uint8_t i; - A7105_Strobe(0xF0); //A7105_RST_RDPTR + A7105_Strobe(A7105_RST_RDPTR); A7105_CSN_off; - SPI_Write(0x45); + SPI_Write(0x40 | A7105_05_FIFO_DATA); //bit 6 =1 for reading for (i=0;i RXSW and RX_EN -> TXSW //This means that sleep mode is wired as RX_EN = 1 and TX_EN = 1 @@ -83,21 +95,22 @@ uint8_t A7105_Reset() { uint8_t result; - A7105_WriteReg(0x00, 0x00); + A7105_WriteReg(A7105_00_MODE, 0x00); delayMilliseconds(1); A7105_SetTxRxMode(TXRX_OFF); //Set both GPIO as output and low - result=A7105_ReadReg(0x10) == 0x9E; //check if is reset. + result=A7105_ReadReg(A7105_10_PLL_II) == 0x9E; //check if is reset. A7105_Strobe(A7105_STANDBY); return result; } -void A7105_WriteID(uint32_t ida) { +void A7105_WriteID(uint32_t ida) +{ A7105_CSN_off; - SPI_Write(0x06);//ex id=0x5475c52a ;txid3txid2txid1txid0 - SPI_Write((ida>>24)&0xff);//53 - SPI_Write((ida>>16)&0xff);//75 - SPI_Write((ida>>8)&0xff);//c5 - SPI_Write((ida>>0)&0xff);//2a + SPI_Write(A7105_06_ID_DATA); //ex id=0x5475c52a ;txid3txid2txid1txid0 + SPI_Write((ida>>24)&0xff); //53 + SPI_Write((ida>>16)&0xff); //75 + SPI_Write((ida>>8)&0xff); //c5 + SPI_Write((ida>>0)&0xff); //2a A7105_CSN_on; } @@ -138,7 +151,7 @@ void A7105_SetPower() power=A7105_RANGE_POWER; if(prev_power != power) { - A7105_WriteReg(0x28, power); + A7105_WriteReg(A7105_28_TX_TEST, power); prev_power=power; } } @@ -148,121 +161,100 @@ void A7105_Strobe(uint8_t address) { SPI_Write(address); A7105_CSN_on; } - +#ifdef HUBSAN_A7105_INO const uint8_t PROGMEM HUBSAN_A7105_regs[] = { 0xFF, 0x63, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF ,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2B, 0xFF, 0xFF, 0x62, 0x80, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0x07, 0x17, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF + 0xFF, 0xFF }; +#endif +#ifdef FLYSKY_A7105_INO const uint8_t PROGMEM FLYSKY_A7105_regs[] = { 0xff, 0x42, 0x00, 0x14, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x00, 0x50, 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x00, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0xc3, 0x0f, 0x13, 0xc3, 0x00, 0xff, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, - 0x01, 0x0f, 0xff + 0x01, 0x0f }; -const uint8_t PROGMEM AFHDS2A_regs[] = { - 0xFF , 0x42 | (1<<5), 0x00, 0x25, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3c, 0x05, 0x00, 0x50, // 00 - 0f - 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x4f, 0x62, 0x80, 0xFF, 0xFF, 0x2a, 0x32, 0xc3, 0x1f, // 10 - 1f - 0x1e, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f +#endif +#ifdef AFHDS2A_A7105_INO +const uint8_t PROGMEM AFHDS2A_A7105_regs[] = { + 0xFF, 0x42 | (1<<5), 0x00, 0x25, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3c, 0x05, 0x00, 0x50, // 00 - 0f + 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x4f, 0x62, 0x80, 0xFF, 0xFF, 0x2a, 0x32, 0xc3, 0x1f, // 10 - 1f + 0x1e, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f 0x01, 0x0f // 30 - 31 }; -static const uint8_t PROGMEM JOYSWAY_regs[] = { - 0x00, 0x62, -1, 0x0f, 0x00, -1 , -1 , 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0xf5, 0x00, 0x15, - 0x9e, 0x4b, 0x00, 0x03, 0x56, 0x2b, 0x12, 0x4a, 0x02, 0x80, 0x80, 0x00, 0x0e, 0x91, 0x03, 0x0f, - 0x16, 0x2a, 0x00, -1, -1, -1, 0x3a, 0x06, 0x1f, 0x47, 0x80, 0x01, 0x05, 0x45, 0x18, 0x00, - 0x01, 0x0f, 0x00 -}; +#endif #define ID_NORMAL 0x55201041 #define ID_PLUS 0xAA201041 -void A7105_Init(uint8_t protocol) +void A7105_Init(void) { - uint8_t *A7105_Regs; + uint8_t *A7105_Regs=0; - if(protocol==INIT_FLYSKY || protocol==INIT_FLYSKY_AFHDS2A) - { - A7105_WriteID(0x5475c52A);//0x2Ac57554 - if(protocol==INIT_FLYSKY_AFHDS2A) - A7105_Regs=(uint8_t*)AFHDS2A_regs; + #ifdef HUBSAN_A7105_INO + if(protocol==MODE_HUBSAN) + { + A7105_WriteID(ID_NORMAL); + A7105_Regs=(uint8_t*)HUBSAN_A7105_regs; + } else - A7105_Regs=(uint8_t*)FLYSKY_A7105_regs; - } - else if(protocol==INIT_JOYSWAY) + #endif + { + A7105_WriteID(0x5475c52A);//0x2Ac57554 + #ifdef FLYSKY_A7105_INO + if(protocol==MODE_FLYSKY) + A7105_Regs=(uint8_t*)FLYSKY_A7105_regs; + else + #endif + { + #ifdef AFHDS2A_A7105_INO + A7105_Regs=(uint8_t*)AFHDS2A_A7105_regs; + #endif + } + } + + for (uint8_t i = 0; i < 0x32; i++) { - A7105_WriteID(0x5475c52a);//0x2Ac57554 - A7105_Regs=(uint8_t*)JOYSWAY_regs; + uint8_t val=pgm_read_byte_near(&A7105_Regs[i]); + if( val != 0xFF) + A7105_WriteReg(i, val); } - else - { // HUBSAN - A7105_WriteID(ID_NORMAL); - A7105_Regs=(uint8_t*)HUBSAN_A7105_regs; - } - for (uint8_t i = 0; i < 0x33; i++){ - if( pgm_read_byte_near(&A7105_Regs[i]) != 0xFF) - A7105_WriteReg(i, pgm_read_byte_near(&A7105_Regs[i])); - } - if(protocol==INIT_JOYSWAY) - A7105_Strobe(A7105_PLL); - else - A7105_Strobe(A7105_STANDBY); + A7105_Strobe(A7105_STANDBY); //IF Filter Bank Calibration A7105_WriteReg(A7105_02_CALC,1); - while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end // A7105_ReadReg(A7105_22_IF_CALIB_I); // A7105_ReadReg(A7105_24_VCO_CURCAL); - if(protocol==INIT_JOYSWAY) { - A7105_Strobe(A7105_STANDBY); - //VCO Current Calibration - A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet - A7105_WriteReg(A7105_25_VCO_SBCAL_I,0x09); //Recommended calibration from A7105 Datasheet - A7105_WriteID(binding_idx); - } - if(protocol==INIT_FLYSKY || protocol==INIT_FLYSKY_AFHDS2A) + if(protocol!=MODE_HUBSAN) { //VCO Current Calibration - A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet + A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet //VCO Bank Calibration - A7105_WriteReg(A7105_26_VCO_SBCAL_II,0x3b); //Recommended calibration from A7105 Datasheet + A7105_WriteReg(A7105_26_VCO_SBCAL_II,0x3b); //Recommended calibration from A7105 Datasheet } //VCO Bank Calibrate channel 0 - if(protocol==INIT_JOYSWAY) { - A7105_Strobe(A7105_PLL); - A7105_WriteReg(A7105_02_CALC,1); - } - else { - A7105_WriteReg(A7105_0F_CHANNEL, 0); - A7105_WriteReg(A7105_02_CALC,2); - } + A7105_WriteReg(A7105_0F_CHANNEL, 0); + A7105_WriteReg(A7105_02_CALC,2); while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end // A7105_ReadReg(A7105_25_VCO_SBCAL_I); - if(protocol==INIT_JOYSWAY) { - A7105_Strobe(A7105_STANDBY); - //VCO Current Calibration - A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet - A7105_WriteReg(A7105_25_VCO_SBCAL_I,0x09); //Recommended calibration from A7105 Datasheet - } - else { - //VCO Bank Calibrate channel A0 - A7105_WriteReg(A7105_0F_CHANNEL, 0xa0); - A7105_WriteReg(A7105_02_CALC, 2); - while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end - // A7105_ReadReg(A7105_25_VCO_SBCAL_I); + //VCO Bank Calibrate channel A0 + A7105_WriteReg(A7105_0F_CHANNEL, 0xa0); + A7105_WriteReg(A7105_02_CALC, 2); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end +// A7105_ReadReg(A7105_25_VCO_SBCAL_I); - //Reset VCO Band calibration - if(protocol==INIT_FLYSKY) - A7105_WriteReg(A7105_25_VCO_SBCAL_I,0x08); - if(protocol==INIT_FLYSKY_AFHDS2A) - A7105_WriteReg(A7105_25_VCO_SBCAL_I,0x0A); - } + //Reset VCO Band calibration + if(protocol!=MODE_HUBSAN) + A7105_WriteReg(A7105_25_VCO_SBCAL_I,protocol==MODE_FLYSKY?0x08:0x0A); A7105_SetTxRxMode(TX_EN); A7105_SetPower(); A7105_Strobe(A7105_STANDBY); } -#endif +#endif \ No newline at end of file diff --git a/Multiprotocol/A7105_joysway.ino b/Multiprotocol/A7105_joysway.ino index feb12b7..572ca9f 100644 --- a/Multiprotocol/A7105_joysway.ino +++ b/Multiprotocol/A7105_joysway.ino @@ -20,6 +20,12 @@ #define EVEN_ODD 0x00 //#define EVEN_ODD 0x01 +static uint8_t PROGMEM A7105_regs[] = { + 0x00, 0x62, 0xFF, 0x0f, 0x00, 0xFF , 0xFF , 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0xf5, 0x00, 0x15, + 0x9e, 0x4b, 0x00, 0x03, 0x56, 0x2b, 0x12, 0x4a, 0x02, 0x80, 0x80, 0x00, 0x0e, 0x91, 0x03, 0x0f, + 0x16, 0x2a, 0x00, 0xFF, 0xFF, 0xFF, 0x3a, 0x06, 0x1f, 0x47, 0x80, 0x01, 0x05, 0x45, 0x18, 0x00, + 0x01, 0x0f, 0x00 +}; static void joysway_build_packet() { int i; @@ -29,10 +35,10 @@ static void joysway_build_packet() //Center = 0x5d9 //1 % = 5 packet[0] = phase == 0 ? 0xdd : 0xff; - packet[1] = (binding_idx >> 24) & 0xff; - packet[2] = (binding_idx >> 16) & 0xff; - packet[3] = (binding_idx >> 8) & 0xff; - packet[4] = (binding_idx >> 0) & 0xff; + packet[1] = (MProtocol_id >> 24) & 0xff; + packet[2] = (MProtocol_id >> 16) & 0xff; + packet[3] = (MProtocol_id >> 8) & 0xff; + packet[4] = (MProtocol_id >> 0) & 0xff; packet[5] = 0x00; static const int chmap[4] = {6, 7, 10, 11}; for (i = 0; i < 4; i++) { @@ -56,7 +62,7 @@ static uint16_t joysway_cb() A7105_WriteID(0x5475c52a); hopping_frequency_no = 0x0a; } else if (phase == 2) { - A7105_WriteID(binding_idx); + A7105_WriteID(MProtocol_id); hopping_frequency_no = 0x30; } else { if ((phase & 0x01) ^ EVEN_ODD) { @@ -78,8 +84,44 @@ static uint16_t joysway_cb() } static uint16_t JOYSWAY_Setup() { - binding_idx = MProtocol_id_master | 0xf8000000; - A7105_Init(INIT_JOYSWAY); + int i; + u8 if_calibration1; + //u8 vco_calibration0; + //u8 vco_calibration1; + + counter = 0; + next_ch = 0x30; + + for (i = 0; i < 0x33; i++) { + uint8_t val=pgm_read_byte_near(&A7105_Regs[i]); + if( val != 0xFF) + A7105_WriteReg(i, val); + } + A7105_WriteID(0x5475c52a); + + A7105_Strobe(A7105_PLL); + + //IF Filter Bank Calibration + A7105_WriteReg(0x02, 1); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + A7105_Strobe(A7105_STANDBY); + + //VCO Current Calibration + A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet + A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet + + A7105_WriteID(MProtocol_id); + A7105_Strobe(A7105_PLL); + A7105_WriteReg(0x02, 1); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + A7105_Strobe(A7105_STANDBY); + A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet + A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet + + A7105_SetTxRxMode(TX_EN); + A7105_SetPower(); + + A7105_Strobe(A7105_STANDBY); return 2400; } #endif diff --git a/Multiprotocol/AFHDS2A_a7105.ino b/Multiprotocol/AFHDS2A_a7105.ino new file mode 100644 index 0000000..869b5a8 --- /dev/null +++ b/Multiprotocol/AFHDS2A_a7105.ino @@ -0,0 +1,351 @@ +/* + 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 . + */ +// Last sync with hexfet new_protocols/flysky_a7105.c dated 2015-09-28 + +#ifdef AFHDS2A_A7105_INO + +#define AFHDS2A_TXPACKET_SIZE 38 +#define AFHDS2A_RXPACKET_SIZE 37 +#define AFHDS2A_NUMFREQ 16 + +enum{ + AFHDS2A_PACKET_STICKS, + AFHDS2A_PACKET_SETTINGS, + AFHDS2A_PACKET_FAILSAFE, +}; + +enum{ + AFHDS2A_BIND1, + AFHDS2A_BIND2, + AFHDS2A_BIND3, + AFHDS2A_BIND4, + AFHDS2A_DATA, +}; + +static void AFHDS2A_calc_channels() +{ + uint8_t idx = 0; + uint32_t rnd = MProtocol_id; + while (idx < AFHDS2A_NUMFREQ) + { + uint8_t i; + uint8_t count_1_42 = 0, count_43_85 = 0, count_86_128 = 0, count_129_168 = 0; + rnd = rnd * 0x0019660D + 0x3C6EF35F; // Randomization + + uint8_t next_ch = ((rnd >> (idx%32)) % 0xa8) + 1; + // Keep the distance 2 between the channels - either odd or even + if (((next_ch ^ MProtocol_id) & 0x01 )== 0) + continue; + // Check that it's not duplicate and spread uniformly + for (i = 0; i < idx; i++) + { + if(hopping_frequency[i] == next_ch) + break; + if(hopping_frequency[i] <= 42) + count_1_42++; + else if (hopping_frequency[i] <= 85) + count_43_85++; + else if (hopping_frequency[i] <= 128) + count_86_128++; + else + count_129_168++; + } + if (i != idx) + continue; + if ((next_ch <= 42 && count_1_42 < 5) + ||(next_ch >= 43 && next_ch <= 85 && count_43_85 < 5) + ||(next_ch >= 86 && next_ch <=128 && count_86_128 < 5) + ||(next_ch >= 129 && count_129_168 < 5)) + hopping_frequency[idx++] = next_ch; + } +} + +#if defined(TELEMETRY) +// telemetry sensors ID +enum{ + AFHDS2A_SENSOR_RX_VOLTAGE = 0x00, + AFHDS2A_SENSOR_RX_ERR_RATE = 0xfe, + AFHDS2A_SENSOR_RX_RSSI = 0xfc, + AFHDS2A_SENSOR_RX_NOISE = 0xfb, + AFHDS2A_SENSOR_RX_SNR = 0xfa, +}; + +static void AFHDS2A_update_telemetry() +{ + // AA | TXID | rx_id | sensor id | sensor # | value 16 bit big endian | sensor id ...... + // max 7 sensors per packet +#if defined AFHDS2A_TELEMETRY + if (option & 0x80) { + // forward telemetry to TX, skip rx and tx id to save space + pkt[0]= TX_RSSI; + for(int i=9;i < AFHDS2A_RXPACKET_SIZE; i++) + pkt[i-8]=packet[i]; + + telemetry_link=2; + return; + } +#endif + for(uint8_t sensor=0; sensor<7; sensor++) + { + uint8_t index = 9+(4*sensor); + switch(packet[index]) + { + case AFHDS2A_SENSOR_RX_VOLTAGE: + v_lipo = packet[index+3]<<8 | packet[index+2]; + telemetry_link=1; + break; + /*case AFHDS2A_SENSOR_RX_ERR_RATE: + // packet[index+2]; + break;*/ + case AFHDS2A_SENSOR_RX_RSSI: + RSSI_dBm = -packet[index+2]; + break; + case 0xff: + return; + /*default: + // unknown sensor ID + break;*/ + } + } +} +#endif + +static void AFHDS2A_build_bind_packet() +{ + uint8_t ch; + memcpy( &packet[1], rx_tx_addr, 4); + memset( &packet[5], 0xff, 4); + packet[10]= 0x00; + for(ch=0; ch 0x02) + packet[9] = 0x02; + packet[27]= 0x01; + packet[28]= 0x80; + break; + } +} + +static void AFHDS2A_build_packet(uint8_t type) +{ + memcpy( &packet[1], rx_tx_addr, 4); + memcpy( &packet[5], rx_id, 4); + switch(type) + { + case AFHDS2A_PACKET_STICKS: + packet[0] = 0x58; + for(uint8_t ch=0; ch<14; ch++) + { + packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF; + packet[10 + ch*2] = (Servo_data[CH_AETR[ch]]>>8)&0xFF; + } + break; + case AFHDS2A_PACKET_FAILSAFE: + packet[0] = 0x56; + for(uint8_t ch=0; ch<14; ch++) + { + /*if((Model.limits[ch].flags & CH_FAILSAFE_EN)) + { + packet[9 + ch*2] = Servo_data[CH_AETR[ch]] & 0xff; + packet[10+ ch*2] = (Servo_data[CH_AETR[ch]] >> 8) & 0xff; + } + else*/ + { + packet[9 + ch*2] = 0xff; + packet[10+ ch*2] = 0xff; + } + } + break; + case AFHDS2A_PACKET_SETTINGS: + packet[0] = 0xaa; + packet[9] = 0xfd; + packet[10]= 0xff; + uint16_t val_hz=5*(option & 0x7f)+50; // option value should be between 0 and 70 which gives a value between 50 and 400Hz + if(val_hz<50 || val_hz>400) val_hz=50; // default is 50Hz + packet[11]= val_hz; + packet[12]= val_hz >> 8; + if(sub_protocol == PPM_IBUS || sub_protocol == PPM_SBUS) + packet[13] = 0x01; // PPM output enabled + else + packet[13] = 0x00; + packet[14]= 0x00; + for(uint8_t i=15; i<37; i++) + packet[i] = 0xff; + packet[18] = 0x05; // ? + packet[19] = 0xdc; // ? + packet[20] = 0x05; // ? + if(sub_protocol == PWM_SBUS || sub_protocol == PPM_SBUS) + packet[21] = 0xdd; // SBUS output enabled + else + packet[21] = 0xde; // IBUS + break; + } + packet[37] = 0x00; +} + +#define AFHDS2A_WAIT_WRITE 0x80 +uint16_t ReadAFHDS2A() +{ + static uint8_t packet_type = AFHDS2A_PACKET_STICKS; + static uint16_t packet_counter=0; + uint8_t data_rx; + uint16_t start; + switch(phase) + { + case AFHDS2A_BIND1: + case AFHDS2A_BIND2: + case AFHDS2A_BIND3: + AFHDS2A_build_bind_packet(); + A7105_WriteData(AFHDS2A_TXPACKET_SIZE, packet_count%2 ? 0x0d : 0x8c); + if(!(A7105_ReadReg(A7105_00_MODE) & (1<<5 | 1<<6))) + { // FECF+CRCF Ok + A7105_ReadData(AFHDS2A_RXPACKET_SIZE); + if(packet[0] == 0xbc && packet[9] == 0x01) + { + uint8_t temp=50+RX_num*4; + uint8_t i; + for(i=0; i<4; i++) + { + rx_id[i] = packet[5+i]; + eeprom_write_byte((EE_ADDR)(temp+i),rx_id[i]); + } + phase = AFHDS2A_BIND4; + packet_count++; + return 3850; + } + } + packet_count++; + phase |= AFHDS2A_WAIT_WRITE; + return 1700; + case AFHDS2A_BIND1|AFHDS2A_WAIT_WRITE: + case AFHDS2A_BIND2|AFHDS2A_WAIT_WRITE: + case AFHDS2A_BIND3|AFHDS2A_WAIT_WRITE: + //Wait for TX completion + start=micros(); + while ((uint16_t)micros()-start < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs + if(!(A7105_ReadReg(A7105_00_MODE) & 0x01)) + break; + A7105_SetTxRxMode(RX_EN); + A7105_Strobe(A7105_RX); + phase &= ~AFHDS2A_WAIT_WRITE; + phase++; + if(phase > AFHDS2A_BIND3) + phase = AFHDS2A_BIND1; + return 2150; + case AFHDS2A_BIND4: + AFHDS2A_build_bind_packet(); + A7105_WriteData(AFHDS2A_TXPACKET_SIZE, packet_count%2 ? 0x0d : 0x8c); + packet_count++; + bind_phase++; + if(bind_phase>=4) + { + packet_counter=0; + packet_type = AFHDS2A_PACKET_STICKS; + hopping_frequency_no=1; + phase = AFHDS2A_DATA; + BIND_DONE; + } + return 3850; + case AFHDS2A_DATA: + AFHDS2A_build_packet(packet_type); + if((A7105_ReadReg(A7105_00_MODE) & 0x01)) // Check if something has been received... + data_rx=0; + else + data_rx=1; // Yes + A7105_WriteData(AFHDS2A_TXPACKET_SIZE, hopping_frequency[hopping_frequency_no++]); + if(hopping_frequency_no >= AFHDS2A_NUMFREQ) + hopping_frequency_no = 0; + if(!(packet_counter % 1313)) + packet_type = AFHDS2A_PACKET_SETTINGS; + else if(!(packet_counter % 1569)) + packet_type = AFHDS2A_PACKET_FAILSAFE; + else + packet_type = AFHDS2A_PACKET_STICKS; // todo : check for settings changes + if(!(A7105_ReadReg(A7105_00_MODE) & (1<<5 | 1<<6)) && data_rx==1) + { // RX+FECF+CRCF Ok + A7105_ReadData(AFHDS2A_RXPACKET_SIZE); + if(packet[0] == 0xaa) + { + if(packet[9] == 0xfc) + packet_type=AFHDS2A_PACKET_SETTINGS; // RX is asking for settings + #if defined(TELEMETRY) + else + { + // Read TX RSSI + int16_t temp=256-(A7105_ReadReg(A7105_1D_RSSI_THOLD)*8)/5; // value from A7105 is between 8 for maximum signal strength to 160 or less + if(temp<0) temp=0; + else if(temp>255) temp=255; + TX_RSSI=temp; + AFHDS2A_update_telemetry(); + } + #endif + } + } + packet_counter++; + phase |= AFHDS2A_WAIT_WRITE; + return 1700; + case AFHDS2A_DATA|AFHDS2A_WAIT_WRITE: + //Wait for TX completion + start=micros(); + while ((uint16_t)micros()-start < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs + if(!(A7105_ReadReg(A7105_00_MODE) & 0x01)) + break; + A7105_SetTxRxMode(RX_EN); + A7105_Strobe(A7105_RX); + phase &= ~AFHDS2A_WAIT_WRITE; + return 2150; + } + return 3850; // never reached, please the compiler +} + +uint16_t initAFHDS2A() +{ + A7105_Init(); + + AFHDS2A_calc_channels(); + packet_count = 0; + bind_phase = 0; + if(IS_AUTOBIND_FLAG_on) + phase = AFHDS2A_BIND1; + else + { + phase = AFHDS2A_DATA; + //Read RX ID from EEPROM based on RX_num, RX_num must be uniq for each RX + uint8_t temp=50+RX_num*4; + for(uint8_t i=0;i<4;i++) + rx_id[i]=eeprom_read_byte((EE_ADDR)(temp+i)); + } + hopping_frequency_no = 0; + return 50000; +} +#endif diff --git a/Multiprotocol/Build_orangetx.cmd b/Multiprotocol/Build_orangetx.cmd new file mode 100644 index 0000000..58c6f24 --- /dev/null +++ b/Multiprotocol/Build_orangetx.cmd @@ -0,0 +1,20 @@ +@echo off +if "%AVR32_HOME%"=="" ( +echo. +echo You must install winavr to compile Multi for OrangeTX: https://sourceforge.net/projects/winavr/ +echo. +pause +exit /b +) +if exist MultiOrange.cpp.orangetx ren *.orangetx *. +if exist .dep (make clean) +md .dep +make +if exist MultiOrange.hex ( +objcopy -I ihex MultiOrange.hex -O binary MultiOrange.bin +echo. +echo Compilation OK. +echo Use MultiOrange.hex to program your OrangeTX module. +echo. +) +pause diff --git a/Multiprotocol/CG023_nrf24l01.ino b/Multiprotocol/CG023_nrf24l01.ino index 5f6f3a2..91425a8 100644 --- a/Multiprotocol/CG023_nrf24l01.ino +++ b/Multiprotocol/CG023_nrf24l01.ino @@ -126,8 +126,8 @@ static void __attribute__((unused)) CG023_send_packet(uint8_t bind) | GET_FLAG(Servo_AUX4,H8_3D_FLAG_RTH); // 180/360 flip mode on H8 3D packet[18] = GET_FLAG(Servo_AUX5,H8_3D_FLAG_CALIBRATE) | GET_FLAG(Servo_AUX5,H8_3D_FLAG_CALIBRATE2) - | GET_FLAG(Servo_AUX6, H8_3D_FLAG_SNAPSHOT) - | GET_FLAG(Servo_AUX7, H8_3D_FLAG_VIDEO); + | GET_FLAG(Servo_AUX6,H8_3D_FLAG_SNAPSHOT) + | GET_FLAG(Servo_AUX7,H8_3D_FLAG_VIDEO); } uint8_t sum = packet[9]; for (uint8_t i=10; i < H8_3D_PACKET_SIZE-1; i++) diff --git a/Multiprotocol/FlySky_a7105.ino b/Multiprotocol/FlySky_a7105.ino index 43ccffd..c1632e7 100644 --- a/Multiprotocol/FlySky_a7105.ino +++ b/Multiprotocol/FlySky_a7105.ino @@ -184,7 +184,7 @@ uint16_t initFlySky() uint8_t chanoffset; uint8_t temp; - A7105_Init(INIT_FLYSKY); //flysky_init(); + A7105_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; diff --git a/Multiprotocol/Flysky_afhds2a_a7105.ino b/Multiprotocol/Flysky_afhds2a_a7105.ino deleted file mode 100644 index 5fcf6c4..0000000 --- a/Multiprotocol/Flysky_afhds2a_a7105.ino +++ /dev/null @@ -1,314 +0,0 @@ -// adaptation de https://github.com/goebish/deviation/blob/c5dd9fcc1441fc05fe9effa4c378886aeb3938d4/src/protocol/flysky_afhds2a_a7105.c -#ifdef AFHDS2A_A7105_INO -#define EEPROMadress 0 // rx ID 32bit -#define SERVO_HZ 50 //Frequency's servo 0=50 1=400 2=5 - -#define TXPACKET_SIZE 38 -#define RXPACKET_SIZE 37 -#define NUMFREQ 16 - -static uint8_t txid[4]; -static uint8_t rxid[4]; -static uint8_t packet_type; -static uint8_t bind_reply; - - -enum{ - PACKET_STICKS, - PACKET_SETTINGS, - PACKET_FAILSAFE, -}; - -enum{ - BIND1, - BIND2, - BIND3, - BIND4, - DATA1, -}; -enum { - PWM_IBUS = 0, - PPM_IBUS, - PWM_SBUS, - PPM_SBUS -}; - - -static void build_packet(uint8_t type) { - switch(type) { - case PACKET_STICKS: - packet[0] = 0x58; - memcpy( &packet[1], txid, 4); - memcpy( &packet[5], rxid, 4); - for(uint8_t ch=0; ch<14; ch++) { - packet[9 + ch*2] = Servo_data[CH_AETR[ch]]&0xFF; - packet[10 + ch*2] = (Servo_data[CH_AETR[ch]]>>8)&0xFF; - } - packet[37] = 0x00; - break; - - case PACKET_FAILSAFE: - packet[0] = 0x56; - memcpy( &packet[1], txid, 4); - memcpy( &packet[5], rxid, 4); - for(uint8_t ch=0; ch<14; ch++) { - if(ch==0) { - // if(ch < Model.num_channels && (Model.limits[ch].flags & CH_FAILSAFE_EN)) { - packet[9 + ch*2] = Servo_data[AUX11] & 0xff; - packet[10+ ch*2] = (Servo_data[AUX11] >> 8) & 0xff; - } - else { - packet[9 + ch*2] = 0xff; - packet[10+ ch*2] = 0xff; - } - } - packet[37] = 0x00; - break; - - case PACKET_SETTINGS: - packet[0] = 0xaa; - memcpy( &packet[1], txid, 4); - memcpy( &packet[5], rxid, 4); - packet[9] = 0xfd; - packet[10]= 0xff; - packet[11]= SERVO_HZ & 0xff; - packet[12]= (SERVO_HZ >> 8) & 0xff; - if(option == PPM_IBUS || option == PPM_SBUS) - packet[13] = 0x01; // PPM output enabled - else - packet[13] = 0x00; - packet[14]= 0x00; - for(uint8_t i=15; i<37; i++) - packet[i] = 0xff; - packet[18] = 0x05; // ? - packet[19] = 0xdc; // ? - packet[20] = 0x05; // ? - if(option == PWM_SBUS || option == PPM_SBUS) - packet[21] = 0xdd; // SBUS output enabled - else - packet[21] = 0xde; - packet[37] = 0x00; - break; - } -} - -// telemetry sensors ID -enum{ - SENSOR_RX_VOLTAGE = 0x00, - SENSOR_RX_ERR_RATE = 0xfe, - SENSOR_RX_RSSI = 0xfc, - SENSOR_RX_NOISE = 0xfb, - SENSOR_RX_SNR = 0xfa, -}; - -static void update_telemetry() { - // AA | TXID | RXID | sensor id | sensor # | value 16 bit big endian | sensor id ...... - // max 7 sensors per packet - - for(uint8_t sensor=0; sensor<7; sensor++) { - uint8_t index = 9+(4*sensor); - switch(packet[index]) { - case SENSOR_RX_VOLTAGE: - v_lipo = packet[index+3]<<8 | packet[index+2]; - telemetry_link=1; - break; - case SENSOR_RX_ERR_RATE: - // packet[index+2]; - break; - case SENSOR_RX_RSSI: - RSSI_dBm = -packet[index+2]; - break; - case 0xff: - return; - default: - // unknown sensor ID - break; - } - } -} - -static void afhds2a_build_bind_packet() { - uint8_t ch; - memcpy( &packet[1], txid, 4); - memset( &packet[5], 0xff, 4); - packet[10]= 0x00; - for(ch=0; ch<16; ch++) { - packet[11+ch] = hopping_frequency[ch]; - } - memset( &packet[27], 0xff, 10); - packet[37] = 0x00; - switch(phase) { - case BIND1: - packet[0] = 0xbb; - packet[9] = 0x01; - break; - case BIND2: - case BIND3: - case BIND4: - packet[0] = 0xbc; - if(phase == BIND4) { - memcpy( &packet[5], &rxid, 4); - memset( &packet[11], 0xff, 16); - } - packet[9] = phase-1; - if(packet[9] > 0x02) - packet[9] = 0x02; - packet[27]= 0x01; - packet[28]= 0x80; - break; - } -} - -static void calc_afhds_channels() { - int idx = 0; - uint32_t rnd = MProtocol_id; - while (idx < NUMFREQ) { - int i; - int count_1_42 = 0, count_43_85 = 0, count_86_128 = 0, count_129_168=0; - rnd = rnd * 0x0019660D + 0x3C6EF35F; // Randomization - - uint8_t next_ch = ((rnd >> (idx%32)) % 0xa8) + 1; - // Keep the distance 2 between the channels - either odd or even - if (((next_ch ^ MProtocol_id) & 0x01 )== 0) - continue; - // Check that it's not duplicate and spread uniformly - for (i = 0; i < idx; i++) { - if(hopping_frequency[i] == next_ch) - break; - if(hopping_frequency[i] <= 42) - count_1_42++; - else if (hopping_frequency[i] <= 85) - count_43_85++; - else if (hopping_frequency[i] <= 128) - count_86_128++; - else - count_129_168++; - } - if (i != idx) - continue; - if ((next_ch <= 42 && count_1_42 < 5) - ||(next_ch >= 43 && next_ch <= 85 && count_43_85 < 5) - ||(next_ch >= 86 && next_ch <=128 && count_86_128 < 5) - ||(next_ch >= 129 && count_129_168 < 5)) - { - hopping_frequency[idx++] = next_ch; - } - } -} - -#define WAIT_WRITE 0x80 -static uint16_t afhds2a_cb() { - switch(phase) { - case BIND1: - case BIND2: - case BIND3: - A7105_Strobe(A7105_STANDBY); - afhds2a_build_bind_packet(); - A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); - if(A7105_ReadReg(0) == 0x1b) { // todo: replace with check crc+fec - A7105_Strobe(A7105_RST_RDPTR); - A7105_ReadData(RXPACKET_SIZE); - if(packet[0] == 0xbc) { - for(uint8_t i=0; i<4; i++) { - rxid[i] = packet[5+i]; - } - eeprom_write_block((const void*)rxid,(EE_ADDR)EEPROMadress,4); - if(packet[9] == 0x01) - phase = BIND4; - } - } - packet_count++; - phase |= WAIT_WRITE; - return 1700; - case BIND1|WAIT_WRITE: - case BIND2|WAIT_WRITE: - case BIND3|WAIT_WRITE: - A7105_Strobe(A7105_RX); - phase &= ~WAIT_WRITE; - phase++; - if(phase > BIND3) - phase = BIND1; - return 2150; - case BIND4: - A7105_Strobe(A7105_STANDBY); - afhds2a_build_bind_packet(); - A7105_WriteData(38, packet_count%2 ? 0x0d : 0x8c); - packet_count++; - bind_reply++; - if(bind_reply>=4) { - packet_count=0; - channel=1; - phase = DATA1; - BIND_DONE; - } - phase |= WAIT_WRITE; - return 1700; - case BIND4|WAIT_WRITE: - A7105_Strobe(A7105_RX); - phase &= ~WAIT_WRITE; - return 2150; - case DATA1: - A7105_Strobe(A7105_STANDBY); - build_packet(packet_type); - A7105_WriteData(38, hopping_frequency[channel++]); - if(channel >= 16) - channel = 0; - if(!(packet_count % 1313)) - packet_type = PACKET_SETTINGS; - else if(!(packet_count % 1569)) - packet_type = PACKET_FAILSAFE; - else - packet_type = PACKET_STICKS; // todo : check for settings changes - // got some data from RX ? - // we've no way to know if RX fifo has been filled - // as we can't poll GIO1 or GIO2 to check WTR - // we can't check A7105_MASK_TREN either as we know - // it's currently in transmit mode. - if(!(A7105_ReadReg(0) & (1<<5 | 1<<6))) { // FECF+CRCF Ok - A7105_Strobe(A7105_RST_RDPTR); - A7105_ReadData(1); - if(packet[0] == 0xaa) { - A7105_Strobe(A7105_RST_RDPTR); - A7105_ReadData(RXPACKET_SIZE); - if(packet[9] == 0xfc) { // rx is asking for settings - packet_type=PACKET_SETTINGS; - } - else { - update_telemetry(); - } - } - } - packet_count++; - phase |= WAIT_WRITE; - return 1700; - case DATA1|WAIT_WRITE: - phase &= ~WAIT_WRITE; - A7105_Strobe(A7105_RX); - return 2150; - } - return 3850; // never reached, please the compiler -} - -static uint16_t AFHDS2A_setup() -{ - A7105_Init(INIT_FLYSKY_AFHDS2A); //flysky_init(); - for (uint8_t i = 0; i < 4; ++i) { - txid[i] = rx_tx_addr[i]; - } - - calc_afhds_channels(); - packet_type = PACKET_STICKS; - packet_count = 0; - bind_reply = 0; - if(IS_AUTOBIND_FLAG_on) { - phase = BIND1; - BIND_IN_PROGRESS; - } - else { - phase = DATA1; - eeprom_read_block((void*)rxid,(EE_ADDR)EEPROMadress,4); - } - channel = 0; - return 50000; -} -#endif diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index e0a2113..474f190 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -293,7 +293,9 @@ uint16_t ReadFrSkyX() seq_last_sent = 0; seq_last_rcvd = 8; counter=0; - telemetry_lost=1; + #if defined TELEMETRY + telemetry_lost=1; + #endif } CC2500_Strobe(CC2500_SFRX); //flush the RXFIFO } diff --git a/Multiprotocol/Hubsan_a7105.ino b/Multiprotocol/Hubsan_a7105.ino index 227134c..4b681ec 100644 --- a/Multiprotocol/Hubsan_a7105.ino +++ b/Multiprotocol/Hubsan_a7105.ino @@ -287,7 +287,6 @@ uint16_t ReadHubsan() case BIND_5: case BIND_7: hubsan_build_bind_packet(phase == BIND_7 ? 9 : (phase == BIND_5 ? 1 : phase + 1 - BIND_1)); - A7105_Strobe(A7105_STANDBY); A7105_WriteData(16, channel); phase |= WAIT_WRITE; return 3000; @@ -322,7 +321,7 @@ uint16_t ReadHubsan() phase = BIND_1; return 4500; //No signal, restart binding procedure. 12msec elapsed since last write } - A7105_ReadData(); + A7105_ReadData(16); phase++; if (phase == BIND_5) A7105_WriteID(((uint32_t)packet[2] << 24) | ((uint32_t)packet[3] << 16) | ((uint32_t)packet[4] << 8) | packet[5]); @@ -333,7 +332,7 @@ uint16_t ReadHubsan() phase = BIND_7; return 15000; //22.5msec elapsed since last write } - A7105_ReadData(); + A7105_ReadData(16); if(packet[1] == 9 && id_data == ID_NORMAL) { phase = DATA_1; A7105_WriteReg(A7105_1F_CODE_I, 0x0F); @@ -355,7 +354,6 @@ uint16_t ReadHubsan() if( phase == DATA_1) A7105_SetPower(); //Keep transmit power in sync hubsan_build_packet(); - A7105_Strobe(A7105_STANDBY); u8 ch; if((phase == DATA_5 && id_data == ID_NORMAL) && sub_protocol == FORMAT_H107) { ch = channel + 0x23; @@ -391,7 +389,7 @@ uint16_t ReadHubsan() { if( !(A7105_ReadReg(A7105_00_MODE) & 0x01)) { // data received - A7105_ReadData(); + A7105_ReadData(16); if( hubsan_check_integrity() ) { v_lipo=packet[13];// hubsan lipo voltage 8bits the real value is h_lipo/10(0x2A=42 -> 4.2V) @@ -399,9 +397,10 @@ uint16_t ReadHubsan() } A7105_Strobe(A7105_RX); // Read TX RSSI - RSSI_dBm=256-(A7105_ReadReg(A7105_1D_RSSI_THOLD)*8)/5; // value from A7105 is between 8 for maximum signal strength to 160 or less - if(RSSI_dBm<0) RSSI_dBm=0; - else if(RSSI_dBm>255) RSSI_dBm=255; + int16_t temp=256-(A7105_ReadReg(A7105_1D_RSSI_THOLD)*8)/5; // value from A7105 is between 8 for maximum signal strength to 160 or less + if(temp<0) temp=0; + else if(temp>255) temp=255; + TX_RSSI=temp; break; } } @@ -420,7 +419,7 @@ uint16_t ReadHubsan() uint16_t initHubsan() { const uint8_t allowed_ch[] = {0x14, 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82}; - A7105_Init(INIT_HUBSAN); //hubsan_init(); + A7105_Init(); sessionid = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); channel = allowed_ch[random(0xfefefefe) % sizeof(allowed_ch)]; diff --git a/Multiprotocol/J6Pro_cyrf6936.ino b/Multiprotocol/J6Pro_cyrf6936.ino index acc0971..1846716 100644 --- a/Multiprotocol/J6Pro_cyrf6936.ino +++ b/Multiprotocol/J6Pro_cyrf6936.ino @@ -55,10 +55,10 @@ static void __attribute__((unused)) j6pro_build_data_packet() { uint8_t i; uint32_t upperbits = 0; - uint16_t value; + uint16_t value; packet[0] = 0xaa; //FIXME what is this? for (i = 0; i < 12; i++) - { + { value = convert_channel_10b(CH_AETR[i]); packet[i+1] = value & 0xff; upperbits |= (value >> 8) << (i * 2); @@ -76,16 +76,16 @@ static void __attribute__((unused)) j6pro_cyrf_init() CYRF_WriteRegister(CYRF_35_AUTOCAL_OFFSET, 0x14); CYRF_WriteRegister(CYRF_1C_TX_OFFSET_MSB, 0x05); CYRF_WriteRegister(CYRF_1B_TX_OFFSET_LSB, 0x55); - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - CYRF_SetPower(0x05); - CYRF_WriteRegister(CYRF_06_RX_CFG, 0x8a); + //CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); + //CYRF_SetPower(0x05); + CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); CYRF_SetPower(0x28); CYRF_WriteRegister(CYRF_12_DATA64_THOLD, 0x0e); CYRF_WriteRegister(CYRF_10_FRAMING_CFG, 0xee); CYRF_WriteRegister(CYRF_1F_TX_OVERRIDE, 0x00); CYRF_WriteRegister(CYRF_1E_RX_OVERRIDE, 0x00); CYRF_ConfigDataCode(j6pro_data_code, 16); - CYRF_WritePreamble(0x023333); + CYRF_WritePreamble(0x333302); CYRF_GetMfgData(cyrfmfg_id); //Model match @@ -94,36 +94,28 @@ static void __attribute__((unused)) j6pro_cyrf_init() static void __attribute__((unused)) cyrf_bindinit() { -/* Use when binding */ - //0.060470# 03 2f - CYRF_SetPower(0x28); //Deviation using max power, replaced by bind power... - - CYRF_ConfigRFChannel(0x52); - CYRF_PROGMEM_ConfigSOPCode(j6pro_bind_sop_code); - CYRF_ConfigCRCSeed(0x0000); - CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); - CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); - //0.061511# 13 20 - - CYRF_ConfigRFChannel(0x52); - //0.062684# 0f 05 - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - //0.062792# 0f 05 - CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40); - j6pro_build_bind_packet(); //01 01 e9 49 ec a9 c4 c1 ff - //CYRF_WriteDataPacketLen(packet, 0x09); + /* Use when binding */ + CYRF_SetPower(0x28); //Deviation using max power, replaced by bind power... + //CYRF_ConfigRFChannel(0x52); + CYRF_PROGMEM_ConfigSOPCode(j6pro_bind_sop_code); + CYRF_ConfigCRCSeed(0x0000); + //CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); + //CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x80); + //CYRF_ConfigRFChannel(0x52); + //CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); + //CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40); + j6pro_build_bind_packet(); } static void __attribute__((unused)) cyrf_datainit() { -/* Use when already bound */ - //0.094007# 0f 05 - uint8_t sop_idx = (0xff & (cyrfmfg_id[0] + cyrfmfg_id[1] + cyrfmfg_id[2] + cyrfmfg_id[3] - cyrfmfg_id[5])) % 19; - uint16_t crc = (0xff & (cyrfmfg_id[1] - cyrfmfg_id[4] + cyrfmfg_id[5])) | - ((0xff & (cyrfmfg_id[2] + cyrfmfg_id[3] - cyrfmfg_id[4] + cyrfmfg_id[5])) << 8); - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[sop_idx]); - CYRF_ConfigCRCSeed(crc); + /* Use when already bound */ + uint8_t sop_idx = (0xff & (cyrfmfg_id[0] + cyrfmfg_id[1] + cyrfmfg_id[2] + cyrfmfg_id[3] - cyrfmfg_id[5])) % 19; + uint16_t crc = (0xff & (cyrfmfg_id[1] - cyrfmfg_id[4] + cyrfmfg_id[5])) | + ((0xff & (cyrfmfg_id[2] + cyrfmfg_id[3] - cyrfmfg_id[4] + cyrfmfg_id[5])) << 8); + //CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); + CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[sop_idx]); + CYRF_ConfigCRCSeed(crc); } static void __attribute__((unused)) j6pro_set_radio_channels() @@ -136,10 +128,10 @@ static void __attribute__((unused)) j6pro_set_radio_channels() uint16_t ReadJ6Pro() { - uint32_t start; + uint32_t start; switch(phase) - { + { case J6PRO_BIND: cyrf_bindinit(); phase = J6PRO_BIND_01; @@ -147,9 +139,7 @@ uint16_t ReadJ6Pro() case J6PRO_BIND_01: CYRF_ConfigRFChannel(0x52); CYRF_SetTxRxMode(TX_EN); - //0.062684# 0f 05 - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); - //0.062684# 0f 05 + //CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); CYRF_WriteDataPacketLen(packet, 0x09); phase = J6PRO_BIND_03_START; return 3000; //3msec @@ -160,8 +150,8 @@ uint16_t ReadJ6Pro() break; CYRF_ConfigRFChannel(0x53); CYRF_SetTxRxMode(RX_EN); - CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); - CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); + //CYRF_WriteRegister(CYRF_06_RX_CFG, 0x4a); + CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x80); phase = J6PRO_BIND_03_CHECK; return 30000; //30msec case J6PRO_BIND_03_CHECK: @@ -201,7 +191,7 @@ uint16_t ReadJ6Pro() case J6PRO_BIND_05_4: case J6PRO_BIND_05_5: case J6PRO_BIND_05_6: - CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x25); + //CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); CYRF_WriteDataPacketLen(packet, 0x0f); phase = phase + 1; return 4600; //4.6msec @@ -212,7 +202,7 @@ uint16_t ReadJ6Pro() phase = J6PRO_CHAN_1; case J6PRO_CHAN_1: //Keep transmit power updated - CYRF_SetPower(0); + CYRF_SetPower(0x28); j6pro_build_data_packet(); //return 3400; case J6PRO_CHAN_2: @@ -237,12 +227,10 @@ uint16_t initJ6Pro() { j6pro_cyrf_init(); - if(IS_AUTOBIND_FLAG_on) { + if(IS_AUTOBIND_FLAG_on) phase = J6PRO_BIND; - } - else { + else phase = J6PRO_CHANSEL; - } return 2400; } diff --git a/Multiprotocol/MJXQ_nrf24l01.ino b/Multiprotocol/MJXQ_nrf24l01.ino index ae95060..04cf9d6 100644 --- a/Multiprotocol/MJXQ_nrf24l01.ino +++ b/Multiprotocol/MJXQ_nrf24l01.ino @@ -27,14 +27,14 @@ #define MJXQ_ADDRESS_LENGTH 5 // haven't figured out txid<-->rf channel mapping for MJX models -const uint8_t PROGMEM MJXQ_map_rfchan[][4] = { - {0x0A, 0x46, 0x3A, 0x42}, - {0x0A, 0x3C, 0x36, 0x3F}, - {0x0A, 0x43, 0x36, 0x3F} }; const uint8_t PROGMEM MJXQ_map_txid[][3] = { {0xF8, 0x4F, 0x1C}, {0xC8, 0x6E, 0x02}, {0x48, 0x6A, 0x40} }; +const uint8_t PROGMEM MJXQ_map_rfchan[][4] = { + {0x0A, 0x46, 0x3A, 0x42}, + {0x0A, 0x3C, 0x36, 0x3F}, + {0x0A, 0x43, 0x36, 0x3F} }; #define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing @@ -90,9 +90,11 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) // Servo_AUX5 HEADLESS // Servo_AUX6 RTH // Servo_AUX7 AUTOFLIP // X800, X600 +// Servo_AUX8 ARM // H26WH switch(sub_protocol) { case H26D: + case H26WH: packet[10]=MJXQ_pan_tilt_value(); // fall through on purpose - no break case WLH08: @@ -107,6 +109,11 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) | GET_FLAG(Servo_AUX4, 0x10) //VIDEO | GET_FLAG(!Servo_AUX2, 0x20); // air/ground mode } + if (sub_protocol == H26WH) { + packet[10] &= ~0x40; + packet[14] &= ~0x24; + packet[14] |= GET_FLAG(Servo_AUX2, 0x04); + } break; case X600: packet[10] = GET_FLAG(!Servo_AUX2, 0x02); //LED @@ -139,10 +146,15 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) packet[15] = sum; // Power on, TX mode, 2byte CRC - if (sub_protocol == H26D) - NRF24L01_SetTxRxMode(TX_EN); - else - XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); + switch (Model.proto_opts[PROTOOPTS_FORMAT]) { + case H26D: + case H26WH: + NRF24L01_SetTxRxMode(TX_EN); + break; + default: + XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); + break; + } NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++ / 2]); hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated @@ -150,10 +162,15 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind) NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); - if (sub_protocol == H26D) - NRF24L01_WritePayload(packet, MJXQ_PACKET_SIZE); - else - XN297_WritePayload(packet, MJXQ_PACKET_SIZE); + switch (Model.proto_opts[PROTOOPTS_FORMAT]) { + case H26D: + case H26WH: + NRF24L01_WritePayload(packet, MJXQ_PACKET_SIZE); + break; + default: + XN297_WritePayload(packet, MJXQ_PACKET_SIZE); + break; + } NRF24L01_SetPower(); } @@ -162,10 +179,13 @@ static void __attribute__((unused)) MJXQ_init() { uint8_t addr[MJXQ_ADDRESS_LENGTH]; memcpy(addr, "\x6d\x6a\x77\x77\x77", MJXQ_ADDRESS_LENGTH); + NRF24L01_Initialize(); + NRF24L01_SetTxRxMode(TX_EN); + if (sub_protocol == WLH08) memcpy(hopping_frequency, "\x12\x22\x32\x42", MJXQ_RF_NUM_CHANNELS); else - if (sub_protocol == H26D || sub_protocol == E010) + if (sub_protocol == H26D || sub_protocol == H26WH || sub_protocol == E010) memcpy(hopping_frequency, "\x36\x3e\x46\x2e", MJXQ_RF_NUM_CHANNELS); else { @@ -174,11 +194,11 @@ static void __attribute__((unused)) MJXQ_init() } - NRF24L01_Initialize(); - NRF24L01_SetTxRxMode(TX_EN); - - if (sub_protocol == H26D) + if (sub_protocol == H26D || sub_protocol == H26WH) + { + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, addr, MJXQ_ADDRESS_LENGTH); + } else XN297_SetTXAddr(addr, MJXQ_ADDRESS_LENGTH); @@ -203,20 +223,25 @@ static void __attribute__((unused)) MJXQ_init2() else if (sub_protocol != WLH08 && sub_protocol != E010) for(uint8_t i=0;iPPM_SWITCH) Servo_AUX|=1<PPM_SWITCH && !( (cur_protocol[0]&0x1F)==MODE_FRSKYD || (cur_protocol[0]&0x1F)==MODE_DSM || (cur_protocol[0]&0x1F)==MODE_AFHDS2A ) ) { CHANGE_PROTOCOL_FLAG_on; } // Rebind voie + if(Servo_data[SWITCH_RESET]>PPM_SWITCH && !( (cur_protocol[0]&0x1F)==MODE_FRSKYD || (cur_protocol[0]&0x1F)==MODE_DSM || (cur_protocol[0]&0x1F)==MODE_AFHDS2A ) ) { CHANGE_PROTOCOL_FLAG_on; } // Rebind voie if(IS_CHANGE_PROTOCOL_FLAG_on) { // Protocol needs to be changed LED_off; //led off during protocol init @@ -529,13 +531,16 @@ static void update_led_status(void) inline void tx_pause() { - #ifndef STM32_BOARD - #ifdef TELEMETRY - #ifdef ORANGE_TX - USARTC0.CTRLA &= ~0x03 ; // Pause telemetry by disabling transmitter interrupt - #else - #ifndef BASH_SERIAL - UCSR0B &= ~_BV(UDRIE0); // Pause telemetry by disabling transmitter interrupt + #ifdef TELEMETRY + // Pause telemetry by disabling transmitter interrupt + #ifdef ORANGE_TX + USARTC0.CTRLA &= ~0x03 ; + #else + #ifndef BASH_SERIAL + #ifdef STM32_BOARD + USART3_BASE->CR1 &= ~ USART_CR1_TXEIE; + #else + UCSR0B &= ~_BV(UDRIE0); #endif #endif #endif @@ -544,23 +549,26 @@ inline void tx_pause() inline void tx_resume() { - #ifndef STM32_BOARD - #ifdef TELEMETRY - if(!IS_TX_PAUSE_on) - { - #ifdef ORANGE_TX - cli() ; - USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; // Resume telemetry by enabling transmitter interrupt - sei() ; - #else - #ifndef BASH_SERIAL - UCSR0B |= _BV(UDRIE0); // Resume telemetry by enabling transmitter interrupt + #ifdef TELEMETRY + // Resume telemetry by enabling transmitter interrupt + if(!IS_TX_PAUSE_on) + { + #ifdef ORANGE_TX + cli() ; + USARTC0.CTRLA = (USARTC0.CTRLA & 0xFC) | 0x01 ; + sei() ; + #else + #ifndef BASH_SERIAL + #ifdef STM32_BOARD + USART3_BASE->CR1 |= USART_CR1_TXEIE; #else - resumeBashSerial() ; - #endif - #endif - } - #endif + UCSR0B |= _BV(UDRIE0); + #endif + #else + resumeBashSerial() ; + #endif + #endif + } #endif } @@ -595,6 +603,8 @@ static void protocol_init() tx_tail=0; tx_head=0; #endif + TX_RX_PAUSE_off; + TX_MAIN_PAUSE_off; #endif blink=millis(); @@ -618,13 +628,6 @@ static void protocol_init() remote_callback = joysway_cb; break; #endif - #if defined(AFHDS2A_A7105_INO) - case MODE_AFHDS2A: - next_callback=AFHDS2A_setup(); - remote_callback = afhds2a_cb; - break; - #endif - #if defined(FLYSKY_A7105_INO) case MODE_FLYSKY: PE1_off; //antenna RF1 @@ -632,6 +635,13 @@ static void protocol_init() remote_callback = ReadFlySky; break; #endif + #if defined(AFHDS2A_A7105_INO) + case MODE_AFHDS2A: + PE1_off; //antenna RF1 + next_callback = initAFHDS2A(); + remote_callback = ReadAFHDS2A; + break; + #endif #if defined(HUBSAN_A7105_INO) case MODE_HUBSAN: PE1_off; //antenna RF1 @@ -783,6 +793,12 @@ static void protocol_init() remote_callback = inav_cb; break; #endif + #if defined(Q303_NRF24L01_INO) + case MODE_Q303: + next_callback=q303_init(); + remote_callback = q303_callback; + break; + #endif #if defined(HISKY_NRF24L01_INO) case MODE_HISKY: @@ -1012,8 +1028,8 @@ void Mprotocol_serial_init() PORTC.PIN3CTRL |= 0x40 ; #endif #elif defined STM32_BOARD - Serial1.begin(100000,SERIAL_8E2);//USART2 - Serial2.begin(100000,SERIAL_8E2);//USART3 + usart2_begin(100000,SERIAL_8E2); + usart3_begin(100000,SERIAL_8E2); USART2_BASE->CR1 |= USART_CR1_PCE_BIT; USART3_BASE->CR1 &= ~ USART_CR1_RE;//disable USART2_BASE->CR1 &= ~ USART_CR1_TE;//disable transmit @@ -1040,7 +1056,7 @@ void Mprotocol_serial_init() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A)) + if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) ) initTXSerial( SPEED_9600 ) ; if(protocol==MODE_FRSKYX) initTXSerial( SPEED_57600 ) ; @@ -1186,14 +1202,14 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) rx_buff[0]=UDR0; if((rx_buff[0]&0xFE)==0x54) // If 1st byte is 0x54 or 0x55 it looks ok { + TX_RX_PAUSE_on; + tx_pause(); #if defined STM32_BOARD uint16_t OCR1B; OCR1B =TCNT1+(6500L); timer.setCompare(TIMER_CH2,OCR1B); timer.attachCompare2Interrupt(ISR_COMPB); #else - TX_RX_PAUSE_on; - tx_pause(); OCR1B = TCNT1+(6500L) ; // Full message should be received within timer of 3250us TIFR1 = OCF1B_bm ; // clear OCR1B match flag SET_TIMSK1_OCIE1B ; // enable interrupt on compare B match @@ -1228,9 +1244,9 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) detachInterrupt(2); // Disable interrupt on ch2 #else CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - TX_RX_PAUSE_off; - tx_resume(); #endif + TX_RX_PAUSE_off; + tx_resume(); } #if not defined (ORANGE_TX) && not defined (STM32_BOARD) cli() ; @@ -1252,8 +1268,8 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) detachInterrupt(2); // Disable interrupt on ch2 #else CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match - tx_resume(); #endif + tx_resume(); } #endif //ENABLE_SERIAL diff --git a/Multiprotocol/Nrf24l01_inav.ino b/Multiprotocol/Nrf24l01_inav.ino index 2d04acc..d8cfa0a 100644 --- a/Multiprotocol/Nrf24l01_inav.ino +++ b/Multiprotocol/Nrf24l01_inav.ino @@ -55,11 +55,11 @@ #include "iface_nrf24l01.h" - #define BIND_COUNT 345 // 1.5 seconds - #define FIRST_PACKET_DELAY 12000 + #define INAV_BIND_COUNT 345 // 1.5 seconds + #define FIRST_INAV_PACKET_DELAY 12000 - #define PACKET_PERIOD 4000 // Timeout for callback in uSec - #define INITIAL_WAIT 500 + #define INAV_PACKET_PERIOD 4000 // Timeout for callback in uSec + #define INAV_INITIAL_WAIT 500 // For code readability enum { @@ -96,28 +96,28 @@ enum { - RATE_LOW = 0, - RATE_MID = 1, - RATE_HIGH = 2, + INAV_RATE_LOW = 0, + INAV_RATE_MID = 1, + INAV_RATE_HIGH = 2, }; enum { - FLAG_FLIP = 0x01, - FLAG_PICTURE = 0x02, - FLAG_VIDEO = 0x04, - FLAG_RTH = 0x08, - FLAG_HEADLESS = 0x10, + INAV_FLAG_FLIP = 0x01, + INAV_FLAG_PICTURE = 0x02, + INAV_FLAG_VIDEO = 0x04, + INAV_FLAG_RTH = 0x08, + INAV_FLAG_HEADLESS = 0x10, }; typedef enum { - PHASE_INAV_INIT = 0, + PHASE_INIT = 0, PHASE_INAV_BIND, PHASE_INAV_DATA }; typedef enum { - DATA_PACKET = 0, - BIND_PACKET = 1, + DATA_INAV_PACKET = 0, + BIND_INAV_PACKET = 1, }; static const char * const inav_opts[] = { @@ -308,19 +308,19 @@ // pack the AETR low bits packet[6] = (aileron & 0x03) | ((elevator & 0x03) << 2) | ((throttle & 0x03) << 4) | ((rudder & 0x03) << 6); - uint8_t rate = RATE_LOW; + uint8_t rate = INAV_RATE_LOW; if (Channels[CHANNEL_RATE] > 0) { - rate = RATE_HIGH; + rate = INAV_RATE_HIGH; } else if (Channels[CHANNEL_RATE] == 0) { - rate = RATE_MID; + rate = INAV_RATE_MID; } packet[7] = rate; // rate, deviation channel 5, is mapped to AUX1 - const uint8_t flags = GET_FLAG(CHANNEL_FLIP, FLAG_FLIP) - | GET_FLAG(CHANNEL_PICTURE, FLAG_PICTURE) - | GET_FLAG(CHANNEL_VIDEO, FLAG_VIDEO) - | GET_FLAG(CHANNEL_RTH, FLAG_RTH) - | GET_FLAG(CHANNEL_HEADLESS, FLAG_HEADLESS); + const uint8_t flags = GET_FLAG(CHANNEL_FLIP, INAV_FLAG_FLIP) + | GET_FLAG(CHANNEL_PICTURE, INAV_FLAG_PICTURE) + | GET_FLAG(CHANNEL_VIDEO, INAV_FLAG_VIDEO) + | GET_FLAG(CHANNEL_RTH, INAV_FLAG_RTH) + | GET_FLAG(CHANNEL_HEADLESS, INAV_FLAG_HEADLESS); packet[8] = flags; // flags, deviation channels 6-10 are mapped to AUX2 t0 AUX6 // map deviation channels 9-12 to RC channels AUX7-AUX10, use 10 bit resolution @@ -399,7 +399,7 @@ static void send_packet(uint8_t packet_type) { - if (packet_type == DATA_PACKET) { + if (packet_type == DATA_INAV_PACKET) { build_data_packet(); } else { build_bind_packet(); @@ -644,9 +644,9 @@ switch (phase) { case PHASE_INAV_INIT: phase = PHASE_INAV_BIND; - bind_counter = BIND_COUNT; + bind_counter = INAV_BIND_COUNT; bind_acked = 0; - return FIRST_PACKET_DELAY; + return FIRST_INAV_PACKET_DELAY; break; case PHASE_INAV_BIND: @@ -660,9 +660,9 @@ if (bind_acked == 1) { // bind packet acked, so set bind_counter to zero to enter data phase on next callback bind_counter = 0; - return PACKET_PERIOD; + return INAV_PACKET_PERIOD; } - send_packet(BIND_PACKET); + send_packet(BIND_INAV_PACKET); --bind_counter; } break; @@ -674,10 +674,10 @@ return PACKET_CHKTIME; // packet send not yet complete }*/ packet_ack(); - send_packet(DATA_PACKET); + send_packet(DATA_INAV_PACKET); break; } - return PACKET_PERIOD; + return INAV_PACKET_PERIOD; } static uint8_t INAV_setup() @@ -696,12 +696,12 @@ if(IS_AUTOBIND_FLAG_on) { phase = PHASE_INAV_INIT; -// PROTOCOL_SetBindState(BIND_COUNT * PACKET_PERIOD / 1000); +// PROTOCOL_SetBindState(INAV_BIND_COUNT * INAV_PACKET_PERIOD / 1000); } else { set_data_phase(); // BIND_DONE; } - return INITIAL_WAIT; + return INAV_INITIAL_WAIT; } /* const void *INAV_Cmds(enum ProtoCmds cmd) diff --git a/Multiprotocol/Nrf24l01_q303.ino b/Multiprotocol/Nrf24l01_q303.ino new file mode 100644 index 0000000..729373b --- /dev/null +++ b/Multiprotocol/Nrf24l01_q303.ino @@ -0,0 +1,152 @@ +#ifdef Q303_NRF24L01_INO + +#include "iface_nrf24l01.h" + +#define Q303_BIND_COUNT 1200 + +#define Q303_PACKET_SIZE 10 +#define Q303_PACKET_PERIOD 1500 // Timeout for callback in uSec +#define Q303_INITIAL_WAIT 500 +#define Q303_RF_BIND_CHANNEL 0x02 +#define Q303_NUM_RF_CHANNELS 4 + +static uint8_t tx_addr[5]; +static uint8_t current_chan; +uint8_t txid[4] = {0xAE, 0x89, 0x97, 0x87}; +static uint8_t rf_chans[4] = {0x4A, 0x4C, 0x4E, 0x48}; + +// haven't figured out txid<-->rf channel mapping yet +// static const struct { uint8_t txid[sizeof(txid)]; uint8_t rfchan[Q303_NUM_RF_CHANNELS]; } q303_tx_rf_map[] = {{{0xAE, 0x89, 0x97, 0x87}, {0x4A, 0x4C, 0x4E, 0x48}}}; + +enum { + Q303_BIND, + Q303_DATA +}; + +// flags going to packet[8] +#define Q303_FLAG_HIGHRATE 0x03 +#define Q303_FLAG_AHOLD 0x40 +#define Q303_FLAG_RTH 0x80 + +// flags going to packet[9] +#define Q303_FLAG_GIMBAL_DN 0x04 +#define Q303_FLAG_GIMBAL_UP 0x20 +#define Q303_FLAG_HEADLESS 0x08 +#define Q303_FLAG_FLIP 0x80 +#define Q303_FLAG_SNAPSHOT 0x10 +#define Q303_FLAG_VIDEO 0x01 + +static void send_packet(uint8_t bind) +{ + if(bind) { + packet[0] = 0xaa; + memcpy(&packet[1], txid, 4); + memset(&packet[5], 0, 5); + } + else { + aileron = map(Servo_data[AILERON], 1000, 2000, 0, 1000); + elevator = 1000 - map(Servo_data[ELEVATOR], 1000, 2000, 0, 1000); + throttle = map(Servo_data[THROTTLE], 1000, 2000, 0, 1000); + rudder = 1000 - map(Servo_data[RUDDER], 1000, 2000, 0, 1000); + + packet[0] = 0x55; + packet[1] = aileron >> 2 ; // 8 bits + packet[2] = (aileron & 0x03) << 6 // 2 bits + | (elevator >> 4); // 6 bits + packet[3] = (elevator & 0x0f) << 4 // 4 bits + | (throttle >> 6); // 4 bits + packet[4] = (throttle & 0x3f) << 2 // 6 bits + | (rudder >> 8); // 2 bits + packet[5] = rudder & 0xff; // 8 bits + packet[6] = 0x10; // trim(s) ? + packet[7] = 0x10; // trim(s) ? + packet[8] = 0x03 // high rate (0-3) + | GET_FLAG(Servo_AUX1, Q303_FLAG_AHOLD) + | GET_FLAG(Servo_AUX6, Q303_FLAG_RTH); + packet[9] = 0x40 // always set + | GET_FLAG(Servo_AUX5, Q303_FLAG_HEADLESS) + | GET_FLAG(Servo_AUX2, Q303_FLAG_FLIP) + | GET_FLAG(Servo_AUX3, Q303_FLAG_SNAPSHOT) + | GET_FLAG(Servo_AUX4, Q303_FLAG_VIDEO); + if(Servo_data[AUX7] < (servo_max_100-PPM_SWITCH)) + packet[9] |= Q303_FLAG_GIMBAL_DN; + else if(Servo_data[AUX7] > PPM_SWITCH) + packet[9] |= Q303_FLAG_GIMBAL_UP; + // set low rate for first packets + if(bind_counter != 0) { + packet[8] &= ~0x03; + bind_counter--; + } + } + + // Power on, TX mode, CRC enabled + XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); + if (bind) { + NRF24L01_WriteReg(NRF24L01_05_RF_CH, Q303_RF_BIND_CHANNEL); + } else { + NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_chans[current_chan++]); + current_chan %= Q303_NUM_RF_CHANNELS; + } + + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushTx(); + + XN297_WritePayload(packet, Q303_PACKET_SIZE); +} + +static uint16_t q303_callback() +{ + switch (phase) { + case Q303_BIND: + if (bind_counter == 0) { + tx_addr[0] = 0x55; + memcpy(&tx_addr[1], txid, 4); + XN297_SetTXAddr(tx_addr, 5); + phase = Q303_DATA; + bind_counter = Q303_BIND_COUNT; + BIND_DONE; + } else { + send_packet(1); + bind_counter--; + } + break; + case Q303_DATA: + send_packet(0); + break; + } + return Q303_PACKET_PERIOD; +} + +static uint16_t q303_init() +{ +// memcpy(txid, q303_tx_rf_map[MProtocol_id % (sizeof(q303_tx_rf_map)/sizeof(q303_tx_rf_map[0]))].txid, sizeof(txid)); +// memcpy(rf_chans, q303_tx_rf_map[MProtocol_id % (sizeof(q303_tx_rf_map)/sizeof(q303_tx_rf_map[0]))].rfchan, sizeof(rf_chans)); + + NRF24L01_Initialize(); + NRF24L01_SetTxRxMode(TX_EN); + + XN297_SetTXAddr((uint8_t *) "\xCC\xCC\xCC\xCC\xCC", 5); + NRF24L01_FlushTx(); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit + NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes + NRF24L01_WriteReg(NRF24L01_05_RF_CH, Q303_RF_BIND_CHANNEL); + NRF24L01_SetBitrate(NRF24L01_BR_250K); + NRF24L01_SetPower(); + + // this sequence necessary for module from stock tx + NRF24L01_ReadReg(NRF24L01_1D_FEATURE); + NRF24L01_Activate(0x73); // Activate feature register + NRF24L01_ReadReg(NRF24L01_1D_FEATURE); + NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x00); // Set feature bits on + NRF24L01_Activate(0x53); // switch bank back + + BIND_IN_PROGRESS; + bind_counter = Q303_BIND_COUNT; + current_chan = 0; +// PROTOCOL_SetBindState(Q303_BIND_COUNT * Q303_PACKET_PERIOD / 1000); + phase = Q303_BIND; + return Q303_INITIAL_WAIT; +} + +#endif \ No newline at end of file diff --git a/Multiprotocol/PPM_SERIE.txt b/Multiprotocol/PPM_SERIE.txt new file mode 100644 index 0000000..263c90b --- /dev/null +++ b/Multiprotocol/PPM_SERIE.txt @@ -0,0 +1,89 @@ +#define PPM_TEST 3 //test voie valeur + +#define PPM_MIN_COMMAND 1250 +#define PPM_SWITCH 1550 +#define PPM_MAX_COMMAND 1750 +#define isterie 10 + + +#define PPM_Pin 3 //this must be 2 or 3 +int ppm[18]; //array for storing up to 16 servo signals +int maxi = 0, mini = 3000, decal, moy, a,r, val; + +void setup() { + Serial.begin(115200); Serial.println("ready"); + pinMode(PPM_Pin, INPUT); attachInterrupt(PPM_Pin - 2, read_ppm, CHANGE); + + TCCR1A = 0; //reset timer1 + TCCR1B = 0; + TCCR1B |= (1 << CS11); //set timer1 to increment every 0,5 us +} + +void loop() { + //You can delete everithing inside loop() and put your own code here + int count; + if(ppm[PPM_TEST]maxi) { + maxi = max( maxi, ppm[PPM_TEST]); + mini = min( mini, ppm[PPM_TEST]); + moy = (maxi + mini)/2; + decal = (maxi - moy) / 125 * 100; + a = moy + decal; + r = moy - decal; + } + Serial.print(a); Serial.print(" "); + Serial.print(r); Serial.print(" "); + Serial.print(maxi); Serial.print(" "); + Serial.print(mini); Serial.print(" "); + Serial.print(moy); Serial.print(" "); + if((PPM_SWITCH - isterie) < moy < (PPM_SWITCH + isterie)) { + Serial.print(" . Pb istérie PPM middel "); + Serial.print(PPM_SWITCH); + } + else { + Serial.print(" . "); + + count = 0; + Serial.print(ppm[count]); Serial.print(" "); count++; + Serial.print(ppm[count]); Serial.print(" "); count++; + Serial.print(ppm[count]); Serial.print(" "); count++; + Serial.print(ppm[count]); Serial.print(" "); count++; + for( ;count<17;count++) { + val=ppm[count]; + if((moy-2*isterie) < val < (moy+2*isterie)) { Serial.print("2"); } + else if(PPM_MAX_COMMAND < val < 2200) { Serial.print("3"); } + else if(PPM_MAX_COMMAND < val) { Serial.print("+"); } + else if(800 < val < PPM_MIN_COMMAND) { Serial.print("1"); } + else { Serial.print("."); } + + } +/* + while(ppm[count] != 0){ //print out the servo values + Serial.print(count); Serial.print(" "); + Serial.print(ppm[count]); Serial.print(" "); + count++; + } +*/ + } + Serial.println(""); + delay(100); //you can even use delays!!! +} + +void read_ppm(){ //leave this alone + #if F_CPU == 16000000 + #define PPM_SCALE 1L + #elif F_CPU == 8000000 + #define PPM_SCALE 0L + #else + #error // 8 or 16MHz only ! + #endif + static unsigned int pulse; + static unsigned long counter; + static byte channel; + + counter = TCNT1; + TCNT1 = 0; + + if(counter < 510 << PPM_SCALE){ pulse = counter; } //must be a pulse if less than 510us + else if(counter > 1910 << PPM_SCALE){ channel = 0; } //sync pulses over 1910us + else{ ppm[channel] = (counter + pulse) >> PPM_SCALE; channel++; } //servo values between 510us and 2420us will end up here +} \ No newline at end of file diff --git a/Multiprotocol/Pins.h b/Multiprotocol/Pins.h index d82975a..c163b38 100644 --- a/Multiprotocol/Pins.h +++ b/Multiprotocol/Pins.h @@ -79,7 +79,7 @@ #define SDO_1 (SDO_ipr & _BV(SDO_pin)) #define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00 #endif - + // SCLK #define SCLK_port PORTD #define SCLK_ddr DDRD @@ -290,21 +290,6 @@ #define cli() noInterrupts() #define sei() interrupts() #define delayMilliseconds(x) delay(x) - //TX Pause - #undef TX_MAIN_PAUSE_off - #undef TX_MAIN_PAUSE_on - #undef IS_TX_MAIN_PAUSE_on - #undef TX_RX_PAUSE_off - #undef TX_RX_PAUSE_on - #undef IS_TX_RX_PAUSE_on - #undef IS_TX_PAUSE_on - #define TX_MAIN_PAUSE_off - #define TX_MAIN_PAUSE_on - #define IS_TX_MAIN_PAUSE_on - #define TX_RX_PAUSE_off - #define TX_RX_PAUSE_on - #define IS_TX_RX_PAUSE_on - #define IS_TX_PAUSE_on #endif //******************* diff --git a/Multiprotocol/README.md b/Multiprotocol/README.md index bd35dd9..dc2450b 100644 --- a/Multiprotocol/README.md +++ b/Multiprotocol/README.md @@ -215,6 +215,9 @@ FLIP|SNAPSHOT|VIDEO|HEADLESS ###INAV En cours de passage +###MJX +####Sub_protocol H26WH + ###NE260 Modele: Nine Eagles SoloPro @@ -224,6 +227,14 @@ CH1|CH2|CH3|CH4 ---|---|---|--- A|E|T|R +###Q303 + +Autobind + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|AHOLD|FLIP|SNAPSHOT|VIDEO|HEADLESS|RTH|GIMBAL + ###UDI Modele: Known UDI 2.4GHz protocol variants, all using BK2421 * UDI U819 coaxial 3ch helicoper diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 3db2eb4..de2808e 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -15,7 +15,6 @@ //************************** // Telemetry serial code * //************************** - #if defined TELEMETRY #if defined SPORT_TELEMETRY @@ -62,6 +61,15 @@ void DSM_frame() } #endif +#if defined AFHDS2A_TELEMETRY +void AFHDSA_short_frame() +{ + Serial_write(0xAA); // Telemetry packet + for (uint8_t i = 0; i < 29; i++) // RSSI value followed by 4*7 bytes of telemetry data + Serial_write(pkt[i]); +} +#endif + void frskySendStuffed() { Serial_write(START_STOP); @@ -94,11 +102,11 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) for (uint8_t i=3;i> 4 & 0x0f) == 0x08) @@ -131,12 +139,12 @@ void frsky_link_frame() frame[4] = (uint8_t)RSSI_dBm; } else - if ((protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A)) + if (protocol==MODE_HUBSAN||protocol==MODE_AFHDS2A) { frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V frame[2] = frame[1]; - frame[3] = 0x00; - frame[4] = (uint8_t)RSSI_dBm; + frame[3] = protocol==MODE_HUBSAN?0x00:(uint8_t)RSSI_dBm; + frame[4] = TX_RSSI; } frame[5] = frame[6] = frame[7] = frame[8] = 0; frskySendStuffed(); @@ -414,7 +422,6 @@ void proces_sport_data(uint8_t data) void TelemetryUpdate() { // check for space in tx buffer - #ifdef BASH_SERIAL uint8_t h ; uint8_t t ; @@ -487,12 +494,19 @@ void TelemetryUpdate() return; } #endif - if(telemetry_link && protocol != MODE_FRSKYX ) - { // FrSky + Hubsan + Flysky AFHDS2A - frsky_link_frame(); - telemetry_link=0; - return; - } + #if defined AFHDS2A_TELEMETRY + if(telemetry_link == 2 && protocol == MODE_AFHDS2A) + { + AFHDSA_short_frame(); + telemetry_link=0; + } + #endif + if(telemetry_link && protocol != MODE_FRSKYX ) + { // FrSkyD + Hubsan + AFHDS2A + frsky_link_frame(); + telemetry_link=0; + return; + } #if defined HUB_TELEMETRY if(!telemetry_link && protocol == MODE_FRSKYD) { // FrSky @@ -521,7 +535,7 @@ void TelemetryUpdate() tx_head = nextHead ; tx_resume(); } - + void initTXSerial( uint8_t speed) { #ifdef ENABLE_PPM @@ -535,12 +549,12 @@ void TelemetryUpdate() USARTC0.CTRLC = 0x03 ; #else #ifdef STM32_BOARD - Serial2.begin(9600); //USART3 + usart3_begin(9600,SERIAL_8N1); //USART3 USART3_BASE->CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled #else UBRR0H = 0x00; UBRR0L = 0x67; - UCSR0A = 0 ; // Clear X2 bit + UCSR0A = 0 ; // Clear X2 bit //Set frame format to 8 data bits, none, 1 stop bit UCSR0C = (1<CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled - #else - UBRR0H = 0x00; - UBRR0L = 0x22; - UCSR0A = 0x02 ; // Set X2 bit - //Set frame format to 8 data bits, none, 1 stop bit - UCSR0C = (1<CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled + #else + UBRR0H = 0x00; + UBRR0L = 0x22; + UCSR0A = 0x02 ; // Set X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled - #else - UBRR0H = 0x00; - UBRR0L = 0x07; - UCSR0A = 0x00 ; // Clear X2 bit - //Set frame format to 8 data bits, none, 1 stop bit - UCSR0C = (1<CR1 &= ~ USART_CR1_RE; //disable RX leave TX enabled + #else + UBRR0H = 0x00; + UBRR0L = 0x07; + UCSR0A = 0x00 ; // Clear X2 bit + //Set frame format to 8 data bits, none, 1 stop bit + UCSR0C = (1<CR1 &= ~USART_CR1_TXEIE;//disable interrupt + tx_pause(); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt + #ifdef STM32_BOARD } - #else - tx_pause(); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt - #endif + #endif } - #if defined STM32_BOARD - #ifdef __cplusplus - } - #endif - #endif //STM32_BOARD - + #ifdef STM32_BOARD + void usart2_begin(uint32_t baud,uint32_t config ) + { + usart_init(USART2); + usart_config_gpios_async(USART2,GPIOA,PIN_MAP[PA3].gpio_bit,GPIOA,PIN_MAP[PA2].gpio_bit,config); + usart_set_baud_rate(USART2, STM32_PCLK1, baud);// + usart_enable(USART2); + } + void usart3_begin(uint32_t baud,uint32_t config ) + { + usart_init(USART3); + usart_config_gpios_async(USART3,GPIOB,PIN_MAP[PB11].gpio_bit,GPIOB,PIN_MAP[PB10].gpio_bit,config); + usart_set_baud_rate(USART3, STM32_PCLK1, baud); + usart_enable(USART3); + } + #endif #else //BASH_SERIAL - // Routines for bit-bashed serial output +// Routines for bit-bashed serial output - // Speed is 0 for 100K and 1 for 9600 - void initTXSerial( uint8_t speed) +// Speed is 0 for 100K and 1 for 9600 +void initTXSerial( uint8_t speed) +{ + TIMSK0 = 0 ; // Stop all timer 0 interrupts + #ifdef INVERT_SERIAL + SERIAL_TX_off; + #else + SERIAL_TX_on; + #endif + UCSR0B &= ~(1<>= 7 ; // Top bit - if ( SerialControl.speed == SPEED_100K ) - { - #ifdef INVERT_SERIAL - byteLo |= 0x02 ; // Parity bit - #else - byteLo |= 0xFC ; // Stop bits - #endif + byteLo = byte ; + byteLo >>= 7 ; // Top bit + if ( SerialControl.speed == SPEED_100K ) + { + #ifdef INVERT_SERIAL + byteLo |= 0x02 ; // Parity bit + #else + byteLo |= 0xFC ; // Stop bits + #endif // calc parity - temp = byte ; - temp >>= 4 ; - temp = byte ^ temp ; - temp1 = temp ; - temp1 >>= 2 ; - temp = temp ^ temp1 ; - temp1 = temp ; - temp1 <<= 1 ; - temp ^= temp1 ; - temp &= 0x02 ; - #ifdef INVERT_SERIAL - byteLo ^= temp ; - #else - byteLo |= temp ; - #endif - } - else - { - byteLo |= 0xFE ; // Stop bit - } - byte <<= 1 ; + temp = byte ; + temp >>= 4 ; + temp = byte ^ temp ; + temp1 = temp ; + temp1 >>= 2 ; + temp = temp ^ temp1 ; + temp1 = temp ; + temp1 <<= 1 ; + temp ^= temp1 ; + temp &= 0x02 ; + #ifdef INVERT_SERIAL + byteLo ^= temp ; + #else + byteLo |= temp ; + #endif + } + else + { + byteLo |= 0xFE ; // Stop bit + } + byte <<= 1 ; #ifdef INVERT_SERIAL byte |= 1 ; // Start bit #endif - uint8_t next = (SerialControl.head + 2) & 0x3f ; - if ( next != SerialControl.tail ) - { - SerialControl.data[SerialControl.head] = byte ; - SerialControl.data[SerialControl.head+1] = byteLo ; - SerialControl.head = next ; - } - if(!IS_TX_PAUSE_on) - tx_resume(); - } - - void resumeBashSerial() + uint8_t next = (SerialControl.head + 2) & 0x3f ; + if ( next != SerialControl.tail ) { - cli() ; - if ( SerialControl.busy == 0 ) + SerialControl.data[SerialControl.head] = byte ; + SerialControl.data[SerialControl.head+1] = byteLo ; + SerialControl.head = next ; + } + if(!IS_TX_PAUSE_on) + tx_resume(); +} + +void resumeBashSerial() +{ + cli() ; + if ( SerialControl.busy == 0 ) + { + sei() ; + // Start the transmission here + #ifdef INVERT_SERIAL + GPIOR2 = 0 ; + #else + GPIOR2 = 0x01 ; + #endif + if ( SerialControl.speed == SPEED_100K ) { - sei() ; - // Start the transmission here - #ifdef INVERT_SERIAL - GPIOR2 = 0 ; - #else - GPIOR2 = 0x01 ; - #endif - if ( SerialControl.speed == SPEED_100K ) - { - GPIOR1 = 1 ; - OCR0B = TCNT0 + 40 ; - OCR0A = OCR0B + 210 ; - TIFR0 = (1<>= 1 - GPIOR0 = byte ; - if ( --GPIOR1 == 0 ) - { - TIMSK0 &= ~(1<>= 1 + GPIOR0 = byte ; + if ( --GPIOR1 == 0 ) { - uint8_t byte ; - byte = GPIOR2 ; - if ( byte & 0x01 ) - SERIAL_TX_on; - else - SERIAL_TX_off; - byte /= 2 ; // Generates shorter code than byte >>= 1 - GPIOR2 = byte ; - if ( --GPIOR1 == 0 ) - { - if ( IS_TX_PAUSE_on ) - { - SerialControl.busy = 0 ; - TIMSK0 &= ~(1<head != ptr->tail ) - { - GPIOR0 = ptr->data[ptr->tail] ; - GPIOR2 = ptr->data[ptr->tail+1] ; - ptr->tail = ( ptr->tail + 2 ) & 0x3F ; - GPIOR1 = 8 ; - OCR0A = OCR0B + 40 ; - OCR0B = OCR0A + 8 * 20 ; - TIMSK0 |= (1< 2 ) + OCR0A += 20 ; + } +} + +ISR(TIMER0_COMPB_vect) +{ + uint8_t byte ; + byte = GPIOR2 ; + if ( byte & 0x01 ) + SERIAL_TX_on; + else + SERIAL_TX_off; + byte /= 2 ; // Generates shorter code than byte >>= 1 + GPIOR2 = byte ; + if ( --GPIOR1 == 0 ) + { + if ( IS_TX_PAUSE_on ) { - byte = GPIOR0 ; + SerialControl.busy = 0 ; + TIMSK0 &= ~(1<>= 1 - if ( GPIOR1 > 2 ) - { - GPIOR0 = byte ; - } - else - { - GPIOR2 = byte ; - } - if ( --GPIOR1 == 0 ) - { - // prepare next byte + // prepare next byte and allow for 2 stop bits struct t_serial_bash *ptr = &SerialControl ; if ( ptr->head != ptr->tail ) { GPIOR0 = ptr->data[ptr->tail] ; GPIOR2 = ptr->data[ptr->tail+1] ; ptr->tail = ( ptr->tail + 2 ) & 0x3F ; - GPIOR1 = 10 ; + GPIOR1 = 8 ; + OCR0A = OCR0B + 40 ; + OCR0B = OCR0A + 8 * 20 ; + TIMSK0 |= (1< 2 ) + { + byte = GPIOR0 ; + } + else + { + byte = GPIOR2 ; + } + if ( byte & 0x01 ) + SERIAL_TX_on; + else + SERIAL_TX_off; + byte /= 2 ; // Generates shorter code than byte >>= 1 + if ( GPIOR1 > 2 ) + { + GPIOR0 = byte ; + } + else + { + GPIOR2 = byte ; + } + if ( --GPIOR1 == 0 ) + { + // prepare next byte + struct t_serial_bash *ptr = &SerialControl ; + if ( ptr->head != ptr->tail ) + { + GPIOR0 = ptr->data[ptr->tail] ; + GPIOR2 = ptr->data[ptr->tail+1] ; + ptr->tail = ( ptr->tail + 2 ) & 0x3F ; + GPIOR1 = 10 ; + } + else + { + SerialControl.busy = 0 ; + TIMSK0 &= ~(1<NRF24L01 MODE_NE260 = 55, // =>NRF24L01 - MODE_AFHDS2A = 31, // =>A7105 MODE_INAV = 57, // =>NRF24L01 + MODE_Q303 = 58, // =>NRF24L01 MODE_SERIAL = 0, // Serial commands MODE_FLYSKY = 1, // =>A7105 @@ -63,6 +63,7 @@ enum PROTOCOLS MODE_FRSKYV = 25, // =>CC2500 MODE_HONTAI = 26, // =>NRF24L01 MODE_OPENLRS = 27, // =>OpenLRS hardware + MODE_AFHDS2A = 28, // =>A7105 }; enum Flysky { @@ -71,6 +72,13 @@ enum Flysky V6X6=2, V912=3 }; +enum AFHDS2A +{ + PWM_IBUS = 0, + PPM_IBUS = 1, + PWM_SBUS = 2, + PPM_SBUS = 3, +}; enum Hisky { Hisky=0, @@ -132,7 +140,8 @@ enum MJXQ X600 = 1, X800 = 2, H26D = 3, - E010 = 4 + E010 = 4, + H26WH = 5 }; enum FRSKYX { @@ -432,6 +441,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- FrskyV 25 HONTAI 26 OpenLRS 27 + AFHDS2A 28 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No @@ -497,7 +507,12 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- FORMAT_HONTAI 0 FORMAT_JJRCX1 1 FORMAT_X5C1 2 - FQ777-521 3 + FQ777-521 3 + sub_protocol==AFHDS2A + PWM_IBUS 0 + PPM_IBUS 1 + PWM_SBUS 2 + PPM_SBUS 3 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; option_protocol value is -127..127 diff --git a/Multiprotocol/sync.ffs_db b/Multiprotocol/sync.ffs_db index 1d9eca37de4989b7134c95087de83d9f11ac52d1..c065aeab6f818e680712ab90da67f39103e03519 100644 GIT binary patch delta 1084 zcmV-C1jGBT2gV4H8GlQq7kSRiLj;<-7>f7yoZ%S+000620002u0RR9100014P*M!! zE>QHzbSlkJag!APWA`MUG#kaAavU63C^bX55-#vcfN^j`?$rj*9RwC*l)sLB9HI!v zq0)=`5aRX!KhPZD78+;+JFbTn(USn2n`1dr!a`?7^6w;10e>uRv@4b2P@bDNdXpSk_PDWAqZlLinHz&(jGZ+ zHqADn^or$j(tkw98DT7wUjI@tiL#xK8@QfC!u8RXka+z2cO-nQl@f{n_+iE*?iSUe zka)mP0=Ki&GU#iN9cis=ECj`cr*YR6`)?Tx-$A~n>krsfec^ovebsC>EK_gI>*Aew z$@^+20bBZPt)VOId06119b%bA-83hL#u`5ixNg?&ygrKiVCuh8R?@gU&(NbH^dji)KSG=y@H1-?Nq+`E9oYfmJ57#5hR63we~$R?rFP=1 z=7i&yd|X$2iQ!t4zwfxN7vQLMZMwtts{AdJuZ#272>B_n@Ut}#&Z~0v;8V?8hQ4hi z#D7p-h2Z~a{!Mwy5wE4MkX~V-zl0vlc|`mo@TXI`|GVhJOmK(zmEh!$@mxy4@$c}y zWnk`2$y`_IUEU8<#IFK>TG6Ya`*XigyyO~lu}f>!Q>rTydDT82nswR5b9+D>7x?PD z8eK+ww44v}`zp7X`+ylA8!`7GQ+LRx6n}n4UgVu?V*hX9|3cBbp{w&cMqO!6p5rU{ z)G}B-@N_Co;##&A({H`LEa5F=dFkS^_cgh0lH_K-}T(Q!PiCg zc?Cb}J;??q#>RJ`5&Eq^o_w}g+<{t)`xeBzQ1_}1@sk1e-)_NgK>X+$`|QPhXEiUG z^BSDK&pP>kkNxcQ^8O5hqwe!ZGhUCl+c&7|+f^3ve|n5~o1}H|-lm)WW92`;*Jlf! CMJsy% delta 931 zcmV;U16=&Z2(AZ^8GjYI?MxYfMJAh&d%(rHP&I)A000620002P0RR910000k_~`u+ zF3r&3#eMwY{%$cWZ>=~gnm4@Y+ zb1s<=Skl+md7#%&@?=3x_@s5$@f_W;hGprNxen0hr#r)|c2FeWt9PSqskSQw1^MMR zB|u%yviYU0S`BPi;e`CiY7+bkIl5t)I8gb1>OU%&lwK?mmVS+mIuHw0j8!YfyJPSy z&o-n~;;B^FK7VW+cVtqjU5bZMde}gMw+SUo8*Ky<-)_(t9TGN{lcB^YIA$-f`+%1k z`O7lQH5&TKd3qG)kCw~L7v~hoYkIJ?Op$Q?12pQ3+pPfr000I6000000C-+?l-n!A zVHn4Mwtt~CE=VDX3lZCHXPEQ(G?P*;m0dcd_yd&Px*|0x%7xs?1-D!|l#(SP8HUXq zVmVCN*4M@NUC(N@K0SS&_j$hWyV9KCfEN82qu{M@OF4+viTi3!H+GRyAE?@jPO1KLS9dpD_zMk1a2tee4qdK zuhhQ?{1yDr$>(_k@1J09!dyEA-1i;z)>Ga?P?+lj^{(+-%Dn@A=M?8?7V_#8cv#4* zOQ`P_cn|opGS?UUPM43)KacmK{;xXV$sAJdVXx5l2mU!5-=7G0{t)lEFz!jy{s6A4 FUSL7z(cS<6 From a08370ce97e2777825d55bb2144474619091a4da Mon Sep 17 00:00:00 2001 From: tipouic Date: Sat, 19 Nov 2016 22:54:18 +0100 Subject: [PATCH 6/6] Suivit --- Multiprotocol/A7105_joysway.ino | 156 ++++++++++++++++---------------- Multiprotocol/Multiprotocol.ino | 43 ++++++--- Multiprotocol/SLT_nrf24l01.ino | 118 +++++++++++------------- Multiprotocol/TX_Def.h | 1 + Multiprotocol/V2X2_nrf24l01.ino | 11 +-- Multiprotocol/_Config.h | 2 +- Multiprotocol/multiprotocol.h | 9 +- Multiprotocol/sync.ffs_db | Bin 1094 -> 1013 bytes 8 files changed, 173 insertions(+), 167 deletions(-) diff --git a/Multiprotocol/A7105_joysway.ino b/Multiprotocol/A7105_joysway.ino index 572ca9f..e29fc2b 100644 --- a/Multiprotocol/A7105_joysway.ino +++ b/Multiprotocol/A7105_joysway.ino @@ -20,108 +20,106 @@ #define EVEN_ODD 0x00 //#define EVEN_ODD 0x01 -static uint8_t PROGMEM A7105_regs[] = { +const uint8_t PROGMEM JOYSWAY_A7105_regs[] = { 0x00, 0x62, 0xFF, 0x0f, 0x00, 0xFF , 0xFF , 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0xf5, 0x00, 0x15, 0x9e, 0x4b, 0x00, 0x03, 0x56, 0x2b, 0x12, 0x4a, 0x02, 0x80, 0x80, 0x00, 0x0e, 0x91, 0x03, 0x0f, 0x16, 0x2a, 0x00, 0xFF, 0xFF, 0xFF, 0x3a, 0x06, 0x1f, 0x47, 0x80, 0x01, 0x05, 0x45, 0x18, 0x00, 0x01, 0x0f, 0x00 }; -static void joysway_build_packet() -{ - int i; - //-100% =~ 0x03e8 - //+100% =~ 0x07ca - //Calculate: - //Center = 0x5d9 - //1 % = 5 - packet[0] = phase == 0 ? 0xdd : 0xff; - packet[1] = (MProtocol_id >> 24) & 0xff; - packet[2] = (MProtocol_id >> 16) & 0xff; - packet[3] = (MProtocol_id >> 8) & 0xff; - packet[4] = (MProtocol_id >> 0) & 0xff; - packet[5] = 0x00; - static const int chmap[4] = {6, 7, 10, 11}; - for (i = 0; i < 4; i++) { -// if (i >= Model.num_channels) { packet[chmap[i]] = 0x64; continue; } - packet[chmap[i]] = map(limit_channel_100(i),servo_min_100,servo_max_100,0,204); - } - packet[8] = 0x64; - packet[9] = 0x64; - packet[12] = 0x64; - packet[13] = 0x64; - packet[14] = phase == 0 ? 0x30 : 0xaa; - uint8_t value = 0; - for (int i = 0; i < 15; i++) { value += packet[i]; } - packet[15] = value; +static void joysway_build_packet() { + int i; + //-100% =~ 0x03e8 + //+100% =~ 0x07ca + //Calculate: + //Center = 0x5d9 + //1 % = 5 + packet[0] = phase == 0 ? 0xdd : 0xff; + packet[1] = (MProtocol_id >> 24) & 0xff; + packet[2] = (MProtocol_id >> 16) & 0xff; + packet[3] = (MProtocol_id >> 8) & 0xff; + packet[4] = (MProtocol_id >> 0) & 0xff; + packet[5] = 0x00; + static const int chmap[4] = {6, 7, 10, 11}; + for (i = 0; i < 4; i++) { +// if (i >= Model.num_channels) { packet[chmap[i]] = 0x64; continue; } + packet[chmap[i]] = map(limit_channel_100(i),servo_min_100,servo_max_100,0,204); + } + packet[8] = 0x64; + packet[9] = 0x64; + packet[12] = 0x64; + packet[13] = 0x64; + packet[14] = phase == 0 ? 0x30 : 0xaa; + uint8_t value = 0; + for (int i = 0; i < 15; i++) { value += packet[i]; } + packet[15] = value; } -static uint16_t joysway_cb() -{ - if (phase == 254) { - phase = 0; - A7105_WriteID(0x5475c52a); - hopping_frequency_no = 0x0a; - } else if (phase == 2) { - A7105_WriteID(MProtocol_id); - hopping_frequency_no = 0x30; - } else { - if ((phase & 0x01) ^ EVEN_ODD) { - hopping_frequency_no = 0x30; - } else { - hopping_frequency_no = rf_ch_num; - } - } - if (! ((phase & 0x01) ^ EVEN_ODD)) { - rf_ch_num++; - if (rf_ch_num == 0x45) - rf_ch_num = 0x30; - } - joysway_build_packet(); - A7105_Strobe(A7105_STANDBY); - A7105_WriteData(16, hopping_frequency_no); - phase++; - return 6000; +static uint16_t joysway_cb() { + if (phase == 254) { + phase = 0; + A7105_WriteID(0x5475c52a); + hopping_frequency_no = 0x0a; + } else if (phase == 2) { + A7105_WriteID(MProtocol_id); + hopping_frequency_no = 0x30; + } else { + if ((phase & 0x01) ^ EVEN_ODD) { + hopping_frequency_no = 0x30; + } else { + hopping_frequency_no = rf_ch_num; + } + } + if (! ((phase & 0x01) ^ EVEN_ODD)) { + rf_ch_num++; + if (rf_ch_num == 0x45) + rf_ch_num = 0x30; + } + joysway_build_packet(); + A7105_Strobe(A7105_STANDBY); + A7105_WriteData(16, hopping_frequency_no); + phase++; + return 6000; } static uint16_t JOYSWAY_Setup() { - int i; - u8 if_calibration1; - //u8 vco_calibration0; - //u8 vco_calibration1; + int i; + u8 if_calibration1; + //u8 vco_calibration0; + //u8 vco_calibration1; - counter = 0; - next_ch = 0x30; + counter = 0; +// next_ch = 0x30; - for (i = 0; i < 0x33; i++) { - uint8_t val=pgm_read_byte_near(&A7105_Regs[i]); + for (i = 0; i < 0x33; i++) { + uint8_t val=pgm_read_byte_near(&JOYSWAY_A7105_regs[i]); if( val != 0xFF) A7105_WriteReg(i, val); } - A7105_WriteID(0x5475c52a); + A7105_WriteID(0x5475c52a); - A7105_Strobe(A7105_PLL); + A7105_Strobe(A7105_PLL); - //IF Filter Bank Calibration - A7105_WriteReg(0x02, 1); + //IF Filter Bank Calibration + A7105_WriteReg(0x02, 1); while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end - A7105_Strobe(A7105_STANDBY); + A7105_Strobe(A7105_STANDBY); - //VCO Current Calibration - A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet - A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet + //VCO Current Calibration + A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet + A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet - A7105_WriteID(MProtocol_id); - A7105_Strobe(A7105_PLL); - A7105_WriteReg(0x02, 1); + A7105_WriteID(MProtocol_id); + A7105_Strobe(A7105_PLL); + A7105_WriteReg(0x02, 1); while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end - A7105_Strobe(A7105_STANDBY); - A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet - A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet + A7105_Strobe(A7105_STANDBY); + A7105_WriteReg(0x24, 0x13); //Recomended calibration from A7105 Datasheet + A7105_WriteReg(0x25, 0x09); //Recomended calibration from A7105 Datasheet - A7105_SetTxRxMode(TX_EN); - A7105_SetPower(); + A7105_SetTxRxMode(TX_EN); + A7105_SetPower(); - A7105_Strobe(A7105_STANDBY); + A7105_Strobe(A7105_STANDBY); return 2400; } #endif diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 636e627..94ca4f4 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -477,13 +477,15 @@ void Update_All() } update_aux_flags(); PPM_FLAG_off; // wait for next frame before update + INPUT_SIGNAL_on; //valid signal received + last_signal=millis(); } #endif //ENABLE_PPM - update_led_status(); #if defined(TELEMETRY) if((protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) TelemetryUpdate(); #endif + update_led_status(); } // Update Servo_AUX flags based on servo AUX positions @@ -508,23 +510,32 @@ static void update_aux_flags(void) // Update led status based on binding and serial static void update_led_status(void) { + if(IS_INPUT_SIGNAL_on) + if(millis()-last_signal>50) + INPUT_SIGNAL_off; //no valid signal (PPM or Serial) received for 50ms if(blink led on else + { + if(IS_BIND_DONE_on) + LED_off; //bind completed force led on blink+=BLINK_BIND_TIME; //blink fastly during binding + } LED_toggle; } } @@ -1150,25 +1161,27 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) #endif #endif { // Interrupt on PPM pin - static int8_t chan=-1; + static int8_t chan=0,bad_frame=1; static uint16_t Prev_TCNT1=0; uint16_t Cur_TCNT1; Cur_TCNT1=TCNT1-Prev_TCNT1; // Capture current Timer1 value if(Cur_TCNT1<1000) - chan=-1; // bad frame + bad_frame=1; // bad frame else if(Cur_TCNT1>4840) - { - chan=0; // start of frame - PPM_FLAG_on; // full frame present (even at startup since PPM_data has been initialized) + { //start of frame + if(chan>3) + PPM_FLAG_on; // good frame received if at least 4 channels have been seen + chan=0; // reset channel counter + bad_frame=0; } else - if(chan!=-1) // need to wait for start of frame + if(bad_frame==0) // need to wait for start of frame { //servo values between 500us and 2420us will end up here PPM_data[chan]= Cur_TCNT1>>1;; if(chan++>=NUM_CHN) - chan=-1; // don't accept any new channels + bad_frame=1; // don't accept any new channels } Prev_TCNT1+=Cur_TCNT1; } diff --git a/Multiprotocol/SLT_nrf24l01.ino b/Multiprotocol/SLT_nrf24l01.ino index 8d4e486..9778d3c 100644 --- a/Multiprotocol/SLT_nrf24l01.ino +++ b/Multiprotocol/SLT_nrf24l01.ino @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ -// Last sync with hexfet new_protocols/slt_nrf24l01.c dated 2015-02-13 +// Last sync with deviation main github branch #if defined(SLT_NRF24L01_INO) @@ -24,11 +24,11 @@ #define SLT_TXID_SIZE 4 enum { - SLT_INIT2 = 0, - SLT_BIND, + SLT_BUILD=0, SLT_DATA1, SLT_DATA2, - SLT_DATA3 + SLT_DATA3, + SLT_BIND }; static void __attribute__((unused)) SLT_init() @@ -45,24 +45,18 @@ static void __attribute__((unused)) SLT_init() NRF24L01_SetPower(); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t*)"\xC3\xC3\xAA\x55", 4); NRF24L01_FlushRx(); -} - -static void __attribute__((unused)) SLT_init2() -{ + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, SLT_TXID_SIZE); NRF24L01_FlushTx(); - packet_sent = 0; - hopping_frequency_no = 0; - // Turn radio power on NRF24L01_SetTxRxMode(TX_EN); } -static void __attribute__((unused)) SLT_set_tx_id(void) +static void __attribute__((unused)) SLT_set_freq(void) { // Frequency hopping sequence generation - for (uint8_t i = 0; i < 4; ++i) + for (uint8_t i = 0; i < SLT_TXID_SIZE; ++i) { - uint8_t next_i = (i+1) % 4; // is & 3 better than % 4 ? + uint8_t next_i = (i+1) % SLT_TXID_SIZE; // is & 3 better than % 4 ? uint8_t base = i < 2 ? 0x03 : 0x10; hopping_frequency[i*4 + 0] = (rx_tx_addr[i] & 0x3f) + base; hopping_frequency[i*4 + 1] = (rx_tx_addr[i] >> 2) + base; @@ -72,8 +66,9 @@ static void __attribute__((unused)) SLT_set_tx_id(void) } // unique - uint8_t done = 0; for (uint8_t i = 0; i < SLT_NFREQCHANNELS; ++i) + { + uint8_t done = 0; while (!done) { done = 1; @@ -86,14 +81,13 @@ static void __attribute__((unused)) SLT_set_tx_id(void) hopping_frequency[i] = hopping_frequency[i] - 0x50 + 0x03; } } - - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 4); + } } static void __attribute__((unused)) SLT_wait_radio() { if (packet_sent) - while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))) ; + while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))); packet_sent = 0; } @@ -109,9 +103,15 @@ static void __attribute__((unused)) SLT_send_data(uint8_t *data, uint8_t len) static void __attribute__((unused)) SLT_build_packet() { - // aileron, elevator, throttle, rudder, gear, pitch + // Set radio channel - once per packet batch + NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); + if (++hopping_frequency_no >= SLT_NFREQCHANNELS) + hopping_frequency_no = 0; + + // aileron, elevator, throttle, rudder, gear, pitch uint8_t e = 0; // byte where extension 2 bits for every 10-bit channel are packed - for (uint8_t i = 0; i < 4; ++i) { + for (uint8_t i = 0; i < 4; ++i) + { uint16_t v = convert_channel_10b(CH_AETR[i]); packet[i] = v; e = (e >> 2) | (uint8_t) ((v >> 2) & 0xC0); @@ -121,81 +121,71 @@ static void __attribute__((unused)) SLT_build_packet() // 8-bit channels packet[5] = convert_channel_8b(AUX1); packet[6] = convert_channel_8b(AUX2); - - // Set radio channel - once per packet batch - NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); - if (++hopping_frequency_no >= SLT_NFREQCHANNELS) - hopping_frequency_no = 0; } static void __attribute__((unused)) SLT_send_bind_packet() { SLT_wait_radio(); - BIND_IN_PROGRESS; // autobind protocol + BIND_IN_PROGRESS; //Limit TX power to bind level NRF24L01_SetPower(); - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t *)"\x7E\xB8\x63\xA9", 4); + BIND_DONE; + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t *)"\x7E\xB8\x63\xA9", SLT_TXID_SIZE); NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x50); - SLT_send_data(rx_tx_addr, 4); + SLT_send_data(rx_tx_addr, SLT_TXID_SIZE); - // NB: we should wait until the packet's sent before changing TX address! - SLT_wait_radio(); + SLT_wait_radio(); //Wait until the packet's sent before changing TX address! - BIND_DONE; - NRF24L01_SetPower(); - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 4); + NRF24L01_SetPower(); //Change power back to normal level + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, SLT_TXID_SIZE); } uint16_t SLT_callback() { - uint16_t delay_us = 20000; // 3 packets with 1ms intervals every 22ms switch (phase) { - case SLT_INIT2: - SLT_init2(); - phase = SLT_BIND; - delay_us = 150; - break; - case SLT_BIND: - SLT_send_bind_packet(); - phase = SLT_DATA1; - delay_us = 19000; - break; - case SLT_DATA1: + case SLT_BUILD: SLT_build_packet(); - SLT_send_data(packet, 7); - phase = SLT_DATA2; - delay_us = 1000; - break; + phase++; + return 1000; + case SLT_DATA1: + SLT_send_data(packet, SLT_PAYLOADSIZE); + phase++; + return 1000; case SLT_DATA2: - SLT_send_data(packet, 7); - phase = SLT_DATA3; - delay_us = 1000; - break; + SLT_send_data(packet, SLT_PAYLOADSIZE); + phase++; + return 1000; case SLT_DATA3: - SLT_send_data(packet, 7); - if (++counter >= 100) + SLT_send_data(packet, SLT_PAYLOADSIZE); + if (++packet_count >= 100) { - counter = 0; - phase = SLT_BIND; - delay_us = 1000; + packet_count = 0; + phase++; + return 1000; } else { NRF24L01_SetPower(); // Set tx_power - phase = SLT_DATA1; + phase = SLT_BUILD; + return 19000; } - break; + case SLT_BIND: + SLT_send_bind_packet(); + phase = SLT_BUILD; + return 18000; } - return delay_us; + return 19000; } uint16_t initSLT() { - counter = 0; + packet_count = 0; + packet_sent = 0; + hopping_frequency_no = 0; + SLT_set_freq(); SLT_init(); - phase = SLT_INIT2; - SLT_set_tx_id(); + phase = SLT_BIND; return 50000; } diff --git a/Multiprotocol/TX_Def.h b/Multiprotocol/TX_Def.h index caef39d..ef18d5e 100644 --- a/Multiprotocol/TX_Def.h +++ b/Multiprotocol/TX_Def.h @@ -56,6 +56,7 @@ //PPM values used to compare #define PPM_MIN_COMMAND 1250 #define PPM_SWITCH 1550 +#define PPM_SWITCH_B 1450 #define PPM_MAX_COMMAND 1750 //Channel definitions diff --git a/Multiprotocol/V2X2_nrf24l01.ino b/Multiprotocol/V2X2_nrf24l01.ino index fc5aa9d..999410f 100644 --- a/Multiprotocol/V2X2_nrf24l01.ino +++ b/Multiprotocol/V2X2_nrf24l01.ino @@ -196,14 +196,11 @@ static void __attribute__((unused)) V2X2_send_packet(uint8_t bind) // Channel 11 if (Servo_AUX7) flags2 |= JXD_FLAG_EMERGENCY; -/* // Channel 12 down - if (num_channels < 11 || Channels[CHANNEL11] >= CHAN_MIN_VALUE/2) *flags2 &= ~FLAG_CAMERA_DN; - else *flags2 |= JXD_FLAG_CAMERA_DN; - + // Channel 12 down + if (Servo_data[AUX8] < PPM_SWITCH_B) flags2 |= JXD_FLAG_CAMERA_DN; // Channel 12 up - if (num_channels < 11 || Channels[CHANNEL11] <= CHAN_MAX_VALUE/2) *flags2 &= ~FLAG_CAMERA_UP; - else *flags2 |= JXD_FLAG_CAMERA_UP; -*/ + if (Servo_data[AUX8] > PPM_SWITCH) flags2 |= JXD_FLAG_CAMERA_UP; + } else { // Channel 10 if (Servo_AUX6) diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 07f5dc2..50d574f 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -60,7 +60,7 @@ //Comment the protocols you are not using with "//" to save Flash space. //The protocols below need an A7105 to be installed -// #define JOYSWAY_A7105_INO + #define JOYSWAY_A7105_INO #define FLYSKY_A7105_INO #define HUBSAN_A7105_INO diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index be11096..68caa59 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -167,7 +167,7 @@ enum FY326 FY326 = 0, FY319 = 1 }; -enum{ +enum V2X2 { FORMAT_V202 = 0, FORMAT_JXD506 = 1, }; @@ -266,12 +266,18 @@ struct PPM_Parameters #define IS_TX_RX_PAUSE_on ( ( protocol_flags2 & _BV(4) ) !=0 ) #define IS_TX_PAUSE_on ( ( protocol_flags2 & (_BV(4)|_BV(3)) ) !=0 ) +//Signal OK +#define INPUT_SIGNAL_off protocol_flags2 &= ~_BV(5) +#define INPUT_SIGNAL_on protocol_flags2 |= _BV(5) +#define IS_INPUT_SIGNAL_on ( ( protocol_flags2 & _BV(5) ) !=0 ) +#define IS_INPUT_SIGNAL_off ( ( protocol_flags2 & _BV(5) ) ==0 ) //******************** //*** Blink timing *** //******************** #define BLINK_BIND_TIME 100 #define BLINK_SERIAL_TIME 500 +#define BLINK_PPM_TIME 1000 #define BLINK_BAD_PROTO_TIME_LOW 1000 #define BLINK_BAD_PROTO_TIME_HIGH 50 @@ -461,6 +467,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- DSM2_11 1 DSMX_22 2 DSMX_11 3 + DSM_AUTO 4 sub_protocol==YD717 YD717 0 SKYWLKR 1 diff --git a/Multiprotocol/sync.ffs_db b/Multiprotocol/sync.ffs_db index c065aeab6f818e680712ab90da67f39103e03519..ef0ab5b6e240d7449385800e71903eb8a557b56e 100644 GIT binary patch delta 1002 zcmV41Xj_iBpaOC2~V&feyW5 zt*wp3`T`A27L@|tTHuGi<-1u`dE~4C^yBR&N`Vg^p(xa`TZL4%X$8@iM_(`kbmu%j z*~}F;!nPY9uHSiQf@?9yvRwxYm0u_Sqk>5T<|pF;=-kg?CyUgJggRDiQoKVMkF2-as?srn12aW zXTGV^+aP_UHLtS}6c?UG9Y^fHqceOnc^Zz_XQled=MLto(Wsk-)|}DAJ@J9h)iwe) zwW(@dQ`q$|%a3-5W#~1-7&|nU`Nx3kMopVvoRPY*oPU}+W3DCPm-*qh1tgMN^=#^9 zG=@DSx49U1AhxiJdpHc@ruwQe6X5=6waqHFnGJuSlgR@2m(;c@4-c;}II@IXr$gqK zZ9Shl9&XoB*p&wA30O`R6mYp(%FE~Yd43as(I&a;Z08;mS9p2g4m35b(OjsD;@oDU z@%jhy9e<&8+5rFncm@Cf00000cwTkYO(?^07zgmbZDAp_T)e*);dsFe763_^}k*tZAgcAKH4zD!tu;60^%d$C?qctvgz+zNlMN~8Q55AEz`;l8@yxq80GZn&n1y+_FD z72E>1_&@2~tZ?Uvj_U7&-x_#d8+`kf=VQbkyO%qDuKR_02H^4UlR>yv#qWUt{5zCR zbq)!0;t<|%4y;e!F;UJ0d_BzdJB54~@|Ui;&S9)S{;H;Y7kodH_Z@*xd3gTa!W?>p Ydc5$HApehy#^!38=XMPK19yU7Wf7yoZ%S+000620002u0RR9100014P*M!! zE>QHzbSlkJag!APWA`MUG#kaAavU63C^bX55-#vcfN^j`?$rj*9RwC*l)sLB9HI!v zq0)=`5aRX!KhPZD78+;+JFbTn(USn2n`1dr!a`?7^6w;10e>uRv@4b2P@bDNdXpSk_PDWAqZlLinHz&(jGZ+ zHqADn^or$j(tkw98DT7wUjI@tiL#xK8@QfC!u8RXka+z2cO-nQl@f{n_+iE*?iSUe zka)mP0=Ki&GU#iN9cis=ECj`cr*YR6`)?Tx-$A~n>krsfec^ovebsC>EK_gI>*Aew z$@^+20bBZPt)VOId06119b%bA-83hL#u`5ixNg?&ygrKiVCuh8R?@gU&(NbH^dji)KSG=y@H1-?Nq+`E9oYfmJ57#5hR63we~$R?rFP=1 z=7i&yd|X$2iQ!t4zwfxN7vQLMZMwtts{AdJuZ#272>B_n@Ut}#&Z~0v;8V?8hQ4hi z#D7p-h2Z~a{!Mwy5wE4MkX~V-zl0vlc|`mo@TXI`|GVhJOmK(zmEh!$@mxy4@$c}y zWnk`2$y`_IUEU8<#IFK>TG6Ya`*XigyyO~lu}f>!Q>rTydDT82nswR5b9+D>7x?PD z8eK+ww44v}`zp7X`+ylA8!`7GQ+LRx6n}n4UgVu?V*hX9|3cBbp{w&cMqO!6p5rU{ z)G}B-@N_Co;##&A({H`LEa5F=dFkS^_cgh0lH_K-}T(Q!PiCg zc?Cb}J;??q#>RJ`5&Eq^o_w}g+<{t)`xeBzQ1_}1@sk1e-)_NgK>X+$`|QPhXEiUG z^BSDK&pP>kkNxcQ^8O5hqwe!ZGhUCl+c&7|+f^3ve|n5~o1}H|-lm)WW92`;*JlgL C_$$Hy