mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-04 19:58:13 +00:00
Bayang: rewritten the protocol to be more friendly with main scheduler
This commit is contained in:
parent
7f3c80c2a9
commit
9f721c528d
@ -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();
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user