MAJ telemtry BAYANG

This commit is contained in:
tipouic 2016-12-06 22:04:37 +01:00
parent a95221200f
commit 8b282dd506
7 changed files with 119 additions and 58 deletions

View File

@ -265,11 +265,7 @@ uint16_t BAYANG_callback()
#ifdef ENABLE_BAYANG_TELEMETRY #ifdef ENABLE_BAYANG_TELEMETRY
if(sub_protocol == BAYANG_TELEM) if(sub_protocol == BAYANG_TELEM)
{ {
Bayang_process(); return Bayang_process();
// Return 0 here so that Bayang_process is called as often as possible
// to check for the incomming telemetry data. When telemetry is enabled
// the packet period is handled in the Bayang_process function.
return 0;
} }
else else
#endif #endif
@ -317,6 +313,9 @@ uint16_t initBAYANG(void)
#ifdef ENABLE_BAYANG_TELEMETRY #ifdef ENABLE_BAYANG_TELEMETRY
extern float telemetry_voltage; extern float telemetry_voltage;
extern uint16_t telemetry_rx_recv_pps;
extern uint16_t telemetry_tx_recv_pps;
extern uint16_t telemetry_tx_sent_pps;
extern uint8_t telemetry_rx_rssi; extern uint8_t telemetry_rx_rssi;
extern uint8_t telemetry_tx_rssi; extern uint8_t telemetry_tx_rssi;
extern uint8_t telemetry_datamode; extern uint8_t telemetry_datamode;
@ -326,13 +325,21 @@ uint16_t initBAYANG(void)
extern uint16_t telemetry_flighttime; extern uint16_t telemetry_flighttime;
extern uint8_t telemetry_flightmode; extern uint8_t telemetry_flightmode;
uint8_t telemetry_tx_rssi_count; uint16_t telemetry_tx_sent_pkt_count;
uint8_t telemetry_tx_rssi_next; uint32_t telemetry_tx_sent_pps_time;
uint16_t telemetry_tx_recv_pkt_count;
uint32_t telemetry_tx_recv_pps_time;
static uint32_t bayang_tx_time = 0;
uint8_t BAYANG_recv_packet() { uint8_t BAYANG_recv_packet() {
uint8_t received = 0; uint8_t received = 0;
if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) { if (NRF24L01_Strobe(NRF24L01_FF_NOP) & _BV(NRF24L01_07_RX_DR)) {
int sum = 0; int sum = 0;
uint16_t roll, pitch, yaw, throttle; uint16_t roll, pitch, yaw, throttle;
@ -357,7 +364,13 @@ uint16_t initBAYANG(void)
v.bytes[1] = packet[2]; v.bytes[1] = packet[2];
telemetry_voltage = v.v / 100.f; telemetry_voltage = v.v / 100.f;
telemetry_rx_rssi = packet[3]; telemetry_rx_recv_pps = packet[3]*2;
telemetry_rx_rssi = (uint8_t)(telemetry_rx_recv_pps*100/telemetry_tx_sent_pps);
if (telemetry_rx_rssi > 100)
telemetry_rx_rssi = 100;
telemetry_tx_rssi = (uint8_t)(telemetry_tx_recv_pps*100/telemetry_rx_recv_pps);
if (telemetry_tx_rssi > 100)
telemetry_tx_rssi = 100;
v.bytes[0] = packet[4]; v.bytes[0] = packet[4];
@ -401,60 +414,83 @@ uint16_t initBAYANG(void)
BayangState Bayang_state = BAYANG_STATE_IDLE; BayangState Bayang_state = BAYANG_STATE_IDLE;
uint32_t Bayang_next_send = 0; uint32_t Bayang_next_send = 0;
void Bayang_process() { uint16_t Bayang_process() {
uint32_t time_micros = micros(); uint32_t time_micros = micros();
uint16_t callback_period = 30; // asap
if (BAYANG_STATE_TRANSMITTING == Bayang_state) { if (BAYANG_STATE_TRANSMITTING == Bayang_state) {
if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)) { if (NRF24L01_Strobe(NRF24L01_FF_NOP) & _BV(NRF24L01_07_TX_DS) || time_micros - bayang_tx_time > 1100) {
// send finished, switch to rx to receive telemetry // send finished, switch to rx to receive telemetry
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX)); XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX));
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushTx();
NRF24L01_FlushRx(); NRF24L01_FlushRx();
telemetry_tx_rssi_count++; Bayang_state = BAYANG_STATE_RECEIEVING;
Bayang_state = BAYANG_STATE_RECEIEVING; callback_period = Bayang_next_send - time_micros - 550; // wait a while for quad to receive then send a packet
} }
} }
else if (BAYANG_STATE_RECEIEVING == Bayang_state) { else if (BAYANG_STATE_RECEIEVING == Bayang_state) {
uint8_t change_state = 1;
// 250us is about the time it takes to read a packet over spi // 250us is about the time it takes to read a packet over spi
if (time_micros > (Bayang_next_send-250)) { if (time_micros > (Bayang_next_send-250))
// didnt receive telemetry in time {
Bayang_state = BAYANG_STATE_IDLE;
// if it's been a while since receiving telemetry data, // if it's been a while since receiving telemetry data,
// stop sending the telemetry data to the transmitter // stop sending the telemetry data to the transmitter
if (millis() - bayang_telemetry_last_rx > 1000) if (time_micros - bayang_telemetry_last_rx > 1000000)
telemetry_lost = 1; telemetry_lost = 1;
} }
else if (BAYANG_recv_packet()) { else if (BAYANG_recv_packet())
telemetry_tx_rssi_next++; {
telemetry_tx_recv_pkt_count++;
// received telemetry packet // received telemetry packet
telemetry_lost = 0; telemetry_lost = 0;
bayang_telemetry_last_rx = millis(); bayang_telemetry_last_rx = time_micros;
} }
else else
{ {
return; change_state = 0;
} }
if (100 == telemetry_tx_rssi_count) if (telemetry_tx_recv_pps_time < time_micros)
{ {
telemetry_tx_rssi = telemetry_tx_rssi_next; telemetry_tx_recv_pps = telemetry_tx_recv_pps + telemetry_tx_recv_pkt_count - telemetry_tx_recv_pps/10;
telemetry_tx_rssi_next = 0; telemetry_tx_recv_pkt_count = 0;
telemetry_tx_rssi_count = 0; telemetry_tx_recv_pps_time += 100000;
} }
if (change_state)
{
Bayang_state = BAYANG_STATE_IDLE; Bayang_state = BAYANG_STATE_IDLE;
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));
NRF24L01_FlushRx(); NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushRx();
}
} }
else if (time_micros > Bayang_next_send) { else if (time_micros > Bayang_next_send)
{
bayang_tx_time = time_micros;
BAYANG_send_packet(0); BAYANG_send_packet(0);
Bayang_state = BAYANG_STATE_TRANSMITTING; Bayang_state = BAYANG_STATE_TRANSMITTING;
Bayang_next_send = time_micros + BAYANG_PACKET_PERIOD_TELEM; Bayang_next_send = time_micros + BAYANG_PACKET_PERIOD_TELEM;
callback_period = 600; // takes about 1ms to send(spi transfer + tx send)
telemetry_tx_sent_pkt_count++;
if (telemetry_tx_sent_pps_time < time_micros)
{
telemetry_tx_sent_pps = telemetry_tx_sent_pps + telemetry_tx_sent_pkt_count - telemetry_tx_sent_pps/10;
telemetry_tx_sent_pkt_count = 0;
telemetry_tx_sent_pps_time += 100000;
}
} }
else
{
callback_period = Bayang_next_send - time_micros;
}
return callback_period;
} }
#endif //ENABLE_BAYANG_TELEMETRY #endif //ENABLE_BAYANG_TELEMETRY
#endif #endif

View File

@ -196,7 +196,9 @@ uint16_t initFlySky()
A7105_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) // limit offset to 9 as higher values don't work with some RX (ie V912)
// limit offset to 9 as CX20 repeats the same channels after that
if ((rx_tx_addr[3]&0xF0) > 0x90)
rx_tx_addr[3]=rx_tx_addr[3]-0x70; rx_tx_addr[3]=rx_tx_addr[3]-0x70;
// Build frequency hop table // Build frequency hop table
@ -213,11 +215,18 @@ uint16_t initFlySky()
if(i&0x01) if(i&0x01)
temp+=0x50; temp+=0x50;
if(sub_protocol==CX20) if(sub_protocol==CX20)
{//Might need more dumps to be 100% sure but this is how it looks like to work {
if(temp==0x0A) if(temp==0x0A)
temp+=0x37; temp+=0x37;
if(temp==0xA0) if(temp==0xA0)
temp-=0x73; {
if (chanoffset<4)
temp=0x37;
else if (chanoffset<9)
temp=0x2D;
else
temp=0x29;
}
} }
hopping_frequency[((chanrow&1)?15-i:i)]=temp-chanoffset; hopping_frequency[((chanrow&1)?15-i:i)]=temp-chanoffset;
} }

View File

@ -420,7 +420,10 @@ void loop()
{ {
TX_MAIN_PAUSE_on; TX_MAIN_PAUSE_on;
tx_pause(); tx_pause();
next_callback=remote_callback(); if(IS_INPUT_SIGNAL_on)
next_callback=remote_callback();
else
next_callback=2000; // No PPM/serial signal check again in 2ms...
TX_MAIN_PAUSE_off; TX_MAIN_PAUSE_off;
tx_resume(); tx_resume();
while(next_callback>4000) while(next_callback>4000)
@ -536,8 +539,8 @@ static void update_channels_aux(void)
static void update_led_status(void) static void update_led_status(void)
{ {
if(IS_INPUT_SIGNAL_on) if(IS_INPUT_SIGNAL_on)
if(millis()-last_signal>50) if(millis()-last_signal>70)
INPUT_SIGNAL_off; //no valid signal (PPM or Serial) received for 50ms INPUT_SIGNAL_off; //no valid signal (PPM or Serial) received for 70ms
if(blink<millis()) if(blink<millis())
{ {
if(IS_INPUT_SIGNAL_off) if(IS_INPUT_SIGNAL_off)

View File

@ -101,11 +101,13 @@ static uint8_t NRF24L01_GetDynamicPayloadSize(void)
return res; return res;
} }
static void NRF24L01_Strobe(uint8_t state) static uint8_t NRF24L01_Strobe(uint8_t state)
{ {
uint8_t result;
NRF_CSN_off; NRF_CSN_off;
SPI_Write(state); result =SPI_Write(state);
NRF_CSN_on; NRF_CSN_on;
return result;
} }
void NRF24L01_FlushTx() void NRF24L01_FlushTx()
@ -389,9 +391,17 @@ void XN297_ReadPayload(uint8_t* msg, uint8_t len)
NRF24L01_ReadPayload(msg, len); NRF24L01_ReadPayload(msg, len);
for(uint8_t i=0; i<len; i++) for(uint8_t i=0; i<len; i++)
{ {
msg[i] = bit_reverse(msg[i]); if (protocol == MODE_BAYANG) {
if(xn297_scramble_enabled) if(xn297_scramble_enabled)
msg[i] ^= bit_reverse(xn297_scramble[i+xn297_addr_len]); msg[i] = bit_reverse(msg[i] ^ xn297_scramble[i+xn297_addr_len]);
else
msg[i] = bit_reverse(msg[i]);
}
else {
msg[i] = bit_reverse(msg[i]);
if(xn297_scramble_enabled)
msg[i] ^= bit_reverse(xn297_scramble[i+xn297_addr_len]);
}
} }
} }

View File

@ -21,7 +21,10 @@
float telemetry_voltage = 0.f; float telemetry_voltage = 0.f;
uint8_t telemetry_rx_rssi = 100; uint8_t telemetry_rx_rssi = 100;
#ifdef ENABLE_BAYANG_TELEMETRY #ifdef ENABLE_BAYANG_TELEMETRY
uint16_t telemetry_rx_recv_pps = 100;
uint8_t telemetry_tx_rssi = 100; uint8_t telemetry_tx_rssi = 100;
uint16_t telemetry_tx_recv_pps = 100;
uint16_t telemetry_tx_sent_pps = 100;
uint8_t telemetry_datamode = 0; uint8_t telemetry_datamode = 0;
uint8_t telemetry_dataitem = 0; uint8_t telemetry_dataitem = 0;
float telemetry_data[3] = {0}; float telemetry_data[3] = {0};
@ -51,7 +54,7 @@ uint8_t frame[18];
#ifdef BASH_SERIAL #ifdef BASH_SERIAL
// For bit-bashed serial output // For bit-bashed serial output
struct t_serial_bash volatile struct t_serial_bash
{ {
uint8_t head ; uint8_t head ;
uint8_t tail ; uint8_t tail ;
@ -71,12 +74,12 @@ void DSM_frame()
#endif #endif
#if defined AFHDS2A_TELEMETRY #if defined AFHDS2A_TELEMETRY
void AFHDSA_short_frame() void AFHDSA_short_frame()
{ {
Serial_write(0xAA); // Telemetry packet Serial_write(0xAA); // Telemetry packet
for (uint8_t i = 0; i < 29; i++) // RSSI value followed by 4*7 bytes of telemetry data for (uint8_t i = 0; i < 29; i++) // RSSI value followed by 4*7 bytes of telemetry data
Serial_write(pkt[i]); Serial_write(pkt[i]);
} }
#endif #endif
void frskySendStuffed() void frskySendStuffed()
@ -371,10 +374,7 @@ void sportSendFrame()
case 2: //BATT case 2: //BATT
frame[2] = 0x04; frame[2] = 0x04;
frame[3] = 0xf1; frame[3] = 0xf1;
if (protocol == MODE_BAYANG) frame[4] = telemetry_voltage/4.f * 255.f/3.3f;//a1;
frame[4] = telemetry_voltage/4.f * 255.f/3.3f;//a1;
else
frame[4] = telemetry_voltage;
break; break;
case 3: //FCS VOLTAGE case 3: //FCS VOLTAGE
frame[2] = 0x10; frame[2] = 0x10;
@ -447,12 +447,14 @@ void sportSendFrame()
case 12: // xjt t1 case 12: // xjt t1
frame[2] = 0x02; frame[2] = 0x02;
frame[3] = 0x00; frame[3] = 0x00;
frame[4] = 0; frame[4] = telemetry_tx_sent_pps >> 1; // divided by 2
frame[5] = telemetry_rx_recv_pps >> 1; // divided by 2
break; break;
case 13: // xjt t2 case 13: // xjt t2
frame[2] = 0x05; frame[2] = 0x05;
frame[3] = 0x00; frame[3] = 0x00;
frame[4] = 0; frame[4] = telemetry_tx_recv_pps >> 1; // divided by 2
frame[5] = 0;
break; break;
default: default:
if(sport) if(sport)
@ -963,7 +965,7 @@ ISR(TIMER0_COMPB_vect)
else else
{ {
// prepare next byte and allow for 2 stop bits // prepare next byte and allow for 2 stop bits
struct t_serial_bash *ptr = &SerialControl ; volatile struct t_serial_bash *ptr = &SerialControl ;
if ( ptr->head != ptr->tail ) if ( ptr->head != ptr->tail )
{ {
GPIOR0 = ptr->data[ptr->tail] ; GPIOR0 = ptr->data[ptr->tail] ;
@ -1014,7 +1016,7 @@ ISR(TIMER0_OVF_vect)
if ( --GPIOR1 == 0 ) if ( --GPIOR1 == 0 )
{ {
// prepare next byte // prepare next byte
struct t_serial_bash *ptr = &SerialControl ; volatile struct t_serial_bash *ptr = &SerialControl ;
if ( ptr->head != ptr->tail ) if ( ptr->head != ptr->tail )
{ {
GPIOR0 = ptr->data[ptr->tail] ; GPIOR0 = ptr->data[ptr->tail] ;

View File

@ -151,6 +151,7 @@
//In this section you can configure the NUNCHUCK. //In this section you can configure the NUNCHUCK.
//If you do not plan to use the NUNCHUCK mode comment this line using "//" to save Flash space, you don't need to configure anything below in this case //If you do not plan to use the NUNCHUCK mode comment this line using "//" to save Flash space, you don't need to configure anything below in this case
#define ENABLE_NUNCHUCK #define ENABLE_NUNCHUCK
// pont diviseur VCC --------------- 240K ------------- analogRead(0) -------------- 75K ----------- GND
#define VBAT_PIN 3 // for Tx adapters with battery #define VBAT_PIN 3 // for Tx adapters with battery
#define VBAT_VAL 340 // for Tx adapters with battery (attention pont divisieur pour avoir 1,1V max ,~=3,404V) #define VBAT_VAL 340 // for Tx adapters with battery (attention pont divisieur pour avoir 1,1V max ,~=3,404V)
#define VBAT_LIM 330 // for Tx adapters with battery (attention pont divisieur pour avoir 1,1V max , ~=3,302V) #define VBAT_LIM 330 // for Tx adapters with battery (attention pont divisieur pour avoir 1,1V max , ~=3,302V)

Binary file not shown.