mirror of
https://github.com/peterantypas/maiana.git
synced 2025-05-20 09:20:10 -07:00
Fixed mysterious hard fault
This commit is contained in:
parent
ceaf7de8e5
commit
ec3c02f093
@ -22,14 +22,15 @@ NoiseFloorDetector &NoiseFloorDetector::instance()
|
|||||||
NoiseFloorDetector::NoiseFloorDetector()
|
NoiseFloorDetector::NoiseFloorDetector()
|
||||||
: mUTC(0), mStartTime(0), mLastDumpTime(0)
|
: mUTC(0), mStartTime(0), mLastDumpTime(0)
|
||||||
{
|
{
|
||||||
|
mSorted.reserve(WINDOW_SIZE);
|
||||||
EventQueue::instance().addObserver(this, CLOCK_EVENT);
|
EventQueue::instance().addObserver(this, CLOCK_EVENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t NoiseFloorDetector::report(VHFChannel channel, uint8_t rssi)
|
void NoiseFloorDetector::report(VHFChannel channel, uint8_t rssi)
|
||||||
{
|
{
|
||||||
// If we don't have time yet, we certainly don't have fix so we can't be transmitting anyway, so no data collection
|
// If we don't have time yet, we certainly don't have fix so we can't be transmitting anyway, so no data collection
|
||||||
if ( mUTC == 0 )
|
if ( mUTC == 0 )
|
||||||
return 0xff;
|
return;
|
||||||
|
|
||||||
if ( mData.find(channel) == mData.end() ) {
|
if ( mData.find(channel) == mData.end() ) {
|
||||||
ChannelReadings r;
|
ChannelReadings r;
|
||||||
@ -38,7 +39,7 @@ uint8_t NoiseFloorDetector::report(VHFChannel channel, uint8_t rssi)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ChannelReadings &window = mData[channel];
|
ChannelReadings &window = mData[channel];
|
||||||
return processSample(window, rssi);
|
processSample(window, rssi);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t NoiseFloorDetector::getNoiseFloor(VHFChannel channel)
|
uint8_t NoiseFloorDetector::getNoiseFloor(VHFChannel channel)
|
||||||
@ -69,7 +70,7 @@ void NoiseFloorDetector::processEvent(Event *e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t NoiseFloorDetector::processSample(ChannelReadings &window, uint8_t rssi)
|
void NoiseFloorDetector::processSample(ChannelReadings &window, uint8_t rssi)
|
||||||
{
|
{
|
||||||
while ( window.size() >= WINDOW_SIZE )
|
while ( window.size() >= WINDOW_SIZE )
|
||||||
window.pop_back();
|
window.pop_back();
|
||||||
@ -79,7 +80,7 @@ uint8_t NoiseFloorDetector::processSample(ChannelReadings &window, uint8_t rssi)
|
|||||||
r.timestamp = mUTC;
|
r.timestamp = mUTC;
|
||||||
r.reading = rssi;
|
r.reading = rssi;
|
||||||
window.push_back(r);
|
window.push_back(r);
|
||||||
return 0xff;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert the reading at the start if it qualifies
|
// Insert the reading at the start if it qualifies
|
||||||
@ -92,11 +93,6 @@ uint8_t NoiseFloorDetector::processSample(ChannelReadings &window, uint8_t rssi)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( mUTC - mStartTime < 30 )
|
|
||||||
return 0xff;
|
|
||||||
|
|
||||||
return medianValue(window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t NoiseFloorDetector::medianValue(ChannelReadings &window)
|
uint8_t NoiseFloorDetector::medianValue(ChannelReadings &window)
|
||||||
@ -104,13 +100,12 @@ uint8_t NoiseFloorDetector::medianValue(ChannelReadings &window)
|
|||||||
if ( window.empty() )
|
if ( window.empty() )
|
||||||
return 0xff;
|
return 0xff;
|
||||||
|
|
||||||
vector<uint8_t> sorted;
|
mSorted.clear();
|
||||||
sorted.reserve(WINDOW_SIZE);
|
|
||||||
for ( ChannelReadings::iterator i = window.begin(); i != window.end(); ++i )
|
for ( ChannelReadings::iterator i = window.begin(); i != window.end(); ++i )
|
||||||
sorted.push_back(i->reading);
|
mSorted.push_back(i->reading);
|
||||||
|
|
||||||
sort(sorted.begin(), sorted.end());
|
sort(mSorted.begin(), mSorted.end());
|
||||||
return sorted[sorted.size()/2];
|
return mSorted[mSorted.size()/2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
// Called directly by each receiver to report every RSSI reading at every SOTDMA slot, returns latest noise floor or 0xff if not enough data exists
|
// Called directly by each receiver to report every RSSI reading at every SOTDMA slot, returns latest noise floor or 0xff if not enough data exists
|
||||||
uint8_t report(VHFChannel channel, uint8_t rssi);
|
void report(VHFChannel channel, uint8_t rssi);
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
NoiseFloorDetector();
|
NoiseFloorDetector();
|
||||||
uint8_t processSample(ChannelReadings &window, uint8_t rssi);
|
void processSample(ChannelReadings &window, uint8_t rssi);
|
||||||
uint8_t medianValue(ChannelReadings &window);
|
uint8_t medianValue(ChannelReadings &window);
|
||||||
void dump();
|
void dump();
|
||||||
private:
|
private:
|
||||||
@ -48,6 +48,8 @@ private:
|
|||||||
time_t mStartTime;
|
time_t mStartTime;
|
||||||
time_t mLastDumpTime;
|
time_t mLastDumpTime;
|
||||||
ChannelData mData;
|
ChannelData mData;
|
||||||
|
vector<uint8_t> mSorted;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* NOISEFLOORDETECTOR_HPP_ */
|
#endif /* NOISEFLOORDETECTOR_HPP_ */
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is defined, the device transmits low-power carrier at a nominal frequency of 162.075Mhz,
|
* If this is defined, the device transmits low-power carrier on channel 86 (161.925MHz).
|
||||||
* two channels above AIS. This is meant to be used for crystal calibration only
|
* This is meant to be used for crystal calibration only
|
||||||
*/
|
*/
|
||||||
//#define CALIBRATION_MODE 1
|
//#define CALIBRATION_MODE 1
|
||||||
|
|
||||||
@ -36,7 +36,7 @@
|
|||||||
#ifdef TX_TEST_MODE
|
#ifdef TX_TEST_MODE
|
||||||
#define TX_POWER_LEVEL PWR_P16
|
#define TX_POWER_LEVEL PWR_P16
|
||||||
#else
|
#else
|
||||||
#define TX_POWER_LEVEL PWR_M10
|
#define TX_POWER_LEVEL PWR_M27
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -44,7 +44,7 @@
|
|||||||
#define OUTPUT_GPS_NMEA
|
#define OUTPUT_GPS_NMEA
|
||||||
#define ENABLE_PRINTF2
|
#define ENABLE_PRINTF2
|
||||||
|
|
||||||
// Some AIS messages can occupy 5 time slots (5x256 = 1280). We call it quits at 2 slots.
|
// Some AIS messages can occupy 5 time slots (5x256 = 1280). Nothing we care about exceeds 2 slots.
|
||||||
#define MAX_AIS_RX_PACKET_SIZE 512
|
#define MAX_AIS_RX_PACKET_SIZE 512
|
||||||
|
|
||||||
|
|
||||||
@ -54,7 +54,7 @@
|
|||||||
// For testing, it's necessary to transmit longer packets for a basic RTL-SDR receiver to not "miss" them.
|
// For testing, it's necessary to transmit longer packets for a basic RTL-SDR receiver to not "miss" them.
|
||||||
#define MAX_AIS_TX_PACKET_SIZE 1280
|
#define MAX_AIS_TX_PACKET_SIZE 1280
|
||||||
#else
|
#else
|
||||||
// As a class B transponder, we never transmit anything bigger than 256 bits
|
// As a class B transponder, we never transmit anything bigger than 240 bits.
|
||||||
#define MAX_AIS_TX_PACKET_SIZE 300
|
#define MAX_AIS_TX_PACKET_SIZE 300
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
10
src/main.cpp
10
src/main.cpp
@ -15,8 +15,9 @@
|
|||||||
#include "TXScheduler.hpp"
|
#include "TXScheduler.hpp"
|
||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
#include "system_stm32f30x.h"
|
#include "system_stm32f30x.h"
|
||||||
|
#include "core_cm4.h"
|
||||||
#include "stm32f30x.h"
|
#include "stm32f30x.h"
|
||||||
|
#include <diag/Trace.h>
|
||||||
#include "DataTerminal.hpp"
|
#include "DataTerminal.hpp"
|
||||||
#include "TXScheduler.hpp"
|
#include "TXScheduler.hpp"
|
||||||
#include "DebugPrinter.hpp"
|
#include "DebugPrinter.hpp"
|
||||||
@ -57,6 +58,13 @@ main(int argc, char* argv[])
|
|||||||
// at high speed.
|
// at high speed.
|
||||||
printf2_Init(230400);
|
printf2_Init(230400);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
// Disable buffered memory writes to debug imprecise bus faults
|
||||||
|
SCnSCB->ACTLR |= SCnSCB_ACTLR_DISDEFWBUF_Msk;
|
||||||
|
trace_printf("ACTLR: %.8x\n", SCnSCB->ACTLR);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
EEPROM::instance().init();
|
EEPROM::instance().init();
|
||||||
/*
|
/*
|
||||||
struct StationData __d;
|
struct StationData __d;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user