mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-09 22:38:10 +00:00
Traxxas TQ 1st gen: try 1
This commit is contained in:
parent
9d383432a5
commit
63dfa316e8
@ -148,7 +148,7 @@ const char STR_SUBTYPE_H83D[] = "\x07""Std\0 ""H20H\0 ""H20Mini""H30Min
|
|||||||
const char STR_SUBTYPE_CORONA[] = "\x05""V1\0 ""V2\0 ""FD V3";
|
const char STR_SUBTYPE_CORONA[] = "\x05""V1\0 ""V2\0 ""FD V3";
|
||||||
const char STR_SUBTYPE_HITEC[] = "\x07""Optima\0""Opt Hub""Minima\0";
|
const char STR_SUBTYPE_HITEC[] = "\x07""Optima\0""Opt Hub""Minima\0";
|
||||||
const char STR_SUBTYPE_BUGS_MINI[] = "\x06""Std\0 ""Bugs3H";
|
const char STR_SUBTYPE_BUGS_MINI[] = "\x06""Std\0 ""Bugs3H";
|
||||||
const char STR_SUBTYPE_TRAXXAS[] = "\x02""TQ";
|
const char STR_SUBTYPE_TRAXXAS[] = "\x03""TQ2""TQ1";
|
||||||
const char STR_SUBTYPE_E01X[] = "\x05""E012\0""E015\0";
|
const char STR_SUBTYPE_E01X[] = "\x05""E012\0""E015\0";
|
||||||
const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
|
const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
|
||||||
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
|
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
|
||||||
@ -468,7 +468,7 @@ const mm_protocol_definition multi_protocols[] = {
|
|||||||
{PROTO_SYMAX, STR_SYMAX, STR_SUBTYPE_SYMAX, 2, OPTION_NONE, 0, 0, SW_NRF, SYMAX_init, SYMAX_callback },
|
{PROTO_SYMAX, STR_SYMAX, STR_SUBTYPE_SYMAX, 2, OPTION_NONE, 0, 0, SW_NRF, SYMAX_init, SYMAX_callback },
|
||||||
#endif
|
#endif
|
||||||
#if defined(TRAXXAS_CYRF6936_INO)
|
#if defined(TRAXXAS_CYRF6936_INO)
|
||||||
{PROTO_TRAXXAS, STR_TRAXXAS, STR_SUBTYPE_TRAXXAS, 1, OPTION_NONE, 0, 0, SW_CYRF, TRAXXAS_init, TRAXXAS_callback },
|
{PROTO_TRAXXAS, STR_TRAXXAS, STR_SUBTYPE_TRAXXAS, 2, OPTION_NONE, 0, 0, SW_CYRF, TRAXXAS_init, TRAXXAS_callback },
|
||||||
#endif
|
#endif
|
||||||
#if defined(V2X2_NRF24L01_INO)
|
#if defined(V2X2_NRF24L01_INO)
|
||||||
{PROTO_V2X2, STR_V2X2, STR_SUBTYPE_V2X2, 3, OPTION_NONE, 0, 0, SW_NRF, V2X2_init, V2X2_callback },
|
{PROTO_V2X2, STR_V2X2, STR_SUBTYPE_V2X2, 3, OPTION_NONE, 0, 0, SW_NRF, V2X2_init, V2X2_callback },
|
||||||
|
@ -363,7 +363,8 @@ enum REDPINE
|
|||||||
};
|
};
|
||||||
enum TRAXXAS
|
enum TRAXXAS
|
||||||
{
|
{
|
||||||
TRAXXAS_TQ = 0,
|
TRAXXAS_TQ2 = 0,
|
||||||
|
TRAXXAS_TQ1 = 1,
|
||||||
};
|
};
|
||||||
enum ESKY150
|
enum ESKY150
|
||||||
{
|
{
|
||||||
|
@ -19,12 +19,16 @@
|
|||||||
|
|
||||||
#include "iface_cyrf6936.h"
|
#include "iface_cyrf6936.h"
|
||||||
|
|
||||||
//#define TRAXXAS_FORCE_ID
|
#define TRAXXAS_TQ1_FORCE_ID
|
||||||
|
//#define TRAXXAS_TQ2_FORCE_ID
|
||||||
//#define TRAXXAS_DEBUG
|
//#define TRAXXAS_DEBUG
|
||||||
|
|
||||||
#define TRAXXAS_BIND_CHANNEL 0x2B
|
#define TRAXXAS_BIND_CHANNEL 0x2B
|
||||||
#define TRAXXAS_CHECK_CHANNEL 0x22
|
#define TRAXXAS_CHECK_CHANNEL 0x22
|
||||||
#define TRAXXAS_PACKET_SIZE 16
|
#define TRAXXAS_PACKET_SIZE 16
|
||||||
|
|
||||||
|
#define TRAXXAS_TQ1_BIND_CHANNEL 0x04
|
||||||
|
#define TRAXXAS_TQ1_CHECK_CHANNEL 0x34
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TRAXXAS_BIND_PREP_RX=0,
|
TRAXXAS_BIND_PREP_RX=0,
|
||||||
@ -34,6 +38,9 @@ enum {
|
|||||||
TRAXXAS_RX,
|
TRAXXAS_RX,
|
||||||
TRAXXAS_PREP_DATA,
|
TRAXXAS_PREP_DATA,
|
||||||
TRAXXAS_DATA,
|
TRAXXAS_DATA,
|
||||||
|
TRAXXAS_TQ1_BIND,
|
||||||
|
TRAXXAS_TQ1_DATA1,
|
||||||
|
TRAXXAS_TQ1_DATA2,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM TRAXXAS_init_vals[][2] = {
|
const uint8_t PROGMEM TRAXXAS_init_vals[][2] = {
|
||||||
@ -98,7 +105,46 @@ static void __attribute__((unused)) TRAXXAS_send_data_packet()
|
|||||||
}
|
}
|
||||||
|
|
||||||
CYRF_SetPower(0x08);
|
CYRF_SetPower(0x08);
|
||||||
CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
CYRF_WriteDataPacket(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __attribute__((unused)) TRAXXAS_TQ1_send_data_packet()
|
||||||
|
{
|
||||||
|
memcpy(&packet[1], cyrfmfg_id, 4);
|
||||||
|
if(IS_BIND_IN_PROGRESS)
|
||||||
|
{
|
||||||
|
packet_length = 8;
|
||||||
|
packet[0] = 0x2A; // Bind packet
|
||||||
|
packet[5] = 0xA0; // Bind phase 0
|
||||||
|
packet[6] = TRAXXAS_BIND_CHANNEL-1; // Not sure...
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
packet[0] = 0x02; // Normal packet
|
||||||
|
packet[5] = 0xA2; // Bind phase 2 = completed?
|
||||||
|
//4 channels
|
||||||
|
uint16_t ch;
|
||||||
|
for(uint8_t i=0; i<4; i++)
|
||||||
|
{
|
||||||
|
ch = convert_channel_ppm(i);
|
||||||
|
packet[6+i*2]=ch;
|
||||||
|
packet[7+i*2]=ch>>8;
|
||||||
|
}
|
||||||
|
packet[14] = hopping_frequency[0]-1; // Not sure...
|
||||||
|
}
|
||||||
|
uint8_t xor_value=0;
|
||||||
|
for(uint8_t i=0; i<packet_length-1; i++)
|
||||||
|
xor_value ^= packet[i];
|
||||||
|
packet[packet_length-1] = xor_value;
|
||||||
|
|
||||||
|
CYRF_SetPower(0x08);
|
||||||
|
CYRF_WriteDataPacketLen(packet, packet_length);
|
||||||
|
#ifdef TRAXXAS_DEBUG
|
||||||
|
debug("P:");
|
||||||
|
for(uint8_t i=0; i<packet_length; i++)
|
||||||
|
debug(" %02X",packet[i]);
|
||||||
|
debugln("");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t TRAXXAS_callback()
|
uint16_t TRAXXAS_callback()
|
||||||
@ -107,6 +153,7 @@ uint16_t TRAXXAS_callback()
|
|||||||
|
|
||||||
switch(phase)
|
switch(phase)
|
||||||
{
|
{
|
||||||
|
//TQ2
|
||||||
case TRAXXAS_BIND_PREP_RX:
|
case TRAXXAS_BIND_PREP_RX:
|
||||||
case TRAXXAS_PREP_RX:
|
case TRAXXAS_PREP_RX:
|
||||||
//debugln("PREP_RX");
|
//debugln("PREP_RX");
|
||||||
@ -221,6 +268,35 @@ uint16_t TRAXXAS_callback()
|
|||||||
TRAXXAS_send_data_packet();
|
TRAXXAS_send_data_packet();
|
||||||
phase = TRAXXAS_PREP_RX;
|
phase = TRAXXAS_PREP_RX;
|
||||||
return 1000;
|
return 1000;
|
||||||
|
//TQ1
|
||||||
|
case TRAXXAS_TQ1_BIND:
|
||||||
|
if(bind_counter)
|
||||||
|
{
|
||||||
|
CYRF_ConfigRFChannel(TRAXXAS_TQ1_BIND_CHANNEL);
|
||||||
|
TRAXXAS_TQ1_send_data_packet();
|
||||||
|
bind_counter--;
|
||||||
|
if(bind_counter == 0)
|
||||||
|
{
|
||||||
|
BIND_DONE;
|
||||||
|
phase++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 10000;
|
||||||
|
case TRAXXAS_TQ1_DATA1:
|
||||||
|
//debugln_time("DATA1");
|
||||||
|
#ifdef MULTI_SYNC
|
||||||
|
telemetry_set_input_sync(20000);
|
||||||
|
#endif
|
||||||
|
CYRF_ConfigRFChannel(TRAXXAS_TQ1_CHECK_CHANNEL);
|
||||||
|
TRAXXAS_TQ1_send_data_packet();
|
||||||
|
phase++;
|
||||||
|
return 7000;
|
||||||
|
case TRAXXAS_TQ1_DATA2:
|
||||||
|
//debugln_time("DATA2");
|
||||||
|
CYRF_ConfigRFChannel(hopping_frequency[0]);
|
||||||
|
TRAXXAS_TQ1_send_data_packet();
|
||||||
|
phase = TRAXXAS_TQ1_DATA1;
|
||||||
|
return 13000;
|
||||||
}
|
}
|
||||||
return 10000;
|
return 10000;
|
||||||
}
|
}
|
||||||
@ -233,30 +309,60 @@ 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
|
//Find a free channel
|
||||||
CYRF_FindBestChannels(hopping_frequency,1,1,0x02,0x21, FIND_CHANNEL_ANY);
|
if(sub_protocol == TRAXXAS_TQ1)
|
||||||
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
{
|
||||||
cyrfmfg_id[0]=0x65; // CYRF MFG ID
|
cyrfmfg_id[3]+=RX_num; // Not needed for TQ2 since the TX and RX have to match
|
||||||
cyrfmfg_id[1]=0xE2;
|
CYRF_FindBestChannels(hopping_frequency,1,1,0x0B,0x30, FIND_CHANNEL_ANY); // Complete guess
|
||||||
cyrfmfg_id[2]=0x5E;
|
}
|
||||||
cyrfmfg_id[3]=0x55;
|
else //TRAXXAS_TQ2
|
||||||
cyrfmfg_id[4]=0x4D;
|
CYRF_FindBestChannels(hopping_frequency,1,1,0x02,0x21, FIND_CHANNEL_ANY);
|
||||||
cyrfmfg_id[5]=0xFE;
|
|
||||||
hopping_frequency[0] = 0x05; // seen 05 and 0F
|
#ifdef TRAXXAS_TQ1_FORCE_ID // data taken from TX dump
|
||||||
|
if(sub_protocol == TRAXXAS_TQ1)
|
||||||
|
{
|
||||||
|
cyrfmfg_id[0]=0xD8; // CYRF MFG ID
|
||||||
|
cyrfmfg_id[1]=0xAA;
|
||||||
|
cyrfmfg_id[2]=0x59;
|
||||||
|
cyrfmfg_id[3]=0xE6;
|
||||||
|
//cyrfmfg_id[4]=0x44; // Unused
|
||||||
|
//cyrfmfg_id[5]=0xFB; // Unused
|
||||||
|
hopping_frequency[0] = 0x0B;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef TRAXXAS_TQ2_FORCE_ID // data taken from TX dump
|
||||||
|
if(sub_protocol == TRAXXAS_TQ2)
|
||||||
|
{
|
||||||
|
cyrfmfg_id[0]=0x65; // CYRF MFG ID
|
||||||
|
cyrfmfg_id[1]=0xE2;
|
||||||
|
cyrfmfg_id[2]=0x5E;
|
||||||
|
cyrfmfg_id[3]=0x55;
|
||||||
|
cyrfmfg_id[4]=0x4D;
|
||||||
|
cyrfmfg_id[5]=0xFE;
|
||||||
|
hopping_frequency[0] = 0x05; // seen 05 and 0F
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef TRAXXAS_DEBUG
|
#ifdef TRAXXAS_DEBUG
|
||||||
debugln("ID: %02X %02X %02X %02X %02X %02X",cyrfmfg_id[0],cyrfmfg_id[1],cyrfmfg_id[2],cyrfmfg_id[3],cyrfmfg_id[4],cyrfmfg_id[5]);
|
debugln("ID: %02X %02X %02X %02X %02X %02X",cyrfmfg_id[0],cyrfmfg_id[1],cyrfmfg_id[2],cyrfmfg_id[3],cyrfmfg_id[4],cyrfmfg_id[5]);
|
||||||
debugln("RF CH: %02X",hopping_frequency[0]);
|
debugln("RF CH: %02X",hopping_frequency[0]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(IS_BIND_IN_PROGRESS)
|
bind_counter=100;
|
||||||
|
if(sub_protocol == TRAXXAS_TQ1)
|
||||||
{
|
{
|
||||||
bind_counter=100;
|
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[0]);
|
||||||
phase = TRAXXAS_BIND_PREP_RX;
|
if(IS_BIND_IN_PROGRESS)
|
||||||
|
phase = TRAXXAS_TQ1_BIND;
|
||||||
|
else
|
||||||
|
phase = TRAXXAS_TQ1_DATA1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
phase = TRAXXAS_PREP_DATA;
|
{//TRAXXAS_TQ2
|
||||||
|
if(IS_BIND_IN_PROGRESS)
|
||||||
|
phase = TRAXXAS_BIND_PREP_RX;
|
||||||
|
else
|
||||||
|
phase = TRAXXAS_PREP_DATA;
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// phase = TRAXXAS_BIND_TX1;
|
// phase = TRAXXAS_BIND_TX1;
|
||||||
// TRAXXAS_cyrf_bind_config();
|
// TRAXXAS_cyrf_bind_config();
|
||||||
@ -266,6 +372,8 @@ void TRAXXAS_init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Traxxas TQ 2nd generation
|
||||||
|
-------------------------
|
||||||
Packets 0x02: Bind learn TX/RX addresses
|
Packets 0x02: Bind learn TX/RX addresses
|
||||||
CHANNEL: 0x2B
|
CHANNEL: 0x2B
|
||||||
SOP_CODE: 0x3C 0x37 0xCC 0x91 0xE2 0xF8 0xCC 0x91
|
SOP_CODE: 0x3C 0x37 0xCC 0x91 0xE2 0xF8 0xCC 0x91
|
||||||
@ -310,8 +418,8 @@ 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\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: \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
|
RX ID: \xFF\x00\x2D\x1A\x49\xFE CRC 0x66 0xE2 => CRC: 65-FF=66 E2-00=E2
|
||||||
*/
|
|
||||||
/*
|
SOP Codes:
|
||||||
RX1: 02 4A A3 2D 1A 49 FE 06 00 00 02 01 06 06 00 00
|
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
|
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
|
RX2: 02 49 AC 4F 55 4D FE 05 00 00 02 01 06 06 00 00
|
||||||
@ -340,4 +448,9 @@ Dump of SOP Codes:
|
|||||||
20: 00 00 00 33 DE AD BA BE ??over??
|
20: 00 00 00 33 DE AD BA BE ??over??
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Traxxas TQ 1st generation
|
||||||
|
-------------------------
|
||||||
|
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/issues/967#issuecomment-2079038576
|
||||||
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user