Add support for KISS CSMA persistence command

pull/15/head
sh123 2020-12-08 22:22:08 +02:00
rodzic 17cf20c609
commit 1d2b966be0
3 zmienionych plików z 48 dodań i 15 usunięć

Wyświetl plik

@ -29,7 +29,7 @@ void initializeConfig() {
cfg.AprsLogin = "NOCALL-10"; cfg.AprsLogin = "NOCALL-10";
cfg.AprsPass = "12345"; cfg.AprsPass = "12345";
cfg.AprsFilter = "r/35.60/139.80/25"; // multiple filters are space separated cfg.AprsFilter = "r/35.60/139.80/25"; // multiple filters are space separated
cfg.AprsRawBeacon = "NOCALL-10>APZMDM,WIDE1-1:!0000.00N/00000.00E#LoRA 433.775MHz/BW125/SF12/CR7/0x3f"; cfg.AprsRawBeacon = "NOCALL-10>APZMDM,WIDE1-1:!0000.00N/00000.00E#LoRA 433.775MHz/BW125/SF12/CR7/0x34";
cfg.AprsRawBeaconPeriodMinutes = 20; cfg.AprsRawBeaconPeriodMinutes = 20;
// bluetooth device name // bluetooth device name

Wyświetl plik

@ -5,6 +5,7 @@ namespace LoraPrs {
Service::Service() Service::Service()
: kissState_(KissState::Void) : kissState_(KissState::Void)
, kissCmd_(KissCmd::NoCmd) , kissCmd_(KissCmd::NoCmd)
, csmaP_(CfgCsmaPersistence)
, serialBt_() , serialBt_()
{ {
} }
@ -149,7 +150,7 @@ void Service::loop()
} }
// TX path // TX path
else { else {
if (random(0, 255) < CfgCsmaPersistence) { if (random(0, 255) < csmaP_) {
if (serialBt_.available()) { if (serialBt_.available()) {
onBtDataAvailable(); onBtDataAvailable();
} }
@ -316,50 +317,77 @@ void Service::kissResetState()
kissState_ = KissState::Void; kissState_ = KissState::Void;
} }
bool Service::loraBeginPacketAndWait()
{
bool canSend = false;
for (int i = 0; i < CfgLoraTxWaitMs; i++) {
if (LoRa.beginPacket() == 1) {
return true;
}
delay(1);
}
return false;
}
void Service::onBtDataAvailable() void Service::onBtDataAvailable()
{ {
while (serialBt_.available()) { while (serialBt_.available()) {
byte txByte = serialBt_.read();
int rxResult = serialBt_.read();
if (rxResult == -1) break;
byte rxByte = (byte)rxResult;
switch (kissState_) { switch (kissState_) {
case KissState::Void: case KissState::Void:
if (txByte == KissMarker::Fend) { if (rxByte == KissMarker::Fend) {
kissCmd_ = KissCmd::NoCmd; kissCmd_ = KissCmd::NoCmd;
kissState_ = KissState::GetCmd; kissState_ = KissState::GetCmd;
} }
break; break;
case KissState::GetCmd: case KissState::GetCmd:
if (txByte != KissMarker::Fend) { if (rxByte != KissMarker::Fend) {
if (txByte == KissCmd::Data) { if (rxByte == KissCmd::Data) {
LoRa.beginPacket(); if (!loraBeginPacketAndWait()) {
kissCmd_ = (KissCmd)txByte; kissResetState();
return;
}
kissCmd_ = (KissCmd)rxByte;
kissState_ = KissState::GetData; kissState_ = KissState::GetData;
} }
else if (rxByte == KissCmd::P) {
kissCmd_ = (KissCmd)rxByte;
kissState_ = KissState::GetP;
}
else { else {
kissResetState(); kissResetState();
} }
} }
break; break;
case KissState::GetP:
csmaP_ = rxByte;
kissState_ = KissState::GetData;
break;
case KissState::GetData: case KissState::GetData:
if (txByte == KissMarker::Fesc) { if (rxByte == KissMarker::Fesc) {
kissState_ = KissState::Escape; kissState_ = KissState::Escape;
} }
else if (txByte == KissMarker::Fend) { else if (rxByte == KissMarker::Fend) {
if (kissCmd_ == KissCmd::Data) { if (kissCmd_ == KissCmd::Data) {
LoRa.endPacket(); LoRa.endPacket(true);
} }
kissResetState(); kissResetState();
} }
else { else if (kissCmd_ == KissCmd::Data) {
LoRa.write(txByte); LoRa.write(rxByte);
} }
break; break;
case KissState::Escape: case KissState::Escape:
if (txByte == KissMarker::Tfend) { if (rxByte == KissMarker::Tfend) {
LoRa.write(KissMarker::Fend); LoRa.write(KissMarker::Fend);
kissState_ = KissState::GetData; kissState_ = KissState::GetData;
} }
else if (txByte == KissMarker::Tfesc) { else if (rxByte == KissMarker::Tfesc) {
LoRa.write(KissMarker::Fesc); LoRa.write(KissMarker::Fesc);
kissState_ = KissState::GetData; kissState_ = KissState::GetData;
} }

Wyświetl plik

@ -37,6 +37,7 @@ private:
void sendToAprsis(String aprsMessage); void sendToAprsis(String aprsMessage);
bool sendToLora(const AX25::Payload &payload); bool sendToLora(const AX25::Payload &payload);
bool loraBeginPacketAndWait();
void kissResetState(); void kissResetState();
inline bool needsAprsis() const { return !isClient_ && (enableRfToIs_ || enableIsToRf_); } inline bool needsAprsis() const { return !isClient_ && (enableRfToIs_ || enableIsToRf_); }
@ -56,17 +57,20 @@ private:
Void = 0, Void = 0,
GetCmd, GetCmd,
GetData, GetData,
GetP,
Escape Escape
}; };
enum KissCmd { enum KissCmd {
Data = 0x00, Data = 0x00,
P = 0x02,
NoCmd = 0x80 NoCmd = 0x80
}; };
const String CfgLoraprsVersion = "LoRAPRS 0.1"; const String CfgLoraprsVersion = "LoRAPRS 0.1";
const int CfgPollDelayMs = 5; const int CfgPollDelayMs = 5;
const int CfgLoraTxWaitMs = 500;
// tx when lower than this value from random 0..255 // tx when lower than this value from random 0..255
// use lower value for high traffic, use 255 for real time // use lower value for high traffic, use 255 for real time
@ -102,6 +106,7 @@ private:
KissState kissState_; KissState kissState_;
KissCmd kissCmd_; KissCmd kissCmd_;
long previousBeaconMs_; long previousBeaconMs_;
byte csmaP_;
// peripherals // peripherals
BluetoothSerial serialBt_; BluetoothSerial serialBt_;