kopia lustrzana https://github.com/sh123/esp32_loraprs
Porównaj commity
5 Commity
3e90abd47f
...
e78e0e8513
Autor | SHA1 | Data |
---|---|---|
sh123 | e78e0e8513 | |
sh123 | cf99eb014d | |
sh123 | b89a13680e | |
sh123 | 0a43429b1c | |
sh123 | 2083f946d9 |
|
@ -50,6 +50,7 @@ protected:
|
||||||
None = 0x80
|
None = 0x80
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const int CfgToSerialDelayMs = 10;
|
||||||
static const int CfgSerialToRigQueueSize = 4096;
|
static const int CfgSerialToRigQueueSize = 4096;
|
||||||
static const int CfgRigToSerialQueueSize = 4096;
|
static const int CfgRigToSerialQueueSize = 4096;
|
||||||
|
|
||||||
|
|
|
@ -52,9 +52,14 @@ private:
|
||||||
|
|
||||||
void onRigTaskRxPacket();
|
void onRigTaskRxPacket();
|
||||||
void onRigTaskTxPacket();
|
void onRigTaskTxPacket();
|
||||||
|
void onRigTaskStartRx();
|
||||||
|
void onRigTaskStartTx();
|
||||||
static void rigTask(void *self);
|
static void rigTask(void *self);
|
||||||
static ICACHE_RAM_ATTR void onRigIsrRxPacket();
|
static ICACHE_RAM_ATTR void onRigIsrRxPacket();
|
||||||
|
|
||||||
|
void startRx();
|
||||||
|
static bool startRxTimer(void *param);
|
||||||
|
|
||||||
void onAprsisDataAvailable();
|
void onAprsisDataAvailable();
|
||||||
|
|
||||||
void sendSignalReportEvent(int rssi, float snr);
|
void sendSignalReportEvent(int rssi, float snr);
|
||||||
|
@ -106,13 +111,18 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct SetHardware {
|
struct SetHardware {
|
||||||
uint32_t freq;
|
uint32_t freqRx;
|
||||||
|
uint32_t freqTx;
|
||||||
|
uint8_t modType;
|
||||||
|
int16_t pwr;
|
||||||
uint32_t bw;
|
uint32_t bw;
|
||||||
uint16_t sf;
|
uint16_t sf;
|
||||||
uint16_t cr;
|
uint16_t cr;
|
||||||
uint16_t pwr;
|
|
||||||
uint16_t sync;
|
uint16_t sync;
|
||||||
uint8_t crc;
|
uint8_t crc;
|
||||||
|
uint32_t fskBitRate;
|
||||||
|
uint32_t fskFreqDev;
|
||||||
|
uint32_t fskRxBw;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct SignalReport {
|
struct SignalReport {
|
||||||
|
@ -125,7 +135,7 @@ private:
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const String CfgLoraprsVersion = "LoRAPRS 1.0.13";
|
const String CfgLoraprsVersion = "LoRAPRS 1.0.14";
|
||||||
|
|
||||||
// processor config
|
// processor config
|
||||||
const int CfgConnRetryMs = 500; // connection retry delay, e.g. wifi
|
const int CfgConnRetryMs = 500; // connection retry delay, e.g. wifi
|
||||||
|
@ -145,7 +155,9 @@ private:
|
||||||
// radio task commands
|
// radio task commands
|
||||||
enum RadioTaskBits {
|
enum RadioTaskBits {
|
||||||
Receive = 0x01,
|
Receive = 0x01,
|
||||||
Transmit = 0x02
|
Transmit = 0x02,
|
||||||
|
StartReceive = 0x04,
|
||||||
|
StartTransmit = 0x10
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -164,6 +176,7 @@ private:
|
||||||
|
|
||||||
// peripherals, radio
|
// peripherals, radio
|
||||||
static TaskHandle_t rigTaskHandle_;
|
static TaskHandle_t rigTaskHandle_;
|
||||||
|
Timer<1> startRxTimer_;
|
||||||
static volatile bool rigIsRxActive_;
|
static volatile bool rigIsRxActive_;
|
||||||
static volatile bool rigIsRxIsrEnabled_;
|
static volatile bool rigIsRxIsrEnabled_;
|
||||||
bool rigIsImplicitMode_;
|
bool rigIsImplicitMode_;
|
||||||
|
|
|
@ -134,7 +134,7 @@ bool Processor::processRigToSerial()
|
||||||
onRigPacket(&buf, rxPacketSize);
|
onRigPacket(&buf, rxPacketSize);
|
||||||
|
|
||||||
isProcessed = true;
|
isProcessed = true;
|
||||||
yield();
|
if (!rigToSerialQueueIndex_.isEmpty()) delay(CfgToSerialDelayMs);
|
||||||
}
|
}
|
||||||
return isProcessed;
|
return isProcessed;
|
||||||
}
|
}
|
||||||
|
@ -280,11 +280,19 @@ bool Processor::receiveByteKiss(byte rxByte)
|
||||||
break;
|
break;
|
||||||
case State::Escape:
|
case State::Escape:
|
||||||
if (rxByte == Marker::Tfend) {
|
if (rxByte == Marker::Tfend) {
|
||||||
onRigTx((byte)Marker::Fend);
|
if (dataType_ == DataType::Raw) {
|
||||||
|
onRigTx((byte)Marker::Fend);
|
||||||
|
} else if (dataType_ == DataType::Control) {
|
||||||
|
cmdBuffer_.push_back((byte)Marker::Fend);
|
||||||
|
}
|
||||||
state_ = State::GetData;
|
state_ = State::GetData;
|
||||||
}
|
}
|
||||||
else if (rxByte == Marker::Tfesc) {
|
else if (rxByte == Marker::Tfesc) {
|
||||||
onRigTx((byte)Marker::Fesc);
|
if (dataType_ == DataType::Raw) {
|
||||||
|
onRigTx((byte)Marker::Fesc);
|
||||||
|
} else if (dataType_ == DataType::Control) {
|
||||||
|
cmdBuffer_.push_back((byte)Marker::Fesc);
|
||||||
|
}
|
||||||
state_ = State::GetData;
|
state_ = State::GetData;
|
||||||
}
|
}
|
||||||
else if (rxByte != Marker::Fend) {
|
else if (rxByte != Marker::Fend) {
|
||||||
|
|
|
@ -367,6 +367,7 @@ void Service::loop()
|
||||||
if (config_.TlmEnable) {
|
if (config_.TlmEnable) {
|
||||||
telemetryTimer_.tick();
|
telemetryTimer_.tick();
|
||||||
}
|
}
|
||||||
|
startRxTimer_.tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
ICACHE_RAM_ATTR void Service::onRigIsrRxPacket() {
|
ICACHE_RAM_ATTR void Service::onRigIsrRxPacket() {
|
||||||
|
@ -388,9 +389,30 @@ void Service::rigTask(void *self) {
|
||||||
else if (commandBits & RadioTaskBits::Transmit) {
|
else if (commandBits & RadioTaskBits::Transmit) {
|
||||||
static_cast<Service*>(self)->onRigTaskTxPacket();
|
static_cast<Service*>(self)->onRigTaskTxPacket();
|
||||||
}
|
}
|
||||||
|
if (commandBits & RadioTaskBits::StartReceive) {
|
||||||
|
static_cast<Service*>(self)->onRigTaskStartRx();
|
||||||
|
}
|
||||||
|
else if (commandBits & RadioTaskBits::StartTransmit) {
|
||||||
|
static_cast<Service*>(self)->onRigTaskStartTx();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Service::onRigTaskStartRx() {
|
||||||
|
LOG_TRACE("onRigTaskStartRx");
|
||||||
|
if (config_.PttEnable) {
|
||||||
|
digitalWrite(config_.PttPin, LOW);
|
||||||
|
}
|
||||||
|
if (isHalfDuplex()) {
|
||||||
|
setFreq(config_.LoraFreqRx);
|
||||||
|
}
|
||||||
|
int state = rig_->startReceive();
|
||||||
|
if (state != RADIOLIB_ERR_NONE) {
|
||||||
|
LOG_ERROR("Start receive error: ", state);
|
||||||
|
}
|
||||||
|
rigIsRxIsrEnabled_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
void Service::onRigTaskRxPacket() {
|
void Service::onRigTaskRxPacket() {
|
||||||
int packetSize = rig_->getPacketLength();
|
int packetSize = rig_->getPacketLength();
|
||||||
LOG_TRACE("onRigTaskRxPacket", packetSize);
|
LOG_TRACE("onRigTaskRxPacket", packetSize);
|
||||||
|
@ -411,15 +433,21 @@ void Service::onRigTaskRxPacket() {
|
||||||
rigIsRxActive_ = false;
|
rigIsRxActive_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::onRigTaskTxPacket() {
|
void Service::onRigTaskStartTx() {
|
||||||
rigIsRxIsrEnabled_ = false;
|
LOG_TRACE("onRigTaskStartTx");
|
||||||
if (isHalfDuplex()) {
|
if (rigIsRxIsrEnabled_) {
|
||||||
setFreq(config_.LoraFreqTx);
|
rigIsRxIsrEnabled_ = false;
|
||||||
}
|
if (isHalfDuplex()) {
|
||||||
if (config_.PttEnable) {
|
setFreq(config_.LoraFreqTx);
|
||||||
digitalWrite(config_.PttPin, HIGH);
|
}
|
||||||
|
if (config_.PttEnable) {
|
||||||
|
digitalWrite(config_.PttPin, HIGH);
|
||||||
|
}
|
||||||
delay(config_.PttTxDelayMs);
|
delay(config_.PttTxDelayMs);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Service::onRigTaskTxPacket() {
|
||||||
while (rigTxQueueIndex_.size() > 0) {
|
while (rigTxQueueIndex_.size() > 0) {
|
||||||
int txPacketSize = rigTxQueueIndex_.shift();
|
int txPacketSize = rigTxQueueIndex_.shift();
|
||||||
LOG_TRACE("onRigTaskTxPacket", txPacketSize);
|
LOG_TRACE("onRigTaskTxPacket", txPacketSize);
|
||||||
|
@ -435,18 +463,7 @@ void Service::onRigTaskTxPacket() {
|
||||||
}
|
}
|
||||||
vTaskDelay(1);
|
vTaskDelay(1);
|
||||||
}
|
}
|
||||||
if (config_.PttEnable) {
|
startRxTimer_.in(config_.PttTxTailMs, &startRxTimer);
|
||||||
delay(config_.PttTxTailMs);
|
|
||||||
digitalWrite(config_.PttPin, LOW);
|
|
||||||
}
|
|
||||||
if (isHalfDuplex()) {
|
|
||||||
setFreq(config_.LoraFreqRx);
|
|
||||||
}
|
|
||||||
int state = rig_->startReceive();
|
|
||||||
if (state != RADIOLIB_ERR_NONE) {
|
|
||||||
LOG_ERROR("Start receive error: ", state);
|
|
||||||
}
|
|
||||||
rigIsRxIsrEnabled_ = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::sendPeriodicBeacon()
|
void Service::sendPeriodicBeacon()
|
||||||
|
@ -528,6 +545,16 @@ bool Service::sendModemTelemetryTimer(void *param)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Service::startRxTimer(void *param)
|
||||||
|
{
|
||||||
|
static_cast<Service*>(param)->startRx();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Service::startRx() {
|
||||||
|
xTaskNotify(rigTaskHandle_, RadioTaskBits::StartReceive, eSetBits);
|
||||||
|
}
|
||||||
|
|
||||||
void Service::sendModemTelemetry()
|
void Service::sendModemTelemetry()
|
||||||
{
|
{
|
||||||
float batVoltage = 2 * analogRead(config_.TlmBatMonPin) * (3.3 / 4096.0) + config_.TlmBatMonCal;
|
float batVoltage = 2 * analogRead(config_.TlmBatMonPin) * (3.3 / 4096.0) + config_.TlmBatMonCal;
|
||||||
|
@ -591,10 +618,6 @@ void Service::performFrequencyCorrection() {
|
||||||
|
|
||||||
void Service::setFreq(long loraFreq) const {
|
void Service::setFreq(long loraFreq) const {
|
||||||
rig_->setFrequency((float)loraFreq / 1e6);
|
rig_->setFrequency((float)loraFreq / 1e6);
|
||||||
int state = rig_->startReceive();
|
|
||||||
if (state != RADIOLIB_ERR_NONE) {
|
|
||||||
LOG_ERROR("Start receive error:", state);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::processIncomingRawPacketAsServer(const byte *packet, int packetLength) {
|
void Service::processIncomingRawPacketAsServer(const byte *packet, int packetLength) {
|
||||||
|
@ -650,6 +673,8 @@ void Service::processIncomingRawPacketAsServer(const byte *packet, int packetLen
|
||||||
bool Service::onRigTxBegin()
|
bool Service::onRigTxBegin()
|
||||||
{
|
{
|
||||||
LOG_TRACE("onRigTxBegin");
|
LOG_TRACE("onRigTxBegin");
|
||||||
|
startRxTimer_.cancel();
|
||||||
|
xTaskNotify(rigTaskHandle_, RadioTaskBits::StartTransmit, eSetBits);
|
||||||
rigCurrentTxPacketSize_ = 0;
|
rigCurrentTxPacketSize_ = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -781,21 +806,29 @@ void Service::onRadioControlCommand(const std::vector<byte> &rawCommand) {
|
||||||
if (config_.KissEnableExtensions && rawCommand.size() == sizeof(SetHardware)) {
|
if (config_.KissEnableExtensions && rawCommand.size() == sizeof(SetHardware)) {
|
||||||
LOG_INFO("Setting new radio parameters");
|
LOG_INFO("Setting new radio parameters");
|
||||||
const struct SetHardware * setHardware = reinterpret_cast<const struct SetHardware*>(rawCommand.data());
|
const struct SetHardware * setHardware = reinterpret_cast<const struct SetHardware*>(rawCommand.data());
|
||||||
|
|
||||||
// TODO, add support for split set hardware
|
config_.LoraFreqRx = be32toh(setHardware->freqRx);
|
||||||
config_.LoraFreqRx = be32toh(setHardware->freq);
|
config_.LoraFreqTx = be32toh(setHardware->freqTx);
|
||||||
config_.LoraFreqTx = be32toh(setHardware->freq);
|
config_.ModType = setHardware->modType;
|
||||||
config_.LoraBw = be32toh(setHardware->bw);
|
config_.LoraBw = be32toh(setHardware->bw);
|
||||||
config_.LoraSf = be16toh(setHardware->sf);
|
config_.LoraSf = be16toh(setHardware->sf);
|
||||||
config_.LoraCodingRate = be16toh(setHardware->cr);
|
config_.LoraCodingRate = be16toh(setHardware->cr);
|
||||||
config_.LoraPower = be16toh(setHardware->pwr);
|
config_.LoraPower = (int16_t)be16toh(setHardware->pwr);
|
||||||
config_.LoraSync = be16toh(setHardware->sync);
|
config_.LoraSync = be16toh(setHardware->sync);
|
||||||
|
config_.FskBitRate = (float)be32toh(setHardware->fskBitRate) / 1e3;
|
||||||
|
config_.FskFreqDev = (float)be32toh(setHardware->fskFreqDev) / 1e3;
|
||||||
|
config_.FskRxBw = (float)be32toh(setHardware->fskRxBw) / 1e3;
|
||||||
int crcType = setHardware->crc ? config_.LoraCrc : 0;
|
int crcType = setHardware->crc ? config_.LoraCrc : 0;
|
||||||
|
|
||||||
setupRig(config_.LoraFreqRx, config_.LoraBw, config_.LoraSf,
|
if (config_.ModType == CFG_MOD_TYPE_FSK) {
|
||||||
config_.LoraCodingRate, config_.LoraPower, config_.LoraSync, crcType, config_.LoraExplicit);
|
setupRigFsk(config_.LoraFreqRx, config_.FskBitRate, config_.FskFreqDev, config_.FskRxBw, config_.LoraPower);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setupRig(config_.LoraFreqRx, config_.LoraBw, config_.LoraSf,
|
||||||
|
config_.LoraCodingRate, config_.LoraPower, config_.LoraSync, crcType, config_.LoraExplicit);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR("Radio control command of wrong size");
|
LOG_ERROR("Radio control command of wrong size", rawCommand.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include "loraprs_service.h"
|
#include "loraprs_service.h"
|
||||||
|
|
||||||
const int CfgPollDelayMs = 20; // main loop delay
|
const int CfgPollDelayMs = 10; // main loop delay
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize config from config.h options.
|
* Initialize config from config.h options.
|
||||||
|
|
Ładowanie…
Reference in New Issue