MJXQ: Fixed E010 and added H26WH

Protocol: 18
Sub_protocol for H26WH: 5
This commit is contained in:
pascallanger 2016-12-13 14:58:02 +01:00
parent f69aae550f
commit 67d0e9d2c2
4 changed files with 90 additions and 56 deletions

View File

@ -48,25 +48,28 @@ const uint8_t PROGMEM E010_map_txid[][2] = {
{0x41, 0x22}, {0x41, 0x22},
{0xEE, 0xB3}, {0xEE, 0xB3},
{0x9A, 0xB2}, {0x9A, 0xB2},
{0xCD, 0x01},
{0xC0, 0x44}, {0xC0, 0x44},
{0xD7, 0x6E} }; {0x2A, 0xFE},
{0xD7, 0x6E},
{0x3C, 0xCD} // for this ID rx_tx_addr[2]=0x01
};
const uint8_t PROGMEM E010_map_rfchan[][4] = { const uint8_t PROGMEM E010_map_rfchan[][2] = {
{0x3A, 0x35, 0x4A, 0x45}, {0x3A, 0x35},
{0x2E, 0x36, 0x3E, 0x46}, {0x2E, 0x36},
{0x32, 0x3E, 0x42, 0x4E}, {0x32, 0x3E},
{0x2E, 0x3C, 0x3E, 0x4C}, {0x2E, 0x3C},
{0x2F, 0x3B, 0x3F, 0x4B}, {0x2F, 0x3B},
{0x33, 0x3B, 0x43, 0x4B}, {0x33, 0x3B},
{0x33, 0x3B, 0x43, 0x4B}, {0x33, 0x3B},
{0x34, 0x3E, 0x44, 0x4E}, {0x34, 0x3E},
{0x3F, 0x34, 0x2F, 0x44}, {0x34, 0x2F},
{0x39, 0x3E, 0x49, 0x4E}, {0x39, 0x3E},
{0x2E, 0x36, 0x3E, 0x46}, {0x2E, 0x36},
{0x2E, 0x36, 0x3E, 0x46}, {0x2E, 0x36},
{0x2E, 0x36, 0x3E, 0x46}, {0x2E, 0x36},
{0x3A, 0x41, 0x4A, 0x51} }; {0x3A, 0x41},
{0x32, 0x3E} };
#define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing #define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing
#define MJXQ_PAN_DOWN 0x08 #define MJXQ_PAN_DOWN 0x08
@ -115,14 +118,17 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind)
packet[14] = 0xC0; // bind value packet[14] = 0xC0; // bind value
// Servo_AUX1 FLIP // Servo_AUX1 FLIP
// Servo_AUX2 LED // Servo_AUX2 LED / ARM
// Servo_AUX3 PICTURE // Servo_AUX3 PICTURE
// Servo_AUX4 VIDEO // Servo_AUX4 VIDEO
// Servo_AUX5 HEADLESS // Servo_AUX5 HEADLESS
// Servo_AUX6 RTH // Servo_AUX6 RTH
// Servo_AUX7 AUTOFLIP // X800, X600 // Servo_AUX7 AUTOFLIP // X800, X600
// Servo_AUX8 PAN
// Servo_AUX9 TILT
switch(sub_protocol) switch(sub_protocol)
{ {
case H26WH:
case H26D: case H26D:
packet[10]=MJXQ_pan_tilt_value(); packet[10]=MJXQ_pan_tilt_value();
// fall through on purpose - no break // fall through on purpose - no break
@ -136,7 +142,13 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind)
| GET_FLAG(Servo_AUX1, 0x01) //FLIP | GET_FLAG(Servo_AUX1, 0x01) //FLIP
| GET_FLAG(Servo_AUX3, 0x08) //PICTURE | GET_FLAG(Servo_AUX3, 0x08) //PICTURE
| GET_FLAG(Servo_AUX4, 0x10) //VIDEO | GET_FLAG(Servo_AUX4, 0x10) //VIDEO
| GET_FLAG(!Servo_AUX2, 0x20); // air/ground mode | GET_FLAG(!Servo_AUX2, 0x20); // LED or air/ground mode
if(sub_protocol==H26WH)
{
packet[10] |=0x40; //High rate
packet[14] &= ~0x24; // unset air/ground & arm flags
packet[14] |= GET_FLAG(Servo_AUX2, 0x02); // arm
}
} }
break; break;
case X600: case X600:
@ -169,23 +181,23 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind)
for (uint8_t i=1; i < MJXQ_PACKET_SIZE-1; i++) sum += packet[i]; for (uint8_t i=1; i < MJXQ_PACKET_SIZE-1; i++) sum += packet[i];
packet[15] = sum; 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));
NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++ / 2]); NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++ / 2]);
hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushTx(); NRF24L01_FlushTx();
if (sub_protocol == H26D) // Power on, TX mode, 2byte CRC and send packet
if (sub_protocol == H26D || sub_protocol == H26WH)
{
NRF24L01_SetTxRxMode(TX_EN);
NRF24L01_WritePayload(packet, MJXQ_PACKET_SIZE); NRF24L01_WritePayload(packet, MJXQ_PACKET_SIZE);
}
else else
{
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
XN297_WritePayload(packet, MJXQ_PACKET_SIZE); XN297_WritePayload(packet, MJXQ_PACKET_SIZE);
}
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
@ -196,25 +208,18 @@ static void __attribute__((unused)) MJXQ_init()
if (sub_protocol == WLH08) if (sub_protocol == WLH08)
memcpy(hopping_frequency, "\x12\x22\x32\x42", MJXQ_RF_NUM_CHANNELS); memcpy(hopping_frequency, "\x12\x22\x32\x42", MJXQ_RF_NUM_CHANNELS);
else else
if (sub_protocol == H26D) if (sub_protocol == H26D || sub_protocol == H26D || sub_protocol == E010)
memcpy(hopping_frequency, "\x36\x3e\x46\x2e", MJXQ_RF_NUM_CHANNELS); memcpy(hopping_frequency, "\x2e\x36\x3e\x46", MJXQ_RF_NUM_CHANNELS);
else else
if(sub_protocol == E010) {
{ memcpy(hopping_frequency, "\x0a\x35\x42\x3d", MJXQ_RF_NUM_CHANNELS);
for(uint8_t i=0;i<4;i++) memcpy(addr, "\x6d\x6a\x73\x73\x73", MJXQ_ADDRESS_LENGTH);
hopping_frequency[i]=pgm_read_byte_near( &E010_map_rfchan[rx_tx_addr[3]%14][i] ); }
}
else
{
memcpy(hopping_frequency, "\x0a\x35\x42\x3d", MJXQ_RF_NUM_CHANNELS);
memcpy(addr, "\x6d\x6a\x73\x73\x73", MJXQ_ADDRESS_LENGTH);
}
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); 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_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, addr, MJXQ_ADDRESS_LENGTH); NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, addr, MJXQ_ADDRESS_LENGTH);
@ -238,27 +243,52 @@ static void __attribute__((unused)) MJXQ_init()
static void __attribute__((unused)) MJXQ_init2() static void __attribute__((unused)) MJXQ_init2()
{ {
if (sub_protocol == H26D) switch(sub_protocol)
memcpy(hopping_frequency, "\x32\x3e\x42\x4e", MJXQ_RF_NUM_CHANNELS); {
else case H26D:
if (sub_protocol != WLH08 && sub_protocol != E010) memcpy(hopping_frequency, "\x32\x3e\x42\x4e", MJXQ_RF_NUM_CHANNELS);
break;
case H26WH:
memcpy(hopping_frequency, "\x37\x32\x47\x42", MJXQ_RF_NUM_CHANNELS);
break;
case E010:
for(uint8_t i=0;i<2;i++)
{
hopping_frequency[i]=pgm_read_byte_near( &E010_map_rfchan[rx_tx_addr[3]%15][i] );
hopping_frequency[i+2]=hopping_frequency[i]+0x10;
}
break;
case WLH08:
// do nothing
break;
default:
for(uint8_t i=0;i<MJXQ_RF_NUM_CHANNELS;i++) for(uint8_t i=0;i<MJXQ_RF_NUM_CHANNELS;i++)
hopping_frequency[i]=pgm_read_byte_near( &MJXQ_map_rfchan[rx_tx_addr[3]%3][i] ); hopping_frequency[i]=pgm_read_byte_near( &MJXQ_map_rfchan[rx_tx_addr[3]%3][i] );
break;
}
} }
static void __attribute__((unused)) MJXQ_initialize_txid() static void __attribute__((unused)) MJXQ_initialize_txid()
{ {
rx_tx_addr[0]&=0xF8; switch(sub_protocol)
rx_tx_addr[2]=rx_tx_addr[3]; // Make use of RX_Num
if (sub_protocol == E010)
{ {
for(uint8_t i=0;i<2;i++) case H26WH:
rx_tx_addr[i]=pgm_read_byte_near( &E010_map_txid[rx_tx_addr[3]%14][i] ); memcpy(rx_tx_addr, "\xa4\x03\x00", 3);
rx_tx_addr[2]=0; break;
case E010:
for(uint8_t i=0;i<2;i++)
rx_tx_addr[i]=pgm_read_byte_near( &E010_map_txid[rx_tx_addr[3]%15][i] );
rx_tx_addr[2]=(rx_tx_addr[3]%15 == 14)?1:0;
break;
case WLH08:
rx_tx_addr[0]&=0xF8;
rx_tx_addr[2]=rx_tx_addr[3]; // Make use of RX_Num
break;
default:
for(uint8_t i=0;i<3;i++)
rx_tx_addr[i]=pgm_read_byte_near( &MJXQ_map_txid[rx_tx_addr[3]%3][i] );
break;
} }
else
for(uint8_t i=0;i<3;i++)
rx_tx_addr[i]=pgm_read_byte_near( &MJXQ_map_txid[rx_tx_addr[3]%3][i] );
} }
uint16_t MJXQ_callback() uint16_t MJXQ_callback()

View File

@ -15,7 +15,7 @@
15,FrskyX,CH_16,CH_8 15,FrskyX,CH_16,CH_8
16,ESky 16,ESky
17,MT99xx,MT,H7,YZ,LS,FY805 17,MT99xx,MT,H7,YZ,LS,FY805
18,MJXq,WLH08,X600,X800,H26D,E010 18,MJXq,WLH08,X600,X800,H26D,E010,H26WH
19,Shenqi 19,Shenqi
20,FY326,FY326,FY319 20,FY326,FY326,FY319
21,SFHSS 21,SFHSS

View File

@ -141,7 +141,8 @@ enum MJXQ
X600 = 1, X600 = 1,
X800 = 2, X800 = 2,
H26D = 3, H26D = 3,
E010 = 4 E010 = 4,
H26WH = 5,
}; };
enum FRSKYX enum FRSKYX
{ {
@ -489,6 +490,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
X800 2 X800 2
H26D 3 H26D 3
E010 4 E010 4
H26WH 5
sub_protocol==FRSKYX sub_protocol==FRSKYX
CH_16 0 CH_16 0
CH_8 1 CH_8 1

View File

@ -89,6 +89,7 @@
#define SYMAX_NRF24L01_INO #define SYMAX_NRF24L01_INO
#define V2X2_NRF24L01_INO #define V2X2_NRF24L01_INO
#define YD717_NRF24L01_INO #define YD717_NRF24L01_INO
#define MT99XX_NRF24L01_INO #define MT99XX_NRF24L01_INO
#define MJXQ_NRF24L01_INO #define MJXQ_NRF24L01_INO
#define SHENQI_NRF24L01_INO #define SHENQI_NRF24L01_INO
@ -259,6 +260,7 @@ const PPM_Parameters PPM_prot[15]= {
X800 X800
H26D H26D
E010 E010
H26WH
MODE_SHENQI MODE_SHENQI
NONE NONE
MODE_FY326 MODE_FY326