PiScan/src/events.h

125 lines
4.4 KiB
C++

#pragma once
#include <memory>
#include <functional>
namespace piscan {
namespace events {
struct Event {
Event(std::string topic) : topic(topic) {};
virtual ~Event(){};
inline virtual std::string to_string() {
return "Event type: " + topic + "\n";
}
std::string topic;
};
typedef std::shared_ptr<Event> EventPtr;
typedef std::function<void(std::shared_ptr<Event>)> EventHandler;
//typedef std::shared_ptr<EventHandler> EventHandler;
void publish(EventPtr event);
void subscribe(std::string topic, int subscriber, EventHandler handler);
void unsubscribe(std::string topic, int subscriber);
/*---------------------------------*/
struct GenericStringEvent : public Event {
GenericStringEvent(std::string topic, std::string data) : Event(topic), data(data) {};
virtual ~GenericStringEvent() {};
inline virtual std::string to_string() {
return Event::to_string() + "\tData:\t" + data + "\n";
}
std::string data;
};
struct GenericNumberEvent : public Event {
GenericNumberEvent(std::string topic, long long data) : Event(topic), data(data) {};
virtual ~GenericNumberEvent() {};
inline virtual std::string to_string() {
return Event::to_string() + "\tData:\t" + std::to_string(data) + "\n";
}
long long data;
};
struct GenericBoolEvent : public Event {
GenericBoolEvent(std::string topic, bool data) : Event(topic), data(data) {};
virtual ~GenericBoolEvent() {};
inline virtual std::string to_string() {
return Event::to_string() + "\tData:\t" + std::to_string(data) + "\n";
}
bool data;
};
struct ScannerStateEvent : public Event {
virtual ~ScannerStateEvent() {};
enum ScannerState {
OTHER_STATE,
SCAN,
HOLD,
RECEIVE,
};
ScannerStateEvent() : Event("scanner_state_change") {};
inline virtual std::string to_string() {
std::string tail = (state == HOLD || state == RECEIVE)?
"\tSystem:\t" + systemTag + "\n" +
"\tEntry:\t" + entryTag + "\n" +
"\tFrequency:\t" + std::to_string(frequency) + "\n" +
"\tModulation:\t" + modulation + "\n" +
"\tIndex:\t" + entryIndex + "\n" +
"\tDelay:\t" + std::to_string(delayMS) + "\n" +
"\tLockout:\t" + std::to_string(lockout) + "\n"
: "";
return Event::to_string() +
"\tState:\t" + std::to_string(state) + "\n" + tail;
}
//TODO ported from context messages
ScannerState state = OTHER_STATE;
std::string systemTag = "";
std::string entryTag = "";
long long frequency = 0;
std::string modulation = "";
std::string entryIndex = "";
int delayMS = 0;
bool lockout = false;
};
struct DemodStateEvent : public Event {
DemodStateEvent() : Event("demod_state_change") {};
virtual ~DemodStateEvent() {};
inline virtual std::string to_string() {
return Event::to_string() +
"\tTuner gain:\t" + std::to_string(tunerGainState) + "\n"
"\tSquelch:\t" + std::to_string(squelchState) + "\n";
}
float tunerGainState;
int squelchState;
};
struct SignalLevelEvent : public Event {
SignalLevelEvent(int level) : Event("signal_level"), level(level) {};
virtual ~SignalLevelEvent(){};
inline virtual std::string to_string() {
return Event::to_string() + "\tSignal level:\t" + std::to_string(level) + "\n";
}
int level;
};
struct LoggingEvent : public Event {
LoggingEvent(int level, std::string line) : Event("log_write"), level(level), line(line) {};
virtual ~LoggingEvent(){};
inline virtual std::string to_string() {
return Event::to_string() + "\t> " + line + "\n";
}
int level;
std::string line;
};
}
}