kopia lustrzana https://github.com/sh123/esp32_loraprs
Add support for KISS CSMA persistence command
rodzic
17cf20c609
commit
1d2b966be0
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
Ładowanie…
Reference in New Issue