Merge pull request #2 from svaio/develop-dd6sw

pull/134/head
Stefan 2021-12-18 22:38:37 +01:00 zatwierdzone przez GitHub
commit b5e1e448f9
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
52 zmienionych plików z 995 dodań i 395 usunięć

Wyświetl plik

@ -0,0 +1,27 @@
name: DUT Tests
on: [push, pull_request]
jobs:
hil_tests:
name: HIL testing
runs-on: dut-testing
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install python reqirements
run: cd HIL && make install
- name: Run Tests
run: cd HIL && make test
dut_tests:
name: DUT testing
runs-on: dut-testing
needs: hil_tests
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install python reqirements
run: make install
- name: Run Tests
run: make test

8
.gitignore vendored
Wyświetl plik

@ -5,6 +5,10 @@
.vscode/ipch
report.xml
output
data/dd6sw.is-cfg.json
dd6sw*
is-cfg.json
*.code-workspace
dd6sw-*
src/data/*
__pycache__
.pytest_cache
spiffs.bin

95
.vscode/settings.json vendored
Wyświetl plik

@ -1,49 +1,50 @@
{
"files.insertFinalNewline": true,
"editor.formatOnSave": true,
"files.associations": {
"*.h": "cpp",
"array": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"memory": "cpp",
"new": "cpp",
"ostream": "cpp",
"numeric": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"utility": "cpp",
"typeinfo": "cpp"
},
"C_Cpp.errorSquiggles": "Disabled"
"files.insertFinalNewline": true,
"editor.formatOnSave": true,
"files.associations": {
"*.h": "cpp",
"array": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"memory": "cpp",
"new": "cpp",
"ostream": "cpp",
"numeric": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"utility": "cpp",
"typeinfo": "cpp",
"bitset": "cpp",
"regex": "cpp"
}
}

12
HIL/Makefile 100644
Wyświetl plik

@ -0,0 +1,12 @@
.PHONY: install test debug
default: install test
install:
pip3 install -r requirements.txt
test:
ESP_PORT=/dev/ttyUSB0 ESP_CONFIG_PATH=testconfig ESP_CONFIG_FILE=testconfig.json pytest tests -v --log-cli-level=INFO
debug:
ESP_PORT=/dev/ttyUSB0 ESP_CONFIG_PATH=testconfig ESP_CONFIG_FILE=testconfig.json pytest tests -v --capture=tee-sys --log-cli-level=DEBUG

0
HIL/__init__.py 100644
Wyświetl plik

86
HIL/aprs_con.py 100644
Wyświetl plik

@ -0,0 +1,86 @@
import pytest
import socket
import logging
logger = logging.getLogger(__name__)
class AprsIs:
def __init__(self, callsign, passwd="-1", host="localhost", port=10152) -> None:
self.callsign = callsign
self.passwd = passwd
self.server = (host, port)
self.socket = None
self.buffer = ""
def connect(self):
if self.socket:
return False
logger.debug(f"trying to connect to {self.server}")
self.socket = socket.create_connection(self.server)
peer = self.socket.getpeername()
logger.info(f"Connected to {str(peer)}")
self.socket.setblocking(1)
self.socket.settimeout(1)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
banner = list(self._get_line())
logger.info(f"Banner: {banner[0].rstrip()}")
login_line = f"user {self.callsign} pass {self.passwd} vers testlib 0.1\r\n"
logger.debug(login_line)
self.send_line(login_line)
login = list(self._get_line())
logger.info(f"login line: {login[0]}")
_, _, _, status, _ = login[0].split(' ', 4)
if status == "verified":
return True
self.close()
return False
def close(self):
if not self.socket:
self.socket.close()
self.socket = None
def send_line(self, line):
if self.socket:
self.socket.sendall(bytearray(f"{line}\r\n", encoding='utf8'))
def get_line(self):
line_list = list(self._get_line())
new_list = []
if line_list:
for line in line_list:
if not line.startswith("#"):
new_list.append(line)
return new_list
def _get_line(self):
if self.socket:
try:
buf = self.socket.recv(4096)
self.buffer = self.buffer + buf.decode('latin-1')
except:
pass
while "\r\n" in self.buffer:
line, self.buffer = self.buffer.split("\r\n", 1)
yield line
return None
def wait_for(self, towait):
for i in range(2, 10):
line = self.get_line()
for l in line:
if l == towait:
return
raise
@pytest.fixture
def APRSIS():
aprs = AprsIs("OE5BPA-1", passwd="22948",
host="localhost", port=10152)
aprs.connect()
return aprs

9
HIL/common.py 100644
Wyświetl plik

@ -0,0 +1,9 @@
import subprocess
import logging
logger = logging.getLogger(__name__)
def runProcess(cmd):
logger.debug(f"run process: \"{cmd}\"")
subprocess.run(cmd, shell=True).check_returncode()

103
HIL/esp_dut.py 100644
Wyświetl plik

@ -0,0 +1,103 @@
import os
import pytest
import serial
import logging
import json
import tempfile
from pathlib import Path
from HIL.common import runProcess
logger = logging.getLogger(__name__)
class EspFlash:
def __init__(self, port):
self._pio_package_path = Path('$HOME') / '.platformio' / 'packages'
self._port = port
logger.info(f"pio package path: {self._pio_package_path}")
logger.info(f"port: {self._port}")
def runESPTool(self, cmd):
esp_tool = self._pio_package_path / 'tool-esptoolpy' / 'esptool.py'
runProcess(
f"/usr/bin/python3 {esp_tool} --chip esp32 --port {self._port} {cmd}")
def erase(self):
logger.info("erase flash")
self.runESPTool("erase_flash")
def write(self, addr, bin_file):
logger.info(f"write flash on addr {addr} with file {bin_file}")
self.runESPTool(
f"--baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_size detect {addr} {bin_file}")
def verify(self, addr, bin_file):
logger.info(f"verify flash on addr {addr} with file {bin_file}")
self.runESPTool(
f"--baud 460800 --before default_reset --after hard_reset verify_flash --flash_mode dio --flash_size detect {addr} {bin_file}")
def make_spiffs(self, fs_path, fs_bin):
logger.info(f"make spiffs, fs_path: {fs_path}, fs_bin: {fs_bin}")
mkspiffs_espressif32_arduino = self._pio_package_path / \
'tool-mkspiffs' / 'mkspiffs_espressif32_arduino'
runProcess(
f"{mkspiffs_espressif32_arduino} -c {fs_path} -p 256 -b 4096 -s 1507328 {fs_bin}")
class EspConfig:
def __init__(self, path, filename):
self.filename = filename
logger.info(f"reading config from: {path}/{self.filename}")
with open(path / self.filename) as json_file:
self.data = json.load(json_file)
logger.info(f"was reading this data: {self.data}")
def writeFile(self):
tmpdirname = tempfile.TemporaryDirectory()
logger.info(f"writing this data: {self.data}")
with open(Path(tmpdirname.name) / self.filename, 'w') as outfile:
json.dump(self.data, outfile)
return tmpdirname
class EspDut:
def __init__(self, port, configPath, configFile):
self.port = port
self.baudrate = 115200
self.serial = None
self.flash = EspFlash(self.port)
self.config = EspConfig(configPath, configFile)
def writeFlash(self, bin_dir):
logger.info("write flash")
self.flash.erase()
self.flash.write("0x1000", bin_dir / 'bootloader_dio_40m.bin')
self.flash.write("0x8000", bin_dir / 'partitions.bin')
self.flash.write("0xe000", bin_dir / 'boot_app0.bin')
self.flash.write("0x10000", bin_dir / 'firmware.bin')
def writeConfig(self):
logger.info("write config")
fs_bin = "spiffs.bin"
fs_path = self.config.writeFile()
self.flash.make_spiffs(fs_path.name, fs_bin)
self.flash.write("0x290000", fs_bin)
def openPort(self):
logger.info(f"open port: {self.port}, baudrate: {self.baudrate}")
self.serial = serial.Serial(
self.port, baudrate=self.baudrate, timeout=0)
def getLine(self):
return self.serial.readline()
def closePort(self):
if self.serial:
self.serial.close()
self.serial = None
@pytest.fixture
def ESP():
return EspDut(os.environ["ESP_PORT"], Path(os.environ["ESP_CONFIG_PATH"]), Path(os.environ["ESP_CONFIG_FILE"]))

Wyświetl plik

@ -0,0 +1,3 @@
pytest
pyserial
aprs

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1 @@
{}

Wyświetl plik

Wyświetl plik

@ -0,0 +1,44 @@
from HIL.esp_dut import ESP
from HIL.aprs_con import APRSIS, AprsIs
from pathlib import Path
def test_basic_port(ESP):
ESP.openPort()
ESP.closePort()
def test_flash(ESP):
bin_dir = Path("testbinary")
ESP.writeFlash(bin_dir)
ESP.flash.verify("0x1000", bin_dir / 'bootloader_dio_40m.bin')
ESP.flash.verify("0x8000", bin_dir / 'partitions.bin')
ESP.flash.verify("0xe000", bin_dir / 'boot_app0.bin')
ESP.flash.verify("0x10000", bin_dir / 'firmware.bin')
def test_flash_config(ESP):
ESP.config.data["bar"] = "foo"
ESP.config.data["number"] = 123
ESP.writeConfig()
def test_erase(ESP):
ESP.flash.erase()
def test_aprs_login(APRSIS):
pass
def test_aprs_msg(APRSIS):
aprs = AprsIs("OE5BPA-2", passwd="22948",
host="localhost", port=10152)
aprs.connect()
aprs.send_line("OE5BPA-2>APLG01:=4819.82NL01418.68E&Testing")
for i in range(2):
line = APRSIS.get_line()
for l in line:
if l == "OE5BPA-2>APLG01,TCPIP*,qAC,OE5BPA:=4819.82NL01418.68E&Testing":
return
raise

Wyświetl plik

@ -0,0 +1,13 @@
import logging
import sys
from pathlib import Path
from HIL.esp_dut import ESP
from HIL.aprs_con import APRSIS
logger = logging.getLogger(__name__)
logger.error(sys.path)
def test_01(ESP, APRSIS):
pass

12
Makefile 100644
Wyświetl plik

@ -0,0 +1,12 @@
.PHONY: install test debug
default: install test
install:
pip3 install -r HIL/requirements.txt
test:
ESP_PORT=/dev/ttyUSB0 ESP_CONFIG_PATH=data ESP_CONFIG_FILE=is-cfg.json PYTHONPATH=. pytest HIL_tests -v --log-cli-level=INFO
debug:
ESP_PORT=/dev/ttyUSB0 ESP_CONFIG_PATH=data ESP_CONFIG_FILE=is-cfg.json PYTHONPATH=. pytest HIL_tests -v --capture=tee-sys --log-cli-level=DEBUG

Wyświetl plik

@ -125,4 +125,3 @@ A direct mount of the [other display](pics/display-wrong.jpg) is not possible wi
The 'wrong' display works too but you have to change VCC and GND by wire !
feel free to add hints!

Wyświetl plik

@ -9,10 +9,15 @@
"dns2": "192.0.2.2"
},
"wifi": {
"active": true,
"AP": [
{
"SSID": "",
"password": ""
"SSID": "SSID1",
"password": "PASS1"
},
{
"SSID": "SSID2",
"password": "PASS2"
}
]
},
@ -36,6 +41,7 @@
},
"lora": {
"frequency_rx": 433775000,
"gain_rx": 0,
"frequency_tx": 433775000,
"power": 20,
"spreading_factor": 12,
@ -54,6 +60,10 @@
{
"name": "ftp",
"password": "ftp"
},
{
"name": "ftp2",
"password": "ftp2"
}
]
},
@ -66,7 +76,8 @@
"telegram": {
"active": false,
"chatid": "",
"bottoken": ""
"bottoken": "",
"monitor": false
},
"ntp_server": "pool.ntp.org"
}

Wyświetl plik

@ -50,7 +50,7 @@ bool APRS_IS::sendMessage(const String &message) {
return true;
}
bool APRS_IS::sendMessage(const std::shared_ptr<APRSMessage> message) {
bool APRS_IS::sendMessage(const std::shared_ptr<APRSExtMessage> message) {
if (!connected()) {
return false;
}
@ -70,7 +70,7 @@ String APRS_IS::getMessage() {
return line;
}
std::shared_ptr<APRSMessage> APRS_IS::getAPRSMessage() {
std::shared_ptr<APRSExtMessage> APRS_IS::getAPRSExtMessage() {
String line;
if (_client.available() > 0) {
line = _client.readStringUntil('\n');
@ -82,7 +82,7 @@ std::shared_ptr<APRSMessage> APRS_IS::getAPRSMessage() {
if (line.length() == 0) {
return 0;
}
std::shared_ptr<APRSMessage> msg = std::shared_ptr<APRSMessage>(new APRSMessage());
std::shared_ptr<APRSExtMessage> msg = std::shared_ptr<APRSExtMessage>(new APRSExtMessage());
msg->decode(line);
return msg;
}

Wyświetl plik

@ -3,6 +3,7 @@
#define APRS_IS_Lib_h_
#include <APRS-Decoder.h>
#include <APRSExtMessage.h>
#include <WiFi.h>
class APRS_IS {
@ -14,12 +15,12 @@ public:
bool connected();
bool sendMessage(const String &message);
bool sendMessage(const std::shared_ptr<APRSMessage> message);
bool sendMessage(const std::shared_ptr<APRSExtMessage> message);
int available();
String getMessage();
std::shared_ptr<APRSMessage> getAPRSMessage();
String getMessage();
std::shared_ptr<APRSExtMessage> getAPRSExtMessage();
private:
String _user;

Wyświetl plik

@ -0,0 +1,47 @@
#include "APRSExtMessage.h"
APRSExtMessage::APRSExtMessage() {
}
/*
APRSExtMessage::APRSExtMessage(APRSExtMessage &other_msg) : _source(other_msg.getSource()), _destination(other_msg.getDestination()), _path(other_msg.getPath()), _type(other_msg.getType()), _rssi(other_msg.getRSSI()), _snr(other_msg.getSNR()), _rawBody(other_msg.getRawBody()), _body(new APRSBody()) {
_body->setData(other_msg.getBody()->getData());
}
APRSExtMessage &APRSExtMessage::operator=(APRSExtMessage &other_msg) {
if (this != &other_msg) {
setSource(other_msg.getSource());
setDestination(other_msg.getDestination());
setPath(other_msg.getPath());
setType(other_msg.getType());
setRSSI(other_msg.getRSSI());
setSNR(other_msg.getSNR());
setother_msg.getRawBody();
_body->setData(other_msg.getBody()->getData());
}
return *this;
}
*/
APRSExtMessage::~APRSExtMessage() {
}
int APRSExtMessage::getRSSI() const {
return _rssi;
}
void APRSExtMessage::setRSSI(const int rssi) {
_rssi = rssi;
}
float APRSExtMessage::getSNR() const {
return _snr;
}
void APRSExtMessage::setSNR(const float snr) {
_snr = snr;
}
String APRSExtMessage::toString() {
return "Source: " + getSource() + ", Destination: " + getDestination() + ", Path: " + getPath() + ", Type: " + getType().toString() + ", SNR: " + String(getSNR()) + ", RSSI: " + String(getRSSI()) + ", " + getBody()->toString();
}

Wyświetl plik

@ -0,0 +1,30 @@
#ifndef APRS_EXTHEADER_H_
#define APRS_EXTHEADER_H_
#include <APRSMessage.h>
#include <APRSMessageType.h>
#include <Arduino.h>
class APRSExtMessage : public APRSMessage {
public:
APRSExtMessage();
/*
APRSExtMessage(APRSExtMessage &other_msg);
APRSExtMessage &operator=(APRSExtMessage &other_msg);
*/
virtual ~APRSExtMessage();
int getRSSI() const;
void setRSSI(const int rssi);
float getSNR() const;
void setSNR(const float snr);
virtual String toString();
private:
int _rssi = 0;
float _snr = 0.0;
};
#endif

Wyświetl plik

@ -42,6 +42,11 @@ void Display::setDisplaySaveTimeout(uint32_t timeout) {
_displaySaveModeTimer.setTimeout(timeout * 1000);
}
void Display::activateDistplay()
{
_disp->displayOn();
}
void Display::update() {
if (_displayFrameRate.check()) {

Wyświetl plik

@ -37,6 +37,8 @@ public:
void activateDisplaySaveMode();
void setDisplaySaveTimeout(uint32_t timeout);
void activateDistplay();
// functions for update loop
void update();
void addFrame(std::shared_ptr<DisplayFrame> frame);

Wyświetl plik

@ -36,52 +36,47 @@
#define REG_DETECTION_THRESHOLD 0x37
#define REG_SYNC_WORD 0x39
#define REG_INVERTIQ2 0x3b
#define REG_TEMP 0x3c
#define RED_LOW_BAT 0x3d
#define REG_DIO_MAPPING_1 0x40
#define REG_VERSION 0x42
#define REG_PA_DAC 0x4d
#define REG_FORMER_TEMP 0x5b
// modes
#define MODE_LONG_RANGE_MODE 0x80
#define MODE_SLEEP 0x00
#define MODE_STDBY 0x01
#define MODE_TX 0x03
#define MODE_RX_CONTINUOUS 0x05
#define MODE_RX_SINGLE 0x06
#define MODE_LONG_RANGE_MODE 0x80
#define MODE_SLEEP 0x00
#define MODE_STDBY 0x01
#define MODE_TX 0x03
#define MODE_RX_CONTINUOUS 0x05
#define MODE_RX_SINGLE 0x06
// PA config
#define PA_BOOST 0x80
#define PA_BOOST 0x80
// IRQ masks
#define IRQ_TX_DONE_MASK 0x08
#define IRQ_PAYLOAD_CRC_ERROR_MASK 0x20
#define IRQ_RX_DONE_MASK 0x40
#define RF_MID_BAND_THRESHOLD 525E6
#define RSSI_OFFSET_HF_PORT 157
#define RSSI_OFFSET_LF_PORT 164
#define RF_MID_BAND_THRESHOLD 525E6
#define RSSI_OFFSET_HF_PORT 157
#define RSSI_OFFSET_LF_PORT 164
#define MAX_PKT_LENGTH 255
#define MAX_PKT_LENGTH 255
#if (ESP8266 || ESP32)
#define ISR_PREFIX ICACHE_RAM_ATTR
#define ISR_PREFIX ICACHE_RAM_ATTR
#else
#define ISR_PREFIX
#define ISR_PREFIX
#endif
LoRaClass::LoRaClass() :
_spiSettings(LORA_DEFAULT_SPI_FREQUENCY, MSBFIRST, SPI_MODE0),
_spi(&LORA_DEFAULT_SPI),
_ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN),
_frequency(0),
_packetIndex(0),
_implicitHeaderMode(0)
{
LoRaClass::LoRaClass() : _spiSettings(LORA_DEFAULT_SPI_FREQUENCY, MSBFIRST, SPI_MODE0), _spi(&LORA_DEFAULT_SPI), _ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN), _frequency(0), _packetIndex(0), _implicitHeaderMode(0) {
// overide Stream timeout value
setTimeout(0);
}
int LoRaClass::begin(long frequency)
{
int LoRaClass::begin(long frequency) {
#if defined(ARDUINO_SAMD_MKRWAN1300) || defined(ARDUINO_SAMD_MKRWAN1310)
pinMode(LORA_IRQ_DUMB, OUTPUT);
digitalWrite(LORA_IRQ_DUMB, LOW);
@ -148,8 +143,7 @@ int LoRaClass::begin(long frequency)
return 1;
}
void LoRaClass::end()
{
void LoRaClass::end() {
// put in sleep mode
sleep();
@ -157,8 +151,7 @@ void LoRaClass::end()
_spi->end();
}
int LoRaClass::beginPacket(int implicitHeader)
{
int LoRaClass::beginPacket(int implicitHeader) {
if (isTransmitting()) {
return 0;
}
@ -179,8 +172,7 @@ int LoRaClass::beginPacket(int implicitHeader)
return 1;
}
int LoRaClass::endPacket(bool async)
{
int LoRaClass::endPacket(bool async) {
// put in TX mode
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);
@ -197,8 +189,7 @@ int LoRaClass::endPacket(bool async)
return 1;
}
bool LoRaClass::isTransmitting()
{
bool LoRaClass::isTransmitting() {
if ((readRegister(REG_OP_MODE) & MODE_TX) == MODE_TX) {
return true;
}
@ -211,10 +202,9 @@ bool LoRaClass::isTransmitting()
return false;
}
int LoRaClass::parsePacket(int size)
{
int LoRaClass::parsePacket(int size) {
int packetLength = 0;
int irqFlags = readRegister(REG_IRQ_FLAGS);
int irqFlags = readRegister(REG_IRQ_FLAGS);
if (size > 0) {
implicitHeaderMode();
@ -256,47 +246,41 @@ int LoRaClass::parsePacket(int size)
return packetLength;
}
int LoRaClass::packetRssi()
{
int LoRaClass::packetRssi() {
return (readRegister(REG_PKT_RSSI_VALUE) - (_frequency < RF_MID_BAND_THRESHOLD ? RSSI_OFFSET_LF_PORT : RSSI_OFFSET_HF_PORT));
}
float LoRaClass::packetSnr()
{
float LoRaClass::packetSnr() {
return ((int8_t)readRegister(REG_PKT_SNR_VALUE)) * 0.25;
}
long LoRaClass::packetFrequencyError()
{
long LoRaClass::packetFrequencyError() {
int32_t freqError = 0;
freqError = static_cast<int32_t>(readRegister(REG_FREQ_ERROR_MSB) & B111);
freqError = static_cast<int32_t>(readRegister(REG_FREQ_ERROR_MSB) & B111);
freqError <<= 8L;
freqError += static_cast<int32_t>(readRegister(REG_FREQ_ERROR_MID));
freqError <<= 8L;
freqError += static_cast<int32_t>(readRegister(REG_FREQ_ERROR_LSB));
if (readRegister(REG_FREQ_ERROR_MSB) & B1000) { // Sign bit is on
freqError -= 524288; // B1000'0000'0000'0000'0000
freqError -= 524288; // B1000'0000'0000'0000'0000
}
const float fXtal = 32E6; // FXOSC: crystal oscillator (XTAL) frequency (2.5. Chip Specification, p. 14)
const float fXtal = 32E6; // FXOSC: crystal oscillator (XTAL) frequency (2.5. Chip Specification, p. 14)
const float fError = ((static_cast<float>(freqError) * (1L << 24)) / fXtal) * (getSignalBandwidth() / 500000.0f); // p. 37
return static_cast<long>(fError);
}
int LoRaClass::rssi()
{
int LoRaClass::rssi() {
return (readRegister(REG_RSSI_VALUE) - (_frequency < RF_MID_BAND_THRESHOLD ? RSSI_OFFSET_LF_PORT : RSSI_OFFSET_HF_PORT));
}
size_t LoRaClass::write(uint8_t byte)
{
size_t LoRaClass::write(uint8_t byte) {
return write(&byte, sizeof(byte));
}
size_t LoRaClass::write(const uint8_t *buffer, size_t size)
{
size_t LoRaClass::write(const uint8_t *buffer, size_t size) {
int currentLength = readRegister(REG_PAYLOAD_LENGTH);
// check size
@ -315,13 +299,11 @@ size_t LoRaClass::write(const uint8_t *buffer, size_t size)
return size;
}
int LoRaClass::available()
{
int LoRaClass::available() {
return (readRegister(REG_RX_NB_BYTES) - _packetIndex);
}
int LoRaClass::read()
{
int LoRaClass::read() {
if (!available()) {
return -1;
}
@ -331,8 +313,7 @@ int LoRaClass::read()
return readRegister(REG_FIFO);
}
int LoRaClass::peek()
{
int LoRaClass::peek() {
if (!available()) {
return -1;
}
@ -349,12 +330,10 @@ int LoRaClass::peek()
return b;
}
void LoRaClass::flush()
{
void LoRaClass::flush() {
}
void LoRaClass::receive(int size)
{
void LoRaClass::receive(int size) {
writeRegister(REG_DIO_MAPPING_1, 0x00); // DIO0 => RXDONE
@ -369,18 +348,15 @@ void LoRaClass::receive(int size)
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
}
void LoRaClass::idle()
{
void LoRaClass::idle() {
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY);
}
void LoRaClass::sleep()
{
void LoRaClass::sleep() {
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
}
void LoRaClass::setTxPower(int level, int outputPin)
{
void LoRaClass::setTxPower(int level, int outputPin) {
if (PA_OUTPUT_RFO_PIN == outputPin) {
// RFO
if (level < 0) {
@ -407,7 +383,7 @@ void LoRaClass::setTxPower(int level, int outputPin)
if (level < 2) {
level = 2;
}
//Default value PA_HF/LF or +17dBm
// Default value PA_HF/LF or +17dBm
writeRegister(REG_PA_DAC, 0x84);
setOCP(100);
}
@ -416,8 +392,7 @@ void LoRaClass::setTxPower(int level, int outputPin)
}
}
void LoRaClass::setFrequency(long frequency)
{
void LoRaClass::setFrequency(long frequency) {
_frequency = frequency;
uint64_t frf = ((uint64_t)frequency << 19) / 32000000;
@ -427,13 +402,11 @@ void LoRaClass::setFrequency(long frequency)
writeRegister(REG_FRF_LSB, (uint8_t)(frf >> 0));
}
int LoRaClass::getSpreadingFactor()
{
int LoRaClass::getSpreadingFactor() {
return readRegister(REG_MODEM_CONFIG_2) >> 4;
}
void LoRaClass::setSpreadingFactor(int sf)
{
void LoRaClass::setSpreadingFactor(int sf) {
if (sf < 6) {
sf = 6;
} else if (sf > 12) {
@ -452,28 +425,36 @@ void LoRaClass::setSpreadingFactor(int sf)
setLdoFlag();
}
long LoRaClass::getSignalBandwidth()
{
long LoRaClass::getSignalBandwidth() {
byte bw = (readRegister(REG_MODEM_CONFIG_1) >> 4);
switch (bw) {
case 0: return 7.8E3;
case 1: return 10.4E3;
case 2: return 15.6E3;
case 3: return 20.8E3;
case 4: return 31.25E3;
case 5: return 41.7E3;
case 6: return 62.5E3;
case 7: return 125E3;
case 8: return 250E3;
case 9: return 500E3;
case 0:
return 7.8E3;
case 1:
return 10.4E3;
case 2:
return 15.6E3;
case 3:
return 20.8E3;
case 4:
return 31.25E3;
case 5:
return 41.7E3;
case 6:
return 62.5E3;
case 7:
return 125E3;
case 8:
return 250E3;
case 9:
return 500E3;
}
return -1;
}
void LoRaClass::setSignalBandwidth(long sbw)
{
void LoRaClass::setSignalBandwidth(long sbw) {
int bw;
if (sbw <= 7.8E3) {
@ -502,10 +483,9 @@ void LoRaClass::setSignalBandwidth(long sbw)
setLdoFlag();
}
void LoRaClass::setLdoFlag()
{
void LoRaClass::setLdoFlag() {
// Section 4.1.1.5
long symbolDuration = 1000 / ( getSignalBandwidth() / (1L << getSpreadingFactor()) ) ;
long symbolDuration = 1000 / (getSignalBandwidth() / (1L << getSpreadingFactor()));
// Section 4.1.1.6
boolean ldoOn = symbolDuration > 16;
@ -515,8 +495,7 @@ void LoRaClass::setLdoFlag()
writeRegister(REG_MODEM_CONFIG_3, config3);
}
void LoRaClass::setCodingRate4(int denominator)
{
void LoRaClass::setCodingRate4(int denominator) {
if (denominator < 5) {
denominator = 5;
} else if (denominator > 8) {
@ -528,62 +507,54 @@ void LoRaClass::setCodingRate4(int denominator)
writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0xf1) | (cr << 1));
}
void LoRaClass::setPreambleLength(long length)
{
void LoRaClass::setPreambleLength(long length) {
writeRegister(REG_PREAMBLE_MSB, (uint8_t)(length >> 8));
writeRegister(REG_PREAMBLE_LSB, (uint8_t)(length >> 0));
}
void LoRaClass::setSyncWord(int sw)
{
void LoRaClass::setSyncWord(int sw) {
writeRegister(REG_SYNC_WORD, sw);
}
void LoRaClass::enableCrc()
{
void LoRaClass::enableCrc() {
writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) | 0x04);
}
void LoRaClass::disableCrc()
{
void LoRaClass::disableCrc() {
writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb);
}
void LoRaClass::enableInvertIQ()
{
writeRegister(REG_INVERTIQ, 0x66);
void LoRaClass::enableInvertIQ() {
writeRegister(REG_INVERTIQ, 0x66);
writeRegister(REG_INVERTIQ2, 0x19);
}
void LoRaClass::disableInvertIQ()
{
writeRegister(REG_INVERTIQ, 0x27);
void LoRaClass::disableInvertIQ() {
writeRegister(REG_INVERTIQ, 0x27);
writeRegister(REG_INVERTIQ2, 0x1d);
}
void LoRaClass::setOCP(uint8_t mA)
{
void LoRaClass::setOCP(uint8_t mA) {
uint8_t ocpTrim = 27;
if (mA <= 120) {
ocpTrim = (mA - 45) / 5;
} else if (mA <=240) {
} else if (mA <= 240) {
ocpTrim = (mA + 30) / 10;
}
writeRegister(REG_OCP, 0x20 | (0x1F & ocpTrim));
}
void LoRaClass::setGain(uint8_t gain)
{
void LoRaClass::setGain(uint8_t gain) {
// check allowed range
if (gain > 6) {
gain = 6;
}
// set to standby
idle();
// set gain
if (gain == 0) {
// if gain = 0, enable AGC
@ -591,39 +562,34 @@ void LoRaClass::setGain(uint8_t gain)
} else {
// disable AGC
writeRegister(REG_MODEM_CONFIG_3, 0x00);
// clear Gain and set LNA boost
writeRegister(REG_LNA, 0x03);
// set gain
writeRegister(REG_LNA, readRegister(REG_LNA) | (gain << 5));
}
}
byte LoRaClass::random()
{
byte LoRaClass::random() {
return readRegister(REG_RSSI_WIDEBAND);
}
void LoRaClass::setPins(int ss, int reset, int dio0)
{
_ss = ss;
void LoRaClass::setPins(int ss, int reset, int dio0) {
_ss = ss;
_reset = reset;
_dio0 = dio0;
_dio0 = dio0;
}
void LoRaClass::setSPI(SPIClass& spi)
{
void LoRaClass::setSPI(SPIClass &spi) {
_spi = &spi;
}
void LoRaClass::setSPIFrequency(uint32_t frequency)
{
void LoRaClass::setSPIFrequency(uint32_t frequency) {
_spiSettings = SPISettings(frequency, MSBFIRST, SPI_MODE0);
}
void LoRaClass::dumpRegisters(Stream& out)
{
void LoRaClass::dumpRegisters(Stream &out) {
for (int i = 0; i < 128; i++) {
out.print("0x");
out.print(i, HEX);
@ -632,32 +598,27 @@ void LoRaClass::dumpRegisters(Stream& out)
}
}
void LoRaClass::explicitHeaderMode()
{
void LoRaClass::explicitHeaderMode() {
_implicitHeaderMode = 0;
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
}
void LoRaClass::implicitHeaderMode()
{
void LoRaClass::implicitHeaderMode() {
_implicitHeaderMode = 1;
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) | 0x01);
}
uint8_t LoRaClass::readRegister(uint8_t address)
{
uint8_t LoRaClass::readRegister(uint8_t address) {
return singleTransfer(address & 0x7f, 0x00);
}
void LoRaClass::writeRegister(uint8_t address, uint8_t value)
{
void LoRaClass::writeRegister(uint8_t address, uint8_t value) {
singleTransfer(address | 0x80, value);
}
uint8_t LoRaClass::singleTransfer(uint8_t address, uint8_t value)
{
uint8_t LoRaClass::singleTransfer(uint8_t address, uint8_t value) {
uint8_t response;
digitalWrite(_ss, LOW);

Wyświetl plik

@ -22,16 +22,16 @@ bool LoRa_APRS::checkMessage() {
while (available()) {
str += (char)read();
}
_LastReceivedMsg = std::shared_ptr<APRSMessage>(new APRSMessage());
_LastReceivedMsg = std::shared_ptr<APRSExtMessage>(new APRSExtMessage());
_LastReceivedMsg->decode(str);
return true;
}
std::shared_ptr<APRSMessage> LoRa_APRS::getMessage() {
std::shared_ptr<APRSExtMessage> LoRa_APRS::getMessage() {
return _LastReceivedMsg;
}
void LoRa_APRS::sendMessage(const std::shared_ptr<APRSMessage> msg) {
void LoRa_APRS::sendMessage(const std::shared_ptr<APRSExtMessage> msg) {
setFrequency(_TxFrequency);
String data = msg->encode();
beginPacket();
@ -50,6 +50,10 @@ void LoRa_APRS::setRxFrequency(long frequency) {
setFrequency(_RxFrequency);
}
void LoRa_APRS::setRxGain(uint8_t gain) {
setGain(gain);
}
// cppcheck-suppress unusedFunction
long LoRa_APRS::getRxFrequency() const {
return _RxFrequency;

Wyświetl plik

@ -4,6 +4,7 @@
#include <Arduino.h>
#include <APRS-Decoder.h>
#include <APRSExtMessage.h>
#include <LoRa.h>
#include <memory>
@ -11,21 +12,23 @@ class LoRa_APRS : public LoRaClass {
public:
LoRa_APRS();
bool checkMessage();
std::shared_ptr<APRSMessage> getMessage();
bool checkMessage();
std::shared_ptr<APRSExtMessage> getMessage();
void sendMessage(const std::shared_ptr<APRSMessage> msg);
void sendMessage(const std::shared_ptr<APRSExtMessage> msg);
void setRxFrequency(long frequency);
long getRxFrequency() const;
void setRxGain(uint8_t gain);
void setTxFrequency(long frequency);
long getTxFrequency() const;
private:
std::shared_ptr<APRSMessage> _LastReceivedMsg;
long _RxFrequency;
long _TxFrequency;
std::shared_ptr<APRSExtMessage> _LastReceivedMsg;
long _RxFrequency;
long _TxFrequency;
};
#endif

Wyświetl plik

@ -1,7 +1,7 @@
#include "power_management.h"
PowerManagement::PowerManagement() {
PowerManagement::PowerManagement() : axp() {
}
bool PowerManagement::begin(TwoWire &port) {

Wyświetl plik

@ -1,6 +1,5 @@
#include "power_management_adc.h"
#include <logger.h>
PowerManagementADC::PowerManagementADC() {
}
@ -10,17 +9,18 @@ PowerManagementADC::~PowerManagementADC() {
// cppcheck-suppress unusedFunction
bool PowerManagementADC::begin(int pin, double max, double min) {
adc.attach(pin);
_pin = pin;
adc.attach(pin);
_pin = pin;
_max_voltage = max;
_min_voltage = min;
if (adc.readVoltage() > 0.0) return false;
if (adc.readVoltage() > 0.0)
return false;
return true;
}
// cppcheck-suppress unusedFunction
double PowerManagementADC::getVoltage() {
return adc.readVoltage();
_last_voltage = adc.readVoltage() * _scale;
// logPrintlnI("getVoltage() " + String(_last_voltage));
return _last_voltage;
}

Wyświetl plik

@ -9,16 +9,17 @@ public:
PowerManagementADC();
~PowerManagementADC();
bool begin(int pin, double max, double min);
bool begin(int pin, double max, double min);
double getVoltage();
private:
ESP32AnalogRead adc;
unsigned long _updateInterval = 60000; // In ms
int _pin;
double _max_voltage;
double _min_voltage;
int _pin = -1;
double _max_voltage = 0.0;
double _min_voltage = 0.0;
double _last_voltage = 0.0;
double const _divider = 0.5;
double const _scale = 1 / _divider;
};
#endif

Wyświetl plik

@ -1,7 +1,7 @@
#include "System.h"
System::System() : _boardConfig(0), _userConfig(0), _isWifiEthConnected(false) {
System::System() : _boardConfig(0), _userConfig(0), _dataConfig(0), _isWifiEthConnected(false) {
}
System::~System() {
@ -23,6 +23,10 @@ Configuration const *const System::getUserConfig() const {
return _userConfig;
}
DynamicJsonDocument const *const System::getDataConfig() const {
return _dataConfig;
}
TaskManager &System::getTaskManager() {
return _taskManager;
}
@ -31,10 +35,6 @@ Display &System::getDisplay() {
return _display;
}
PowerManagementADC &System::getPower() {
return _powerManagementADC;
}
bool System::isWifiEthConnected() const {
return _isWifiEthConnected;
}
@ -42,3 +42,23 @@ bool System::isWifiEthConnected() const {
void System::connectedViaWifiEth(bool status) {
_isWifiEthConnected = status;
}
double System::getVoltage() {
return _voltage;
}
void System::setVoltage(double last_voltage) {
_voltage = last_voltage;
}
void System::setCopyToTelegram() {
_copyToTelegram = true;
};
void System::unsetCopyToTelegram() {
_copyToTelegram = false;
};
bool System::isCopyToTelegram() const {
return _copyToTelegram;
};

Wyświetl plik

@ -6,7 +6,6 @@
#include "TaskManager.h"
#include <BoardFinder.h>
#include <Display.h>
#include <power_management_adc.h>
#include <configuration.h>
class System {
@ -17,21 +16,28 @@ public:
void setBoardConfig(BoardConfig const *const boardConfig);
void setUserConfig(Configuration const *const userConfig);
BoardConfig const *const getBoardConfig() const;
Configuration const *const getUserConfig() const;
TaskManager & getTaskManager();
Display & getDisplay();
PowerManagementADC & getPower();
bool isWifiEthConnected() const;
void connectedViaWifiEth(bool status);
BoardConfig const *const getBoardConfig() const;
Configuration const *const getUserConfig() const;
DynamicJsonDocument const *const getDataConfig() const;
TaskManager & getTaskManager();
Display & getDisplay();
bool isWifiEthConnected() const;
bool isCopyToTelegram() const;
void setCopyToTelegram();
void unsetCopyToTelegram();
void connectedViaWifiEth(bool status);
double getVoltage();
void setVoltage(double last_voltage);
private:
BoardConfig const * _boardConfig;
Configuration const *_userConfig;
TaskManager _taskManager;
Display _display;
PowerManagementADC _powerManagementADC;
bool _isWifiEthConnected;
BoardConfig const * _boardConfig;
Configuration const * _userConfig;
DynamicJsonDocument const *_dataConfig;
TaskManager _taskManager;
Display _display;
bool _isWifiEthConnected;
bool _copyToTelegram = false;
double _voltage = 0.0;
};
#endif

Wyświetl plik

@ -14,7 +14,9 @@ void TaskManager::addAlwaysRunTask(Task *task) {
}
std::list<Task *> TaskManager::getTasks() {
return _tasks;
std::list<Task *> tasks = _alwaysRunTasks;
std::copy(_tasks.begin(), _tasks.end(), std::back_inserter(tasks));
return tasks;
}
bool TaskManager::setup(System &system) {

Wyświetl plik

@ -0,0 +1,59 @@
#include <logger.h>
#include "TelegramMessage.h"
#include <TimeLib.h>
TelegramMessage::TelegramMessage() : _body(new TelegramBody()) {
}
TelegramMessage::TelegramMessage(TelegramMessage &other_msg) : _time(other_msg.getTime()), _body(new TelegramBody()) {
_body->setData(other_msg.getBody()->getData());
}
TelegramMessage &TelegramMessage::operator=(TelegramMessage &other_msg) {
if (this != &other_msg) {
_time = other_msg.getTime();
_body->setData(other_msg.getBody()->getData());
}
return *this;
}
TelegramMessage::~TelegramMessage() {
if (_body != 0) {
delete _body;
}
}
unsigned long TelegramMessage::getTime() const {
return _time;
}
void TelegramMessage::setTime(const unsigned long &time) {
_time = time;
}
TelegramBody *const TelegramMessage::getBody() {
return _body;
}
String TelegramMessage::toString() const {
return timeString(_time) + " (UTC), " + _body->toString();
}
TelegramBody::TelegramBody() {
}
TelegramBody::~TelegramBody() {
}
String TelegramBody::getData() const {
return _data;
}
void TelegramBody::setData(const String &data) {
_data = data;
}
String TelegramBody::toString() const {
return "Data: " + _data;
}

Wyświetl plik

@ -0,0 +1,36 @@
#ifndef Telegram_H_
#define Telegram_H_
class TelegramBody {
public:
TelegramBody();
virtual ~TelegramBody();
String getData() const;
void setData(const String &data);
virtual String toString() const;
private:
String _data;
};
class TelegramMessage {
public:
TelegramMessage();
explicit TelegramMessage(TelegramMessage &other_msg);
TelegramMessage &operator=(TelegramMessage &other_msg);
virtual ~TelegramMessage();
unsigned long getTime() const;
void setTime(const unsigned long &time);
TelegramBody *const getBody();
virtual String toString() const;
private:
unsigned long _time = 0;
TelegramBody *const _body;
};
#endif

Wyświetl plik

@ -11,6 +11,7 @@
[platformio]
default_envs = ttgo-lora32-v21
[env]
platform = espressif32 @ 3.1.1
framework = arduino
@ -18,16 +19,17 @@ lib_ldf_mode = deep+
monitor_speed = 115200
monitor_flags = --raw
lib_deps =
bblanchon/ArduinoJson @ 6.17.0
lewisxhe/AXP202X_Library @ 1.1.2
peterus/APRS-Decoder-Lib @ 0.0.6
peterus/esp-logger @ 0.0.1
peterus/ESP-FTP-Server-Lib @ 0.9.5
madhephaestus/ESP32AnalogRead@ 0.1.2
bblanchon/ArduinoJson @^6.17.0
lewisxhe/AXP202X_Library @^1.1.2
peterus/APRS-Decoder-Lib @^0.0.6
peterus/esp-logger @^0.0.2
peterus/ESP-FTP-Server-Lib @^0.9.6
madhephaestus/ESP32AnalogRead@^0.1.2
witnessmenow/UniversalTelegramBot@^1.3.0
check_tool = cppcheck
check_flags = cppcheck: --suppress=*:*.pio\* --inline-suppr -DCPPCHECK --force lib -ilib/TimeLib -ilib/LoRa -ilib/NTPClient
check_skip_packages = yes
upload_port = /dev/cu.wchusbserial*
[env:lora_board]
board = esp32doit-devkit-v1
@ -42,6 +44,8 @@ monitor_filters = esp32_exception_decoder
[env:ttgo-lora32-v21]
platform = espressif32
board = ttgo-lora32-v21
build_flags = -Wall -DCORE_DEBUG_LEVEL=3
[env:ttgo-lora32-debug-v21]
platform = espressif32

Wyświetl plik

@ -15,36 +15,37 @@
#include "TaskModem.h"
#include "TaskNTP.h"
#include "TaskOTA.h"
#include "TaskRouter.h"
#include "TaskWifi.h"
#include "TaskPower.h"
#include "TaskRouter.h"
#include "TaskTelegram.h"
#include "TaskWifi.h"
#include "project_configuration.h"
#define VERSION "21.35.2"
#define VERSION "21.44.0-dev"
String create_lat_aprs(double lat);
String create_long_aprs(double lng);
TaskQueue<std::shared_ptr<APRSMessage>> toAprsIs;
TaskQueue<std::shared_ptr<APRSMessage>> fromModem;
TaskQueue<std::shared_ptr<APRSMessage>> toModem;
TaskQueue<std::shared_ptr<APRSMessage>> fromPower;
TaskQueue<std::shared_ptr<APRSExtMessage>> toAprsIs;
TaskQueue<std::shared_ptr<APRSExtMessage>> fromModem;
TaskQueue<std::shared_ptr<APRSExtMessage>> toModem;
TaskQueue<std::shared_ptr<APRSExtMessage>> fromPower;
TaskQueue<std::shared_ptr<TelegramMessage>> toTelegram;
System LoRaSystem;
Configuration userConfig;
DisplayTask displayTask;
ModemTask modemTask(fromModem, toModem);
EthTask ethTask;
WifiTask wifiTask;
OTATask otaTask;
NTPTask ntpTask;
FTPTask ftpTask;
POWERTask powerTask(fromPower);
AprsIsTask aprsIsTask(toAprsIs);
RouterTask routerTask(fromModem, toModem, toAprsIs);
TelegramTask telegramTask;
DisplayTask displayTask;
ModemTask modemTask(fromModem, toModem);
EthTask ethTask;
WifiTask wifiTask;
OTATask otaTask;
NTPTask ntpTask;
FTPTask ftpTask;
PowerTask powerTask(fromPower);
AprsIsTask aprsIsTask(toAprsIs);
RouterTask routerTask(fromModem, toModem, toAprsIs, toTelegram);
TelegramTask telegramTask(toTelegram);
void setup() {
Serial.begin(115200);
@ -106,11 +107,11 @@ void setup() {
LoRaSystem.getTaskManager().addTask(&modemTask);
LoRaSystem.getTaskManager().addTask(&routerTask);
if (userConfig.aprs_is.active) {
if (boardConfig->Type == eETH_BOARD) {
if (boardConfig->Type == eETH_BOARD && !userConfig.wifi.active) {
LoRaSystem.getTaskManager().addAlwaysRunTask(&ethTask);
} else {
}
if (userConfig.wifi.active) {
LoRaSystem.getTaskManager().addAlwaysRunTask(&wifiTask);
}
LoRaSystem.getTaskManager().addTask(&otaTask);
@ -149,7 +150,6 @@ void setup() {
}
if (userConfig.display.overwritePin != 0) {
pinMode(userConfig.display.overwritePin, INPUT);
pinMode(userConfig.display.overwritePin, INPUT_PULLUP);
}

Wyświetl plik

@ -4,7 +4,7 @@
#include "TaskAprsIs.h"
#include "project_configuration.h"
AprsIsTask::AprsIsTask(TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs) : Task(TASK_APRS_IS, TaskAprsIs), _toAprsIs(toAprsIs) {
AprsIsTask::AprsIsTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &toAprsIs) : Task(TASK_APRS_IS, TaskAprsIs), _toAprsIs(toAprsIs) {
}
AprsIsTask::~AprsIsTask() {
@ -30,10 +30,10 @@ bool AprsIsTask::loop(System &system) {
return false;
}
_aprs_is.getAPRSMessage();
_aprs_is.getAPRSExtMessage();
if (!_toAprsIs.empty()) {
std::shared_ptr<APRSMessage> msg = _toAprsIs.getElement();
std::shared_ptr<APRSExtMessage> msg = _toAprsIs.getElement();
_aprs_is.sendMessage(msg);
}

Wyświetl plik

@ -2,13 +2,13 @@
#define TASK_APRS_IS_H_
#include <APRS-IS.h>
#include <APRSMessage.h>
#include <APRSExtMessage.h>
#include <TaskManager.h>
#include <Timer.h>
class AprsIsTask : public Task {
public:
explicit AprsIsTask(TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs);
explicit AprsIsTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &toAprsIs);
virtual ~AprsIsTask();
virtual bool setup(System &system) override;
@ -17,7 +17,7 @@ public:
private:
APRS_IS _aprs_is;
TaskQueue<std::shared_ptr<APRSMessage>> &_toAprsIs;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_toAprsIs;
bool connect(const System &system);
};

Wyświetl plik

@ -25,6 +25,9 @@ bool DisplayTask::setup(System &system) {
}
bool DisplayTask::loop(System &system) {
if (system.getUserConfig()->display.overwritePin != 0 && !digitalRead(system.getUserConfig()->display.overwritePin)) {
system.getDisplay().activateDistplay();
}
system.getDisplay().update();
return true;
}

Wyświetl plik

@ -7,7 +7,7 @@
#include "TaskModem.h"
#include "project_configuration.h"
ModemTask::ModemTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toModem) : Task(TASK_MODEM, TaskModem), _lora_aprs(), _fromModem(fromModem), _toModem(toModem) {
ModemTask::ModemTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSExtMessage>> &toModem) : Task(TASK_MODEM, TaskModem), _lora_aprs(), _fromModem(fromModem), _toModem(toModem) {
}
ModemTask::~ModemTask() {
@ -24,6 +24,7 @@ bool ModemTask::setup(System &system) {
;
}
_lora_aprs.setRxFrequency(system.getUserConfig()->lora.frequencyRx);
_lora_aprs.setRxGain(system.getUserConfig()->lora.gainRx);
_lora_aprs.setTxFrequency(system.getUserConfig()->lora.frequencyTx);
_lora_aprs.setTxPower(system.getUserConfig()->lora.power);
_lora_aprs.setSpreadingFactor(system.getUserConfig()->lora.spreadingFactor);
@ -37,22 +38,25 @@ bool ModemTask::setup(System &system) {
bool ModemTask::loop(System &system) {
if (_lora_aprs.checkMessage()) {
std::shared_ptr<APRSMessage> msg = _lora_aprs.getMessage();
std::shared_ptr<APRSExtMessage> msg = _lora_aprs.getMessage();
// msg->getAPRSBody()->setData(msg->getAPRSBody()->getData() + " 123");
logPrintD("[" + timeString() + "] ");
logPrintD("Received packet '");
logPrintD(msg->toString());
logPrintD("' with RSSI ");
logPrintD(String(_lora_aprs.packetRssi()));
logPrintD(" and SNR ");
logPrintlnD(String(_lora_aprs.packetSnr()));
logPrintI("[" + timeString() + "] ");
logPrintI("Received packet '");
logPrintI(msg->toString());
logPrintI("' with RSSI ");
logPrintI(String(_lora_aprs.packetRssi()));
logPrintI(" and SNR ");
logPrintlnI(String(_lora_aprs.packetSnr()));
msg->setRSSI(_lora_aprs.packetRssi());
msg->setSNR(_lora_aprs.packetSnr());
_fromModem.addElement(msg);
system.getDisplay().addFrame(std::shared_ptr<DisplayFrame>(new TextFrame("LoRa", msg->toString())));
}
if (!_toModem.empty()) {
std::shared_ptr<APRSMessage> msg = _toModem.getElement();
std::shared_ptr<APRSExtMessage> msg = _toModem.getElement();
_lora_aprs.sendMessage(msg);
}

Wyświetl plik

@ -7,7 +7,7 @@
class ModemTask : public Task {
public:
explicit ModemTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &_toModem);
explicit ModemTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSExtMessage>> &_toModem);
virtual ~ModemTask();
virtual bool setup(System &system) override;
@ -16,8 +16,8 @@ public:
private:
LoRa_APRS _lora_aprs;
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
TaskQueue<std::shared_ptr<APRSMessage>> &_toModem;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_fromModem;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_toModem;
};
#endif

Wyświetl plik

@ -2,14 +2,15 @@
#include "TaskPower.h"
#include "project_configuration.h"
#include <TimeLib.h>
POWERTask::POWERTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromPower) : Task("POWERTask", 0), _fromPower(fromPower) {
PowerTask::PowerTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &fromPower) : Task("PowerTask", 0), _fromPower(fromPower) {
}
POWERTask::~POWERTask() {
PowerTask::~PowerTask() {
}
bool POWERTask::setup(System &system) {
bool PowerTask::setup(System &system) {
if (!_powerManagementADC.begin(system.getUserConfig()->power.pin, system.getUserConfig()->power.max_voltage, system.getUserConfig()->power.min_voltage)) {
logPrintlnI("ADC init done!");
return true;
@ -18,13 +19,19 @@ bool POWERTask::setup(System &system) {
return false;
}
bool POWERTask::loop(System &system) {
bool PowerTask::loop(System &system) {
if (millis() > _lastTimePowerRead + _powerReadDelay) {
logPrintI("Voltage: ");
logPrintlnI(String(_powerManagementADC.getVoltage()*2.0));
_stateInfo = String(_powerManagementADC.getVoltage()*2.0) + "V";
_lastVoltage = _powerManagementADC.getVoltage();
logPrintlnI(timeString(now()) + " (UTC), ");
logPrintI("Battery: ");
logPrintlnI(String(_lastVoltage) + " V");
//logPrintlnI("Free Heap : " + String(esp_get_free_heap_size()));
logPrintlnI("Free Minimum Heap : " + String(esp_get_minimum_free_heap_size()));
//logPrintlnI("Free Internal Heap: " + String(esp_get_free_internal_heap_size()));
_stateInfo = String(_lastVoltage) + " V";
_lastTimePowerRead = millis();
system.setVoltage(_lastVoltage);
}
_state = Okay;
_state = Okay;
return true;
}

Wyświetl plik

@ -1,24 +1,24 @@
#ifndef TASK_POWER_H_
#define TASK_POWER_H_
#include <power_management_adc.h>
#include <APRSExtMessage.h>
#include <TaskManager.h>
#include <APRSMessage.h>
#include <power_management_adc.h>
class POWERTask : public Task {
class PowerTask : public Task {
public:
POWERTask(TaskQueue<std::shared_ptr<APRSMessage>> &_fromPower);
virtual ~POWERTask();
PowerTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &_fromPower);
virtual ~PowerTask();
virtual bool setup(System &system) override;
virtual bool loop(System &system) override;
private:
PowerManagementADC _powerManagementADC;
int _powerReadDelay = 30000;
unsigned long _lastTimePowerRead;
int _powerReadDelay = 30000;
unsigned long _lastTimePowerRead = 0;
double _lastVoltage = 0.0;
TaskQueue<std::shared_ptr<APRSMessage>> &_fromPower;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_fromPower;
};
#endif

Wyświetl plik

@ -9,7 +9,7 @@
String create_lat_aprs(double lat);
String create_long_aprs(double lng);
RouterTask::RouterTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toModem, TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs) : Task(TASK_ROUTER, TaskRouter), _fromModem(fromModem), _toModem(toModem), _toAprsIs(toAprsIs) {
RouterTask::RouterTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSExtMessage>> &toModem, TaskQueue<std::shared_ptr<APRSExtMessage>> &toAprsIs, TaskQueue<std::shared_ptr<TelegramMessage>> &toTelegram) : Task(TASK_ROUTER, TaskRouter), _fromModem(fromModem), _toModem(toModem), _toAprsIs(toAprsIs), _toTelegram(toTelegram) {
}
RouterTask::~RouterTask() {
@ -19,24 +19,28 @@ bool RouterTask::setup(System &system) {
// setup beacon
_beacon_timer.setTimeout(system.getUserConfig()->beacon.timeout * 60 * 1000);
_beaconMsg = std::shared_ptr<APRSMessage>(new APRSMessage());
_beaconMsg = std::shared_ptr<APRSExtMessage>(new APRSExtMessage());
_beaconMsg->setSource(system.getUserConfig()->callsign);
_beaconMsg->setDestination("APLG01");
String lat = create_lat_aprs(system.getUserConfig()->beacon.positionLatitude);
String lng = create_long_aprs(system.getUserConfig()->beacon.positionLongitude);
_beaconMsg->getBody()->setData(String("=") + lat + "L" + lng + "&" + system.getUserConfig()->beacon.message);
if (system.getUserConfig()->telegram.active) {
system.setCopyToTelegram();
}
return true;
}
bool RouterTask::loop(System &system) {
// do routing
if (!_fromModem.empty()) {
std::shared_ptr<APRSMessage> modemMsg = _fromModem.getElement();
std::shared_ptr<APRSExtMessage> modemMsg = _fromModem.getElement();
if (system.getUserConfig()->aprs_is.active && modemMsg->getSource() != system.getUserConfig()->callsign) {
std::shared_ptr<APRSMessage> aprsIsMsg = std::make_shared<APRSMessage>(*modemMsg);
String path = aprsIsMsg->getPath();
std::shared_ptr<APRSExtMessage> aprsIsMsg = std::make_shared<APRSExtMessage>(*modemMsg);
String path = aprsIsMsg->getPath();
if (!(path.indexOf("RFONLY") != -1 || path.indexOf("NOGATE") != -1 || path.indexOf("TCPIP") != -1)) {
if (!path.isEmpty()) {
@ -48,6 +52,12 @@ bool RouterTask::loop(System &system) {
logPrintD("APRS-IS: ");
logPrintlnD(aprsIsMsg->toString());
_toAprsIs.addElement(aprsIsMsg);
if (system.isCopyToTelegram()) {
_telegramMsg = std::shared_ptr<TelegramMessage>(new TelegramMessage());
_telegramMsg->setTime(now());
_telegramMsg->getBody()->setData(aprsIsMsg->toString());
_toTelegram.addElement(_telegramMsg);
}
} else {
logPrintlnD("APRS-IS: no forward => RFonly");
}
@ -60,8 +70,8 @@ bool RouterTask::loop(System &system) {
}
if (system.getUserConfig()->digi.active && modemMsg->getSource() != system.getUserConfig()->callsign) {
std::shared_ptr<APRSMessage> digiMsg = std::make_shared<APRSMessage>(*modemMsg);
String path = digiMsg->getPath();
std::shared_ptr<APRSExtMessage> digiMsg = std::make_shared<APRSExtMessage>(*modemMsg);
String path = digiMsg->getPath();
// simple loop check
if (path.indexOf("WIDE1-1") >= 0 && path.indexOf(system.getUserConfig()->callsign) == -1) {
@ -94,7 +104,7 @@ bool RouterTask::loop(System &system) {
}
uint32_t diff = _beacon_timer.getTriggerTimeInSec();
_stateInfo = "beacon " + String(uint32_t(diff / 60)) + ":" + String(uint32_t(diff % 60));
_stateInfo = "beacon " + String(uint32_t(diff / 600)) + String(uint32_t(diff / 60) % 10) + ":" + String(uint32_t(diff / 10) % 6) + String(uint32_t(diff % 10));
return true;
}

Wyświetl plik

@ -1,24 +1,28 @@
#ifndef TASK_ROUTER_H_
#define TASK_ROUTER_H_
#include <APRSMessage.h>
#include <APRSExtMessage.h>
#include <TaskManager.h>
#include <TelegramMessage.h>
class RouterTask : public Task {
public:
RouterTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toModem, TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs);
RouterTask(TaskQueue<std::shared_ptr<APRSExtMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSExtMessage>> &toModem, TaskQueue<std::shared_ptr<APRSExtMessage>> &toAprsIs, TaskQueue<std::shared_ptr<TelegramMessage>> &toTelegram);
virtual ~RouterTask();
virtual bool setup(System &system) override;
virtual bool loop(System &system) override;
private:
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
TaskQueue<std::shared_ptr<APRSMessage>> &_toModem;
TaskQueue<std::shared_ptr<APRSMessage>> &_toAprsIs;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_fromModem;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_toModem;
TaskQueue<std::shared_ptr<APRSExtMessage>> &_toAprsIs;
std::shared_ptr<APRSMessage> _beaconMsg;
Timer _beacon_timer;
TaskQueue<std::shared_ptr<TelegramMessage>> &_toTelegram;
std::shared_ptr<APRSExtMessage> _beaconMsg;
std::shared_ptr<TelegramMessage> _telegramMsg;
Timer _beacon_timer;
};
#endif

Wyświetl plik

@ -3,17 +3,25 @@
#include "Task.h"
#include "TaskTelegram.h"
#include "project_configuration.h"
#include <System.h>
#include <TimeLib.h>
TelegramTask::TelegramTask() : Task(TASK_Telegram, TaskTelegram) {
TelegramTask::TelegramTask(TaskQueue<std::shared_ptr<TelegramMessage>> &toTelegram) : Task(TASK_Telegram, TaskTelegram), _toTelegram(toTelegram), _telegram(0) {
}
TelegramTask::~TelegramTask() {
}
bool TelegramTask::setup(System &system) {
_chatid = system.getUserConfig()->telegram.chatid;
_chatid = system.getUserConfig()->telegram.chatid;
_bottoken = system.getUserConfig()->telegram.bottoken;
_telegram = UniversalTelegramBot(_bottoken, _client);
_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
_telegram = new UniversalTelegramBot(_bottoken, _client);
logPrintI("BotToken: ");
logPrintI(_bottoken);
logPrintI(" Chat-ID: ");
logPrintlnI(_chatid);
logPrintlnI("TelegramTask: setup done...");
return true;
}
@ -21,39 +29,83 @@ bool TelegramTask::loop(System &system) {
if (!system.isWifiEthConnected()) {
return false;
}
// logPrintlnD("Telegram: check messages");
if (millis() > _lastTimeTelegramRan + _telegramRequestDelay) {
int numNewMessages = _telegram.getUpdates(_telegram.last_message_received + 1);
if (!_toTelegram.empty()) {
std::shared_ptr<TelegramMessage> msg = _toTelegram.getElement();
logPrintI("New Telegram Messages in Queue: ");
logPrintlnI(msg->toString());
_telegram->sendMessage(_chatid, msg->toString(), "");
}
int numNewMessages = _telegram->getUpdates(_telegram->last_message_received + 1);
while (numNewMessages) {
logPrintI("New Telegram Messages: ");
logPrintlnI(String(numNewMessages));
for (int i=0; i<numNewMessages; i++) {
String chatid = String(_telegram.messages[i].chat_id);
for (int i = 0; i < numNewMessages; i++) {
String chatid = String(_telegram->messages[i].chat_id);
if (chatid != _chatid) {
_telegram.sendMessage(chatid, "Unauthorized user", "");
_telegram->sendMessage(chatid, "Unauthorized user", "");
continue;
}
String text = _telegram.messages[i].text;
String from = _telegram.messages[i].from_name;
logPrintlnI(from + " " + text);
if (text == "/start") {
String welcome = "Welcome, " + from + ".\n";
welcome += "Use following commands to get current readings.\n\n";
welcome += "/bat - akku voltage\n";
welcome += "/last - last heard APRS Paket\n";
welcome += "/time - ntp time and date\n";
welcome += "/config - current configuration\n";
_telegram.sendMessage(_chatid, welcome, "");
}
String cmd = _telegram->messages[i].text;
String from = _telegram->messages[i].from_name;
cmd.toLowerCase();
logPrintlnI(from + ": " + cmd);
String text = "";
if (cmd == "/start") {
text = "Welcome, " + from + ".\n";
text += "Use following commands to get current readings.\n\n";
text += "/monon - aprs msg monitoring on\n";
text += "/monoff - aprs msg monitoring off\n";
text += "/bat - battery voltage\n";
text += "/last - last heard Telegram Paket\n";
text += "/millis - arduino millis()\n";
text += "/time - time and date\n";
text += "/config - current configuration\n";
} else if (cmd == "/monon") {
text = timeString(now()) + " (UTC), ";
text += "Monitoring: ON";
system.setCopyToTelegram();
} else if (cmd == "/monoff") {
text = timeString(now()) + " (UTC), ";
text += "Monitoring: OFF ";
system.unsetCopyToTelegram();
} else if (cmd == "/bat") {
text = timeString(now()) + " (UTC), ";
text += "Battery Voltage: ";
text += String(system.getVoltage()) + " V";
} else if (cmd == "/last") {
text = "Last APRS message: ";
text += "not implemented!";
} else if (cmd == "/millis") {
text = "millis: ";
text += String(millis());
} else if (cmd == "/time") {
text = timeString(now()) + " (UTC), ";
text += " " + String(day()) + "." + String(month()) + "." + String(year());
} else if (cmd == "/config") {
// serializeJsonPretty(system.getDataConfig(), text);
} else if (cmd == "/reboot") {
text = "rebooting igate";
ESP.restart();
} else {
text = "unknwon command, try /start for help!";
};
_telegramMsg = std::shared_ptr<TelegramMessage>(new TelegramMessage());
_telegramMsg->setTime(now());
_telegramMsg->getBody()->setData(text);
_toTelegram.addElement(_telegramMsg);
//_telegram->sendMessage(_chatid, text, "");
}
numNewMessages = _telegram.getUpdates(_telegram.last_message_received +1);
numNewMessages = _telegram->getUpdates(_telegram->last_message_received + 1);
}
_lastTimeTelegramRan = millis();
}
_stateInfo = "Telegram: active";
_state = Okay;
_state = Okay;
return true;
}

Wyświetl plik

@ -4,23 +4,31 @@
#include <TaskManager.h>
#include <UniversalTelegramBot.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <TelegramMessage.h>
class TelegramTask : public Task {
public:
TelegramTask();
explicit TelegramTask(TaskQueue<std::shared_ptr<TelegramMessage>> &toTelegram);
virtual ~TelegramTask();
virtual bool setup(System &system) override;
virtual bool loop(System &system) override;
TaskQueue<std::shared_ptr<TelegramMessage>> &_toTelegram;
std::shared_ptr<TelegramMessage> _telegramMsg;
private:
UniversalTelegramBot _telegram;
String _chatid;
String _bottoken;
UniversalTelegramBot * _telegram;
String _chatid = "";
String _bottoken = "";
int _telegramRequestDelay = 1000;
unsigned long _lastTimeTelegramRan;
WiFiClient _client;
unsigned long _lastTimeTelegramRan = 0;
WiFiClientSecure _client;
};
#endif

Wyświetl plik

@ -17,7 +17,8 @@ void ProjectConfigurationManagement::readProjectConfiguration(DynamicJsonDocumen
conf.network.dns2.fromString(data["network"]["dns2"].as<String>());
}
JsonArray aps = data["wifi"]["AP"].as<JsonArray>();
conf.wifi.active = data["wifi"]["active"];
JsonArray aps = data["wifi"]["AP"].as<JsonArray>();
for (JsonVariant v : aps) {
Configuration::Wifi::AP ap;
ap.SSID = v["SSID"].as<String>();
@ -39,6 +40,7 @@ void ProjectConfigurationManagement::readProjectConfiguration(DynamicJsonDocumen
conf.digi.active = data["digi"]["active"] | false;
conf.digi.beacon = data["digi"]["beacon"] | false;
conf.lora.frequencyRx = data["lora"]["frequency_rx"] | 433775000;
conf.lora.gainRx = data["lora"]["gain_rx"] | 0;
conf.lora.frequencyTx = data["lora"]["frequency_tx"] | 433775000;
conf.lora.power = data["lora"]["power"] | 20;
conf.lora.spreadingFactor = data["lora"]["spreading_factor"] | 12;
@ -69,15 +71,15 @@ void ProjectConfigurationManagement::readProjectConfiguration(DynamicJsonDocumen
if (data.containsKey("board"))
conf.board = data["board"].as<String>();
conf.power.active = data["power"]["active"] | true;
conf.power.pin = data["power"]["pin"] | 35;
conf.power.active = data["power"]["active"] | true;
conf.power.pin = data["power"]["pin"] | 35;
conf.power.min_voltage = data["power"]["min_voltage"] | 3.0;
conf.power.min_voltage = data["power"]["max_voltage"] | 4.2;
conf.telegram.active = data["telegram"]["active"] | false;
conf.telegram.chatid = data["telegram"]["chatid"] | "";
conf.telegram.active = data["telegram"]["active"] | false;
conf.telegram.chatid = data["telegram"]["chatid"] | "";
conf.telegram.bottoken = data["telegram"]["bottoken"] | "";
conf.telegram.monitor = data["telegram"]["monitor"] | false;
}
void ProjectConfigurationManagement::writeProjectConfiguration(Configuration &conf, DynamicJsonDocument &data) {
@ -92,7 +94,8 @@ void ProjectConfigurationManagement::writeProjectConfiguration(Configuration &co
data["network"]["dns2"] = conf.network.dns2.toString();
}
JsonArray aps = data["wifi"].createNestedArray("AP");
data["wifi"]["active"] = conf.wifi.active;
JsonArray aps = data["wifi"].createNestedArray("AP");
for (Configuration::Wifi::AP ap : conf.wifi.APs) {
JsonObject v = aps.createNestedObject();
v["SSID"] = ap.SSID;
@ -109,6 +112,7 @@ void ProjectConfigurationManagement::writeProjectConfiguration(Configuration &co
data["digi"]["active"] = conf.digi.active;
data["digi"]["beacon"] = conf.digi.beacon;
data["lora"]["frequency_rx"] = conf.lora.frequencyRx;
data["lora"]["gain_rx"] = conf.lora.gainRx;
data["lora"]["frequency_tx"] = conf.lora.frequencyTx;
data["lora"]["power"] = conf.lora.power;
data["lora"]["spreading_factor"] = conf.lora.spreadingFactor;
@ -129,13 +133,13 @@ void ProjectConfigurationManagement::writeProjectConfiguration(Configuration &co
data["board"] = conf.board;
data["power"]["active"] = conf.power.active;
data["power"]["pin"] = conf.power.pin;
data["power"]["active"] = conf.power.active;
data["power"]["pin"] = conf.power.pin;
data["power"]["min_voltage"] = conf.power.min_voltage;
data["power"]["max_voltage"] = conf.power.max_voltage;
data["telegram"]["active"] = conf.telegram.active;
data["telegram"]["chatid"] = conf.telegram.chatid;
data["telegram"]["active"] = conf.telegram.active;
data["telegram"]["chatid"] = conf.telegram.chatid;
data["telegram"]["bottoken"] = conf.telegram.bottoken;
data["telegram"]["monitor"] = conf.telegram.monitor;
}

Wyświetl plik

@ -21,15 +21,16 @@ public:
class Wifi {
public:
Wifi() : active(true) {
}
bool active;
class AP {
public:
String SSID;
String password;
};
Wifi() {
}
std::list<AP> APs;
};
@ -69,12 +70,13 @@ public:
LoRa() : frequencyRx(433775000), frequencyTx(433775000), power(20), spreadingFactor(12), signalBandwidth(125000), codingRate4(5) {
}
long frequencyRx;
long frequencyTx;
int power;
int spreadingFactor;
long signalBandwidth;
int codingRate4;
long frequencyRx;
uint8_t gainRx;
long frequencyTx;
int power;
int spreadingFactor;
long signalBandwidth;
int codingRate4;
};
class Display {
@ -104,40 +106,40 @@ public:
};
class PowerManagmentADC {
public:
PowerManagmentADC() : active(true), pin(35), max_voltage(4.7), min_voltage(3.0) {
public:
PowerManagmentADC() : active(true), pin(35), max_voltage(4.7), min_voltage(3.0) {
}
bool active;
int pin;
double max_voltage;
double min_voltage;
bool active;
int pin;
double max_voltage;
double min_voltage;
};
class Telegram {
public:
Telegram() : active(false), chatid(""), bottoken("") {
}
bool active;
String chatid;
String bottoken;
public:
Telegram() : active(false), chatid(""), bottoken(""), monitor("false") {
}
bool active;
String chatid;
String bottoken;
bool monitor;
};
Configuration() : callsign("NOCALL-10"), board(""), ntpServer("pool.ntp.org"){};
String callsign;
Network network;
Wifi wifi;
Beacon beacon;
APRS_IS aprs_is;
Digi digi;
LoRa lora;
Display display;
Ftp ftp;
String board;
String ntpServer;
Telegram telegram;
PowerManagmentADC power;
String callsign;
Network network;
Wifi wifi;
Beacon beacon;
APRS_IS aprs_is;
Digi digi;
LoRa lora;
Display display;
Ftp ftp;
String board;
String ntpServer;
Telegram telegram;
PowerManagmentADC power;
};
class ProjectConfigurationManagement : public ConfigurationManagement {