From 0415edfbcf0ce8cc2a71ca3f2ec191002cfbac12 Mon Sep 17 00:00:00 2001 From: ezratl Date: Tue, 5 Mar 2019 21:20:52 -0500 Subject: [PATCH] Created demo data for testing --- piScan_backend/src/core/ScannerSM.cpp | 30 +++++++++++++++---- piScan_backend/src/core/StateMachine.cpp | 8 ++--- piScan_backend/src/demo_system.h | 35 ++++++++++++++++++++++ piScan_backend/src/drivers/rtl_fm.c | 15 +++++++--- piScan_backend/src/drivers/rtl_fm.h | 5 +++- piScan_backend/src/piScan_backend.cpp | 9 +++++- piScan_backend/src/scan/Entry.h | 20 ++++++++----- piScan_backend/src/scan/RadioSystem.h | 10 +++++-- piScan_backend/src/scan/SystemList.h | 9 ++++-- piScan_backend/src/sigproc/Demodulator.cpp | 12 ++++++-- piScan_backend/src/sigproc/Demodulator.h | 7 +++-- piScan_backend/src/sigproc/Tuner.h | 3 +- piScan_backend/src/tests/test_RtlFm.cpp | 2 +- 13 files changed, 128 insertions(+), 37 deletions(-) create mode 100644 piScan_backend/src/demo_system.h diff --git a/piScan_backend/src/core/ScannerSM.cpp b/piScan_backend/src/core/ScannerSM.cpp index bdfeb3c..28506f7 100644 --- a/piScan_backend/src/core/ScannerSM.cpp +++ b/piScan_backend/src/core/ScannerSM.cpp @@ -8,6 +8,9 @@ #include #include "loguru.hpp" +//TODO temporary +#include "rtl_fm.h" + #define DELAY_TIMEOUT 2.0 ScannerSM::ScannerSM(MessageReceiver& central, SystemList& dataSource) : @@ -67,6 +70,8 @@ void ScannerSM::ST_Load(EventData* data){ DLOG_F(9, "ST_Load"); //file read and system tree population + _currentSystem = _systems[0]; + // do not issue event - SM will wait until an event is generated before proceeding //InternalEvent(ST_SCAN); Message* message = new ControllerMessage(SCANNER_SM, ControllerMessage::NOTIFY_READY); @@ -95,8 +100,12 @@ void ScannerSM::ST_Scan(EventData* data){ assert(_currentEntry != NULL); if(_currentEntry->hasSignal()){ + LOG_F(1, "Signal found: %s", _currentEntry->getTag().c_str()); InternalEvent(ST_RECEIVE); } + else{ + InternalEvent(ST_SCAN); + } } @@ -130,6 +139,8 @@ void ScannerSM::ST_Hold(EventData* data){ InternalEvent(ST_SCAN); } + /* wait for 1ms */ + usleep(1000); } void ScannerSM::ST_Receive(EventData* data){ @@ -144,7 +155,11 @@ void ScannerSM::ST_Receive(EventData* data){ LOG_F(1, "Signal lost"); InternalEvent(ST_HOLD); timeoutStart = std::time(nullptr); + return; } + + /* wait for 1ms */ + usleep(1000); } void ScannerSM::ST_Manual(EventData* data){ @@ -167,35 +182,38 @@ void ScannerSM::ST_Stopped(EventData* data){ } void ScannerSM::_broadcastSystemContext(RadioSystem* sys){ - assert(sys != NULL); + /*assert(sys != NULL); //TODO not thread safe _currentContext.state = static_cast(currentState); _currentContext.system = sys; _currentContext.entry = nullptr; Message* message = new ServerMessage(SCANNER_SM, ServerMessage::CONTEXT_UPDATE, &_currentContext); - _centralQueue.giveMessage(*message); + _centralQueue.giveMessage(*message);*/ } void ScannerSM::_broadcastEntryContext(RadioSystem* sys, Entry* entry){ - assert(sys != NULL); + /*assert(sys != NULL); assert(entry != NULL); //TODO not thread safe _currentContext.state = static_cast(currentState); _currentContext.system = sys; _currentContext.entry = entry; Message* message = new ServerMessage(SCANNER_SM, ServerMessage::CONTEXT_UPDATE, &_currentContext); - _centralQueue.giveMessage(*message); + _centralQueue.giveMessage(*message);*/ } void ScannerSM::_enableAudioOut(bool en){ - Message* message; + /*Message* message; if(en){ message = new AudioMessage(SCANNER_SM, AudioMessage::ENABLE_OUTPUT); } else{ message = new AudioMessage(SCANNER_SM, AudioMessage::DISABLE_OUTPUT); } - _centralQueue.giveMessage(*message); + _centralQueue.giveMessage(*message);*/ + + //TODO temporary + rtl_fm_mute((int)(!en)); } void ScannerSM::giveMessage(Message& message) { diff --git a/piScan_backend/src/core/StateMachine.cpp b/piScan_backend/src/core/StateMachine.cpp index 466b211..cfffdbe 100644 --- a/piScan_backend/src/core/StateMachine.cpp +++ b/piScan_backend/src/core/StateMachine.cpp @@ -70,11 +70,11 @@ void StateMachine::StateEngine(void) _cv.wait(lock, [this]{return this->_eventGenerated;}); // while events are being generated keep executing states - while (_eventGenerated) { + if (_eventGenerated) { pDataTemp = _pEventData; // copy of event data pointer _pEventData = NULL; // event data used up, reset ptr _eventGenerated = false; // event used up, reset flag - lock.unlock(); + //lock.unlock(); assert(currentState < _maxStates); @@ -89,8 +89,8 @@ void StateMachine::StateEngine(void) } if(!_run) return; - if(_eventGenerated) - lock.lock(); + //if(!_eventGenerated) + //lock.unlock(); } // TBD - unlock semaphore here diff --git a/piScan_backend/src/demo_system.h b/piScan_backend/src/demo_system.h new file mode 100644 index 0000000..fa78e90 --- /dev/null +++ b/piScan_backend/src/demo_system.h @@ -0,0 +1,35 @@ +/* + * demo_system.h + * + * Created on: Mar 5, 2019 + * Author: ezra + */ + +#include "RadioSystem.h" + +#ifndef DEMO_SYSTEM_H_ +#define DEMO_SYSTEM_H_ + +class DemoSystem : public AnalogSystem { +public: + DemoSystem() : AnalogSystem() { + entries.push_back(new FMChannel(453700000, std::string("Pit Fire 1"), false, true)); + entries.push_back(new FMChannel(453850000, std::string("Pit Fire 2"), false, false)); + entries.push_back(new FMChannel(462950000, std::string("Pit EMS 1"), false, true)); + entries.push_back(new FMChannel(453100000, std::string("Pit PD 1,2"), false, false)); + entries.push_back(new FMChannel(453250000, std::string("Pit PD 3,6"), false, false)); + entries.push_back(new FMChannel(453400000, std::string("Pit PD 4,5"), false, false)); + entries.push_back(new FMChannel(453150000, std::string("Pitt Police"), false, false)); + entries.push_back(new FMChannel(471312500, std::string("East EMS"), false, true)); + entries.push_back(new FMChannel(462450000, std::string("CMU Police"), false, false)); + entries.push_back(new FMChannel(471337500, std::string("South EMS"), false, true)); + entries.push_back(new FMChannel(470437500, std::string("West EMS"), false, true)); + + } + + ~DemoSystem() {}; +}; + + + +#endif /* DEMO_SYSTEM_H_ */ diff --git a/piScan_backend/src/drivers/rtl_fm.c b/piScan_backend/src/drivers/rtl_fm.c index 94c91c8..3910989 100644 --- a/piScan_backend/src/drivers/rtl_fm.c +++ b/piScan_backend/src/drivers/rtl_fm.c @@ -901,10 +901,16 @@ void software_agc(struct demod_state *d) } } +//TODO temporary +int do_squelch = 0; +void rtl_fm_mute(int mute){ + do_squelch = mute; +} + void full_demod(struct demod_state *d) { int i, ds_p; - int do_squelch = 0; + //int do_squelch = 0; int sr = 0; if(d->rotate_enable) { translate(d); @@ -1318,8 +1324,8 @@ int rtl_fm_setfreq(uint32_t freq){ assert(freq > 0); int r; optimal_settings(freq, demod.rate_in); - //r = rtlsdr_set_center_freq(dongle.dev, freq); - r = verbose_set_frequency(dongle.dev, dongle.freq); + r = rtlsdr_set_center_freq(dongle.dev, dongle.freq); + //r = verbose_set_frequency(dongle.dev, dongle.freq); dongle.mute = BUFFER_DUMP; return r; } @@ -1558,7 +1564,7 @@ int generate_header(struct demod_state *d, struct output_state *o) //TODO modified signature //int main(int argc, char **argv) -int rtl_fm_init(void* audioBuffer, size_t bufferSize, int sampleRate) +int rtl_fm_init(void* audioBuffer, size_t bufferSize, int sampleRate, int gain) { #ifndef _WIN32 struct sigaction sigact; @@ -1575,6 +1581,7 @@ int rtl_fm_init(void* audioBuffer, size_t bufferSize, int sampleRate) controller.freqs[controller.freq_len] = 100000000; controller.freq_len++; + dongle.gain = gain; output.rate = sampleRate; demod.rate_out2 = sampleRate; diff --git a/piScan_backend/src/drivers/rtl_fm.h b/piScan_backend/src/drivers/rtl_fm.h index e023837..ff103dd 100644 --- a/piScan_backend/src/drivers/rtl_fm.h +++ b/piScan_backend/src/drivers/rtl_fm.h @@ -25,12 +25,15 @@ enum mode_demod { #ifdef __cplusplus extern "C" { #endif - int rtl_fm_init(void* audioBuffer, size_t bufferSize, int sampleRate); + int rtl_fm_init(void* audioBuffer, size_t bufferSize, int sampleRate, int gain); int rtl_fm_deinit(); int rtl_fm_setfreq(uint32_t freq); int rtl_fm_setmode(enum mode_demod newMode); float rtl_fm_get_rssi(); + + //TODO temporary + void rtl_fm_mute(int mute); #ifdef __cplusplus } #endif diff --git a/piScan_backend/src/piScan_backend.cpp b/piScan_backend/src/piScan_backend.cpp index 6aea8b9..9c57243 100644 --- a/piScan_backend/src/piScan_backend.cpp +++ b/piScan_backend/src/piScan_backend.cpp @@ -14,6 +14,8 @@ using namespace std; #include "ScannerSM.h" #include "SystemList.h" +#include "demo_system.h" + //enum { // SYSTEM_CONTROL, // SCANNER_SM, @@ -145,6 +147,7 @@ public: LOG_F(INFO, "System initialized"); _connectionManager.allowConnections(); + _scanner.startScan(); sysRun = true; } @@ -274,7 +277,7 @@ void setDemodulator(DemodInterface* demod) { int main(int argc, char **argv) { loguru::init(argc, argv); loguru::add_file(LOG_PATH, loguru::Truncate, loguru::Verbosity_2); - loguru::g_stderr_verbosity = loguru::Verbosity_MAX; + //loguru::g_stderr_verbosity = loguru::Verbosity_MAX; signal(SIGINT, sigHandler); signal(SIGTERM, sigHandler); @@ -287,6 +290,10 @@ int main(int argc, char **argv) { messageManager.setReceiver(SERVER_MAN, &connectionManager); //messageManager.setReceiver(AUDIO_MAN, &audioControl); + //DEMO + AnalogSystem demo = DemoSystem(); + scanSystems.addSystem(dynamic_cast(demo)); + setDemodulator(&demod); messageManager.start(); diff --git a/piScan_backend/src/scan/Entry.h b/piScan_backend/src/scan/Entry.h index 7d8c094..116fbe7 100644 --- a/piScan_backend/src/scan/Entry.h +++ b/piScan_backend/src/scan/Entry.h @@ -14,12 +14,12 @@ class Entry { public: - Entry(std::string tag, bool lo, bool del); + Entry(std::string tag, bool lo, bool del) : tag(tag), lockedOut(lo), scanDelay(del){}; virtual ~Entry() {}; - std::string* getTag() { return &tag; } + std::string getTag() { return tag; } virtual std::string getModulation() = 0; - virtual std::string* getIdentity() = 0; + virtual std::string getIdentity() = 0; bool isLockedOut() { return lockedOut; } bool useDelay() { return scanDelay; } void lockout(bool val) { lockedOut = val; } @@ -36,7 +36,7 @@ protected: class Channel: public Entry { public: - Channel(unsigned long freq, char* tag, bool lo, bool del) : Entry(tag, lo, del), frequency(freq){} + Channel(unsigned long freq, std::string tag, bool lo, bool del) : Entry(tag, lo, del), frequency(freq){} virtual ~Channel() {}; protected: const unsigned long frequency; @@ -44,19 +44,23 @@ protected: class FMChannel : public Channel { public: - FMChannel(unsigned long freq, char* tag, bool lo, bool del) : Channel(freq, tag, lo, del){} + FMChannel(unsigned long freq, std::string tag, bool lo, bool del) : Channel(freq, tag, lo, del){} ~FMChannel() {}; std::string getModulation() { return "FM"; } + std::string getIdentity() { + return tag; + } + bool hasSignal(); }; class PLChannel: public FMChannel { public: - PLChannel(unsigned long freq, float tn, char* tag, bool lo, bool del) : + PLChannel(unsigned long freq, float tn, std::string tag, bool lo, bool del) : FMChannel(freq, tag, lo, del), tone(tn) { } ~PLChannel() {}; @@ -68,7 +72,7 @@ protected: class DCChannel : public FMChannel { public: - DCChannel(unsigned long freq, unsigned int tn, char* tag, bool lo, bool del) : + DCChannel(unsigned long freq, unsigned int tn, std::string tag, bool lo, bool del) : FMChannel(freq, tag, lo, del), code(tn) { } ~DCChannel() {}; @@ -80,7 +84,7 @@ protected: class AMChannel : public Channel { public: - AMChannel(unsigned long freq, char* tag, bool lo, bool del) : Channel(freq, tag, lo, del){} + AMChannel(unsigned long freq, std::string tag, bool lo, bool del) : Channel(freq, tag, lo, del){} ~AMChannel() {}; bool hasSignal() { return false; }; diff --git a/piScan_backend/src/scan/RadioSystem.h b/piScan_backend/src/scan/RadioSystem.h index d3c9c6f..ed7bd22 100644 --- a/piScan_backend/src/scan/RadioSystem.h +++ b/piScan_backend/src/scan/RadioSystem.h @@ -25,7 +25,7 @@ public: virtual Entry* operator[](size_t pos) = 0; - size_t size() { return _size; } + virtual size_t size() { return _size; } private: //const RadioSystemType type; const std::string tag; @@ -37,10 +37,14 @@ public: AnalogSystem() : RadioSystem() {}; ~AnalogSystem() {}; - Entry* operator[](size_t pos) { return &entries[pos]; }; + Entry* operator[](size_t pos) { return entries[pos]; }; + + size_t size() { + return entries.size(); + } protected: - std::vector entries; + std::vector entries; }; #endif /* RADIOSYSTEM_H_ */ diff --git a/piScan_backend/src/scan/SystemList.h b/piScan_backend/src/scan/SystemList.h index 1ccac07..b1fa5dc 100644 --- a/piScan_backend/src/scan/SystemList.h +++ b/piScan_backend/src/scan/SystemList.h @@ -17,12 +17,15 @@ public: SystemList(); ~SystemList(); - RadioSystem* operator[](size_t pos) { return nullptr; }; + RadioSystem* operator[](size_t pos) { return _systems[pos]; }; - size_t size(){ return _size; } + size_t size(){ return _systems.size(); } + void addSystem(RadioSystem& system){ + _systems.push_back(&system); + } private: std::vector _systems; - size_t _size = 0; + //size_t _size = 0; }; #endif /* SYSTEMLIST_H_ */ diff --git a/piScan_backend/src/sigproc/Demodulator.cpp b/piScan_backend/src/sigproc/Demodulator.cpp index 43a54b0..a223faa 100644 --- a/piScan_backend/src/sigproc/Demodulator.cpp +++ b/piScan_backend/src/sigproc/Demodulator.cpp @@ -26,9 +26,17 @@ void Demodulator::stop(){ LOG_F(1, "Demodulator stopped"); } -bool Demodulator::setFrequency(unsigned long freq) { - if(_tuner.setFrequency(freq) == TunerStatus::TUNER_SUCCESS) +bool Demodulator::setFrequency(uint32_t freq) { + if(freq == _currentFreq){ + DLOG_F(8, "Frequency already set"); return true; + } + if(_tuner.setFrequency(freq) == TunerStatus::TUNER_SUCCESS){ + _currentFreq = freq; + return true; + } + + LOG_F(ERROR, "Tuning error"); return false; } diff --git a/piScan_backend/src/sigproc/Demodulator.h b/piScan_backend/src/sigproc/Demodulator.h index 972fb4c..f2b47e7 100644 --- a/piScan_backend/src/sigproc/Demodulator.h +++ b/piScan_backend/src/sigproc/Demodulator.h @@ -11,13 +11,13 @@ #include "messages.h" #include "Tuner.h" -#define DEFAULT_SQUELCH 65.0 +#define DEFAULT_SQUELCH 70.0 class DemodInterface { public: virtual ~DemodInterface() {}; - virtual bool setFrequency(unsigned long freq) = 0; + virtual bool setFrequency(uint32_t freq) = 0; virtual float getRssi() = 0; virtual float getDecodedPL() = 0; virtual unsigned int getDecodedDC() = 0; @@ -40,9 +40,10 @@ private: MessageReceiver& _centralQueue; Tuner& _tuner; float _squelchLevel = DEFAULT_SQUELCH; + uint32_t _currentFreq = 0; void giveMessage(Message& message) {}; - bool setFrequency(unsigned long freq); + bool setFrequency(uint32_t freq); float getRssi(); float getDecodedPL(); unsigned int getDecodedDC(); diff --git a/piScan_backend/src/sigproc/Tuner.h b/piScan_backend/src/sigproc/Tuner.h index 713bbe5..fbce39a 100644 --- a/piScan_backend/src/sigproc/Tuner.h +++ b/piScan_backend/src/sigproc/Tuner.h @@ -15,6 +15,7 @@ #include "loguru.hpp" #define RTL_DEMOD_WAIT 50000 +#define RTL_GAIN -100 enum TunerStatus { TUNER_ERROR = -1, @@ -56,7 +57,7 @@ public: TunerStatus init() { LOG_F(2, "Starting rtl_fm"); - if(rtl_fm_init(nullptr, 0, 12000)) + if(rtl_fm_init(nullptr, 0, 12000, RTL_GAIN)) return TUNER_ERROR; return TUNER_SUCCESS; } diff --git a/piScan_backend/src/tests/test_RtlFm.cpp b/piScan_backend/src/tests/test_RtlFm.cpp index e1bf7a8..0f6770e 100644 --- a/piScan_backend/src/tests/test_RtlFm.cpp +++ b/piScan_backend/src/tests/test_RtlFm.cpp @@ -46,7 +46,7 @@ int main(int argc, char** argv){ timespec time1, time2; timespec_get(&time1, TIME_UTC); - if(rtl_fm_init((void*)0, (size_t)0, 12000)) + if(rtl_fm_init((void*)0, (size_t)0, 12000, 30)) return 1; timespec_get(&time2, TIME_UTC); fprintf(stderr, "%li\n", (time2.tv_nsec - time1.tv_nsec)/1000);