mirror of
https://github.com/peterantypas/maiana.git
synced 2025-05-27 21:00:24 -07:00
TX LED logic 100% in FW
This commit is contained in:
parent
94dd635b3c
commit
07f47e7aef
@ -31,12 +31,5 @@ typedef struct {
|
||||
}
|
||||
pa_params;
|
||||
|
||||
#if 0
|
||||
static const pa_params POWER_TABLE[] = {
|
||||
{0x4467, 0x48, 0x20, 0x00},
|
||||
{0x4460, 0x48, 0x20, 0x00},
|
||||
{0x4463, 0x48, 0x12, 0x00}
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* TXPOWERSETTINGS_H_ */
|
||||
|
@ -27,13 +27,13 @@ public:
|
||||
void queueMessage24(VHFChannel channel);
|
||||
|
||||
void reportTXStatus();
|
||||
bool isTXAllowed();
|
||||
|
||||
private:
|
||||
TXScheduler ();
|
||||
virtual ~TXScheduler ();
|
||||
time_t positionReportTimeInterval();
|
||||
void sendNMEASentence(const char *sentence);
|
||||
bool isTXAllowed();
|
||||
private:
|
||||
VHFChannel mPositionReportChannel;
|
||||
VHFChannel mStaticDataChannel;
|
||||
|
@ -47,7 +47,7 @@ void bsp_enter_dfu();
|
||||
void bsp_gnss_on();
|
||||
void bsp_gnss_off();
|
||||
bool bsp_is_tx_disabled();
|
||||
|
||||
bool bsp_is_tx_present();
|
||||
void bsp_rx_led_on();
|
||||
void bsp_rx_led_off();
|
||||
void bsp_tx_led_on();
|
||||
|
@ -25,8 +25,8 @@
|
||||
#include "TXPowerSettings.h"
|
||||
|
||||
|
||||
// Set to non-zero to enable transmission support
|
||||
#define ENABLE_TX 1
|
||||
#define FW_REV "3.2.0"
|
||||
|
||||
|
||||
/*
|
||||
* Defining this symbol forces all output (NMEA + debug) to a high-speed USART for tunneling to an application that demuxes it.
|
||||
@ -54,6 +54,8 @@
|
||||
// Maximum allowed backlog in TX queue
|
||||
#define MAX_TX_PACKETS_IN_QUEUE 4
|
||||
|
||||
// Set to true to emit proprietary NMEA sentences for debugging TX scheduling. Not useful in production.
|
||||
#define REPORT_TX_SCHEDULING 0
|
||||
|
||||
// Set to true to force RSSI sampling at every SOTDMA timer slot on both channels
|
||||
#define FULL_RSSI_SAMPLING 1
|
||||
@ -89,6 +91,4 @@
|
||||
#define CONFIGURATION_ADDRESS 0x0800F800
|
||||
#define OTP_DATA 1
|
||||
|
||||
#define FW_REV "3.1.0"
|
||||
|
||||
#endif /* CONFIG_H_ */
|
||||
|
@ -20,17 +20,9 @@
|
||||
#include "LEDManager.hpp"
|
||||
#include "bsp.hpp"
|
||||
#include "Configuration.hpp"
|
||||
#include "TXScheduler.hpp"
|
||||
|
||||
|
||||
/**
|
||||
* TODO: Update this to manage the status of the TX LED without any external hardware logic.
|
||||
* It must take all inputs into consideration:
|
||||
*
|
||||
* - Presence of station data
|
||||
* - Status of TX_DISABLE signal
|
||||
* - Status of "tx off" software setting
|
||||
*/
|
||||
|
||||
LEDManager::LEDManager()
|
||||
{
|
||||
// Do nothing
|
||||
@ -47,15 +39,11 @@ void tickCB()
|
||||
LEDManager::instance().onTick();
|
||||
}
|
||||
|
||||
static bool mForceTXLedOff = false;
|
||||
|
||||
void LEDManager::init()
|
||||
{
|
||||
if ( !Configuration::instance().isStationDataProvisioned() )
|
||||
if ( !TXScheduler::instance().isTXAllowed() )
|
||||
{
|
||||
mForceTXLedOff = true;
|
||||
|
||||
// This call actually has the opposite effect as it will cause the TX led to be pulled to GND
|
||||
// This call actually has the opposite effect
|
||||
bsp_tx_led_on();
|
||||
}
|
||||
bsp_set_tick_callback(tickCB);
|
||||
@ -72,10 +60,13 @@ void LEDManager::onTick()
|
||||
}
|
||||
|
||||
|
||||
if ( !mForceTXLedOff && count2++ == 250 )
|
||||
if ( count2++ == 200 )
|
||||
{
|
||||
count2 = 1;
|
||||
bsp_tx_led_off();
|
||||
if ( TXScheduler::instance().isTXAllowed() )
|
||||
bsp_tx_led_off();
|
||||
else
|
||||
bsp_tx_led_on();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -165,17 +165,22 @@ void RadioManager::timeSlotStarted(uint32_t slotNumber)
|
||||
|
||||
void RadioManager::scheduleTransmission(TXPacket *packet)
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
Event *e = EventPool::instance().newEvent(PROPR_NMEA_SENTENCE);
|
||||
#endif
|
||||
if ( !mTXQueue.push(packet) )
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
if ( e )
|
||||
{
|
||||
sprintf(e->nmeaBuffer.sentence, "$PAISCHTX,%s,%d*", packet->messageType(), TX_QUEUE_FULL);
|
||||
Utils::completeNMEA(e->nmeaBuffer.sentence);
|
||||
EventQueue::instance().push(e);
|
||||
}
|
||||
#endif
|
||||
TXPacketPool::instance().deleteTXPacket(packet);
|
||||
}
|
||||
#if REPORT_TX_SCHEDULING
|
||||
else
|
||||
{
|
||||
if ( e )
|
||||
@ -185,6 +190,7 @@ void RadioManager::scheduleTransmission(TXPacket *packet)
|
||||
EventQueue::instance().push(e);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void RadioManager::sendTestPacketNow(TXPacket *packet)
|
||||
|
@ -62,7 +62,9 @@ TXScheduler::TXScheduler ()
|
||||
|
||||
void TXScheduler::init()
|
||||
{
|
||||
reportTXStatus();
|
||||
bool cliBootMode = *(uint32_t*)BOOTMODE_ADDRESS == CLI_FLAG_MAGIC;
|
||||
if ( !cliBootMode )
|
||||
reportTXStatus();
|
||||
}
|
||||
|
||||
TXScheduler::~TXScheduler ()
|
||||
@ -81,7 +83,7 @@ void TXScheduler::reportTXStatus()
|
||||
if ( !e )
|
||||
return;
|
||||
|
||||
sprintf(e->nmeaBuffer.sentence, "$PAITXCFG,%d,%d,%d,%d*", !hwSwitchOff, softSwitch, hasStation, status);
|
||||
sprintf(e->nmeaBuffer.sentence, "$PAITXCFG,%d,%d,%d,%d,%d*", bsp_is_tx_present(), !hwSwitchOff, softSwitch, hasStation, status);
|
||||
Utils::completeNMEA(e->nmeaBuffer.sentence);
|
||||
EventQueue::instance().push(e);
|
||||
}
|
||||
@ -89,10 +91,13 @@ void TXScheduler::reportTXStatus()
|
||||
bool TXScheduler::isTXAllowed()
|
||||
{
|
||||
bool hwSwitchOff = bsp_is_tx_disabled();
|
||||
if ( hwSwitchOff )
|
||||
return false;
|
||||
|
||||
bool softSwitch = Configuration::instance().isTXEnabled();
|
||||
bool hasStation = Configuration::instance().isStationDataProvisioned();
|
||||
|
||||
return hwSwitchOff ? false : (softSwitch && hasStation);
|
||||
return softSwitch && hasStation;
|
||||
}
|
||||
|
||||
void TXScheduler::processEvent(const Event &e)
|
||||
@ -112,14 +117,9 @@ void TXScheduler::processEvent(const Event &e)
|
||||
if ( !RadioManager::instance().initialized() || mUTC == 0 )
|
||||
return;
|
||||
|
||||
#if TX_TEST_MODE
|
||||
return;
|
||||
#endif
|
||||
|
||||
if ( !isTXAllowed() )
|
||||
return;
|
||||
|
||||
|
||||
// Using a moving average of SOG to determine transmission rate
|
||||
static float alpha = 0.2;
|
||||
mAvgSpeed = mAvgSpeed * (1.0 - alpha) + mLastGPSFix.speed * alpha;
|
||||
@ -154,10 +154,6 @@ void TXScheduler::processEvent(const Event &e)
|
||||
|
||||
mUTC = e.clock.utc;
|
||||
|
||||
// Every minute on the minute ...
|
||||
if ( mUTC % 60 == 0 )
|
||||
reportTXStatus();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -188,7 +184,9 @@ void TXScheduler::sendNMEASentence(const char *sentence)
|
||||
|
||||
void TXScheduler::queueMessage18(VHFChannel channel)
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
char sentence[48];
|
||||
#endif
|
||||
|
||||
// If we don't have valid station data we don't do anything
|
||||
if ( mStationData.magic != STATION_DATA_MAGIC )
|
||||
@ -197,8 +195,10 @@ void TXScheduler::queueMessage18(VHFChannel channel)
|
||||
TXPacket *p1 = TXPacketPool::instance().newTXPacket(channel);
|
||||
if ( !p1 )
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
sprintf(sentence, "$PAISCHTX,18,%d*", TX_ALLOC_ERROR);
|
||||
sendNMEASentence(sentence);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@ -215,7 +215,9 @@ void TXScheduler::queueMessage18(VHFChannel channel)
|
||||
|
||||
void TXScheduler::queueMessage24(VHFChannel channel)
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
char sentence[48];
|
||||
#endif
|
||||
|
||||
// If we don't have valid station data we don't do anything
|
||||
if ( mStationData.magic != STATION_DATA_MAGIC )
|
||||
@ -224,8 +226,10 @@ void TXScheduler::queueMessage24(VHFChannel channel)
|
||||
TXPacket *p2 = TXPacketPool::instance().newTXPacket(channel);
|
||||
if ( !p2 )
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
sprintf(sentence, "$PAISCHTX,24A,%d*", TX_ALLOC_ERROR);
|
||||
sendNMEASentence(sentence);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@ -237,8 +241,10 @@ void TXScheduler::queueMessage24(VHFChannel channel)
|
||||
TXPacket *p3 = TXPacketPool::instance().newTXPacket(channel);
|
||||
if ( !p3 )
|
||||
{
|
||||
#if REPORT_TX_SCHEDULING
|
||||
sprintf(sentence, "$PAISCHTX,24B,%d*", TX_ALLOC_ERROR);
|
||||
sendNMEASentence(sentence);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -215,6 +215,7 @@ void Transceiver::onBitClock()
|
||||
else if ( mUTC && mUTC - mTXPacket->timestamp() >= MIN_MSG_18_TX_INTERVAL )
|
||||
{
|
||||
// The packet is way too old. Discard it.
|
||||
#if REPORT_TX_SCHEDULING
|
||||
Event *e = EventPool::instance().newEvent(PROPR_NMEA_SENTENCE);
|
||||
if ( e )
|
||||
{
|
||||
@ -222,7 +223,7 @@ void Transceiver::onBitClock()
|
||||
Utils::completeNMEA(e->nmeaBuffer.sentence);
|
||||
EventQueue::instance().push(e);
|
||||
}
|
||||
|
||||
#endif
|
||||
TXPacketPool::instance().deleteTXPacket(mTXPacket);
|
||||
mTXPacket = NULL;
|
||||
}
|
||||
|
@ -319,6 +319,11 @@ void HAL_MspInit(void)
|
||||
/* USER CODE END MspInit 1 */
|
||||
}
|
||||
|
||||
bool bsp_is_tx_present()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void bsp_set_rx_mode()
|
||||
{
|
||||
HAL_GPIO_WritePin(PA_BIAS_PORT, PA_BIAS_PIN, GPIO_PIN_RESET); // Kill the RF MOSFET bias voltage
|
||||
|
@ -56,13 +56,12 @@ void mainLoop()
|
||||
Configuration::instance().init();
|
||||
DataTerminal::instance().init();
|
||||
CommandProcessor::instance().init();
|
||||
LEDManager::instance().init();
|
||||
|
||||
RXPacketProcessor packetProcessor;
|
||||
GPS::instance().init();
|
||||
TXPacketPool::instance().init();
|
||||
TXScheduler::instance().init();
|
||||
RadioManager::instance().init();
|
||||
LEDManager::instance().init();
|
||||
|
||||
if ( !cliBootMode )
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user