mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2026-01-12 19:53:16 +00:00
Compare commits
1 Commits
pascallang
...
pascallang
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4a6411b83 |
@@ -121,8 +121,7 @@
|
|||||||
49,2,KF606,ZCZ50,1,Trim,UNK
|
49,2,KF606,ZCZ50,1,Trim,UNK
|
||||||
9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim
|
9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim
|
||||||
9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim
|
9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim
|
||||||
73,0,Kyosho,FHSS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
73,0,Kyosho,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
||||||
73,1,Kyosho,Hype,0,CH5,CH6
|
|
||||||
18,0,MJXQ,WHL08,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
18,0,MJXQ,WHL08,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
||||||
18,1,MJXQ,X600,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
18,1,MJXQ,X600,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
||||||
18,2,MJXQ,X800,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
18,2,MJXQ,X800,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
||||||
@@ -210,5 +209,3 @@
|
|||||||
92,0,MT99xx2,PA18,0,MODE,FLIP,RTH
|
92,0,MT99xx2,PA18,0,MODE,FLIP,RTH
|
||||||
93,0,Kyosho2,KT-17,0
|
93,0,Kyosho2,KT-17,0
|
||||||
94,0,Scorpio
|
94,0,Scorpio
|
||||||
95,0,Bluefly,HP100,0,CH5,CH6,CH7,CH8
|
|
||||||
96,0,BumbleB
|
|
||||||
|
|||||||
@@ -418,10 +418,10 @@ void A7105_Init(void)
|
|||||||
#ifdef KYOSHO_A7105_INO
|
#ifdef KYOSHO_A7105_INO
|
||||||
if(protocol==PROTO_KYOSHO)
|
if(protocol==PROTO_KYOSHO)
|
||||||
{
|
{
|
||||||
if(sub_protocol==KYOSHO_HYPE)
|
if(sub_protocol==KYOSHO_FHSS)
|
||||||
A7105_Regs=(uint8_t*)KYOSHO_HYPE_A7105_regs;
|
|
||||||
else //FHSS && SYNCRO
|
|
||||||
A7105_Regs=(uint8_t*)KYOSHO_A7105_regs;
|
A7105_Regs=(uint8_t*)KYOSHO_A7105_regs;
|
||||||
|
else
|
||||||
|
A7105_Regs=(uint8_t*)KYOSHO_HYPE_A7105_regs;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -446,7 +446,7 @@ void A7105_Init(void)
|
|||||||
}
|
}
|
||||||
A7105_Strobe(A7105_STANDBY);
|
A7105_Strobe(A7105_STANDBY);
|
||||||
|
|
||||||
if(protocol==PROTO_KYOSHO && sub_protocol!=KYOSHO_HYPE)
|
if(protocol==PROTO_KYOSHO && sub_protocol==KYOSHO_FHSS)
|
||||||
{//strange calibration...
|
{//strange calibration...
|
||||||
//IF Filter Bank Calibration
|
//IF Filter Bank Calibration
|
||||||
A7105_WriteReg(A7105_02_CALC,0x0F);
|
A7105_WriteReg(A7105_02_CALC,0x0F);
|
||||||
|
|||||||
@@ -1,196 +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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(BUMBLEB_CCNRF_INO)
|
|
||||||
|
|
||||||
#include "iface_xn297.h"
|
|
||||||
|
|
||||||
#define FORCE_BUMBLEB_ORIGINAL_ID
|
|
||||||
#define BUMBLEB_TELEM_DEBUG
|
|
||||||
|
|
||||||
#define BUMBLEB_PACKET_PERIOD 10200
|
|
||||||
#define BUMBLEB_RF_BIND_CHANNEL 42
|
|
||||||
#define BUMBLEB_RF_NUM_CHANNELS 2
|
|
||||||
#define BUMBLEB_PAYLOAD_SIZE 7
|
|
||||||
|
|
||||||
static void __attribute__((unused)) BUMBLEB_send_packet()
|
|
||||||
{
|
|
||||||
packet[6] = 0x00;
|
|
||||||
if(IS_BIND_IN_PROGRESS)
|
|
||||||
{
|
|
||||||
packet[0] = rx_tx_addr[0];
|
|
||||||
packet[1] = rx_tx_addr[1];
|
|
||||||
packet[2] = 0x54; //???
|
|
||||||
packet[3] = 0x58; //???
|
|
||||||
hopping_frequency_no ^= 0x01;
|
|
||||||
packet[4] = hopping_frequency[hopping_frequency_no];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//hopping frequency
|
|
||||||
XN297_Hopping(hopping_frequency_no);
|
|
||||||
hopping_frequency_no ^= 0x01;
|
|
||||||
packet[0] = 0x20
|
|
||||||
|GET_FLAG(CH6_SW,0x80); // High rate
|
|
||||||
packet[1] = convert_channel_8b_limit_deadband(AILERON,0xBF,0xA0,0x81,40); // Aileron: Max values:BD..A0..82
|
|
||||||
if(packet[1] < 0xA0)
|
|
||||||
packet[1] = 0x20 - packet[1]; // Reverse low part of aileron
|
|
||||||
packet[2] = convert_channel_8b(CH5)>>2; // 01..20..3F
|
|
||||||
if(CH7_SW) // Drive trim from aileron
|
|
||||||
{
|
|
||||||
uint8_t ch=convert_channel_8b(AILERON);
|
|
||||||
if(ch > 0x5A && ch < 0x80-0x07)
|
|
||||||
packet[2] = ch - 0x5A;
|
|
||||||
else if(ch < 0x5A)
|
|
||||||
{
|
|
||||||
if(ch < 0x5A-0x20)
|
|
||||||
packet[2] = 0;
|
|
||||||
else
|
|
||||||
packet[2] = ch - (0x5A-0x20);
|
|
||||||
}
|
|
||||||
else if(packet[1] == 0x89)
|
|
||||||
packet[2] = 0x20;
|
|
||||||
else if(ch > 0xA5)
|
|
||||||
{
|
|
||||||
if(ch > 0xA9+0x1F)
|
|
||||||
packet[2] = 0x3F;
|
|
||||||
else
|
|
||||||
packet[2] = ch - 0x89;
|
|
||||||
}
|
|
||||||
else if(ch > 0xA5-0x1F)
|
|
||||||
packet[2] = ch - (0xA5-0x1F-0x20);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
packet[2] = convert_channel_8b(CH5)>>2; // 01..20..3F
|
|
||||||
packet[3] = convert_channel_8b(THROTTLE)>>2; // 00..3F
|
|
||||||
packet[4] = hopping_frequency[hopping_frequency_no];
|
|
||||||
}
|
|
||||||
|
|
||||||
packet[5] = packet[0];
|
|
||||||
for(uint8_t i=1;i<BUMBLEB_PAYLOAD_SIZE-2;i++)
|
|
||||||
packet[5] += packet[i];
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
debug("P:");
|
|
||||||
for(uint8_t i=0;i<BUMBLEB_PAYLOAD_SIZE;i++)
|
|
||||||
debug(" %02X", packet[i]);
|
|
||||||
debugln("");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
XN297_SetPower(); // Set tx_power
|
|
||||||
XN297_SetFreqOffset(); // Set frequency offset
|
|
||||||
XN297_SetTxRxMode(TX_EN);
|
|
||||||
XN297_WritePayload(packet, BUMBLEB_PAYLOAD_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __attribute__((unused)) BUMBLEB_RF_init()
|
|
||||||
{
|
|
||||||
//Config CC2500
|
|
||||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K);
|
|
||||||
XN297_SetTXAddr((uint8_t*)"\x55\x55\x55\x55\x55", 5);
|
|
||||||
XN297_HoppingCalib(BUMBLEB_RF_NUM_CHANNELS); // Calibrate all channels
|
|
||||||
XN297_RFChannel(BUMBLEB_RF_BIND_CHANNEL); // Set bind channel
|
|
||||||
XN297_SetRXAddr(rx_tx_addr, BUMBLEB_PAYLOAD_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __attribute__((unused)) BUMBLEB_initialize_txid()
|
|
||||||
{
|
|
||||||
calc_fh_channels(BUMBLEB_RF_NUM_CHANNELS);
|
|
||||||
rx_tx_addr[0] = rx_tx_addr[2];
|
|
||||||
rx_tx_addr[1] = rx_tx_addr[3];
|
|
||||||
#ifdef FORCE_BUMBLEB_ORIGINAL_ID
|
|
||||||
rx_tx_addr[0] = 0x33;
|
|
||||||
rx_tx_addr[1] = 0x65;
|
|
||||||
hopping_frequency[0] = 2;
|
|
||||||
hopping_frequency[1] = 40;
|
|
||||||
#endif
|
|
||||||
rx_tx_addr[2] = rx_tx_addr[3] = rx_tx_addr[4] = 0x55;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {
|
|
||||||
BUMBLEB_BIND = 0x00,
|
|
||||||
BUMBLEB_BINDRX = 0x01,
|
|
||||||
BUMBLEB_DATA = 0x02,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define BUMBLEB_WRITE_TIME 850
|
|
||||||
|
|
||||||
uint16_t BUMBLEB_callback()
|
|
||||||
{
|
|
||||||
bool rx;
|
|
||||||
switch(phase)
|
|
||||||
{
|
|
||||||
case BUMBLEB_BIND:
|
|
||||||
rx = XN297_IsRX(); // Needed for the NRF24L01 since otherwise the bit gets cleared
|
|
||||||
|
|
||||||
BUMBLEB_send_packet();
|
|
||||||
|
|
||||||
if( rx )
|
|
||||||
{ // a packet has been received
|
|
||||||
#ifdef BUMBLEB_TELEM_DEBUG
|
|
||||||
debug("RX :");
|
|
||||||
#endif
|
|
||||||
if(XN297_ReadPayload(packet_in, BUMBLEB_PAYLOAD_SIZE))
|
|
||||||
{ // packet with good CRC
|
|
||||||
#ifdef BUMBLEB_TELEM_DEBUG
|
|
||||||
debug("OK :");
|
|
||||||
for(uint8_t i=0;i<BUMBLEB_PAYLOAD_SIZE;i++)
|
|
||||||
debug(" %02X",packet_in[i]);
|
|
||||||
#endif
|
|
||||||
// packet_in = 4F 71 55 52 58 61 AA
|
|
||||||
rx_tx_addr[2] = packet_in[0];
|
|
||||||
rx_tx_addr[3] = packet_in[1];
|
|
||||||
//rx_tx_addr[4] = packet_in[2]; // to test with other planes...
|
|
||||||
XN297_SetTXAddr(rx_tx_addr, 5);
|
|
||||||
BIND_DONE;
|
|
||||||
phase = BUMBLEB_DATA;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
phase++;
|
|
||||||
return BUMBLEB_WRITE_TIME;
|
|
||||||
case BUMBLEB_BINDRX:
|
|
||||||
{
|
|
||||||
uint16_t start=(uint16_t)micros();
|
|
||||||
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500)
|
|
||||||
{
|
|
||||||
if(XN297_IsPacketSent())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XN297_SetTxRxMode(RX_EN);
|
|
||||||
phase = BUMBLEB_BIND;
|
|
||||||
return BUMBLEB_PACKET_PERIOD-BUMBLEB_WRITE_TIME;
|
|
||||||
case BUMBLEB_DATA:
|
|
||||||
#ifdef MULTI_SYNC
|
|
||||||
telemetry_set_input_sync(BUMBLEB_PACKET_PERIOD);
|
|
||||||
#endif
|
|
||||||
BUMBLEB_send_packet();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return BUMBLEB_PACKET_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BUMBLEB_init()
|
|
||||||
{
|
|
||||||
BUMBLEB_initialize_txid();
|
|
||||||
BUMBLEB_RF_init();
|
|
||||||
hopping_frequency_no = 0;
|
|
||||||
|
|
||||||
BIND_IN_PROGRESS; // autobind protocol
|
|
||||||
phase = BUMBLEB_BIND;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -298,7 +298,7 @@ void CYRF_FindBestChannels(uint8_t *channels, uint8_t len, uint8_t minspace, uin
|
|||||||
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x00); // Clear abort RX
|
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x00); // Clear abort RX
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DEVO_CYRF6936_INO) || defined(J6PRO_CYRF6936_INO) || defined(TRAXXAS_CYRF6936_INO)
|
#if defined(DEVO_CYRF6936_INO) || defined(J6PRO_CYRF6936_INO)
|
||||||
const uint8_t PROGMEM DEVO_j6pro_sopcodes[][8] = {
|
const uint8_t PROGMEM DEVO_j6pro_sopcodes[][8] = {
|
||||||
/* Note these are in order transmitted (LSB 1st) */
|
/* Note these are in order transmitted (LSB 1st) */
|
||||||
{0x3C, 0x37, 0xCC, 0x91, 0xE2, 0xF8, 0xCC, 0x91},
|
{0x3C, 0x37, 0xCC, 0x91, 0xE2, 0xF8, 0xCC, 0x91},
|
||||||
@@ -311,7 +311,7 @@ const uint8_t PROGMEM DEVO_j6pro_sopcodes[][8] = {
|
|||||||
{0xB9, 0x8E, 0x19, 0x74, 0x6F, 0x65, 0x18, 0x74},
|
{0xB9, 0x8E, 0x19, 0x74, 0x6F, 0x65, 0x18, 0x74},
|
||||||
{0xDF, 0xB1, 0xC0, 0x49, 0x62, 0xDF, 0xC1, 0x49},
|
{0xDF, 0xB1, 0xC0, 0x49, 0x62, 0xDF, 0xC1, 0x49},
|
||||||
{0x97, 0xE5, 0x14, 0x72, 0x7F, 0x1A, 0x14, 0x72},
|
{0x97, 0xE5, 0x14, 0x72, 0x7F, 0x1A, 0x14, 0x72},
|
||||||
#if defined(J6PRO_CYRF6936_INO) || defined(TRAXXAS_CYRF6936_INO)
|
#if defined(J6PRO_CYRF6936_INO)
|
||||||
{0x82, 0xC7, 0x90, 0x36, 0x21, 0x03, 0xFF, 0x17},
|
{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
|
{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,
|
{0xAD, 0x39, 0xA2, 0x0F, 0x9B, 0xC5, 0xA1, 0x0F}, //The following are the same as the 1st 8 above,
|
||||||
@@ -322,22 +322,14 @@ const uint8_t PROGMEM DEVO_j6pro_sopcodes[][8] = {
|
|||||||
{0x9E, 0x82, 0xDC, 0x3C, 0xA1, 0x78, 0xDC, 0x3C},
|
{0x9E, 0x82, 0xDC, 0x3C, 0xA1, 0x78, 0xDC, 0x3C},
|
||||||
{0x6F, 0x65, 0x18, 0x74, 0xB9, 0x8E, 0x19, 0x74},
|
{0x6F, 0x65, 0x18, 0x74, 0xB9, 0x8E, 0x19, 0x74},
|
||||||
#endif
|
#endif
|
||||||
#if defined(TRAXXAS_CYRF6936_INO)
|
|
||||||
{0x62, 0xDF, 0xC1, 0x49, 0xDF, 0xB1, 0xC0, 0x49},
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void __attribute__((unused)) CYRF_PROGMEM_ConfigSOPCode(const uint8_t *data)
|
static void __attribute__((unused)) CYRF_PROGMEM_ConfigSOPCode(const uint8_t *data)
|
||||||
{
|
{
|
||||||
uint8_t code[8];
|
uint8_t code[8];
|
||||||
//debug("SOP:");
|
|
||||||
for(uint8_t i=0;i<8;i++)
|
for(uint8_t i=0;i<8;i++)
|
||||||
{
|
|
||||||
code[i]=pgm_read_byte_near(&data[i]);
|
code[i]=pgm_read_byte_near(&data[i]);
|
||||||
//debug(" %02X",code[i]);
|
|
||||||
}
|
|
||||||
//debugln("");
|
|
||||||
CYRF_ConfigSOPCode(code);
|
CYRF_ConfigSOPCode(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ const uint8_t PROGMEM DSM_pncodes[][8] = {
|
|||||||
/* Col 6 */ {0xBF, 0x54, 0x98, 0xB9, 0xB7, 0x30, 0x5A, 0x88},
|
/* Col 6 */ {0xBF, 0x54, 0x98, 0xB9, 0xB7, 0x30, 0x5A, 0x88},
|
||||||
/* Col 7 */ {0x35, 0xD1, 0xFC, 0x97, 0x23, 0xD4, 0xC9, 0x88},
|
/* Col 7 */ {0x35, 0xD1, 0xFC, 0x97, 0x23, 0xD4, 0xC9, 0x88},
|
||||||
/* Row 4 */
|
/* Row 4 */
|
||||||
/* Col 0 */ {0xE1, 0xD6, 0x31, 0x26, 0x5F, 0xBD, 0x40, 0x93}, // Wrong values used by Orange TX/RX Row 3 Col 8: {0x88, 0xE1, 0xD6, 0x31, 0x26, 0x5F, 0xBD, 0x40}
|
/* Col 0 */ {0xE1, 0xD6, 0x31, 0x26, 0x5F, 0xBD, 0x40, 0x93}, // Wrong values used by Orange TX/RX Col 8 */ {0x88, 0xE1, 0xD6, 0x31, 0x26, 0x5F, 0xBD, 0x40}
|
||||||
/* Col 1 */ {0xDC, 0x68, 0x08, 0x99, 0x97, 0xAE, 0xAF, 0x8C},
|
/* Col 1 */ {0xDC, 0x68, 0x08, 0x99, 0x97, 0xAE, 0xAF, 0x8C},
|
||||||
/* Col 2 */ {0xC3, 0x0E, 0x01, 0x16, 0x0E, 0x32, 0x06, 0xBA},
|
/* Col 2 */ {0xC3, 0x0E, 0x01, 0x16, 0x0E, 0x32, 0x06, 0xBA},
|
||||||
/* Col 3 */ {0xE0, 0x83, 0x01, 0xFA, 0xAB, 0x3E, 0x8F, 0xAC},
|
/* Col 3 */ {0xE0, 0x83, 0x01, 0xFA, 0xAB, 0x3E, 0x8F, 0xAC},
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
//#define KYOSHO_FORCE_ID_FHSS
|
//#define KYOSHO_FORCE_ID_FHSS
|
||||||
//#define KYOSHO_FORCE_ID_HYPE
|
//#define KYOSHO_FORCE_ID_HYPE
|
||||||
//#define KYOSHO_FORCE_ID_SYNCRO
|
|
||||||
|
|
||||||
//Kyosho constants & variables
|
//Kyosho constants & variables
|
||||||
#define KYOSHO_BIND_COUNT 2500
|
#define KYOSHO_BIND_COUNT 2500
|
||||||
@@ -33,7 +32,7 @@ static void __attribute__((unused)) KYOSHO_send_packet()
|
|||||||
packet[4] = rx_tx_addr[3];
|
packet[4] = rx_tx_addr[3];
|
||||||
//unknown may be RX ID on some other remotes
|
//unknown may be RX ID on some other remotes
|
||||||
memset(packet+5,0xFF,4);
|
memset(packet+5,0xFF,4);
|
||||||
|
|
||||||
if(IS_BIND_IN_PROGRESS)
|
if(IS_BIND_IN_PROGRESS)
|
||||||
{
|
{
|
||||||
packet[ 0] = 0xBC; // bind indicator
|
packet[ 0] = 0xBC; // bind indicator
|
||||||
@@ -43,9 +42,8 @@ static void __attribute__((unused)) KYOSHO_send_packet()
|
|||||||
//RF table
|
//RF table
|
||||||
for(uint8_t i=0; i<16;i++)
|
for(uint8_t i=0; i<16;i++)
|
||||||
packet[i+11]=hopping_frequency[i+(packet[9]<<4)];
|
packet[i+11]=hopping_frequency[i+(packet[9]<<4)];
|
||||||
//TX type
|
//unknwon
|
||||||
packet[27] = (bind_counter & 0x40) ? 0x05:0x07; // FHSS is 5 and Syncro is 7
|
packet[27] = 0x05;
|
||||||
//Unknown
|
|
||||||
packet[28] = 0x00;
|
packet[28] = 0x00;
|
||||||
memset(packet+29,0xFF,8);
|
memset(packet+29,0xFF,8);
|
||||||
//frequency hop during bind
|
//frequency hop during bind
|
||||||
@@ -57,23 +55,13 @@ static void __attribute__((unused)) KYOSHO_send_packet()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
packet[ 0] = 0x58; // normal packet
|
packet[ 0] = 0x58; // normal packet
|
||||||
//FHSS 14 channels: steering, throttle, ...
|
//14 channels: steering, throttle, ...
|
||||||
//Syncro 6 channels: steering, throttle, ...
|
for(uint8_t i = 0; i < 14; i++)
|
||||||
for(uint8_t i = 0; i < 14; i++) //needed? i < (sub_protocol==KYOSHO_FHSS?14:6); i++)
|
|
||||||
{
|
{
|
||||||
uint16_t temp = convert_channel_ppm(i);
|
uint16_t temp=convert_channel_ppm(i);
|
||||||
packet[ 9 + i*2] = temp&0xFF; // low byte of servo timing(1000-2000us)
|
packet[9 + i*2]=temp&0xFF; // low byte of servo timing(1000-2000us)
|
||||||
packet[10 + i*2] = (temp>>8)&0xFF; // high byte of servo timing(1000-2000us)
|
packet[10 + i*2]=(temp>>8)&0xFF; // high byte of servo timing(1000-2000us)
|
||||||
}
|
}
|
||||||
// if(sub_protocol==KYOSHO_SYNCRO) // needed?
|
|
||||||
// {
|
|
||||||
// memcpy(&packet[21],&hopping_frequency[11],6);
|
|
||||||
// packet[27] = 0x07;
|
|
||||||
// packet[28] = 0x00;
|
|
||||||
// memset(packet+29,0xFF,8);
|
|
||||||
// packet[34] = 0x0F;
|
|
||||||
// packet[36] = 0x0F;
|
|
||||||
// }
|
|
||||||
rf_ch_num=hopping_frequency[hopping_frequency_no];
|
rf_ch_num=hopping_frequency[hopping_frequency_no];
|
||||||
hopping_frequency_no++;
|
hopping_frequency_no++;
|
||||||
packet[34] |= (hopping_frequency_no&0x0F)<<4;
|
packet[34] |= (hopping_frequency_no&0x0F)<<4;
|
||||||
@@ -162,10 +150,10 @@ uint16_t KYOSHO_callback()
|
|||||||
telemetry_set_input_sync(packet_period);
|
telemetry_set_input_sync(packet_period);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if(sub_protocol==KYOSHO_HYPE)
|
if(sub_protocol==KYOSHO_FHSS)
|
||||||
KYOSHO_hype_send_packet();
|
|
||||||
else //FHSS && SYNCRO
|
|
||||||
KYOSHO_send_packet();
|
KYOSHO_send_packet();
|
||||||
|
else//HYPE
|
||||||
|
KYOSHO_hype_send_packet();
|
||||||
return packet_period;
|
return packet_period;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +162,7 @@ void KYOSHO_init()
|
|||||||
A7105_Init();
|
A7105_Init();
|
||||||
|
|
||||||
// compute channels from ID
|
// compute channels from ID
|
||||||
calc_fh_channels(sub_protocol==KYOSHO_HYPE?15:32);
|
calc_fh_channels(sub_protocol==KYOSHO_FHSS?32:15);
|
||||||
hopping_frequency_no=0;
|
hopping_frequency_no=0;
|
||||||
|
|
||||||
#ifdef KYOSHO_FORCE_ID_FHSS
|
#ifdef KYOSHO_FORCE_ID_FHSS
|
||||||
@@ -184,13 +172,6 @@ void KYOSHO_init()
|
|||||||
memcpy(hopping_frequency,"\x29\x4C\x67\x92\x31\x1C\x77\x18\x23\x6E\x81\x5C\x8F\x5A\x51\x94\x7A\x12\x45\x6C\x7F\x1E\x0D\x88\x63\x8C\x4F\x37\x26\x61\x2C\x8A",32);
|
memcpy(hopping_frequency,"\x29\x4C\x67\x92\x31\x1C\x77\x18\x23\x6E\x81\x5C\x8F\x5A\x51\x94\x7A\x12\x45\x6C\x7F\x1E\x0D\x88\x63\x8C\x4F\x37\x26\x61\x2C\x8A",32);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef KYOSHO_FORCE_ID_SYNCRO
|
|
||||||
if(sub_protocol==KYOSHO_FHSS)
|
|
||||||
{
|
|
||||||
memcpy(rx_tx_addr,"\x00\xC2\x24\x00",4);
|
|
||||||
memcpy(hopping_frequency,"\x73\x12\x7D\x88\x63\x4A\x8D\x60\x57\x16\x5D\x8B\x25\x53\x6E\x3C\x41\x70\x20\x83\x2A\x19\x94\x2F\x91\x4C\x47\x36\x78\x10\x5A\x31",32);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if(sub_protocol==KYOSHO_HYPE)
|
if(sub_protocol==KYOSHO_HYPE)
|
||||||
{
|
{
|
||||||
MProtocol_id &= 0x00FF00FF;
|
MProtocol_id &= 0x00FF00FF;
|
||||||
|
|||||||
@@ -92,4 +92,3 @@
|
|||||||
93,Kyosho2,KT-17
|
93,Kyosho2,KT-17
|
||||||
94,Scorpio
|
94,Scorpio
|
||||||
95,BlueFly
|
95,BlueFly
|
||||||
96,BumbleB
|
|
||||||
|
|||||||
@@ -107,7 +107,6 @@ const char STR_MOULDKG[] ="MouldKg";
|
|||||||
const char STR_XERALL[] ="Xerall";
|
const char STR_XERALL[] ="Xerall";
|
||||||
const char STR_SCORPIO[] ="Scorpio";
|
const char STR_SCORPIO[] ="Scorpio";
|
||||||
const char STR_BLUEFLY[] ="BlueFly";
|
const char STR_BLUEFLY[] ="BlueFly";
|
||||||
const char STR_BUMBLEB[] ="BumbleB";
|
|
||||||
|
|
||||||
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
|
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
|
||||||
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
|
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
|
||||||
@@ -227,9 +226,6 @@ const mm_protocol_definition multi_protocols[] = {
|
|||||||
#if defined(BLUEFLY_CCNRF_INO)
|
#if defined(BLUEFLY_CCNRF_INO)
|
||||||
{PROTO_BLUEFLY, STR_BLUEFLY, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, BLUEFLY_init, BLUEFLY_callback },
|
{PROTO_BLUEFLY, STR_BLUEFLY, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, BLUEFLY_init, BLUEFLY_callback },
|
||||||
#endif
|
#endif
|
||||||
#if defined(BUMBLEB_CCNRF_INO)
|
|
||||||
{PROTO_BUMBLEB, STR_BUMBLEB, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, BUMBLEB_init, BUMBLEB_callback },
|
|
||||||
#endif
|
|
||||||
#if defined(BUGS_A7105_INO)
|
#if defined(BUGS_A7105_INO)
|
||||||
{PROTO_BUGS, STR_BUGS, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, BUGS_init, BUGS_callback },
|
{PROTO_BUGS, STR_BUGS, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, BUGS_init, BUGS_callback },
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#define VERSION_MAJOR 1
|
#define VERSION_MAJOR 1
|
||||||
#define VERSION_MINOR 3
|
#define VERSION_MINOR 3
|
||||||
#define VERSION_REVISION 3
|
#define VERSION_REVISION 3
|
||||||
#define VERSION_PATCH_LEVEL 47
|
#define VERSION_PATCH_LEVEL 41
|
||||||
|
|
||||||
#define MODE_SERIAL 0
|
#define MODE_SERIAL 0
|
||||||
|
|
||||||
@@ -123,7 +123,6 @@ enum PROTOCOLS
|
|||||||
PROTO_KYOSHO2 = 93, // =>NRF24L01
|
PROTO_KYOSHO2 = 93, // =>NRF24L01
|
||||||
PROTO_SCORPIO = 94, // =>CYRF6936
|
PROTO_SCORPIO = 94, // =>CYRF6936
|
||||||
PROTO_BLUEFLY = 95, // =>CC2500 & NRF24L01
|
PROTO_BLUEFLY = 95, // =>CC2500 & NRF24L01
|
||||||
PROTO_BUMBLEB = 96, // =>CC2500 & NRF24L01
|
|
||||||
|
|
||||||
|
|
||||||
PROTO_NANORF = 126, // =>NRF24L01
|
PROTO_NANORF = 126, // =>NRF24L01
|
||||||
@@ -832,9 +831,8 @@ enum {
|
|||||||
#define FRSKYX2_CLONE_EEPROM_OFFSET 873 // (1) format + (3) TX ID, 4 bytes, end is 877
|
#define FRSKYX2_CLONE_EEPROM_OFFSET 873 // (1) format + (3) TX ID, 4 bytes, end is 877
|
||||||
#define DSM_RX_EEPROM_OFFSET 877 // (4) TX ID + format, 5 bytes, end is 882
|
#define DSM_RX_EEPROM_OFFSET 877 // (4) TX ID + format, 5 bytes, end is 882
|
||||||
#define MOULDKG_EEPROM_OFFSET 882 // RX ID, 3 bytes per model, end is 882+64*3=1074
|
#define MOULDKG_EEPROM_OFFSET 882 // RX ID, 3 bytes per model, end is 882+64*3=1074
|
||||||
#define DSM_CLONE_EEPROM_OFFSET 1074 // (4) TX ID, (1) Initialized, end is 1079
|
#define DSM_CLONE_EEPROM_OFFSET 1074 // (4) TX ID, (1) Initialized, end is 1079
|
||||||
#define TRAXXAS_EEPROM_OFFSET 1079 // RX ID and SOP index, 3 bytes per model id, end is 1079+192=1271
|
//#define CONFIG_EEPROM_OFFSET 1079 // Current configuration of the multimodule
|
||||||
//#define CONFIG_EEPROM_OFFSET 1271 // Current configuration of the multimodule
|
|
||||||
|
|
||||||
/* STM32 Flash Size */
|
/* STM32 Flash Size */
|
||||||
#ifndef DISABLE_FLASH_SIZE_CHECK
|
#ifndef DISABLE_FLASH_SIZE_CHECK
|
||||||
|
|||||||
@@ -20,12 +20,10 @@
|
|||||||
#include "iface_cyrf6936.h"
|
#include "iface_cyrf6936.h"
|
||||||
|
|
||||||
//#define TRAXXAS_FORCE_ID
|
//#define TRAXXAS_FORCE_ID
|
||||||
#define TRAXXAS_DEBUG
|
|
||||||
|
|
||||||
#define TRAXXAS_CHANNEL 0x0F
|
#define TRAXXAS_CHANNEL 0x05
|
||||||
#define TRAXXAS_BIND_CHANNEL 0x2B
|
#define TRAXXAS_BIND_CHANNEL 0x2B
|
||||||
#define TRAXXAS_BIND_CHECK 0x22
|
#define TRAXXAS_PACKET_SIZE 16
|
||||||
#define TRAXXAS_PACKET_SIZE 16
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TRAXXAS_BIND_PREP_RX=0,
|
TRAXXAS_BIND_PREP_RX=0,
|
||||||
@@ -35,6 +33,10 @@ enum {
|
|||||||
TRAXXAS_DATA,
|
TRAXXAS_DATA,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM TRAXXAS_sop_bind[] ={ 0x3C, 0x37, 0xCC, 0x91, 0xE2, 0xF8, 0xCC, 0x91 };
|
||||||
|
const uint8_t PROGMEM TRAXXAS_sop_data[] ={ 0xA1, 0x78, 0xDC, 0x3C, 0x9E, 0x82, 0xDC, 0x3C };
|
||||||
|
//const uint8_t PROGMEM TRAXXAS_sop_check[]={ 0x97, 0xE5, 0x14, 0x72, 0x7F, 0x1A, 0x14, 0x72 };
|
||||||
|
|
||||||
const uint8_t PROGMEM TRAXXAS_init_vals[][2] = {
|
const uint8_t PROGMEM TRAXXAS_init_vals[][2] = {
|
||||||
//Init from dump
|
//Init from dump
|
||||||
{CYRF_0B_PWR_CTRL, 0x00}, // PMU
|
{CYRF_0B_PWR_CTRL, 0x00}, // PMU
|
||||||
@@ -50,7 +52,7 @@ const uint8_t PROGMEM TRAXXAS_init_vals[][2] = {
|
|||||||
|
|
||||||
static void __attribute__((unused)) TRAXXAS_cyrf_bind_config()
|
static void __attribute__((unused)) TRAXXAS_cyrf_bind_config()
|
||||||
{
|
{
|
||||||
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[0]);
|
CYRF_PROGMEM_ConfigSOPCode(TRAXXAS_sop_bind);
|
||||||
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0x5A);
|
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0x5A);
|
||||||
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0x5A);
|
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0x5A);
|
||||||
CYRF_ConfigRFChannel(TRAXXAS_BIND_CHANNEL);
|
CYRF_ConfigRFChannel(TRAXXAS_BIND_CHANNEL);
|
||||||
@@ -58,15 +60,13 @@ static void __attribute__((unused)) TRAXXAS_cyrf_bind_config()
|
|||||||
|
|
||||||
static void __attribute__((unused)) TRAXXAS_cyrf_data_config()
|
static void __attribute__((unused)) TRAXXAS_cyrf_data_config()
|
||||||
{
|
{
|
||||||
|
CYRF_PROGMEM_ConfigSOPCode(TRAXXAS_sop_data);
|
||||||
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
||||||
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0x1B);
|
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0x1B);
|
||||||
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0x3F);
|
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0x3F);
|
||||||
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[6]);
|
|
||||||
#else
|
#else
|
||||||
uint16_t addr=TRAXXAS_EEPROM_OFFSET+RX_num*3;
|
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, cyrfmfg_id[0]+0xB6);
|
||||||
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, cyrfmfg_id[0] - eeprom_read_byte((EE_ADDR)(addr + 0)));
|
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, cyrfmfg_id[1]+0x5D);
|
||||||
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, cyrfmfg_id[1] - eeprom_read_byte((EE_ADDR)(addr + 1)));
|
|
||||||
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[eeprom_read_byte((EE_ADDR)(addr + 2)) % 20]);
|
|
||||||
#endif
|
#endif
|
||||||
CYRF_ConfigRFChannel(TRAXXAS_CHANNEL);
|
CYRF_ConfigRFChannel(TRAXXAS_CHANNEL);
|
||||||
CYRF_SetTxRxMode(TX_EN);
|
CYRF_SetTxRxMode(TX_EN);
|
||||||
@@ -76,8 +76,6 @@ static void __attribute__((unused)) TRAXXAS_send_data_packet()
|
|||||||
{
|
{
|
||||||
packet[0] = 0x01;
|
packet[0] = 0x01;
|
||||||
memset(&packet[1],0x00,TRAXXAS_PACKET_SIZE-1);
|
memset(&packet[1],0x00,TRAXXAS_PACKET_SIZE-1);
|
||||||
//Next RF channel ? 0x00 -> keep current, 0x0E change to F=15
|
|
||||||
//packet[1]
|
|
||||||
//Steering
|
//Steering
|
||||||
uint16_t ch = convert_channel_16b_nolimit(RUDDER,500,1000,false);
|
uint16_t ch = convert_channel_16b_nolimit(RUDDER,500,1000,false);
|
||||||
packet[2]=ch>>8;
|
packet[2]=ch>>8;
|
||||||
@@ -106,7 +104,6 @@ uint16_t TRAXXAS_callback()
|
|||||||
switch(phase)
|
switch(phase)
|
||||||
{
|
{
|
||||||
case TRAXXAS_BIND_PREP_RX:
|
case TRAXXAS_BIND_PREP_RX:
|
||||||
//debugln("BIND_PREP_RX");
|
|
||||||
TRAXXAS_cyrf_bind_config();
|
TRAXXAS_cyrf_bind_config();
|
||||||
CYRF_SetTxRxMode(RX_EN); //Receive mode
|
CYRF_SetTxRxMode(RX_EN); //Receive mode
|
||||||
CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); //Prepare to receive
|
CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); //Prepare to receive
|
||||||
@@ -114,43 +111,26 @@ uint16_t TRAXXAS_callback()
|
|||||||
phase=TRAXXAS_BIND_RX;
|
phase=TRAXXAS_BIND_RX;
|
||||||
return 700;
|
return 700;
|
||||||
case TRAXXAS_BIND_RX:
|
case TRAXXAS_BIND_RX:
|
||||||
//debugln("BIND_RX");
|
|
||||||
//Read data from RX
|
//Read data from RX
|
||||||
status = CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
status = CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
||||||
if((status & 0x03) == 0x02) // RXC=1, RXE=0 then 2nd check is required (debouncing)
|
if((status & 0x03) == 0x02) // RXC=1, RXE=0 then 2nd check is required (debouncing)
|
||||||
status |= CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
status |= CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
||||||
#ifdef TRAXXAS_DEBUG
|
debugln("s=%02X",status);
|
||||||
debugln("s=%02X",status);
|
|
||||||
#endif
|
|
||||||
CYRF_WriteRegister(CYRF_07_RX_IRQ_STATUS, 0x80); // need to set RXOW before data read
|
CYRF_WriteRegister(CYRF_07_RX_IRQ_STATUS, 0x80); // need to set RXOW before data read
|
||||||
if((status & 0x07) == 0x02)
|
if((status & 0x07) == 0x02)
|
||||||
{ // Data received with no errors
|
{ // Data received with no errors
|
||||||
len=CYRF_ReadRegister(CYRF_09_RX_COUNT);
|
len=CYRF_ReadRegister(CYRF_09_RX_COUNT);
|
||||||
#ifdef TRAXXAS_DEBUG
|
debugln("L=%02X",len)
|
||||||
debugln("L=%02X",len)
|
|
||||||
#endif
|
|
||||||
if(len==TRAXXAS_PACKET_SIZE)
|
if(len==TRAXXAS_PACKET_SIZE)
|
||||||
{
|
{
|
||||||
CYRF_ReadDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
CYRF_ReadDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
||||||
#ifdef TRAXXAS_DEBUG
|
debug("RX=");
|
||||||
debug("RX=");
|
for(uint8_t i=0;i<TRAXXAS_PACKET_SIZE;i++)
|
||||||
for(uint8_t i=0;i<TRAXXAS_PACKET_SIZE;i++)
|
debug(" %02X",packet[i]);
|
||||||
debug(" %02X",packet[i]);
|
debugln("");
|
||||||
debugln("");
|
|
||||||
#endif
|
|
||||||
// Store RX ID
|
|
||||||
uint16_t addr=TRAXXAS_EEPROM_OFFSET+RX_num*3;
|
|
||||||
for(uint8_t i=0;i<2;i++)
|
|
||||||
eeprom_write_byte((EE_ADDR)(addr+i),packet[i+1]);
|
|
||||||
//Store SOP index
|
|
||||||
eeprom_write_byte((EE_ADDR)(addr+2),packet[7]);
|
|
||||||
// Replace RX ID by TX ID
|
|
||||||
for(uint8_t i=0;i<6;i++)
|
for(uint8_t i=0;i<6;i++)
|
||||||
packet[i+1]=cyrfmfg_id[i];
|
packet[i+1]=cyrfmfg_id[i];
|
||||||
//packet[7 ] = 0xEE; // Not needed ??
|
packet[10]=0x01;
|
||||||
packet[8] = TRAXXAS_CHANNEL - 1;
|
|
||||||
packet[10] = 0x01; // Must change otherwise bind doesn't complete
|
|
||||||
//packet[13] = 0x05; // Not needed ??
|
|
||||||
packet_count=12;
|
packet_count=12;
|
||||||
CYRF_SetTxRxMode(TX_EN);
|
CYRF_SetTxRxMode(TX_EN);
|
||||||
phase=TRAXXAS_BIND_TX1;
|
phase=TRAXXAS_BIND_TX1;
|
||||||
@@ -169,24 +149,19 @@ uint16_t TRAXXAS_callback()
|
|||||||
}
|
}
|
||||||
return 700;
|
return 700;
|
||||||
case TRAXXAS_BIND_TX1:
|
case TRAXXAS_BIND_TX1:
|
||||||
//debugln("BIND_TX1");
|
|
||||||
CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
||||||
#ifdef TRAXXAS_DEBUG
|
debug("P=");
|
||||||
debug("P=");
|
for(uint8_t i=0;i<TRAXXAS_PACKET_SIZE;i++)
|
||||||
for(uint8_t i=0;i<TRAXXAS_PACKET_SIZE;i++)
|
debug(" %02X",packet[i]);
|
||||||
debug(" %02X",packet[i]);
|
debugln("");
|
||||||
debugln("");
|
|
||||||
#endif
|
|
||||||
if(--packet_count==0) // Switch to normal mode
|
if(--packet_count==0) // Switch to normal mode
|
||||||
phase=TRAXXAS_PREP_DATA;
|
phase=TRAXXAS_PREP_DATA;
|
||||||
break;
|
break;
|
||||||
case TRAXXAS_PREP_DATA:
|
case TRAXXAS_PREP_DATA:
|
||||||
//debugln("PREP_DATA");
|
|
||||||
BIND_DONE;
|
BIND_DONE;
|
||||||
TRAXXAS_cyrf_data_config();
|
TRAXXAS_cyrf_data_config();
|
||||||
phase++;
|
phase++;
|
||||||
case TRAXXAS_DATA:
|
case TRAXXAS_DATA:
|
||||||
//debugln("DATA");
|
|
||||||
#ifdef MULTI_SYNC
|
#ifdef MULTI_SYNC
|
||||||
telemetry_set_input_sync(13940);
|
telemetry_set_input_sync(13940);
|
||||||
#endif
|
#endif
|
||||||
@@ -204,7 +179,7 @@ void TRAXXAS_init()
|
|||||||
|
|
||||||
//Read CYRF ID
|
//Read CYRF ID
|
||||||
CYRF_GetMfgData(cyrfmfg_id);
|
CYRF_GetMfgData(cyrfmfg_id);
|
||||||
//cyrfmfg_id[0]+=RX_num; // Not needed since the TX and RX have to match
|
cyrfmfg_id[0]+=RX_num;
|
||||||
|
|
||||||
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
||||||
cyrfmfg_id[0]=0x65; // CYRF MFG ID
|
cyrfmfg_id[0]=0x65; // CYRF MFG ID
|
||||||
@@ -222,13 +197,6 @@ void TRAXXAS_init()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
phase = TRAXXAS_PREP_DATA;
|
phase = TRAXXAS_PREP_DATA;
|
||||||
|
|
||||||
//
|
|
||||||
// phase = TRAXXAS_BIND_TX1;
|
|
||||||
// TRAXXAS_cyrf_bind_config();
|
|
||||||
// CYRF_SetTxRxMode(TX_EN);
|
|
||||||
// memcpy(packet,(uint8_t *)"\x02\x4A\xA3\x2D\x1A\x49\xFE\x06\x00\x00\x02\x01\x06\x06\x00\x00",TRAXXAS_PACKET_SIZE);
|
|
||||||
// memcpy(packet,(uint8_t *)"\x02\x49\xAC\x4F\x55\x4D\xFE\x05\x00\x00\x02\x01\x06\x06\x00\x00",TRAXXAS_PACKET_SIZE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -239,15 +207,7 @@ CRC_SEED_LSB: 0x5A
|
|||||||
CRC_SEED_MSB: 0x5A
|
CRC_SEED_MSB: 0x5A
|
||||||
RX1: 0x02 0x4A 0xA3 0x2D 0x1A 0x49 0xFE 0x06 0x00 0x00 0x02 0x01 0x06 0x06 0x00 0x00
|
RX1: 0x02 0x4A 0xA3 0x2D 0x1A 0x49 0xFE 0x06 0x00 0x00 0x02 0x01 0x06 0x06 0x00 0x00
|
||||||
TX1: 0x02 0x65 0xE2 0x5E 0x55 0x4D 0xFE 0xEE 0x00 0x00 0x01 0x01 0x06 0x05 0x00 0x00
|
TX1: 0x02 0x65 0xE2 0x5E 0x55 0x4D 0xFE 0xEE 0x00 0x00 0x01 0x01 0x06 0x05 0x00 0x00
|
||||||
Notes:
|
Note: RX cyrfmfg_id is 0x4A,0xA3,0x2D,0x1A,0x49,0xFE and TX cyrfmfg_id is 0x65,0xE2,0x5E,0x55,0x4D,0xFE
|
||||||
- RX cyrfmfg_id is 0x4A,0xA3,0x2D,0x1A,0x49,0xFE and TX cyrfmfg_id is 0x65,0xE2,0x5E,0x55,0x4D,0xFE
|
|
||||||
- P[7] changes from 0x06 to 0xEE but not needed to complete the bind -> doesn't care??
|
|
||||||
- P[8..9]=0x00 unchanged??
|
|
||||||
- P[10] needs to be set to 0x01 to complete the bind -> normal packet P[0]??
|
|
||||||
- P[11] unchanged ?? -> no bind if set to 0x00 or 0x81
|
|
||||||
- P[12] unchanged ?? -> no bind if set to 0x05 or 0x86
|
|
||||||
- P[13] changes from 0x06 to 0x05 but not needed to complete the bind -> doesn't care??
|
|
||||||
- P[14..15]=0x00 unchanged??
|
|
||||||
|
|
||||||
Bind phase 2 (looks like normal mode?)
|
Bind phase 2 (looks like normal mode?)
|
||||||
CHANNEL: 0x05
|
CHANNEL: 0x05
|
||||||
@@ -271,42 +231,5 @@ SOP_CODE: 0xA1 0x78 0xDC 0x3C 0x9E 0x82 0xDC 0x3C
|
|||||||
CRC_SEED_LSB: 0x1B
|
CRC_SEED_LSB: 0x1B
|
||||||
CRC_SEED_MSB: 0x3F
|
CRC_SEED_MSB: 0x3F
|
||||||
TX3: 0x01 0x00 0x02 0xA8 0x03 0xE7 0x02 0x08 0x00 0x00 0x01 0x01 0x02 0xEE 0x00 0x00
|
TX3: 0x01 0x00 0x02 0xA8 0x03 0xE7 0x02 0x08 0x00 0x00 0x01 0x01 0x02 0xEE 0x00 0x00
|
||||||
|
|
||||||
CRC_SEED:
|
|
||||||
TX ID: \x65\xE2\x5E\x55\x4D\xFE
|
|
||||||
RX ID: \x4A\xA3\x2D\x1A\x49\xFE CRC 0x1B 0x3F => CRC: 65-4A=1B E2-A3=3F
|
|
||||||
RX ID: \x4B\xA3\x2D\x1A\x49\xFE CRC 0x1A 0x3F => CRC: 65-4B=1A E2-A3=3F
|
|
||||||
RX ID: \x00\x00\x2D\x1A\x49\xFE CRC 0x65 0xE2 => CRC: 65-00=65 E2-00=E2
|
|
||||||
RX ID: \x00\xFF\x2D\x1A\x49\xFE CRC 0x65 0xE3 => CRC: 65-00=65 E2-FF=E3
|
|
||||||
RX ID: \xFF\x00\x2D\x1A\x49\xFE CRC 0x66 0xE2 => CRC: 65-FF=66 E2-00=E2
|
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
RX1: 02 4A A3 2D 1A 49 FE 06 00 00 02 01 06 06 00 00
|
|
||||||
SOP: A1 78 DC 3C 9E 82 DC 3C
|
|
||||||
RX2: 02 49 AC 4F 55 4D FE 05 00 00 02 01 06 06 00 00
|
|
||||||
SOP: 5A CC AE 46 B6 31 AE 46
|
|
||||||
RX3: 02 CA F3 62 55 4D FE 03 00 00 02 01 06 06 00 00
|
|
||||||
SOP: 66 CD 7C 50 DD 26 7C 50
|
|
||||||
|
|
||||||
Dump of SOP Codes:
|
|
||||||
00: 3C 37 CC 91 E2 F8 CC 91 => bind
|
|
||||||
01: 9B C5 A1 0F AD 39 A2 0F
|
|
||||||
02: EF 64 B0 2A D2 8F B1 2A
|
|
||||||
03: 66 CD 7C 50 DD 26 7C 50
|
|
||||||
04: 5C E1 F6 44 AD 16 F6 44
|
|
||||||
05: 5A CC AE 46 B6 31 AE 46
|
|
||||||
06: A1 78 DC 3C 9E 82 DC 3C
|
|
||||||
07: B9 8E 19 74 6F 65 18 74
|
|
||||||
08: DF B1 C0 49 62 DF C1 49
|
|
||||||
09: 97 E5 14 72 7F 1A 14 72 => check
|
|
||||||
10: 82 C7 90 36 21 03 FF 17
|
|
||||||
11: E2 F8 CC 91 3C 37 CC 91 => bind 4 bytes group swapped
|
|
||||||
12: AD 39 A2 0F 9B C5 A1 0F => 01 4 bytes group swapped
|
|
||||||
13: D2 8F B1 2A EF 64 B0 2A => 02 4 bytes group swapped
|
|
||||||
14: DD 26 7C 50 66 CD 7C 50 => 03 4 bytes group swapped
|
|
||||||
...
|
|
||||||
19: 62 DF C1 49 DF B1 C0 49 => 08 4 bytes group swapped
|
|
||||||
20: 00 00 00 33 DE AD BA BE ??over??
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
// flags going to packet[2]
|
// flags going to packet[2]
|
||||||
#define V911S_FLAG_CALIB 0x01
|
#define V911S_FLAG_CALIB 0x01
|
||||||
#define A220_FLAG_6G3D 0x04
|
#define A220_FLAG_6G3D 0x04
|
||||||
#define A280_FLAG_6GSENIOR 0x08
|
|
||||||
#define A280_FLAG_LIGHT 0x20
|
|
||||||
|
|
||||||
static void __attribute__((unused)) V911S_send_packet()
|
static void __attribute__((unused)) V911S_send_packet()
|
||||||
{
|
{
|
||||||
@@ -76,9 +74,7 @@ static void __attribute__((unused)) V911S_send_packet()
|
|||||||
{
|
{
|
||||||
packet[ 1]=GET_FLAG(!CH6_SW,E119_FLAG_EXPERT) // short press on left button
|
packet[ 1]=GET_FLAG(!CH6_SW,E119_FLAG_EXPERT) // short press on left button
|
||||||
|GET_FLAG( CH5_SW,E119_FLAG_CALIB); // short press on right button
|
|GET_FLAG( CH5_SW,E119_FLAG_CALIB); // short press on right button
|
||||||
packet[ 2]=GET_FLAG( CH7_SW,A220_FLAG_6G3D) // short press on right button
|
packet[ 2]=GET_FLAG( CH7_SW,A220_FLAG_6G3D); // short press on right button
|
||||||
|GET_FLAG( CH8_SW,A280_FLAG_6GSENIOR) // -100% - 6G, +100% - Senior mode (turn off gyro)
|
|
||||||
|GET_FLAG( CH9_SW,A280_FLAG_LIGHT); // cycle the light through on-flash-off when the CH9 value is changed from -100% to 100%
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//packet[3..6]=trims TAER signed
|
//packet[3..6]=trims TAER signed
|
||||||
|
|||||||
@@ -341,7 +341,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#if ( not defined(CC2500_INSTALLED) && not defined(NRF24L01_INSTALLED) ) || defined MULTI_EU
|
#if ( not defined(CC2500_INSTALLED) && not defined(NRF24L01_INSTALLED) ) || defined MULTI_EU
|
||||||
#undef BLUEFLY_CCNRF_INO
|
#undef BLUEFLY_CCNRF_INO
|
||||||
#undef BUMBLEB_CCNRF_INO
|
|
||||||
#undef GD00X_CCNRF_INO
|
#undef GD00X_CCNRF_INO
|
||||||
#undef KF606_CCNRF_INO
|
#undef KF606_CCNRF_INO
|
||||||
#undef MJXQ_CCNRF_INO
|
#undef MJXQ_CCNRF_INO
|
||||||
|
|||||||
@@ -255,6 +255,7 @@
|
|||||||
#define ZSX_NRF24L01_INO
|
#define ZSX_NRF24L01_INO
|
||||||
|
|
||||||
//The protocols below need either a CC2500 or NRF24L01 to be installed
|
//The protocols below need either a CC2500 or NRF24L01 to be installed
|
||||||
|
#define BLUEFLY_CCNRF_INO
|
||||||
#define GD00X_CCNRF_INO
|
#define GD00X_CCNRF_INO
|
||||||
#define KF606_CCNRF_INO
|
#define KF606_CCNRF_INO
|
||||||
#define MJXQ_CCNRF_INO
|
#define MJXQ_CCNRF_INO
|
||||||
|
|||||||
@@ -326,9 +326,7 @@ CH1|CH2|CH3|CH4
|
|||||||
## Kyosho - *73*
|
## Kyosho - *73*
|
||||||
|
|
||||||
### Sub_protocol FHSS - *0*
|
### Sub_protocol FHSS - *0*
|
||||||
Surface protocol called FHSS introduced in 2017. Transmitter: KT-531P. Models: Mini-Z.
|
Surface protocol called FHSS introduced in 2017. Transmitter: KT-531P. Models: Mini-Z
|
||||||
|
|
||||||
Surface protocol called Syncro. TX: KT-331, RX: KR-331
|
|
||||||
|
|
||||||
Extended limits supported
|
Extended limits supported
|
||||||
|
|
||||||
@@ -1392,11 +1390,9 @@ Models: WLtoys V911S, XK A110
|
|||||||
### Sub_protocol E119 - *1*
|
### Sub_protocol E119 - *1*
|
||||||
Models: Eachine E119, JJRC W01-J3, XK A220 P-40, XK A800 R2, F959S R2, A160 R2, A280
|
Models: Eachine E119, JJRC W01-J3, XK A220 P-40, XK A800 R2, F959S R2, A160 R2, A280
|
||||||
|
|
||||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||||
---|---|---|---|---|---|---|---|---
|
---|---|---|---|---|---|---
|
||||||
A|E|T|R|CALIB|RATE|6G_3D|6GSENIOR|LIGHT
|
A|E|T|R|CALIB|RATE|6G_3D
|
||||||
|
|
||||||
A280 -> 6GSENIOR: -100% - 6G, +100% - Senior mode (turn off gyro), LIGHT: cycle the light through on-flash-off when the CH9 value is changed from -100% to 100%
|
|
||||||
|
|
||||||
## XK - *62*
|
## XK - *62*
|
||||||
|
|
||||||
@@ -1444,13 +1440,13 @@ Channels 14 and 15 (ANAAUX1 and ANAAUX2) only available with analog aux channel
|
|||||||
### Sub_protocol BAYANG - *0*
|
### Sub_protocol BAYANG - *0*
|
||||||
Models: Eachine H8(C) mini, BayangToys X6/X7/X9, JJRC JJ850, Floureon H101 ...
|
Models: Eachine H8(C) mini, BayangToys X6/X7/X9, JJRC JJ850, Floureon H101 ...
|
||||||
|
|
||||||
Option=0 or Telemetry = Off -> normal Bayang protocol
|
Option=0 -> normal Bayang protocol
|
||||||
|
|
||||||
Option=1 or Telemetry = On -> enable telemetry with [Silverxxx firmware](https://github.com/silver13/H101-acro/tree/master). Value returned to the TX using FrSkyD Hub are RX RSSI, TX RSSI, A1=uncompensated battery voltage (set the ratio to 5.0 and adjust with offset), A2=compensated battery voltage (set the ratio to 5.0 and adjust with offset) and if supported AccX=P, AccY=I, ACCZ=D (which you can rename after the sensors discovery)
|
Option=1 -> enable telemetry with [Silverxxx firmware](https://github.com/silver13/H101-acro/tree/master). Value returned to the TX using FrSkyD Hub are RX RSSI, TX RSSI, A1=uncompensated battery voltage (set the ratio to 5.0 and adjust with offset), A2=compensated battery voltage (set the ratio to 5.0 and adjust with offset) and if supported AccX=P, AccY=I, ACCZ=D (which you can rename after the sensors discovery)
|
||||||
|
|
||||||
Option=2 or Telemetry = Off+AUX -> enable analog aux channels with [NFE Silverware firmware](https://github.com/NotFastEnuf/NFE_Silverware). Two otherwise static bytes in the protocol overridden to add two 'analog' (non-binary) auxiliary channels.
|
Option=2 -> enable analog aux channels with [NFE Silverware firmware](https://github.com/NotFastEnuf/NFE_Silverware). Two otherwise static bytes in the protocol overridden to add two 'analog' (non-binary) auxiliary channels.
|
||||||
|
|
||||||
Option=3 or Telemetry = On+AUX-> both Silverware telemetry and analog aux channels enabled.
|
Option=3 -> both Silverware telemetry and analog aux channels enabled.
|
||||||
|
|
||||||
### Sub_protocol H8S3D - *1*
|
### Sub_protocol H8S3D - *1*
|
||||||
Model: H8S 3D
|
Model: H8S 3D
|
||||||
@@ -1997,7 +1993,7 @@ AUTO: Land=-100% Takeoff=+100%
|
|||||||
The model can work with a none centered throttle.
|
The model can work with a none centered throttle.
|
||||||
|
|
||||||
## Tiger - *61*
|
## Tiger - *61*
|
||||||
Models: Tiger Drone 1400782, WLToys 124016 / 124017 / 144010 and Eachine EAT14
|
Models: WLToys 124016, 124017, 144010 and Eachine EAT14
|
||||||
|
|
||||||
Autobind protocol
|
Autobind protocol
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user