2019-08-06 17:27:42 +02:00
|
|
|
/*
|
|
|
|
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/>.
|
|
|
|
|
|
|
|
Works with Traxxas 6519 receivers https://traxxas.com/sites/default/files/24CompGuide-2016.jpg .
|
|
|
|
*/
|
|
|
|
|
|
|
|
#if defined(TRAXXAS_CYRF6936_INO)
|
|
|
|
|
|
|
|
#include "iface_cyrf6936.h"
|
|
|
|
|
|
|
|
//#define TRAXXAS_FORCE_ID
|
2024-02-19 21:53:54 +01:00
|
|
|
//#define TRAXXAS_DEBUG
|
2019-08-06 17:27:42 +02:00
|
|
|
|
2024-01-29 18:59:24 +01:00
|
|
|
#define TRAXXAS_BIND_CHANNEL 0x2B
|
2024-02-17 11:03:37 +01:00
|
|
|
#define TRAXXAS_CHECK_CHANNEL 0x22
|
2024-01-29 18:59:24 +01:00
|
|
|
#define TRAXXAS_PACKET_SIZE 16
|
2019-08-06 17:27:42 +02:00
|
|
|
|
|
|
|
enum {
|
|
|
|
TRAXXAS_BIND_PREP_RX=0,
|
|
|
|
TRAXXAS_BIND_RX,
|
|
|
|
TRAXXAS_BIND_TX1,
|
2024-02-17 11:03:37 +01:00
|
|
|
TRAXXAS_PREP_RX,
|
|
|
|
TRAXXAS_RX,
|
2019-08-06 17:27:42 +02:00
|
|
|
TRAXXAS_PREP_DATA,
|
|
|
|
TRAXXAS_DATA,
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint8_t PROGMEM TRAXXAS_init_vals[][2] = {
|
|
|
|
//Init from dump
|
|
|
|
{CYRF_0B_PWR_CTRL, 0x00}, // PMU
|
|
|
|
{CYRF_32_AUTO_CAL_TIME, 0x3C}, // Default init value
|
|
|
|
{CYRF_35_AUTOCAL_OFFSET, 0x14}, // Default init value
|
|
|
|
{CYRF_1B_TX_OFFSET_LSB, 0x55}, // Default init value
|
|
|
|
{CYRF_1C_TX_OFFSET_MSB, 0x05}, // Default init value
|
|
|
|
{CYRF_28_CLK_EN, 0x02}, // Force Receive Clock Enable
|
|
|
|
{CYRF_06_RX_CFG, 0x88 | 0x02}, // AGC enabled, Fast Turn Mode enabled, adding overwrite enable to not lockup RX
|
|
|
|
{CYRF_1E_RX_OVERRIDE, 0x08}, // Reject packets with 0 seed
|
|
|
|
{CYRF_03_TX_CFG, 0x08 | CYRF_BIND_POWER}, // 8DR Mode, 32 chip codes
|
|
|
|
};
|
|
|
|
|
|
|
|
static void __attribute__((unused)) TRAXXAS_cyrf_bind_config()
|
|
|
|
{
|
2024-01-29 18:59:24 +01:00
|
|
|
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[0]);
|
2019-08-06 17:27:42 +02:00
|
|
|
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0x5A);
|
|
|
|
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0x5A);
|
|
|
|
CYRF_ConfigRFChannel(TRAXXAS_BIND_CHANNEL);
|
|
|
|
}
|
|
|
|
|
2024-02-17 11:03:37 +01:00
|
|
|
static void __attribute__((unused)) TRAXXAS_cyrf_check_config()
|
|
|
|
{
|
2024-02-19 21:53:54 +01:00
|
|
|
CYRF_ConfigRFChannel(TRAXXAS_CHECK_CHANNEL);
|
2024-02-17 11:03:37 +01:00
|
|
|
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[9]);
|
|
|
|
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0xA5);
|
|
|
|
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0xA5);
|
|
|
|
}
|
|
|
|
|
2019-08-06 17:27:42 +02:00
|
|
|
static void __attribute__((unused)) TRAXXAS_cyrf_data_config()
|
|
|
|
{
|
2024-02-19 21:53:54 +01:00
|
|
|
CYRF_ConfigRFChannel(hopping_frequency[0]);
|
2019-08-06 17:27:42 +02:00
|
|
|
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
|
|
|
CYRF_WriteRegister(CYRF_15_CRC_SEED_LSB, 0x1B);
|
|
|
|
CYRF_WriteRegister(CYRF_16_CRC_SEED_MSB, 0x3F);
|
2024-01-29 18:59:24 +01:00
|
|
|
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[6]);
|
2019-08-06 17:27:42 +02:00
|
|
|
#else
|
2024-01-29 18:59:24 +01:00
|
|
|
uint16_t addr=TRAXXAS_EEPROM_OFFSET+RX_num*3;
|
2023-12-22 21:02:10 +01:00
|
|
|
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] - eeprom_read_byte((EE_ADDR)(addr + 1)));
|
2024-01-29 18:59:24 +01:00
|
|
|
CYRF_PROGMEM_ConfigSOPCode(DEVO_j6pro_sopcodes[eeprom_read_byte((EE_ADDR)(addr + 2)) % 20]);
|
2019-08-06 17:27:42 +02:00
|
|
|
#endif
|
|
|
|
CYRF_SetTxRxMode(TX_EN);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void __attribute__((unused)) TRAXXAS_send_data_packet()
|
|
|
|
{
|
|
|
|
packet[0] = 0x01;
|
|
|
|
memset(&packet[1],0x00,TRAXXAS_PACKET_SIZE-1);
|
2023-12-24 15:05:13 +01:00
|
|
|
//Next RF channel ? 0x00 -> keep current, 0x0E change to F=15
|
2024-02-19 21:53:54 +01:00
|
|
|
//packet[1] = hopping_frequency[0] - 1;
|
2019-08-06 17:27:42 +02:00
|
|
|
//Steering
|
2020-12-16 16:14:45 +01:00
|
|
|
uint16_t ch = convert_channel_16b_nolimit(RUDDER,500,1000,false);
|
2019-08-06 17:27:42 +02:00
|
|
|
packet[2]=ch>>8;
|
|
|
|
packet[3]=ch;
|
|
|
|
//Throttle
|
2020-12-16 16:14:45 +01:00
|
|
|
ch = convert_channel_16b_nolimit(THROTTLE,500,1000,false);
|
2019-08-06 17:27:42 +02:00
|
|
|
packet[4]=ch>>8;
|
|
|
|
packet[5]=ch;
|
|
|
|
//AUX3
|
2020-12-16 16:14:45 +01:00
|
|
|
ch = convert_channel_16b_nolimit(AILERON,500,1000,false);
|
2019-08-06 17:27:42 +02:00
|
|
|
packet[6]=ch>>8;
|
|
|
|
packet[7]=ch;
|
|
|
|
//AUX4???
|
2020-12-16 16:14:45 +01:00
|
|
|
ch = convert_channel_16b_nolimit(ELEVATOR,500,1000,false);
|
2019-08-06 17:27:42 +02:00
|
|
|
packet[12]=ch>>8;
|
|
|
|
packet[13]=ch;
|
|
|
|
|
|
|
|
CYRF_SetPower(0x08);
|
|
|
|
CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
|
|
|
}
|
|
|
|
|
2021-02-09 18:23:33 +01:00
|
|
|
uint16_t TRAXXAS_callback()
|
2019-08-06 17:27:42 +02:00
|
|
|
{
|
|
|
|
uint8_t status;
|
|
|
|
|
|
|
|
switch(phase)
|
|
|
|
{
|
|
|
|
case TRAXXAS_BIND_PREP_RX:
|
2024-02-17 11:03:37 +01:00
|
|
|
case TRAXXAS_PREP_RX:
|
|
|
|
//debugln("PREP_RX");
|
|
|
|
if(phase == TRAXXAS_BIND_PREP_RX)
|
|
|
|
TRAXXAS_cyrf_bind_config();
|
|
|
|
else
|
|
|
|
TRAXXAS_cyrf_check_config();
|
2019-08-06 17:27:42 +02:00
|
|
|
CYRF_SetTxRxMode(RX_EN); //Receive mode
|
|
|
|
CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x83); //Prepare to receive
|
|
|
|
packet_count=100; //Timeout for RX
|
2024-02-17 11:03:37 +01:00
|
|
|
phase++; // TRAXXAS_BIND_RX or TRAXXAS_RX
|
|
|
|
return 7000;
|
2019-08-06 17:27:42 +02:00
|
|
|
case TRAXXAS_BIND_RX:
|
2024-02-17 11:03:37 +01:00
|
|
|
case TRAXXAS_RX:
|
|
|
|
//debugln("RX");
|
2019-08-06 17:27:42 +02:00
|
|
|
//Read data from RX
|
|
|
|
status = CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
|
|
|
if((status & 0x03) == 0x02) // RXC=1, RXE=0 then 2nd check is required (debouncing)
|
|
|
|
status |= CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
2023-12-22 21:02:10 +01:00
|
|
|
#ifdef TRAXXAS_DEBUG
|
2024-02-19 21:53:54 +01:00
|
|
|
//debugln("s=%02X",status);
|
2023-12-22 21:02:10 +01:00
|
|
|
#endif
|
2019-08-06 17:27:42 +02:00
|
|
|
CYRF_WriteRegister(CYRF_07_RX_IRQ_STATUS, 0x80); // need to set RXOW before data read
|
|
|
|
if((status & 0x07) == 0x02)
|
|
|
|
{ // Data received with no errors
|
|
|
|
len=CYRF_ReadRegister(CYRF_09_RX_COUNT);
|
2023-12-22 21:02:10 +01:00
|
|
|
#ifdef TRAXXAS_DEBUG
|
|
|
|
debugln("L=%02X",len)
|
|
|
|
#endif
|
2019-08-06 17:27:42 +02:00
|
|
|
if(len==TRAXXAS_PACKET_SIZE)
|
|
|
|
{
|
|
|
|
CYRF_ReadDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
2023-12-22 21:02:10 +01:00
|
|
|
#ifdef TRAXXAS_DEBUG
|
|
|
|
debug("RX=");
|
|
|
|
for(uint8_t i=0;i<TRAXXAS_PACKET_SIZE;i++)
|
|
|
|
debug(" %02X",packet[i]);
|
|
|
|
debugln("");
|
|
|
|
#endif
|
2024-01-29 18:59:24 +01:00
|
|
|
uint16_t addr=TRAXXAS_EEPROM_OFFSET+RX_num*3;
|
2024-02-17 11:03:37 +01:00
|
|
|
if(phase == TRAXXAS_BIND_RX)
|
|
|
|
{
|
|
|
|
// Store RX ID
|
|
|
|
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]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//check RX ID and SOP
|
|
|
|
if(eeprom_read_byte((EE_ADDR)(addr + 0)) != packet[1] || eeprom_read_byte((EE_ADDR)(addr + 1)) != packet[2] || eeprom_read_byte((EE_ADDR)(addr + 2)) != packet[7])
|
|
|
|
{ // Not our RX
|
|
|
|
phase++; // TRAXXAS_PREP_DATA
|
2024-02-19 21:53:54 +01:00
|
|
|
return 10000-7000-500;
|
2024-02-17 11:03:37 +01:00
|
|
|
}
|
|
|
|
}
|
2023-12-22 21:02:10 +01:00
|
|
|
// Replace RX ID by TX ID
|
2019-08-06 17:27:42 +02:00
|
|
|
for(uint8_t i=0;i<6;i++)
|
|
|
|
packet[i+1]=cyrfmfg_id[i];
|
2024-01-29 18:59:24 +01:00
|
|
|
//packet[7 ] = 0xEE; // Not needed ??
|
2024-02-19 21:53:54 +01:00
|
|
|
packet[8 ] = hopping_frequency[0] - 1;
|
2023-12-24 15:05:13 +01:00
|
|
|
packet[10] = 0x01; // Must change otherwise bind doesn't complete
|
2024-01-29 18:59:24 +01:00
|
|
|
//packet[13] = 0x05; // Not needed ??
|
2019-08-06 17:27:42 +02:00
|
|
|
packet_count=12;
|
|
|
|
CYRF_SetTxRxMode(TX_EN);
|
|
|
|
phase=TRAXXAS_BIND_TX1;
|
2024-02-19 21:53:54 +01:00
|
|
|
return 10000;
|
2019-08-06 17:27:42 +02:00
|
|
|
}
|
|
|
|
}
|
2024-02-17 11:03:37 +01:00
|
|
|
if(phase == TRAXXAS_BIND_RX)
|
|
|
|
{
|
|
|
|
if( --packet_count == 0 )
|
|
|
|
{ // Retry RX
|
2024-02-19 21:53:54 +01:00
|
|
|
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Enable RX abort
|
|
|
|
CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); // Force end state
|
|
|
|
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x00); // Disable RX abort
|
2024-02-17 11:03:37 +01:00
|
|
|
if(--bind_counter != 0)
|
2024-02-19 21:53:54 +01:00
|
|
|
phase=TRAXXAS_BIND_PREP_RX; // Retry receiving bind packet
|
2024-02-17 11:03:37 +01:00
|
|
|
else
|
2024-02-19 21:53:54 +01:00
|
|
|
phase=TRAXXAS_PREP_DATA; // Abort binding
|
2024-02-17 11:03:37 +01:00
|
|
|
}
|
|
|
|
return 700;
|
2019-08-06 17:27:42 +02:00
|
|
|
}
|
2024-02-19 21:53:54 +01:00
|
|
|
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Enable RX abort
|
|
|
|
CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); // Force end state
|
|
|
|
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x00); // Disable RX abort
|
2024-02-17 11:03:37 +01:00
|
|
|
phase++; // TRAXXAS_PREP_DATA
|
2024-02-19 21:53:54 +01:00
|
|
|
return 10000-7000-500;
|
2019-08-06 17:27:42 +02:00
|
|
|
case TRAXXAS_BIND_TX1:
|
2024-01-29 18:59:24 +01:00
|
|
|
//debugln("BIND_TX1");
|
2019-08-06 17:27:42 +02:00
|
|
|
CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
|
2023-12-22 21:02:10 +01:00
|
|
|
#ifdef TRAXXAS_DEBUG
|
|
|
|
debug("P=");
|
|
|
|
for(uint8_t i=0;i<TRAXXAS_PACKET_SIZE;i++)
|
|
|
|
debug(" %02X",packet[i]);
|
|
|
|
debugln("");
|
|
|
|
#endif
|
2019-08-06 17:27:42 +02:00
|
|
|
if(--packet_count==0) // Switch to normal mode
|
|
|
|
phase=TRAXXAS_PREP_DATA;
|
|
|
|
break;
|
|
|
|
case TRAXXAS_PREP_DATA:
|
2024-01-29 18:59:24 +01:00
|
|
|
//debugln("PREP_DATA");
|
2019-08-06 17:27:42 +02:00
|
|
|
BIND_DONE;
|
|
|
|
TRAXXAS_cyrf_data_config();
|
|
|
|
phase++;
|
2024-02-19 21:53:54 +01:00
|
|
|
return 500;
|
2019-08-06 17:27:42 +02:00
|
|
|
case TRAXXAS_DATA:
|
2024-02-19 21:53:54 +01:00
|
|
|
//debugln_time("DATA");
|
2019-11-11 19:15:39 +01:00
|
|
|
#ifdef MULTI_SYNC
|
2024-02-17 11:03:37 +01:00
|
|
|
telemetry_set_input_sync(10000);
|
2019-11-11 19:15:39 +01:00
|
|
|
#endif
|
2019-08-06 17:27:42 +02:00
|
|
|
TRAXXAS_send_data_packet();
|
2024-02-17 11:03:37 +01:00
|
|
|
phase = TRAXXAS_PREP_RX;
|
|
|
|
return 1000;
|
2019-08-06 17:27:42 +02:00
|
|
|
}
|
2024-02-17 11:03:37 +01:00
|
|
|
return 10000;
|
2019-08-06 17:27:42 +02:00
|
|
|
}
|
|
|
|
|
2021-02-09 18:23:33 +01:00
|
|
|
void TRAXXAS_init()
|
2019-08-06 17:27:42 +02:00
|
|
|
{
|
|
|
|
//Config CYRF registers
|
|
|
|
for(uint8_t i = 0; i < sizeof(TRAXXAS_init_vals) / 2; i++)
|
|
|
|
CYRF_WriteRegister(pgm_read_byte_near(&TRAXXAS_init_vals[i][0]), pgm_read_byte_near(&TRAXXAS_init_vals[i][1]));
|
|
|
|
|
|
|
|
//Read CYRF ID
|
|
|
|
CYRF_GetMfgData(cyrfmfg_id);
|
2023-12-22 21:02:10 +01:00
|
|
|
//cyrfmfg_id[0]+=RX_num; // Not needed since the TX and RX have to match
|
2024-02-19 21:53:54 +01:00
|
|
|
CYRF_FindBestChannels(hopping_frequency,1,1,0x02,0x21);
|
2019-08-06 17:27:42 +02:00
|
|
|
#ifdef TRAXXAS_FORCE_ID // data taken from TX dump
|
|
|
|
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;
|
2024-02-19 21:53:54 +01:00
|
|
|
hopping_frequency[0] = 0x05; // seen 05 and 0F
|
2019-08-06 17:27:42 +02:00
|
|
|
#endif
|
2024-02-19 21:53:54 +01:00
|
|
|
#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("RF CH: %02X",hopping_frequency[0]);
|
|
|
|
#endif
|
|
|
|
|
2019-08-06 17:27:42 +02:00
|
|
|
if(IS_BIND_IN_PROGRESS)
|
|
|
|
{
|
|
|
|
bind_counter=100;
|
|
|
|
phase = TRAXXAS_BIND_PREP_RX;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
phase = TRAXXAS_PREP_DATA;
|
2023-12-24 15:05:13 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// 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);
|
2024-01-29 18:59:24 +01:00
|
|
|
// memcpy(packet,(uint8_t *)"\x02\x49\xAC\x4F\x55\x4D\xFE\x05\x00\x00\x02\x01\x06\x06\x00\x00",TRAXXAS_PACKET_SIZE);
|
2019-08-06 17:27:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2024-02-19 21:53:54 +01:00
|
|
|
Packets 0x02: Bind learn TX/RX addresses
|
2019-08-06 17:27:42 +02:00
|
|
|
CHANNEL: 0x2B
|
|
|
|
SOP_CODE: 0x3C 0x37 0xCC 0x91 0xE2 0xF8 0xCC 0x91
|
|
|
|
CRC_SEED_LSB: 0x5A
|
|
|
|
CRC_SEED_MSB: 0x5A
|
2024-02-19 21:53:54 +01:00
|
|
|
RX: 0x02 0x4A 0xA3 0x2D 0x1A 0x49 0xFE 0x06 0x00 0x00 0x02 0x01 0x06 0x06 0x00 0x00
|
|
|
|
TX: 0x02 0x65 0xE2 0x5E 0x55 0x4D 0xFE 0xEE 0x00 0x00 0x01 0x01 0x06 0x05 0x00 0x00
|
2023-12-22 21:02:10 +01:00
|
|
|
Notes:
|
|
|
|
- RX cyrfmfg_id is 0x4A,0xA3,0x2D,0x1A,0x49,0xFE and TX cyrfmfg_id is 0x65,0xE2,0x5E,0x55,0x4D,0xFE
|
2023-12-24 15:05:13 +01:00
|
|
|
- P[7] changes from 0x06 to 0xEE but not needed to complete the bind -> doesn't care??
|
2024-02-17 11:03:37 +01:00
|
|
|
- P[8] RF channel - 1 (on packets type 0x03)
|
|
|
|
- P[9] 0x00 unchanged??
|
2023-12-22 21:02:10 +01:00
|
|
|
- P[10] needs to be set to 0x01 to complete the bind -> normal packet P[0]??
|
2023-12-24 15:05:13 +01:00
|
|
|
- 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??
|
2023-12-22 21:02:10 +01:00
|
|
|
- P[14..15]=0x00 unchanged??
|
2019-08-06 17:27:42 +02:00
|
|
|
|
2024-02-19 21:53:54 +01:00
|
|
|
Packets 0x03: Which RF channel
|
2019-08-06 17:27:42 +02:00
|
|
|
CHANNEL: 0x22
|
|
|
|
SOP_CODE: 0x97 0xE5 0x14 0x72 0x7F 0x1A 0x14 0x72
|
|
|
|
CRC_SEED_LSB: 0xA5
|
|
|
|
CRC_SEED_MSB: 0xA5
|
2024-02-19 21:53:54 +01:00
|
|
|
RX: 0x03 0x4A 0xA3 0x2D 0x1A 0x49 0xFE 0x06 0x00 0x00 0x02 0x01 0x06 0x06 0x00 0x00
|
|
|
|
TX: 0x03 0x65 0xE2 0x5E 0x55 0x4D 0xFE 0xEE 0x0E 0x00 0x01 0x01 0x06 0x05 0x00 0x00
|
|
|
|
- P[8] RF channel - 1
|
|
|
|
|
|
|
|
Packets 0x04: unknown
|
|
|
|
RX: 0x04 0x4A 0xA3 0x2D 0x1A 0x49 0xFE 0x06 0x00 0x00 0x02 0x01 0x06 0x06 0x00 0x00
|
2019-08-06 17:27:42 +02:00
|
|
|
|
2024-02-19 21:53:54 +01:00
|
|
|
Packets 0x01: Normal mode
|
2019-08-06 17:27:42 +02:00
|
|
|
CHANNEL: 0x05
|
|
|
|
SOP_CODE: 0xA1 0x78 0xDC 0x3C 0x9E 0x82 0xDC 0x3C
|
|
|
|
CRC_SEED_LSB: 0x1B
|
|
|
|
CRC_SEED_MSB: 0x3F
|
|
|
|
TX3: 0x01 0x00 0x02 0xA8 0x03 0xE7 0x02 0x08 0x00 0x00 0x01 0x01 0x02 0xEE 0x00 0x00
|
2023-12-22 21:02:10 +01:00
|
|
|
|
|
|
|
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
|
2023-12-24 15:05:13 +01:00
|
|
|
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
|
2019-08-06 17:27:42 +02:00
|
|
|
*/
|
2024-01-29 18:59:24 +01: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
|
|
|
|
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??
|
|
|
|
*/
|
|
|
|
|
2019-08-06 17:27:42 +02:00
|
|
|
#endif
|