Refactor to use all parameters from config directly

pull/15/head
sh123 2021-02-02 10:26:11 +02:00
rodzic 470959e8d3
commit 0c902165f3
3 zmienionych plików z 67 dodań i 77 usunięć

Wyświetl plik

@ -19,7 +19,7 @@ struct Config
int AprsPort; // aprs server port, 14580 int AprsPort; // aprs server port, 14580
String AprsHost; // aprs server hostname, rotate.aprs2.net String AprsHost; // aprs server hostname, rotate.aprs2.net
String AprsLogin; // aprs callsign to use, e.g. MY0CAL-1 String AprsLogin; // aprs callsign to use, e.g. N0CALL-1
String AprsPass; // aprs login password String AprsPass; // aprs login password
String AprsFilter; // aprs filter, see http://www.aprs-is.net/javAPRSFilter.aspx, do not include filter directive, just space separated values String AprsFilter; // aprs filter, see http://www.aprs-is.net/javAPRSFilter.aspx, do not include filter directive, just space separated values
String AprsRawBeacon; // aprs string for server beacon, e.g. NOCALL-1>APZMDM,WIDE1-1:!0000.00N/00000.00E#LoRA 433.775MHz/BW125/SF12/CR7/0xf3 String AprsRawBeacon; // aprs string for server beacon, e.g. NOCALL-1>APZMDM,WIDE1-1:!0000.00N/00000.00E#LoRA 433.775MHz/BW125/SF12/CR7/0xf3

Wyświetl plik

@ -3,10 +3,10 @@
namespace LoraPrs { namespace LoraPrs {
Service::Service() Service::Service()
: kissState_(KissState::Void) : csmaP_(CfgCsmaPersistence)
, kissCmd_(KissCmd::NoCmd)
, csmaP_(CfgCsmaPersistence)
, csmaSlotTime_(CfgCsmaSlotTimeMs) , csmaSlotTime_(CfgCsmaSlotTimeMs)
, kissState_(KissState::Void)
, kissCmd_(KissCmd::NoCmd)
, kissTxQueue_(new cppQueue(sizeof(unsigned char), CfgLoraTxQueueSize)) , kissTxQueue_(new cppQueue(sizeof(unsigned char), CfgLoraTxQueueSize))
, serialBt_() , serialBt_()
{ {
@ -14,56 +14,41 @@ Service::Service()
void Service::setup(const Config &conf) void Service::setup(const Config &conf)
{ {
config_ = conf;
previousBeaconMs_ = 0; previousBeaconMs_ = 0;
// config ownCallsign_ = AX25::Callsign(config_.AprsLogin);
isClient_ = conf.IsClientMode;
loraFreq_ = conf.LoraFreq;
ownCallsign_ = AX25::Callsign(conf.AprsLogin);
if (!ownCallsign_.IsValid()) { if (!ownCallsign_.IsValid()) {
Serial.println("Own callsign is not valid"); Serial.println("Own callsign is not valid");
} }
aprsLogin_ = String("user ") + conf.AprsLogin + String(" pass ") + aprsLoginCommand_ = String("user ") + config_.AprsLogin + String(" pass ") +
conf.AprsPass + String(" vers ") + CfgLoraprsVersion; config_.AprsPass + String(" vers ") + CfgLoraprsVersion;
if (conf.AprsFilter.length() > 0) { if (config_.AprsFilter.length() > 0) {
aprsLogin_ += String(" filter ") + conf.AprsFilter; aprsLoginCommand_ += String(" filter ") + config_.AprsFilter;
} }
aprsLogin_ += String("\n"); aprsLoginCommand_ += String("\n");
aprsHost_ = conf.AprsHost;
aprsPort_ = conf.AprsPort;
aprsBeacon_ = conf.AprsRawBeacon;
aprsBeaconPeriodMinutes_ = conf.AprsRawBeaconPeriodMinutes;
autoCorrectFreq_ = conf.EnableAutoFreqCorrection;
addSignalReport_ = conf.EnableSignalReport;
persistentConn_ = conf.EnablePersistentAprsConnection;
enableRfToIs_ = conf.EnableRfToIs;
enableIsToRf_ = conf.EnableIsToRf;
enableRepeater_ = conf.EnableRepeater;
enableBeacon_ = conf.EnableBeacon;
// peripherals // peripherals
setupLora(conf.LoraFreq, conf.LoraBw, conf.LoraSf, setupLora(config_.LoraFreq, config_.LoraBw, config_.LoraSf,
conf.LoraCodingRate, conf.LoraPower, conf.LoraSync, conf.LoraEnableCrc); config_.LoraCodingRate, config_.LoraPower, config_.LoraSync, config_.LoraEnableCrc);
if (needsWifi()) { if (needsWifi()) {
setupWifi(conf.WifiSsid, conf.WifiKey); setupWifi(config_.WifiSsid, config_.WifiKey);
} }
if (needsBt() || conf.BtName.length() > 0) { if (needsBt() || config_.BtName.length() > 0) {
setupBt(conf.BtName); setupBt(config_.BtName);
} }
if (needsAprsis() && persistentConn_) { if (needsAprsis() && config_.EnablePersistentAprsConnection) {
reconnectAprsis(); reconnectAprsis();
} }
} }
void Service::setupWifi(const String &wifiName, const String &wifiKey) void Service::setupWifi(const String &wifiName, const String &wifiKey)
{ {
if (!isClient_) { if (!config_.IsClientMode) {
Serial.print("WIFI connecting to " + wifiName); Serial.print("WIFI connecting to " + wifiName);
WiFi.setHostname("loraprs"); WiFi.setHostname("loraprs");
@ -106,13 +91,13 @@ bool Service::reconnectAprsis()
{ {
Serial.print("APRSIS connecting..."); Serial.print("APRSIS connecting...");
if (!aprsisConn_.connect(aprsHost_.c_str(), aprsPort_)) { if (!aprsisConn_.connect(config_.AprsHost.c_str(), config_.AprsPort)) {
Serial.println("Failed to connect to " + aprsHost_ + ":" + aprsPort_); Serial.println("Failed to connect to " + config_.AprsHost + ":" + config_.AprsPort);
return false; return false;
} }
Serial.println("ok"); Serial.println("ok");
aprsisConn_.print(aprsLogin_); aprsisConn_.print(aprsLoginCommand_);
return true; return true;
} }
@ -156,7 +141,7 @@ void Service::loop()
if (needsWifi() && WiFi.status() != WL_CONNECTED) { if (needsWifi() && WiFi.status() != WL_CONNECTED) {
reconnectWifi(); reconnectWifi();
} }
if (needsAprsis() && !aprsisConn_.connected() && persistentConn_) { if (needsAprsis() && !aprsisConn_.connected() && config_.EnablePersistentAprsConnection) {
reconnectAprsis(); reconnectAprsis();
} }
@ -187,12 +172,12 @@ void Service::loop()
void Service::sendPeriodicBeacon() void Service::sendPeriodicBeacon()
{ {
long currentMs = millis(); long currentMs = millis();
if (previousBeaconMs_ == 0 || currentMs - previousBeaconMs_ >= aprsBeaconPeriodMinutes_ * 60 * 1000) { if (previousBeaconMs_ == 0 || currentMs - previousBeaconMs_ >= config_.AprsRawBeaconPeriodMinutes * 60 * 1000) {
AX25::Payload payload(aprsBeacon_); AX25::Payload payload(config_.AprsRawBeacon);
if (payload.IsValid()) { if (payload.IsValid()) {
sendAX25ToLora(payload); sendAX25ToLora(payload);
if (enableRfToIs_) { if (config_.EnableRfToIs) {
sendToAprsis(payload.ToString()); sendToAprsis(payload.ToString());
} }
Serial.println("Periodic beacon is sent"); Serial.println("Periodic beacon is sent");
@ -214,7 +199,7 @@ void Service::sendToAprsis(String aprsMessage)
} }
aprsisConn_.println(aprsMessage); aprsisConn_.println(aprsMessage);
if (!persistentConn_) { if (!config_.EnablePersistentAprsConnection) {
aprsisConn_.stop(); aprsisConn_.stop();
} }
} }
@ -231,7 +216,7 @@ void Service::onAprsisDataAvailable()
aprsisData += c; aprsisData += c;
} }
if (enableIsToRf_ && aprsisData.length() > 0) { if (config_.EnableIsToRf && aprsisData.length() > 0) {
AX25::Payload payload(aprsisData); AX25::Payload payload(aprsisData);
if (payload.IsValid()) { if (payload.IsValid()) {
sendAX25ToLora(payload); sendAX25ToLora(payload);
@ -288,12 +273,12 @@ void Service::onLoraDataAvailable(int packetSize)
float rssi = LoRa.packetRssi(); float rssi = LoRa.packetRssi();
long frequencyError = LoRa.packetFrequencyError(); long frequencyError = LoRa.packetFrequencyError();
if (autoCorrectFreq_) { if (config_.EnableAutoFreqCorrection) {
loraFreq_ -= frequencyError; config_.LoraFreq -= frequencyError;
LoRa.setFrequency(loraFreq_); LoRa.setFrequency(config_.LoraFreq);
} }
if (!isClient_) { if (!config_.IsClientMode) {
String signalReport = String(" ") + String signalReport = String(" ") +
String("rssi: ") + String("rssi: ") +
@ -309,14 +294,14 @@ void Service::onLoraDataAvailable(int packetSize)
AX25::Payload payload(rxBuf, rxBufIndex); AX25::Payload payload(rxBuf, rxBufIndex);
if (payload.IsValid()) { if (payload.IsValid()) {
String textPayload = payload.ToString(addSignalReport_ ? signalReport : String()); String textPayload = payload.ToString(config_.EnableSignalReport ? signalReport : String());
Serial.println(textPayload); Serial.println(textPayload);
if (enableRfToIs_) { if (config_.EnableRfToIs) {
sendToAprsis(textPayload); sendToAprsis(textPayload);
Serial.println("Packet sent to APRS-IS"); Serial.println("Packet sent to APRS-IS");
} }
if (enableRepeater_ && payload.Digirepeat(ownCallsign_)) { if (config_.EnableRepeater && payload.Digirepeat(ownCallsign_)) {
sendAX25ToLora(payload); sendAX25ToLora(payload);
Serial.println("Packet digirepeated"); Serial.println("Packet digirepeated");
} }

Wyświetl plik

@ -42,10 +42,12 @@ private:
bool kissProcessCommand(unsigned char rxByte); bool kissProcessCommand(unsigned char rxByte);
void kissResetState(); void kissResetState();
inline bool needsAprsis() const { return !isClient_ && (enableRfToIs_ || enableIsToRf_); } inline bool needsAprsis() const {
return !config_.IsClientMode && (config_.EnableRfToIs || config_.EnableIsToRf);
}
inline bool needsWifi() const { return needsAprsis(); } inline bool needsWifi() const { return needsAprsis(); }
inline bool needsBt() const { return isClient_; } inline bool needsBt() const { return config_.IsClientMode; }
inline bool needsBeacon() const { return !isClient_ && enableBeacon_; } inline bool needsBeacon() const { return !config_.IsClientMode && config_.EnableBeacon; }
private: private:
enum KissMarker { enum KissMarker {
@ -65,9 +67,25 @@ private:
}; };
enum KissCmd { enum KissCmd {
// generic
Data = 0x00, Data = 0x00,
P = 0x02, P = 0x02,
SlotTime = 0x03, SlotTime = 0x03,
// extended to modem
Frequency = 0x10,
Bandwidth = 0x11,
Power = 0x12,
SyncWord = 0x13,
SpreadingFactor = 0x14,
CodingRate = 0x15,
EnableCrc = 0x16,
// extended events from modem
SignalLevel = 0x30,
// end of cmds
NoCmd = 0x80 NoCmd = 0x80
}; };
@ -89,33 +107,20 @@ private:
private: private:
// config // config
bool isClient_; Config config_;
long loraFreq_;
AX25::Callsign ownCallsign_;
String aprsHost_;
int aprsPort_;
String aprsLogin_;
String aprsBeacon_;
int aprsBeaconPeriodMinutes_;
bool autoCorrectFreq_;
bool addSignalReport_;
bool persistentConn_;
bool enableRfToIs_;
bool enableIsToRf_;
bool enableRepeater_;
bool enableBeacon_;
// state
KissState kissState_;
KissCmd kissCmd_;
long previousBeaconMs_;
byte csmaP_; byte csmaP_;
long csmaSlotTime_; long csmaSlotTime_;
String aprsLoginCommand_;
AX25::Callsign ownCallsign_;
// kiss
KissState kissState_;
KissCmd kissCmd_;
std::shared_ptr<cppQueue>kissTxQueue_; std::shared_ptr<cppQueue>kissTxQueue_;
// state
long previousBeaconMs_;
// peripherals // peripherals
BluetoothSerial serialBt_; BluetoothSerial serialBt_;
WiFiClient aprsisConn_; WiFiClient aprsisConn_;