Bayang: rewritten the protocol to be more friendly with main scheduler

This commit is contained in:
pascallanger 2020-01-12 19:42:51 +01:00
parent 7f3c80c2a9
commit 9f721c528d
2 changed files with 75 additions and 69 deletions

View File

@ -20,7 +20,8 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_nrf24l01.h" #include "iface_nrf24l01.h"
#define BAYANG_BIND_COUNT 1000 #define BAYANG_BIND_COUNT 1000
#define BAYANG_PACKET_PERIOD 1000 #define BAYANG_PACKET_PERIOD 2000
#define BAYANG_PACKET_TELEM_PERIOD 5000
#define BAYANG_INITIAL_WAIT 500 #define BAYANG_INITIAL_WAIT 500
#define BAYANG_PACKET_SIZE 15 #define BAYANG_PACKET_SIZE 15
#define BAYANG_RF_NUM_CHANNELS 4 #define BAYANG_RF_NUM_CHANNELS 4
@ -46,10 +47,10 @@ enum BAYANG_OPTION_FLAGS {
BAYANG_OPTION_FLAG_ANALOGAUX = 0x02, BAYANG_OPTION_FLAG_ANALOGAUX = 0x02,
}; };
static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) static void __attribute__((unused)) BAYANG_send_packet()
{ {
uint8_t i; uint8_t i;
if (bind) if (IS_BIND_IN_PROGRESS)
{ {
#ifdef BAYANG_HUB_TELEMETRY #ifdef BAYANG_HUB_TELEMETRY
if(option & BAYANG_OPTION_FLAG_TELEMETRY) if(option & BAYANG_OPTION_FLAG_TELEMETRY)
@ -186,29 +187,15 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind)
for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++) for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++)
packet[14] += packet[i]; packet[14] += packet[i];
NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? rf_ch_num:hopping_frequency[hopping_frequency_no++]); NRF24L01_WriteReg(NRF24L01_05_RF_CH, IS_BIND_IN_PROGRESS ? rf_ch_num:hopping_frequency[hopping_frequency_no++]);
hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS; hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS;
// clear packet status bits and TX FIFO
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushTx();
XN297_WritePayload(packet, BAYANG_PACKET_SIZE);
NRF24L01_SetTxRxMode(TXRX_OFF);
NRF24L01_SetTxRxMode(TX_EN);
// Power on, TX mode, 2byte CRC // Power on, TX mode, 2byte CRC
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing // Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
NRF24L01_FlushTx();
NRF24L01_SetTxRxMode(TX_EN);
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));
XN297_WritePayload(packet, BAYANG_PACKET_SIZE);
#ifdef BAYANG_HUB_TELEMETRY
if (option & BAYANG_OPTION_FLAG_TELEMETRY)
{ // switch radio to rx as soon as packet is sent
while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)));
NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03);
}
#endif
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
@ -233,7 +220,8 @@ static void __attribute__((unused)) BAYANG_check_rx(void)
// compensated battery volts*100/2 // compensated battery volts*100/2
v_lipo2 = (packet[5]<<7) + (packet[6]>>2); v_lipo2 = (packet[5]<<7) + (packet[6]>>2);
// reception in packets / sec // reception in packets / sec
RX_RSSI = packet[7]; RX_LQI = packet[7];
RX_RSSI = RX_LQI;
//Flags //Flags
//uint8_t flags = packet[3] >> 3; //uint8_t flags = packet[3] >> 3;
// battery low: flags & 1 // battery low: flags & 1
@ -242,6 +230,7 @@ static void __attribute__((unused)) BAYANG_check_rx(void)
telemetry_link=1; telemetry_link=1;
} }
} }
NRF24L01_SetTxRxMode(TXRX_OFF);
} }
#endif #endif
@ -278,58 +267,74 @@ static void __attribute__((unused)) BAYANG_init()
} }
} }
enum {
BAYANG_BIND=0,
BAYANG_WRITE,
BAYANG_CHECK,
BAYANG_READ,
};
#define BAYANG_CHECK_DELAY 1000 // Time after write phase to check write complete
#define BAYANG_READ_DELAY 600 // Time before read phase
uint16_t BAYANG_callback() uint16_t BAYANG_callback()
{ {
if(IS_BIND_DONE) #ifdef BAYANG_HUB_TELEMETRY
uint16_t start;
#endif
switch(phase)
{ {
if(packet_count==0) case BAYANG_BIND:
{ if (bind_counter-- == 0)
#ifdef MULTI_SYNC {
telemetry_set_input_sync((option & BAYANG_OPTION_FLAG_TELEMETRY)?5*BAYANG_PACKET_PERIOD:2*BAYANG_PACKET_PERIOD); XN297_SetTXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
#endif #ifdef BAYANG_HUB_TELEMETRY
BAYANG_send_packet(0); XN297_SetRXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
} #endif
packet_count++; BIND_DONE;
#ifdef BAYANG_HUB_TELEMETRY phase++; //WRITE
if (option & BAYANG_OPTION_FLAG_TELEMETRY)
{ // telemetry is enabled
state++;
if (state > 1000)
{
//calculate telemetry reception packet rate - packets per 1000ms
TX_RSSI = telemetry_counter;
telemetry_counter = 0;
state = 0;
telemetry_lost=0;
}
if (packet_count > 1)
BAYANG_check_rx();
packet_count %= 5;
} }
else else
#endif BAYANG_send_packet();
packet_count%=2; break;
} case BAYANG_WRITE:
else #ifdef MULTI_SYNC
{ telemetry_set_input_sync((option & BAYANG_OPTION_FLAG_TELEMETRY)?BAYANG_PACKET_TELEM_PERIOD:BAYANG_PACKET_PERIOD);
if (bind_counter == 0)
{
XN297_SetTXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
#ifdef BAYANG_HUB_TELEMETRY
XN297_SetRXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
#endif #endif
BIND_DONE; BAYANG_send_packet();
} #ifdef BAYANG_HUB_TELEMETRY
else if (option & BAYANG_OPTION_FLAG_TELEMETRY)
{ { // telemetry is enabled
if(packet_count==0) state++;
BAYANG_send_packet(1); if (state > 200)
packet_count++; {
packet_count%=4; state = 0;
bind_counter--; //telemetry reception packet rate - packets per second
} TX_LQI = telemetry_counter>>1;
telemetry_counter = 0;
telemetry_lost=0;
}
phase++; //CHECK
return BAYANG_CHECK_DELAY;
}
#endif
break;
#ifdef BAYANG_HUB_TELEMETRY
case BAYANG_CHECK:
// switch radio to rx as soon as packet is sent
start=(uint16_t)micros();
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 1000) // Wait max 1ms
if((NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)))
break;
debugln("time: %d",(uint16_t)((uint16_t)micros()-(uint16_t)start));
NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03);
phase++; // READ
return BAYANG_PACKET_TELEM_PERIOD - BAYANG_CHECK_DELAY - BAYANG_READ_DELAY;
case BAYANG_READ:
BAYANG_check_rx();
phase=BAYANG_WRITE;
return BAYANG_READ_DELAY;
#endif
} }
return BAYANG_PACKET_PERIOD; return BAYANG_PACKET_PERIOD;
} }
@ -350,6 +355,7 @@ static void __attribute__((unused)) BAYANG_initialize_txid()
uint16_t initBAYANG(void) uint16_t initBAYANG(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
phase=BAYANG_BIND;
bind_counter = BAYANG_BIND_COUNT; bind_counter = BAYANG_BIND_COUNT;
BAYANG_initialize_txid(); BAYANG_initialize_txid();
BAYANG_init(); BAYANG_init();

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 0 #define VERSION_REVISION 0
#define VERSION_PATCH_LEVEL 55 #define VERSION_PATCH_LEVEL 56
//****************** //******************
// Protocols // Protocols