1
0
mirror of https://github.com/peterantypas/maiana.git synced 2025-05-31 23:00:16 -07:00

That wasn't a bare metal build :(

This commit is contained in:
Peter Antypas 2020-11-04 10:04:23 -08:00
parent ddf5e39e9b
commit 512c2c892a
11 changed files with 137 additions and 37 deletions

View File

@ -48,7 +48,7 @@ public:
/* /*
* We push events here to be processed by the dispatching task * We push events here to be processed by the dispatching task
*/ */
void push(Event *event); bool push(Event *event);
/* /*
* This method must be called repeatedly by an RTOS task or main() (never an ISR) * This method must be called repeatedly by an RTOS task or main() (never an ISR)

View File

@ -0,0 +1,32 @@
/*
* Stats.hpp
*
* Created on: Nov 4, 2020
* Author: peter
*/
#ifndef INC_STATS_HPP_
#define INC_STATS_HPP_
#include <stdint.h>
#include "EventQueue.hpp"
class Stats : public EventConsumer
{
public:
static Stats &instance();
void init();
void processEvent(const Event &e);
private:
Stats();
public:
int eventQueuePopFailures = 0;
int eventQueuePushFailures = 0;
int rxPacketPoolPopFailures = 0;
};
#endif /* INC_STATS_HPP_ */

View File

@ -24,8 +24,8 @@
#include "radio_config.h" #include "radio_config.h"
#include "TXPowerSettings.h" #include "TXPowerSettings.h"
// Set to non-zero to enable FreeRTOS instead of "bare metal". Doesn't add much value at the moment. // Define to enable FreeRTOS instead of "bare metal". Doesn't add much value at the moment.
#define RTOS 0 //#define RTOS
/** /**
* If this is defined, the device transmits carrier on channel 87 (161.975MHz) for 1 second after reset. * If this is defined, the device transmits carrier on channel 87 (161.975MHz) for 1 second after reset.
@ -74,7 +74,7 @@
#define MAX_TX_PACKETS_IN_QUEUE 4 #define MAX_TX_PACKETS_IN_QUEUE 4
// Headroom above noise floor (in dB) that constitutes a clear channel for transmission // Headroom above noise floor (in dB) that constitutes a clear channel for transmission
#define TX_CCA_HEADROOM 6 #define TX_CCA_HEADROOM 3
// Transmission intervals in seconds // Transmission intervals in seconds
#define MIN_TX_INTERVAL 5 #define MIN_TX_INTERVAL 5

View File

@ -29,9 +29,6 @@
#include "task.h" #include "task.h"
#include "bsp.hpp" #include "bsp.hpp"
#define EVENT_QUEUE_SIZE 50
//static Event* __queue[EVENT_QUEUE_SIZE];
EventQueue &EventQueue::instance() EventQueue &EventQueue::instance()
{ {
@ -46,34 +43,28 @@ EventQueue::EventQueue()
void EventQueue::init() void EventQueue::init()
{ {
//mQueueHandle = xQueueCreateStatic(EVENT_QUEUE_SIZE, sizeof(Event*), (uint8_t*)&__queue[0], &mQueue);
//configASSERT(mQueueHandle);
} }
void EventQueue::push(Event *e) bool EventQueue::push(Event *e)
{ {
//if ( xTaskGetSchedulerState() != taskSCHEDULER_RUNNING )
//return;
//BaseType_t xHighPriorityTaskWoken = pdTRUE;
if ( Utils::inISR() ) if ( Utils::inISR() )
{ {
//bsp_signal_high();
//xQueueSendFromISR(mQueueHandle, &e, &xHighPriorityTaskWoken);
//bsp_signal_low();
if ( !mISRQueue.push(e) ) if ( !mISRQueue.push(e) )
EventPool::instance().deleteEvent(e); {
#if 0 EventPool::instance().deleteEvent(e);
if ( xHighPriorityTaskWoken ) return false;
portYIELD_FROM_ISR(xHighPriorityTaskWoken); }
#endif
} }
else else
{ {
//xQueueSend(mQueueHandle, &e, 0);
if ( !mTaskQueue.push(e) ) if ( !mTaskQueue.push(e) )
EventPool::instance().deleteEvent(e); {
EventPool::instance().deleteEvent(e);
return false;
}
} }
return true;
} }
void EventQueue::addObserver(EventConsumer *c, uint32_t eventMask) void EventQueue::addObserver(EventConsumer *c, uint32_t eventMask)

View File

@ -205,9 +205,13 @@ uint8_t RFIC::readRSSI()
{ {
MODEM_STATUS_REPLY s; MODEM_STATUS_REPLY s;
if ( sendCmd(GET_MODEM_STATUS, NULL, 0, &s, sizeof s) ) if ( sendCmd(GET_MODEM_STATUS, NULL, 0, &s, sizeof s) )
return s.CurrentRSSI; {
return s.CurrentRSSI;
}
else else
return 0; {
return 0;
}
} }
bool RFIC::checkStatus() bool RFIC::checkStatus()

View File

@ -24,6 +24,8 @@
#include "EventQueue.hpp" #include "EventQueue.hpp"
#include "NoiseFloorDetector.hpp" #include "NoiseFloorDetector.hpp"
#include "bsp.hpp" #include "bsp.hpp"
#include "Stats.hpp"
Receiver::Receiver(GPIO_TypeDef *sdnPort, uint32_t sdnPin, GPIO_TypeDef *csPort, uint32_t csPin, Receiver::Receiver(GPIO_TypeDef *sdnPort, uint32_t sdnPin, GPIO_TypeDef *csPort, uint32_t csPin,
GPIO_TypeDef *dataPort, uint32_t dataPin, GPIO_TypeDef *dataPort, uint32_t dataPin,
@ -119,13 +121,16 @@ void Receiver::resetBitScanner()
void Receiver::onBitClock() void Receiver::onBitClock()
{ {
bsp_signal_high();
++mSlotBitNumber; ++mSlotBitNumber;
// Don't waste time processing bits when the transceiver is transmitting // Don't waste time processing bits when the transceiver is transmitting
if ( gRadioState == RADIO_TRANSMITTING ) if ( gRadioState == RADIO_TRANSMITTING )
return; {
bsp_signal_low();
return;
}
bsp_signal_high();
if ( !mRXPacket ) if ( !mRXPacket )
{ {
@ -153,8 +158,7 @@ void Receiver::onBitClock()
else if ( mTimeSlot != 0xffffffff && mSlotBitNumber != 0xffff && else if ( mTimeSlot != 0xffffffff && mSlotBitNumber != 0xffff &&
mTimeSlot % 17 == mChipID && mSlotBitNumber == CCA_SLOT_BIT - 1 ) mTimeSlot % 17 == mChipID && mSlotBitNumber == CCA_SLOT_BIT - 1 )
{ {
uint8_t rssi = reportRSSI(); reportRSSI();
mRXPacket->setRSSI(rssi);
} }
#endif #endif
@ -224,13 +228,13 @@ Receiver::Action Receiver::processNRZIBit(uint8_t bit)
// Start over // Start over
return RESTART_RX; return RESTART_RX;
} }
#if 0
// We can never have 7 consecutive "1" bits in a proper NRZI encoded packet
if ( mOneBitCount >= 7 ) if ( mOneBitCount >= 7 )
{ {
// Bad packet!
return RESTART_RX; return RESTART_RX;
} }
#endif
mLastNRZIBit = bit; mLastNRZIBit = bit;
mBitWindow <<= 1; mBitWindow <<= 1;
mBitWindow |= decodedBit; mBitWindow |= decodedBit;
@ -302,12 +306,23 @@ void Receiver::pushPacket()
{ {
//bsp_signal_high(); //bsp_signal_high();
p->rxPacket = mRXPacket; p->rxPacket = mRXPacket;
EventQueue::instance().push(p); if ( !EventQueue::instance().push(p) )
{
// Count this
++Stats::instance().eventQueuePushFailures;
}
//bsp_signal_low(); //bsp_signal_low();
mRXPacket = EventPool::instance().newRXPacket(); mRXPacket = EventPool::instance().newRXPacket();
if ( !mRXPacket )
{
// TODO: Count this
++Stats::instance().rxPacketPoolPopFailures;
}
} }
else else
{ {
// TODO: Count this
++Stats::instance().eventQueuePopFailures;
/** /**
* We're out of resources so just keep using the existing packet. * We're out of resources so just keep using the existing packet.
* If this happens, the most logical outcome is a watchdog reset * If this happens, the most logical outcome is a watchdog reset
@ -323,9 +338,11 @@ void Receiver::pushPacket()
*/ */
uint8_t Receiver::reportRSSI() uint8_t Receiver::reportRSSI()
{ {
//bsp_signal_high();
uint8_t rssi = readRSSI(); uint8_t rssi = readRSSI();
char channel = AIS_CHANNELS[mChannel].designation; char channel = AIS_CHANNELS[mChannel].designation;
NoiseFloorDetector::instance().report(channel, rssi); NoiseFloorDetector::instance().report(channel, rssi);
//bsp_signal_low();
return rssi; return rssi;
} }

View File

@ -0,0 +1,48 @@
/*
* Stats.cpp
*
* Created on: Nov 4, 2020
* Author: peter
*/
#include "Stats.hpp"
#include "Utils.hpp"
#include "EventQueue.hpp"
static int count = 0;
Stats &Stats::instance()
{
static Stats __instance;
return __instance;
}
Stats::Stats()
{
EventQueue::instance().addObserver(this, CLOCK_EVENT);
}
void Stats::init()
{
}
void Stats::processEvent(const Event &e)
{
++count;
if ( count % 60 == 0 )
{
char buff[32];
sprintf(buff, "$PAISTC,%d,%d,%d*", eventQueuePopFailures, eventQueuePushFailures, rxPacketPoolPopFailures);
Utils::completeNMEA(buff);
printf_serial(buff);
count = 1;
}
}

View File

@ -217,7 +217,7 @@ void Transceiver::onBitClock()
} }
else if ( mUTC && mSlotBitNumber == CCA_SLOT_BIT && mTXPacket->channel() == mChannel ) else if ( mUTC && mSlotBitNumber == CCA_SLOT_BIT && mTXPacket->channel() == mChannel )
{ {
int rssi = mRXPacket->rssi(); int rssi = readRSSI();
int nf = NoiseFloorDetector::instance().getNoiseFloor(AIS_CHANNELS[mChannel].designation); int nf = NoiseFloorDetector::instance().getNoiseFloor(AIS_CHANNELS[mChannel].designation);
if ( rssi <= nf + TX_CCA_HEADROOM ) if ( rssi <= nf + TX_CCA_HEADROOM )
{ {

View File

@ -337,13 +337,16 @@ void HAL_MspInit(void)
/* UsageFault_IRQn interrupt configuration */ /* UsageFault_IRQn interrupt configuration */
HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0); HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
/* SVCall_IRQn interrupt configuration */ /* SVCall_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SVCall_IRQn, 2, 0); HAL_NVIC_SetPriority(SVCall_IRQn, 10, 0);
/* DebugMonitor_IRQn interrupt configuration */ /* DebugMonitor_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0); HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
/* PendSV_IRQn interrupt configuration */ /* PendSV_IRQn interrupt configuration */
HAL_NVIC_SetPriority(PendSV_IRQn, 2, 0); HAL_NVIC_SetPriority(PendSV_IRQn, 10, 0);
/* SysTick_IRQn interrupt configuration */ /* SysTick_IRQn interrupt configuration */
#ifndef RTOS
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
#endif
/* USER CODE BEGIN MspInit 1 */ /* USER CODE BEGIN MspInit 1 */

View File

@ -28,6 +28,9 @@
#include "CommandProcessor.hpp" #include "CommandProcessor.hpp"
#include "bsp.hpp" #include "bsp.hpp"
#include "printf_serial.h" #include "printf_serial.h"
#include "Stats.hpp"
#ifdef RTOS #ifdef RTOS
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
@ -59,6 +62,7 @@ void mainTask(void *params)
Configuration::instance().init(); Configuration::instance().init();
CommandProcessor::instance().init(); CommandProcessor::instance().init();
DataTerminal::instance().init(); DataTerminal::instance().init();
Stats::instance().init();
RXPacketProcessor packetProcessor; RXPacketProcessor packetProcessor;

View File

@ -134,6 +134,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
/* USER CODE END Callback 0 */ /* USER CODE END Callback 0 */
if (htim->Instance == TIM6) { if (htim->Instance == TIM6) {
HAL_IncTick(); HAL_IncTick();
HAL_SYSTICK_IRQHandler();
} }
/* USER CODE BEGIN Callback 1 */ /* USER CODE BEGIN Callback 1 */