kopia lustrzana https://github.com/sh123/esp32_loraprs
Refactor to use all parameters from config directly
rodzic
470959e8d3
commit
0c902165f3
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
Ładowanie…
Reference in New Issue