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.AprsPass = "12345";
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;
// bluetooth device name

Wyświetl plik

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

Wyświetl plik

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