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
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 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

Wyświetl plik

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

Wyświetl plik

@ -42,10 +42,12 @@ private:
bool kissProcessCommand(unsigned char rxByte);
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 needsBt() const { return isClient_; }
inline bool needsBeacon() const { return !isClient_ && enableBeacon_; }
inline bool needsBt() const { return config_.IsClientMode; }
inline bool needsBeacon() const { return !config_.IsClientMode && config_.EnableBeacon; }
private:
enum KissMarker {
@ -65,9 +67,25 @@ private:
};
enum KissCmd {
// generic
Data = 0x00,
P = 0x02,
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
};
@ -89,33 +107,20 @@ private:
private:
// config
bool isClient_;
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_;
Config config_;
byte csmaP_;
long csmaSlotTime_;
String aprsLoginCommand_;
AX25::Callsign ownCallsign_;
// kiss
KissState kissState_;
KissCmd kissCmd_;
std::shared_ptr<cppQueue>kissTxQueue_;
// state
long previousBeaconMs_;
// peripherals
BluetoothSerial serialBt_;
WiFiClient aprsisConn_;