diff --git a/.github/ISSUE_TEMPLATE/Bug Report.yml b/.github/ISSUE_TEMPLATE/Bug Report.yml
index b5ca0db403..f2d2f6507b 100644
--- a/.github/ISSUE_TEMPLATE/Bug Report.yml
+++ b/.github/ISSUE_TEMPLATE/Bug Report.yml
@@ -49,10 +49,24 @@ body:
- Heltec V3
- Heltec Wireless Paper
- Heltec Wireless Tracker
+ - Heltec Mesh Node T114
+ - Heltec Vision Master E213
+ - Heltec Vision Master E290
+ - Heltec Vision Master T190
+ - Nano G1
+ - Nano G1 Explorer
+ - Nano G2 Ultra
- Raspberry Pi Pico (W)
- Relay v1
- Relay v2
- Seeed Wio Tracker 1110
+ - Seeed Card Tracker T1000-E
+ - Station G1
+ - Station G2
+ - unPhone
+ - CanaryOne
+ - Chatter
+ - Linux Native
- DIY
- Other
validations:
diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml
index b027a36ccb..b50ccac26b 100644
--- a/.github/ISSUE_TEMPLATE/feature.yml
+++ b/.github/ISSUE_TEMPLATE/feature.yml
@@ -18,6 +18,7 @@ body:
- ESP32
- RP2040
- Linux Native
+ - Cross-Platform
- other
validations:
required: true
diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml
index 36125f72f1..9b97dcb2e4 100644
--- a/.github/workflows/main_matrix.yml
+++ b/.github/workflows/main_matrix.yml
@@ -266,7 +266,7 @@ jobs:
chmod +x ./output/device-update.sh
- name: Zip firmware
- run: zip -j -9 -r ./firmware-${{ steps.version.outputs.version }}.zip ./output -x *.deb
+ run: zip -j -9 -r ./firmware-${{ steps.version.outputs.version }}.zip ./output -x meshtasticd_*
- uses: actions/download-artifact@v4
with:
diff --git a/boards/lora_isp4520.json b/boards/lora_isp4520.json
deleted file mode 100644
index 8125aa666d..0000000000
--- a/boards/lora_isp4520.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "build": {
- "arduino": {
- "ldscript": "nrf52832_s132_v6.ld"
- },
- "core": "nRF5",
- "cpu": "cortex-m4",
- "extra_flags": "-DNRF52832_XXAA -DNRF52",
- "f_cpu": "64000000L",
- "mcu": "nrf52832",
- "variant": "lora_isp4520",
- "bsp": {
- "name": "adafruit"
- },
- "softdevice": {
- "sd_flags": "-DS132",
- "sd_name": "s132",
- "sd_version": "6.1.1",
- "sd_fwid": "0x00B7"
- }
- },
- "connectivity": ["bluetooth"],
- "debug": {
- "jlink_device": "nRF52832_xxAA",
- "svd_path": "nrf52.svd",
- "openocd_target": "nrf52840-mdk-rs"
- },
- "frameworks": ["arduino"],
- "name": "lora ISP4520",
- "upload": {
- "maximum_ram_size": 65536,
- "maximum_size": 524288,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "nrfutil",
- "protocols": ["jlink", "nrfjprog", "nrfutil", "stlink"]
- },
- "url": "",
- "vendor": "PsiSoft"
-}
diff --git a/platformio.ini b/platformio.ini
index 668496567a..7e11fb86c9 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -82,6 +82,7 @@ build_flags = -Wno-missing-field-initializers
-DRADIOLIB_EXCLUDE_APRS
-DRADIOLIB_EXCLUDE_LORAWAN
-DMESHTASTIC_EXCLUDE_DROPZONE=1
+ -DBUILD_EPOCH=$UNIX_TIME
;-D OLED_PL
monitor_speed = 115200
diff --git a/protobufs b/protobufs
index 0acaec6eff..164e598734 160000
--- a/protobufs
+++ b/protobufs
@@ -1 +1 @@
-Subproject commit 0acaec6eff00e748beeae89148093221f131cd9c
+Subproject commit 164e598734a813ae00a2a74266e9e06438f030ce
diff --git a/src/configuration.h b/src/configuration.h
index 72420cc59f..349bd2870f 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -124,7 +124,8 @@ along with this program. If not, see .
#define INA3221_ADDR 0x42
#define QMC6310_ADDR 0x1C
#define QMI8658_ADDR 0x6B
-#define QMC5883L_ADDR 0x1E
+#define QMC5883L_ADDR 0x0D
+#define HMC5883L_ADDR 0x1E
#define SHTC3_ADDR 0x70
#define LPS22HB_ADDR 0x5C
#define LPS22HB_ADDR_ALT 0x5D
@@ -331,4 +332,4 @@ along with this program. If not, see .
#endif
#include "DebugConfiguration.h"
-#include "RF95Configuration.h"
\ No newline at end of file
+#include "RF95Configuration.h"
diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h
index 743de7a9a2..090b1a9682 100644
--- a/src/detect/ScanI2C.h
+++ b/src/detect/ScanI2C.h
@@ -36,6 +36,7 @@ class ScanI2C
QMC6310,
QMI8658,
QMC5883L,
+ HMC5883L,
PMSA0031,
MPU6050,
LIS3DH,
@@ -118,4 +119,4 @@ class ScanI2C
private:
bool shouldSuppressScreen = false;
-};
\ No newline at end of file
+};
diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp
index 48341034b9..f09eb3b95c 100644
--- a/src/detect/ScanI2CTwoWire.cpp
+++ b/src/detect/ScanI2CTwoWire.cpp
@@ -382,6 +382,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
break;
SCAN_SIMPLE_CASE(QMC5883L_ADDR, QMC5883L, "QMC5883L Highrate 3-Axis magnetic sensor found\n")
+ SCAN_SIMPLE_CASE(HMC5883L_ADDR, HMC5883L, "HMC5883L 3-Axis digital compass found\n")
SCAN_SIMPLE_CASE(PMSA0031_ADDR, PMSA0031, "PMSA0031 air quality sensor found\n")
SCAN_SIMPLE_CASE(MPU6050_ADDR, MPU6050, "MPU6050 accelerometer found\n");
diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp
index 046f277ff1..01fa65816e 100644
--- a/src/gps/GPS.cpp
+++ b/src/gps/GPS.cpp
@@ -26,6 +26,8 @@
#if defined(NRF52840_XXAA) || defined(NRF52833_XXAA) || defined(ARCH_ESP32) || defined(ARCH_PORTDUINO)
HardwareSerial *GPS::_serial_gps = &Serial1;
+#elif defined(ARCH_RP2040)
+SerialUART *GPS::_serial_gps = &Serial1;
#else
HardwareSerial *GPS::_serial_gps = NULL;
#endif
@@ -1198,9 +1200,13 @@ int GPS::prepareDeepSleep(void *unused)
GnssModel_t GPS::probe(int serialSpeed)
{
-#if defined(ARCH_NRF52) || defined(ARCH_PORTDUINO) || defined(ARCH_RP2040) || defined(ARCH_STM32WL)
+#if defined(ARCH_NRF52) || defined(ARCH_PORTDUINO) || defined(ARCH_STM32WL)
_serial_gps->end();
_serial_gps->begin(serialSpeed);
+#elif defined(ARCH_RP2040)
+ _serial_gps->end();
+ _serial_gps->setFIFOSize(256);
+ _serial_gps->begin(serialSpeed);
#else
if (_serial_gps->baudRate() != serialSpeed) {
LOG_DEBUG("Setting Baud to %i\n", serialSpeed);
@@ -1265,9 +1271,13 @@ GnssModel_t GPS::probe(int serialSpeed)
_serial_gps->write(_message_prt, sizeof(_message_prt));
delay(500);
serialSpeed = 9600;
-#if defined(ARCH_NRF52) || defined(ARCH_PORTDUINO) || defined(ARCH_RP2040) || defined(ARCH_STM32WL)
+#if defined(ARCH_NRF52) || defined(ARCH_PORTDUINO) || defined(ARCH_STM32WL)
_serial_gps->end();
_serial_gps->begin(serialSpeed);
+#elif defined(ARCH_RP2040)
+ _serial_gps->end();
+ _serial_gps->setFIFOSize(256);
+ _serial_gps->begin(serialSpeed);
#else
_serial_gps->updateBaudRate(serialSpeed);
#endif
@@ -1428,6 +1438,9 @@ GPS *GPS::createGps()
LOG_DEBUG("Using GPIO%d for GPS RX\n", new_gps->rx_gpio);
LOG_DEBUG("Using GPIO%d for GPS TX\n", new_gps->tx_gpio);
_serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, new_gps->rx_gpio, new_gps->tx_gpio);
+#elif defined(ARCH_RP2040)
+ _serial_gps->setFIFOSize(256);
+ _serial_gps->begin(GPS_BAUDRATE);
#else
_serial_gps->begin(GPS_BAUDRATE);
#endif
@@ -1539,7 +1552,7 @@ The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of s
(midnight UTC/GMT), not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z).
*/
struct tm t;
- t.tm_sec = ti.second();
+ t.tm_sec = ti.second() + round(ti.age() / 1000);
t.tm_min = ti.minute();
t.tm_hour = ti.hour();
t.tm_mday = d.day();
@@ -1547,8 +1560,8 @@ The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of s
t.tm_year = d.year() - 1900;
t.tm_isdst = false;
if (t.tm_mon > -1) {
- LOG_DEBUG("NMEA GPS time %02d-%02d-%02d %02d:%02d:%02d\n", d.year(), d.month(), t.tm_mday, t.tm_hour, t.tm_min,
- t.tm_sec);
+ LOG_DEBUG("NMEA GPS time %02d-%02d-%02d %02d:%02d:%02d age %d\n", d.year(), d.month(), t.tm_mday, t.tm_hour, t.tm_min,
+ t.tm_sec, ti.age());
perhapsSetRTC(RTCQualityGPS, t);
return true;
} else
@@ -1807,4 +1820,4 @@ void GPS::toggleGpsMode()
enable();
}
}
-#endif // Exclude GPS
\ No newline at end of file
+#endif // Exclude GPS
diff --git a/src/gps/GPS.h b/src/gps/GPS.h
index caff48f32e..3423edb686 100644
--- a/src/gps/GPS.h
+++ b/src/gps/GPS.h
@@ -102,7 +102,7 @@ class GPS : private concurrency::OSThread
public:
/** If !NULL we will use this serial port to construct our GPS */
-#if defined(RPI_PICO_WAVESHARE)
+#if defined(ARCH_RP2040)
static SerialUART *_serial_gps;
#else
static HardwareSerial *_serial_gps;
diff --git a/src/gps/RTC.cpp b/src/gps/RTC.cpp
index c056bb9e48..7282842425 100644
--- a/src/gps/RTC.cpp
+++ b/src/gps/RTC.cpp
@@ -109,6 +109,12 @@ bool perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpdate)
static uint32_t lastSetMsec = 0;
uint32_t now = millis();
uint32_t printableEpoch = tv->tv_sec; // Print lib only supports 32 bit but time_t can be 64 bit on some platforms
+#ifdef BUILD_EPOCH
+ if (tv->tv_sec < BUILD_EPOCH) {
+ LOG_WARN("Ignoring time (%ld) before build epoch (%ld)!\n", printableEpoch, BUILD_EPOCH);
+ return false;
+ }
+#endif
bool shouldSet;
if (forceUpdate) {
@@ -118,8 +124,11 @@ bool perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpdate)
} else if (q > currentQuality) {
shouldSet = true;
LOG_DEBUG("Upgrading time to quality %s\n", RtcName(q));
- } else if (q >= RTCQualityNTP && (now - lastSetMsec) > (12 * 60 * 60 * 1000UL)) {
- // Every 12 hrs we will slam in a new GPS or Phone GPS / NTP time, to correct for local RTC clock drift
+ } else if (q == RTCQualityGPS) {
+ shouldSet = true;
+ LOG_DEBUG("Reapplying GPS time: %ld secs\n", printableEpoch);
+ } else if (q == RTCQualityNTP && (now - lastSetMsec) > (12 * 60 * 60 * 1000UL)) {
+ // Every 12 hrs we will slam in a new NTP or Phone GPS / NTP time, to correct for local RTC clock drift
shouldSet = true;
LOG_DEBUG("Reapplying external time to correct clock drift %ld secs\n", printableEpoch);
} else {
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index eb2b10b4f4..f02ccc7a1f 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -1309,8 +1309,8 @@ static int8_t prevFrame = -1;
// Draw the arrow pointing to a node's location
void Screen::drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t compassY, uint16_t compassDiam, float headingRadian)
{
- Point tip(0.0f, 0.5f), tail(0.0f, -0.5f); // pointing up initially
- float arrowOffsetX = 0.2f, arrowOffsetY = 0.2f;
+ Point tip(0.0f, 0.5f), tail(0.0f, -0.35f); // pointing up initially
+ float arrowOffsetX = 0.14f, arrowOffsetY = 1.0f;
Point leftArrow(tip.x - arrowOffsetX, tip.y - arrowOffsetY), rightArrow(tip.x + arrowOffsetX, tip.y - arrowOffsetY);
Point *arrowPoints[] = {&tip, &tail, &leftArrow, &rightArrow};
@@ -1320,9 +1320,19 @@ void Screen::drawNodeHeading(OLEDDisplay *display, int16_t compassX, int16_t com
arrowPoints[i]->scale(compassDiam * 0.6);
arrowPoints[i]->translate(compassX, compassY);
}
+ /* Old arrow
display->drawLine(tip.x, tip.y, tail.x, tail.y);
display->drawLine(leftArrow.x, leftArrow.y, tip.x, tip.y);
display->drawLine(rightArrow.x, rightArrow.y, tip.x, tip.y);
+ display->drawLine(leftArrow.x, leftArrow.y, tail.x, tail.y);
+ display->drawLine(rightArrow.x, rightArrow.y, tail.x, tail.y);
+ */
+#ifdef USE_EINK
+ display->drawTriangle(tip.x, tip.y, rightArrow.x, rightArrow.y, tail.x, tail.y);
+#else
+ display->fillTriangle(tip.x, tip.y, rightArrow.x, rightArrow.y, tail.x, tail.y);
+#endif
+ display->drawTriangle(tip.x, tip.y, leftArrow.x, leftArrow.y, tail.x, tail.y);
}
// Get a string representation of the time passed since something happened
@@ -1360,22 +1370,27 @@ void Screen::drawCompassNorth(OLEDDisplay *display, int16_t compassX, int16_t co
// If north is supposed to be at the top of the compass we want rotation to be +0
if (config.display.compass_north_top)
myHeading = -0;
-
- Point N1(-0.04f, 0.65f), N2(0.04f, 0.65f);
+ /* N sign points currently not deleted*/
+ Point N1(-0.04f, 0.65f), N2(0.04f, 0.65f); // N sign points (N1-N4)
Point N3(-0.04f, 0.55f), N4(0.04f, 0.55f);
- Point *rosePoints[] = {&N1, &N2, &N3, &N4};
+ Point NC1(0.00f, 0.50f); // north circle center point
+ Point *rosePoints[] = {&N1, &N2, &N3, &N4, &NC1};
uint16_t compassDiam = Screen::getCompassDiam(SCREEN_WIDTH, SCREEN_HEIGHT);
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < 5; i++) {
// North on compass will be negative of heading
rosePoints[i]->rotate(-myHeading);
rosePoints[i]->scale(compassDiam);
rosePoints[i]->translate(compassX, compassY);
}
+
+ /* changed the N sign to a small circle on the compass circle.
display->drawLine(N1.x, N1.y, N3.x, N3.y);
display->drawLine(N2.x, N2.y, N4.x, N4.y);
display->drawLine(N1.x, N1.y, N4.x, N4.y);
+ */
+ display->drawCircle(NC1.x, NC1.y, 4); // North sign circle, 4px radius is sufficient for all displays.
}
uint16_t Screen::getCompassDiam(uint32_t displayWidth, uint32_t displayHeight)
@@ -2795,4 +2810,4 @@ int Screen::handleAdminMessage(const meshtastic_AdminMessage *arg)
} // namespace graphics
#else
graphics::Screen::Screen(ScanI2C::DeviceAddress, meshtastic_Config_DisplayConfig_OledType, OLEDDISPLAY_GEOMETRY) {}
-#endif // HAS_SCREEN
\ No newline at end of file
+#endif // HAS_SCREEN
diff --git a/src/main.cpp b/src/main.cpp
index 6242f5ff49..7c5d10b2ad 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -563,6 +563,7 @@ void setup()
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::QMC6310, meshtastic_TelemetrySensorType_QMC6310)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::QMI8658, meshtastic_TelemetrySensorType_QMI8658)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::QMC5883L, meshtastic_TelemetrySensorType_QMC5883L)
+ SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::HMC5883L, meshtastic_TelemetrySensorType_QMC5883L)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::PMSA0031, meshtastic_TelemetrySensorType_PMSA003I)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::RCWL9620, meshtastic_TelemetrySensorType_RCWL9620)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::VEML7700, meshtastic_TelemetrySensorType_VEML7700)
@@ -589,6 +590,9 @@ void setup()
// Hello
printInfo();
+#ifdef BUILD_EPOCH
+ LOG_INFO("Build timestamp: %ld\n", BUILD_EPOCH);
+#endif
#ifdef ARCH_ESP32
esp32Setup();
@@ -764,12 +768,6 @@ void setup()
screen->print("Started...\n");
-#ifdef SX126X_ANT_SW
- // make analog PA vs not PA switch on SX126x eval board work properly
- pinMode(SX126X_ANT_SW, OUTPUT);
- digitalWrite(SX126X_ANT_SW, 1);
-#endif
-
#ifdef PIN_PWR_DELAY_MS
// This may be required to give the peripherals time to power up.
delay(PIN_PWR_DELAY_MS);
@@ -1097,6 +1095,9 @@ extern meshtastic_DeviceMetadata getDeviceMetadata()
deviceMetadata.position_flags = config.position.position_flags;
deviceMetadata.hw_model = HW_VENDOR;
deviceMetadata.hasRemoteHardware = moduleConfig.remote_hardware.enabled;
+#if !(MESHTASTIC_EXCLUDE_PKI)
+ deviceMetadata.hasPKC = true;
+#endif
return deviceMetadata;
}
#ifndef PIO_UNIT_TESTING
@@ -1148,4 +1149,4 @@ void loop()
ScreenTouch();
#endif
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp
index a5322a65a1..79666b3210 100644
--- a/src/mesh/CryptoEngine.cpp
+++ b/src/mesh/CryptoEngine.cpp
@@ -84,7 +84,7 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_
// Calculate the shared secret with the destination node and encrypt
printBytes("Attempting encrypt using nonce: ", nonce, 13);
- printBytes("Attempting encrypt using shared_key: ", shared_key, 32);
+ printBytes("Attempting encrypt using shared_key starting with: ", shared_key, 8);
aes_ccm_ae(shared_key, 32, nonce, 8, bytes, numBytes, nullptr, 0, bytesOut,
auth); // this can write up to 15 bytes longer than numbytes past bytesOut
*extraNonce = extraNonceTmp;
@@ -117,7 +117,7 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size
}
initNonce(fromNode, packetNum, *extraNonce);
printBytes("Attempting decrypt using nonce: ", nonce, 13);
- printBytes("Attempting decrypt using shared_key: ", shared_key, 32);
+ printBytes("Attempting decrypt using shared_key starting with: ", shared_key, 8);
return aes_ccm_ad(shared_key, 32, nonce, 8, bytes, numBytes - 12, nullptr, 0, auth, bytesOut);
}
@@ -137,11 +137,12 @@ bool CryptoEngine::setDHKey(uint32_t nodeNum)
LOG_DEBUG("Node %d or their public_key not found\n", nodeNum);
return false;
}
-
+ printBytes("Generating DH with remote pubkey: ", node->user.public_key.bytes, 32);
+ printBytes("And local pubkey: ", config.security.public_key.bytes, 32);
if (!setDHPublicKey(node->user.public_key.bytes))
return false;
- printBytes("DH Output: ", shared_key, 32);
+ // printBytes("DH Output: ", shared_key, 32);
/**
* D.J. Bernstein reccomends hashing the shared key. We want to do this because there are
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index 5d1db88ae2..dca639070c 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -654,8 +654,8 @@ void NodeDB::pickNewNodeNum()
}
meshtastic_NodeInfoLite *found;
- while ((nodeNum == NODENUM_BROADCAST || nodeNum < NUM_RESERVED) ||
- ((found = getMeshNode(nodeNum)) && memcmp(found->user.macaddr, ourMacAddr, sizeof(ourMacAddr)) != 0)) {
+ while (((found = getMeshNode(nodeNum)) && memcmp(found->user.macaddr, ourMacAddr, sizeof(ourMacAddr)) != 0) ||
+ (nodeNum == NODENUM_BROADCAST || nodeNum < NUM_RESERVED)) {
NodeNum candidate = random(NUM_RESERVED, LONG_MAX); // try a new random choice
LOG_WARN("NOTE! Our desired nodenum 0x%x is invalid or in use, by MAC ending in 0x%02x%02x vs our 0x%02x%02x, so "
"trying for 0x%x\n",
@@ -1112,8 +1112,10 @@ void NodeDB::updateFrom(const meshtastic_MeshPacket &mp)
info->via_mqtt = mp.via_mqtt; // Store if we received this packet via MQTT
// If hopStart was set and there wasn't someone messing with the limit in the middle, add hopsAway
- if (mp.hop_start != 0 && mp.hop_limit <= mp.hop_start)
+ if (mp.hop_start != 0 && mp.hop_limit <= mp.hop_start) {
+ info->has_hops_away = true;
info->hops_away = mp.hop_start - mp.hop_limit;
+ }
}
}
diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp
index 30af9d7b02..742bdbf343 100644
--- a/src/mesh/PhoneAPI.cpp
+++ b/src/mesh/PhoneAPI.cpp
@@ -194,7 +194,7 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
auto us = nodeDB->readNextMeshNode(readIndex);
if (us) {
nodeInfoForPhone = TypeConversions::ConvertToNodeInfo(us);
- nodeInfoForPhone.hops_away = 0;
+ nodeInfoForPhone.has_hops_away = false;
nodeInfoForPhone.is_favorite = true;
fromRadioScratch.which_payload_variant = meshtastic_FromRadio_node_info_tag;
fromRadioScratch.node_info = nodeInfoForPhone;
diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp
index b222872fa6..3cf30519b5 100644
--- a/src/mesh/Router.cpp
+++ b/src/mesh/Router.cpp
@@ -185,9 +185,12 @@ ErrorCode Router::sendLocal(meshtastic_MeshPacket *p, RxSource src)
handleReceived(p, src);
}
- if (!p->channel) { // don't override if a channel was requested
- p->channel = nodeDB->getMeshNodeChannel(p->to);
- LOG_DEBUG("localSend to channel %d\n", p->channel);
+ if (!p->channel && !p->pki_encrypted) { // don't override if a channel was requested
+ meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(p->to);
+ if (node && node->user.public_key.size == 0) {
+ p->channel = node->channel;
+ LOG_DEBUG("localSend to channel %d\n", p->channel);
+ }
}
return send(p);
@@ -344,8 +347,11 @@ bool perhapsDecode(meshtastic_MeshPacket *p)
// memcpy(bytes, ScratchEncrypted, rawSize); // TODO: Rename the bytes buffers
// chIndex = 8;
} else {
+ LOG_ERROR("PKC Decrypted, but pb_decode failed!\n");
return false;
}
+ } else {
+ LOG_WARN("PKC decrypt attempted but failed!\n");
}
}
#endif
@@ -478,10 +484,20 @@ meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p)
#if !(MESHTASTIC_EXCLUDE_PKI)
meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(p->to);
- if (!owner.is_licensed && config.security.private_key.size == 32 && p->to != NODENUM_BROADCAST && node != nullptr &&
- node->user.public_key.size > 0 && p->decoded.portnum != meshtastic_PortNum_TRACEROUTE_APP &&
- p->decoded.portnum != meshtastic_PortNum_NODEINFO_APP && p->decoded.portnum != meshtastic_PortNum_ROUTING_APP &&
- p->decoded.portnum != meshtastic_PortNum_POSITION_APP) {
+ // We may want to retool things so we can send a PKC packet when the client specifies a key and nodenum, even if the node
+ // is not in the local nodedb
+ if (
+ // Don't use PKC with Ham mode
+ !owner.is_licensed &&
+ // Don't use PKC if it's not explicitly requested and a non-primary channel is requested
+ !(p->pki_encrypted != true && p->channel > 0) &&
+ // Check for valid keys and single node destination
+ config.security.private_key.size == 32 && p->to != NODENUM_BROADCAST && node != nullptr &&
+ // Check for a known public key for the destination
+ (node->user.public_key.size == 32) &&
+ // Some portnums either make no sense to send with PKC
+ p->decoded.portnum != meshtastic_PortNum_TRACEROUTE_APP && p->decoded.portnum != meshtastic_PortNum_NODEINFO_APP &&
+ p->decoded.portnum != meshtastic_PortNum_ROUTING_APP && p->decoded.portnum != meshtastic_PortNum_POSITION_APP) {
LOG_DEBUG("Using PKI!\n");
if (numbytes + 12 > MAX_RHPACKETLEN)
return meshtastic_Routing_Error_TOO_LARGE;
diff --git a/src/mesh/SX126xInterface.cpp b/src/mesh/SX126xInterface.cpp
index fcb3e4edb9..6d23206bd9 100644
--- a/src/mesh/SX126xInterface.cpp
+++ b/src/mesh/SX126xInterface.cpp
@@ -25,9 +25,25 @@ SX126xInterface::SX126xInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs
/// \return true if initialisation succeeded.
template bool SX126xInterface::init()
{
-#ifdef SX126X_POWER_EN
- pinMode(SX126X_POWER_EN, OUTPUT);
+
+// Typically, the RF switch on SX126x boards is controlled by two signals, which are negations of each other (switched RFIO
+// paths). The negation is usually performed in hardware, or (suboptimal design) TXEN and RXEN are the two inputs to this style of
+// RF switch. On some boards, there is no hardware negation between CTRL and ¬CTRL, but CTRL is internally connected to DIO2, and
+// DIO2's switching is done by the SX126X itself, so the MCU can't control ¬CTRL at exactly the same time. One solution would be
+// to set ¬CTRL as SX126X_TXEN or SX126X_RXEN, but they may already be used for another purpose, such as controlling another
+// PA/LNA. Keeping ¬CTRL high seems to work, as long CTRL=1, ¬CTRL=1 has the opposite and stable RF path effect as CTRL=0 and
+// ¬CTRL=1, this depends on the RF switch, but it seems this usually works. Better hardware design, which is done most the time,
+// means this workaround is not necessary.
+#ifdef SX126X_ANT_SW // Perhaps add RADIOLIB_NC check, and beforehand define as such if it is undefined, but it is not commonly
+ // used and not part of the 'default' set of pin definitions.
+ digitalWrite(SX126X_ANT_SW, HIGH);
+ pinMode(SX126X_ANT_SW, OUTPUT);
+#endif
+
+#ifdef SX126X_POWER_EN // Perhaps add RADIOLIB_NC check, and beforehand define as such if it is undefined, but it is not commonly
+ // used and not part of the 'default' set of pin definitions.
digitalWrite(SX126X_POWER_EN, HIGH);
+ pinMode(SX126X_POWER_EN, OUTPUT);
#endif
#if ARCH_PORTDUINO
diff --git a/src/mesh/TypeConversions.cpp b/src/mesh/TypeConversions.cpp
index 6a90ac7038..550f87021e 100644
--- a/src/mesh/TypeConversions.cpp
+++ b/src/mesh/TypeConversions.cpp
@@ -11,9 +11,13 @@ meshtastic_NodeInfo TypeConversions::ConvertToNodeInfo(const meshtastic_NodeInfo
info.last_heard = lite->last_heard;
info.channel = lite->channel;
info.via_mqtt = lite->via_mqtt;
- info.hops_away = lite->hops_away;
info.is_favorite = lite->is_favorite;
+ if (lite->has_hops_away) {
+ info.has_hops_away = true;
+ info.hops_away = lite->hops_away;
+ }
+
if (lite->has_position) {
info.has_position = true;
if (lite->position.latitude_i != 0)
diff --git a/src/mesh/generated/meshtastic/atak.pb.h b/src/mesh/generated/meshtastic/atak.pb.h
index 5fd18f963b..50b57cd042 100644
--- a/src/mesh/generated/meshtastic/atak.pb.h
+++ b/src/mesh/generated/meshtastic/atak.pb.h
@@ -120,6 +120,7 @@ typedef struct _meshtastic_PLI {
uint16_t course;
} meshtastic_PLI;
+typedef PB_BYTES_ARRAY_T(220) meshtastic_TAKPacket_detail_t;
/* Packets for the official ATAK Plugin */
typedef struct _meshtastic_TAKPacket {
/* Are the payloads strings compressed for LoRA transport? */
@@ -139,6 +140,9 @@ typedef struct _meshtastic_TAKPacket {
meshtastic_PLI pli;
/* ATAK GeoChat message */
meshtastic_GeoChat chat;
+ /* Generic CoT detail XML
+ May be compressed / truncated by the sender */
+ meshtastic_TAKPacket_detail_t detail;
} payload_variant;
} meshtastic_TAKPacket;
@@ -199,6 +203,7 @@ extern "C" {
#define meshtastic_TAKPacket_status_tag 4
#define meshtastic_TAKPacket_pli_tag 5
#define meshtastic_TAKPacket_chat_tag 6
+#define meshtastic_TAKPacket_detail_tag 7
/* Struct field encoding specification for nanopb */
#define meshtastic_TAKPacket_FIELDLIST(X, a) \
@@ -207,7 +212,8 @@ X(a, STATIC, OPTIONAL, MESSAGE, contact, 2) \
X(a, STATIC, OPTIONAL, MESSAGE, group, 3) \
X(a, STATIC, OPTIONAL, MESSAGE, status, 4) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,pli,payload_variant.pli), 5) \
-X(a, STATIC, ONEOF, MESSAGE, (payload_variant,chat,payload_variant.chat), 6)
+X(a, STATIC, ONEOF, MESSAGE, (payload_variant,chat,payload_variant.chat), 6) \
+X(a, STATIC, ONEOF, BYTES, (payload_variant,detail,payload_variant.detail), 7)
#define meshtastic_TAKPacket_CALLBACK NULL
#define meshtastic_TAKPacket_DEFAULT NULL
#define meshtastic_TAKPacket_contact_MSGTYPE meshtastic_Contact
diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h
index 66ffa0a4b8..da2e43972f 100644
--- a/src/mesh/generated/meshtastic/config.pb.h
+++ b/src/mesh/generated/meshtastic/config.pb.h
@@ -535,7 +535,7 @@ typedef struct _meshtastic_Config_SecurityConfig {
meshtastic_Config_SecurityConfig_private_key_t private_key;
/* The public key authorized to send admin messages to this node. */
pb_size_t admin_key_count;
- meshtastic_Config_SecurityConfig_admin_key_t admin_key[1];
+ meshtastic_Config_SecurityConfig_admin_key_t admin_key[3];
/* If true, device is considered to be "managed" by a mesh administrator via admin messages
Device is managed by a mesh administrator. */
bool is_managed;
@@ -660,7 +660,7 @@ extern "C" {
#define meshtastic_Config_DisplayConfig_init_default {0, _meshtastic_Config_DisplayConfig_GpsCoordinateFormat_MIN, 0, 0, 0, _meshtastic_Config_DisplayConfig_DisplayUnits_MIN, _meshtastic_Config_DisplayConfig_OledType_MIN, _meshtastic_Config_DisplayConfig_DisplayMode_MIN, 0, 0, _meshtastic_Config_DisplayConfig_CompassOrientation_MIN}
#define meshtastic_Config_LoRaConfig_init_default {0, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _meshtastic_Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0}
#define meshtastic_Config_BluetoothConfig_init_default {0, _meshtastic_Config_BluetoothConfig_PairingMode_MIN, 0}
-#define meshtastic_Config_SecurityConfig_init_default {{0, {0}}, {0, {0}}, 0, {{0, {0}}}, 0, 0, 0, 0}
+#define meshtastic_Config_SecurityConfig_init_default {{0, {0}}, {0, {0}}, 0, {{0, {0}}, {0, {0}}, {0, {0}}}, 0, 0, 0, 0}
#define meshtastic_Config_SessionkeyConfig_init_default {0}
#define meshtastic_Config_init_zero {0, {meshtastic_Config_DeviceConfig_init_zero}}
#define meshtastic_Config_DeviceConfig_init_zero {_meshtastic_Config_DeviceConfig_Role_MIN, 0, 0, 0, _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN, 0, 0, 0, 0, "", 0}
@@ -671,7 +671,7 @@ extern "C" {
#define meshtastic_Config_DisplayConfig_init_zero {0, _meshtastic_Config_DisplayConfig_GpsCoordinateFormat_MIN, 0, 0, 0, _meshtastic_Config_DisplayConfig_DisplayUnits_MIN, _meshtastic_Config_DisplayConfig_OledType_MIN, _meshtastic_Config_DisplayConfig_DisplayMode_MIN, 0, 0, _meshtastic_Config_DisplayConfig_CompassOrientation_MIN}
#define meshtastic_Config_LoRaConfig_init_zero {0, _meshtastic_Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _meshtastic_Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0}
#define meshtastic_Config_BluetoothConfig_init_zero {0, _meshtastic_Config_BluetoothConfig_PairingMode_MIN, 0}
-#define meshtastic_Config_SecurityConfig_init_zero {{0, {0}}, {0, {0}}, 0, {{0, {0}}}, 0, 0, 0, 0}
+#define meshtastic_Config_SecurityConfig_init_zero {{0, {0}}, {0, {0}}, 0, {{0, {0}}, {0, {0}}, {0, {0}}}, 0, 0, 0, 0}
#define meshtastic_Config_SessionkeyConfig_init_zero {0}
/* Field tags (for use in manual encoding/decoding) */
@@ -953,7 +953,7 @@ extern const pb_msgdesc_t meshtastic_Config_SessionkeyConfig_msg;
#define meshtastic_Config_NetworkConfig_size 196
#define meshtastic_Config_PositionConfig_size 62
#define meshtastic_Config_PowerConfig_size 52
-#define meshtastic_Config_SecurityConfig_size 111
+#define meshtastic_Config_SecurityConfig_size 178
#define meshtastic_Config_SessionkeyConfig_size 0
#define meshtastic_Config_size 199
diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.h b/src/mesh/generated/meshtastic/deviceonly.pb.h
index 2090842209..a905c45268 100644
--- a/src/mesh/generated/meshtastic/deviceonly.pb.h
+++ b/src/mesh/generated/meshtastic/deviceonly.pb.h
@@ -94,6 +94,7 @@ typedef struct _meshtastic_NodeInfoLite {
/* True if we witnessed the node over MQTT instead of LoRA transport */
bool via_mqtt;
/* Number of hops away from us this node is (0 if adjacent) */
+ bool has_hops_away;
uint8_t hops_away;
/* True if node is in our favorites list
Persists between NodeDB internal clean ups */
@@ -202,13 +203,13 @@ extern "C" {
/* Initializer values for message structs */
#define meshtastic_PositionLite_init_default {0, 0, 0, 0, _meshtastic_Position_LocSource_MIN}
#define meshtastic_UserLite_init_default {{0}, "", "", _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}}
-#define meshtastic_NodeInfoLite_init_default {0, false, meshtastic_UserLite_init_default, false, meshtastic_PositionLite_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, 0, 0}
+#define meshtastic_NodeInfoLite_init_default {0, false, meshtastic_UserLite_init_default, false, meshtastic_PositionLite_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0}
#define meshtastic_DeviceState_init_default {false, meshtastic_MyNodeInfo_init_default, false, meshtastic_User_init_default, 0, {meshtastic_MeshPacket_init_default}, false, meshtastic_MeshPacket_init_default, 0, 0, 0, false, meshtastic_MeshPacket_init_default, 0, {meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default, meshtastic_NodeRemoteHardwarePin_init_default}, {0}}
#define meshtastic_ChannelFile_init_default {0, {meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default, meshtastic_Channel_init_default}, 0}
#define meshtastic_OEMStore_init_default {0, 0, {0, {0}}, _meshtastic_ScreenFonts_MIN, "", {0, {0}}, false, meshtastic_LocalConfig_init_default, false, meshtastic_LocalModuleConfig_init_default}
#define meshtastic_PositionLite_init_zero {0, 0, 0, 0, _meshtastic_Position_LocSource_MIN}
#define meshtastic_UserLite_init_zero {{0}, "", "", _meshtastic_HardwareModel_MIN, 0, _meshtastic_Config_DeviceConfig_Role_MIN, {0, {0}}}
-#define meshtastic_NodeInfoLite_init_zero {0, false, meshtastic_UserLite_init_zero, false, meshtastic_PositionLite_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, 0, 0}
+#define meshtastic_NodeInfoLite_init_zero {0, false, meshtastic_UserLite_init_zero, false, meshtastic_PositionLite_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0}
#define meshtastic_DeviceState_init_zero {false, meshtastic_MyNodeInfo_init_zero, false, meshtastic_User_init_zero, 0, {meshtastic_MeshPacket_init_zero}, false, meshtastic_MeshPacket_init_zero, 0, 0, 0, false, meshtastic_MeshPacket_init_zero, 0, {meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero, meshtastic_NodeRemoteHardwarePin_init_zero}, {0}}
#define meshtastic_ChannelFile_init_zero {0, {meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero, meshtastic_Channel_init_zero}, 0}
#define meshtastic_OEMStore_init_zero {0, 0, {0, {0}}, _meshtastic_ScreenFonts_MIN, "", {0, {0}}, false, meshtastic_LocalConfig_init_zero, false, meshtastic_LocalModuleConfig_init_zero}
@@ -287,7 +288,7 @@ X(a, STATIC, SINGULAR, FIXED32, last_heard, 5) \
X(a, STATIC, OPTIONAL, MESSAGE, device_metrics, 6) \
X(a, STATIC, SINGULAR, UINT32, channel, 7) \
X(a, STATIC, SINGULAR, BOOL, via_mqtt, 8) \
-X(a, STATIC, SINGULAR, UINT32, hops_away, 9) \
+X(a, STATIC, OPTIONAL, UINT32, hops_away, 9) \
X(a, STATIC, SINGULAR, BOOL, is_favorite, 10)
#define meshtastic_NodeInfoLite_CALLBACK NULL
#define meshtastic_NodeInfoLite_DEFAULT NULL
@@ -358,7 +359,7 @@ extern const pb_msgdesc_t meshtastic_OEMStore_msg;
#define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_OEMStore_size
#define meshtastic_ChannelFile_size 718
#define meshtastic_NodeInfoLite_size 183
-#define meshtastic_OEMStore_size 3500
+#define meshtastic_OEMStore_size 3568
#define meshtastic_PositionLite_size 28
#define meshtastic_UserLite_size 96
diff --git a/src/mesh/generated/meshtastic/localonly.pb.h b/src/mesh/generated/meshtastic/localonly.pb.h
index 72f29500c5..19600856f6 100644
--- a/src/mesh/generated/meshtastic/localonly.pb.h
+++ b/src/mesh/generated/meshtastic/localonly.pb.h
@@ -186,8 +186,8 @@ extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg;
#define meshtastic_LocalModuleConfig_fields &meshtastic_LocalModuleConfig_msg
/* Maximum encoded size of messages (where known) */
-#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalModuleConfig_size
-#define meshtastic_LocalConfig_size 667
+#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalConfig_size
+#define meshtastic_LocalConfig_size 735
#define meshtastic_LocalModuleConfig_size 687
#ifdef __cplusplus
diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h
index 677b9e51d0..cffdfeff2f 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.h
+++ b/src/mesh/generated/meshtastic/mesh.pb.h
@@ -319,7 +319,11 @@ typedef enum _meshtastic_Routing_Error {
/* The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) */
meshtastic_Routing_Error_PKI_FAILED = 34,
/* The receiving node does not have a Public Key to decode with */
- meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY = 35
+ meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY = 35,
+ /* Admin packet otherwise checks out, but uses a bogus or expired session key */
+ meshtastic_Routing_Error_ADMIN_BAD_SESSION_KEY = 36,
+ /* Admin packet sent using PKC, but not from a public key on the admin key list */
+ meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED = 37
} meshtastic_Routing_Error;
/* The priority of this message for sending.
@@ -744,6 +748,7 @@ typedef struct _meshtastic_NodeInfo {
/* True if we witnessed the node over MQTT instead of LoRA transport */
bool via_mqtt;
/* Number of hops away from us this node is (0 if adjacent) */
+ bool has_hops_away;
uint8_t hops_away;
/* True if node is in our favorites list
Persists between NodeDB internal clean ups */
@@ -874,6 +879,8 @@ typedef struct _meshtastic_DeviceMetadata {
meshtastic_HardwareModel hw_model;
/* Has Remote Hardware enabled */
bool hasRemoteHardware;
+ /* Has PKC capabilities */
+ bool hasPKC;
} meshtastic_DeviceMetadata;
/* Packets from the radio to the phone will appear on the fromRadio characteristic.
@@ -1029,8 +1036,8 @@ extern "C" {
#define _meshtastic_Position_AltSource_ARRAYSIZE ((meshtastic_Position_AltSource)(meshtastic_Position_AltSource_ALT_BAROMETRIC+1))
#define _meshtastic_Routing_Error_MIN meshtastic_Routing_Error_NONE
-#define _meshtastic_Routing_Error_MAX meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY
-#define _meshtastic_Routing_Error_ARRAYSIZE ((meshtastic_Routing_Error)(meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY+1))
+#define _meshtastic_Routing_Error_MAX meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED
+#define _meshtastic_Routing_Error_ARRAYSIZE ((meshtastic_Routing_Error)(meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED+1))
#define _meshtastic_MeshPacket_Priority_MIN meshtastic_MeshPacket_Priority_UNSET
#define _meshtastic_MeshPacket_Priority_MAX meshtastic_MeshPacket_Priority_MAX
@@ -1092,7 +1099,7 @@ extern "C" {
#define meshtastic_Waypoint_init_default {0, false, 0, false, 0, 0, 0, "", "", 0}
#define meshtastic_MqttClientProxyMessage_init_default {"", 0, {{0, {0}}}, 0}
#define meshtastic_MeshPacket_init_default {0, 0, 0, 0, {meshtastic_Data_init_default}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0}
-#define meshtastic_NodeInfo_init_default {0, false, meshtastic_User_init_default, false, meshtastic_Position_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, 0, 0}
+#define meshtastic_NodeInfo_init_default {0, false, meshtastic_User_init_default, false, meshtastic_Position_init_default, 0, 0, false, meshtastic_DeviceMetrics_init_default, 0, 0, false, 0, 0}
#define meshtastic_MyNodeInfo_init_default {0, 0, 0}
#define meshtastic_LogRecord_init_default {"", 0, "", _meshtastic_LogRecord_Level_MIN}
#define meshtastic_QueueStatus_init_default {0, 0, 0, 0}
@@ -1103,7 +1110,7 @@ extern "C" {
#define meshtastic_Compressed_init_default {_meshtastic_PortNum_MIN, {0, {0}}}
#define meshtastic_NeighborInfo_init_default {0, 0, 0, 0, {meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default, meshtastic_Neighbor_init_default}}
#define meshtastic_Neighbor_init_default {0, 0, 0, 0}
-#define meshtastic_DeviceMetadata_init_default {"", 0, 0, 0, 0, 0, _meshtastic_Config_DeviceConfig_Role_MIN, 0, _meshtastic_HardwareModel_MIN, 0}
+#define meshtastic_DeviceMetadata_init_default {"", 0, 0, 0, 0, 0, _meshtastic_Config_DeviceConfig_Role_MIN, 0, _meshtastic_HardwareModel_MIN, 0, 0}
#define meshtastic_Heartbeat_init_default {0}
#define meshtastic_NodeRemoteHardwarePin_init_default {0, false, meshtastic_RemoteHardwarePin_init_default}
#define meshtastic_ChunkedPayload_init_default {0, 0, 0, {0, {0}}}
@@ -1117,7 +1124,7 @@ extern "C" {
#define meshtastic_Waypoint_init_zero {0, false, 0, false, 0, 0, 0, "", "", 0}
#define meshtastic_MqttClientProxyMessage_init_zero {"", 0, {{0, {0}}}, 0}
#define meshtastic_MeshPacket_init_zero {0, 0, 0, 0, {meshtastic_Data_init_zero}, 0, 0, 0, 0, 0, _meshtastic_MeshPacket_Priority_MIN, 0, _meshtastic_MeshPacket_Delayed_MIN, 0, 0, {0, {0}}, 0}
-#define meshtastic_NodeInfo_init_zero {0, false, meshtastic_User_init_zero, false, meshtastic_Position_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, 0, 0}
+#define meshtastic_NodeInfo_init_zero {0, false, meshtastic_User_init_zero, false, meshtastic_Position_init_zero, 0, 0, false, meshtastic_DeviceMetrics_init_zero, 0, 0, false, 0, 0}
#define meshtastic_MyNodeInfo_init_zero {0, 0, 0}
#define meshtastic_LogRecord_init_zero {"", 0, "", _meshtastic_LogRecord_Level_MIN}
#define meshtastic_QueueStatus_init_zero {0, 0, 0, 0}
@@ -1128,7 +1135,7 @@ extern "C" {
#define meshtastic_Compressed_init_zero {_meshtastic_PortNum_MIN, {0, {0}}}
#define meshtastic_NeighborInfo_init_zero {0, 0, 0, 0, {meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero, meshtastic_Neighbor_init_zero}}
#define meshtastic_Neighbor_init_zero {0, 0, 0, 0}
-#define meshtastic_DeviceMetadata_init_zero {"", 0, 0, 0, 0, 0, _meshtastic_Config_DeviceConfig_Role_MIN, 0, _meshtastic_HardwareModel_MIN, 0}
+#define meshtastic_DeviceMetadata_init_zero {"", 0, 0, 0, 0, 0, _meshtastic_Config_DeviceConfig_Role_MIN, 0, _meshtastic_HardwareModel_MIN, 0, 0}
#define meshtastic_Heartbeat_init_zero {0}
#define meshtastic_NodeRemoteHardwarePin_init_zero {0, false, meshtastic_RemoteHardwarePin_init_zero}
#define meshtastic_ChunkedPayload_init_zero {0, 0, 0, {0, {0}}}
@@ -1259,6 +1266,7 @@ extern "C" {
#define meshtastic_DeviceMetadata_position_flags_tag 8
#define meshtastic_DeviceMetadata_hw_model_tag 9
#define meshtastic_DeviceMetadata_hasRemoteHardware_tag 10
+#define meshtastic_DeviceMetadata_hasPKC_tag 11
#define meshtastic_FromRadio_id_tag 1
#define meshtastic_FromRadio_packet_tag 2
#define meshtastic_FromRadio_my_info_tag 3
@@ -1414,7 +1422,7 @@ X(a, STATIC, SINGULAR, FIXED32, last_heard, 5) \
X(a, STATIC, OPTIONAL, MESSAGE, device_metrics, 6) \
X(a, STATIC, SINGULAR, UINT32, channel, 7) \
X(a, STATIC, SINGULAR, BOOL, via_mqtt, 8) \
-X(a, STATIC, SINGULAR, UINT32, hops_away, 9) \
+X(a, STATIC, OPTIONAL, UINT32, hops_away, 9) \
X(a, STATIC, SINGULAR, BOOL, is_favorite, 10)
#define meshtastic_NodeInfo_CALLBACK NULL
#define meshtastic_NodeInfo_DEFAULT NULL
@@ -1539,7 +1547,8 @@ X(a, STATIC, SINGULAR, BOOL, hasEthernet, 6) \
X(a, STATIC, SINGULAR, UENUM, role, 7) \
X(a, STATIC, SINGULAR, UINT32, position_flags, 8) \
X(a, STATIC, SINGULAR, UENUM, hw_model, 9) \
-X(a, STATIC, SINGULAR, BOOL, hasRemoteHardware, 10)
+X(a, STATIC, SINGULAR, BOOL, hasRemoteHardware, 10) \
+X(a, STATIC, SINGULAR, BOOL, hasPKC, 11)
#define meshtastic_DeviceMetadata_CALLBACK NULL
#define meshtastic_DeviceMetadata_DEFAULT NULL
@@ -1638,7 +1647,7 @@ extern const pb_msgdesc_t meshtastic_ChunkedPayloadResponse_msg;
#define meshtastic_ClientNotification_size 415
#define meshtastic_Compressed_size 243
#define meshtastic_Data_size 273
-#define meshtastic_DeviceMetadata_size 46
+#define meshtastic_DeviceMetadata_size 48
#define meshtastic_FileInfo_size 236
#define meshtastic_FromRadio_size 510
#define meshtastic_Heartbeat_size 0
diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp
index 4deb99eb76..7b96d9c43e 100644
--- a/src/modules/AdminModule.cpp
+++ b/src/modules/AdminModule.cpp
@@ -257,34 +257,26 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
break;
}
case meshtastic_AdminMessage_set_fixed_position_tag: {
- if (fromOthers) {
- LOG_INFO("Ignoring set_fixed_position command from another node.\n");
- } else {
- LOG_INFO("Client is receiving a set_fixed_position command.\n");
- meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(nodeDB->getNodeNum());
- node->has_position = true;
- node->position = TypeConversions::ConvertToPositionLite(r->set_fixed_position);
- nodeDB->setLocalPosition(r->set_fixed_position);
- config.position.fixed_position = true;
- saveChanges(SEGMENT_DEVICESTATE | SEGMENT_CONFIG, false);
+ LOG_INFO("Client is receiving a set_fixed_position command.\n");
+ meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(nodeDB->getNodeNum());
+ node->has_position = true;
+ node->position = TypeConversions::ConvertToPositionLite(r->set_fixed_position);
+ nodeDB->setLocalPosition(r->set_fixed_position);
+ config.position.fixed_position = true;
+ saveChanges(SEGMENT_DEVICESTATE | SEGMENT_CONFIG, false);
#if !MESHTASTIC_EXCLUDE_GPS
- if (gps != nullptr)
- gps->enable();
- // Send our new fixed position to the mesh for good measure
- positionModule->sendOurPosition();
+ if (gps != nullptr)
+ gps->enable();
+ // Send our new fixed position to the mesh for good measure
+ positionModule->sendOurPosition();
#endif
- }
break;
}
case meshtastic_AdminMessage_remove_fixed_position_tag: {
- if (fromOthers) {
- LOG_INFO("Ignoring remove_fixed_position command from another node.\n");
- } else {
- LOG_INFO("Client is receiving a remove_fixed_position command.\n");
- nodeDB->clearLocalPosition();
- config.position.fixed_position = false;
- saveChanges(SEGMENT_DEVICESTATE | SEGMENT_CONFIG, false);
- }
+ LOG_INFO("Client is receiving a remove_fixed_position command.\n");
+ nodeDB->clearLocalPosition();
+ config.position.fixed_position = false;
+ saveChanges(SEGMENT_DEVICESTATE | SEGMENT_CONFIG, false);
break;
}
case meshtastic_AdminMessage_set_time_only_tag: {
diff --git a/src/modules/AtakPluginModule.cpp b/src/modules/AtakPluginModule.cpp
index 437a341db6..72d0696190 100644
--- a/src/modules/AtakPluginModule.cpp
+++ b/src/modules/AtakPluginModule.cpp
@@ -52,6 +52,10 @@ meshtastic_TAKPacket AtakPluginModule::cloneTAKPacketData(meshtastic_TAKPacket *
} else if (t->which_payload_variant == meshtastic_TAKPacket_chat_tag) {
clone.which_payload_variant = meshtastic_TAKPacket_chat_tag;
clone.payload_variant.chat = {0};
+ } else if (t->which_payload_variant == meshtastic_TAKPacket_detail_tag) {
+ clone.which_payload_variant = meshtastic_TAKPacket_detail_tag;
+ clone.payload_variant.detail.size = t->payload_variant.detail.size;
+ memcpy(clone.payload_variant.detail.bytes, t->payload_variant.detail.bytes, t->payload_variant.detail.size);
}
return clone;
diff --git a/src/modules/RemoteHardwareModule.cpp b/src/modules/RemoteHardwareModule.cpp
index 6910005a8f..0242b59bcc 100644
--- a/src/modules/RemoteHardwareModule.cpp
+++ b/src/modules/RemoteHardwareModule.cpp
@@ -47,6 +47,8 @@ RemoteHardwareModule::RemoteHardwareModule()
: ProtobufModule("remotehardware", meshtastic_PortNum_REMOTE_HARDWARE_APP, &meshtastic_HardwareMessage_msg),
concurrency::OSThread("RemoteHardwareModule")
{
+ // restrict to the gpio channel for rx
+ boundChannel = Channels::gpioChannel;
}
bool RemoteHardwareModule::handleReceivedProtobuf(const meshtastic_MeshPacket &req, meshtastic_HardwareMessage *pptr)
diff --git a/src/modules/Telemetry/DeviceTelemetry.cpp b/src/modules/Telemetry/DeviceTelemetry.cpp
index 305be9904a..04789af5e9 100644
--- a/src/modules/Telemetry/DeviceTelemetry.cpp
+++ b/src/modules/Telemetry/DeviceTelemetry.cpp
@@ -124,7 +124,7 @@ void DeviceTelemetryModule::sendLocalStatsToPhone()
telemetry.variant.local_stats.num_total_nodes = nodeDB->getNumMeshNodes();
if (RadioLibInterface::instance) {
telemetry.variant.local_stats.num_packets_tx = RadioLibInterface::instance->txGood;
- telemetry.variant.local_stats.num_packets_rx = RadioLibInterface::instance->rxGood;
+ telemetry.variant.local_stats.num_packets_rx = RadioLibInterface::instance->rxGood + RadioLibInterface::instance->rxBad;
telemetry.variant.local_stats.num_packets_rx_bad = RadioLibInterface::instance->rxBad;
}
diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp
index d14c7a9237..0f4c5a8c52 100644
--- a/src/mqtt/MQTT.cpp
+++ b/src/mqtt/MQTT.cpp
@@ -468,7 +468,7 @@ void MQTT::publishQueuedMessages()
LOG_DEBUG("Publishing enqueued MQTT message\n");
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
meshtastic_ServiceEnvelope *env = mqttQueue.dequeuePtr(0);
- static uint8_t bytes[meshtastic_MeshPacket_size + 64];
+ static uint8_t bytes[meshtastic_MqttClientProxyMessage_size];
size_t numBytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_ServiceEnvelope_msg, env);
std::string topic;
if (env->packet->pki_encrypted) {
@@ -555,7 +555,7 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp, const meshtastic_MeshPacket &
if (moduleConfig.mqtt.proxy_to_client_enabled || this->isConnectedDirectly()) {
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
- static uint8_t bytes[meshtastic_MeshPacket_size + 64];
+ static uint8_t bytes[meshtastic_MqttClientProxyMessage_size];
size_t numBytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_ServiceEnvelope_msg, env);
std::string topic = cryptTopic + channelId + "/" + owner.id;
LOG_DEBUG("MQTT Publish %s, %u bytes\n", topic.c_str(), numBytes);
@@ -651,7 +651,7 @@ void MQTT::perhapsReportToMap()
se->packet = mp;
// FIXME - this size calculation is super sloppy, but it will go away once we dynamically alloc meshpackets
- static uint8_t bytes[meshtastic_MeshPacket_size + 64];
+ static uint8_t bytes[meshtastic_MqttClientProxyMessage_size];
size_t numBytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_ServiceEnvelope_msg, se);
LOG_INFO("MQTT Publish map report to %s\n", mapTopic.c_str());
diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp
index 1b997500a7..0b6f7cf23d 100644
--- a/src/platform/esp32/main-esp32.cpp
+++ b/src/platform/esp32/main-esp32.cpp
@@ -120,17 +120,24 @@ void esp32Setup()
uint32_t rebootCounter = preferences.getUInt("rebootCounter", 0);
rebootCounter++;
preferences.putUInt("rebootCounter", rebootCounter);
+ // store firmware version and hwrevision for access from OTA firmware
+ String fwrev = preferences.getString("firmwareVersion", "");
+ if (fwrev.compareTo(optstr(APP_VERSION)) != 0)
+ preferences.putString("firmwareVersion", optstr(APP_VERSION));
+ uint8_t hwven = preferences.getUInt("hwVendor", 0);
+ if (hwven != HW_VENDOR)
+ preferences.putUInt("hwVendor", HW_VENDOR);
preferences.end();
LOG_DEBUG("Number of Device Reboots: %d\n", rebootCounter);
#if !MESHTASTIC_EXCLUDE_BLUETOOTH
String BLEOTA = BleOta::getOtaAppVersion();
if (BLEOTA.isEmpty()) {
- LOG_DEBUG("No OTA firmware available\n");
+ LOG_INFO("No OTA firmware available\n");
} else {
- LOG_DEBUG("OTA firmware version %s\n", BLEOTA.c_str());
+ LOG_INFO("OTA firmware version %s\n", BLEOTA.c_str());
}
#else
- LOG_DEBUG("No OTA firmware available\n");
+ LOG_INFO("No OTA firmware available\n");
#endif
// enableModemSleep();
diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h
index 5a04dd6a71..b2b7b5a20e 100644
--- a/src/platform/nrf52/architecture.h
+++ b/src/platform/nrf52/architecture.h
@@ -71,6 +71,8 @@
#define HW_VENDOR meshtastic_HardwareModel_MS24SF1
#elif defined(PRIVATE_HW) || defined(FEATHER_DIY)
#define HW_VENDOR meshtastic_HardwareModel_PRIVATE_HW
+#elif defined(HELTEC_T114)
+#define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_NODE_T114
#else
#define HW_VENDOR meshtastic_HardwareModel_NRF52_UNKNOWN
#endif
diff --git a/variants/ME25LS01-4Y10TD_e-ink/variant.h b/variants/ME25LS01-4Y10TD_e-ink/variant.h
index 60996d468b..0b2b130680 100644
--- a/variants/ME25LS01-4Y10TD_e-ink/variant.h
+++ b/variants/ME25LS01-4Y10TD_e-ink/variant.h
@@ -97,7 +97,7 @@ static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK = PIN_SPI_SCK;
// EPD SPI
-#define PIN_SPI1_MISO (-1) // Not Used for EPD
+#define PIN_SPI1_MISO (32 + 2) // Not Used for EPD but needs to be defined
#define PIN_SPI1_MOSI (0 + 10) // EPD_MOSI P0.10
#define PIN_SPI1_SCK (0 + 9) // EPD_SCLK P0.09
diff --git a/variants/heltec_mesh_node_t114/platformio.ini b/variants/heltec_mesh_node_t114/platformio.ini
index 1009ecce5f..e0d8ca0cc7 100644
--- a/variants/heltec_mesh_node_t114/platformio.ini
+++ b/variants/heltec_mesh_node_t114/platformio.ini
@@ -8,6 +8,7 @@ debug_tool = jlink
build_flags = ${nrf52840_base.build_flags} -Ivariants/heltec_mesh_node_t114
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
-DGPS_POWER_TOGGLE
+ -DHELTEC_T114
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_node_t114>
lib_deps =
diff --git a/variants/heltec_mesh_node_t114/variant.cpp b/variants/heltec_mesh_node_t114/variant.cpp
index cae079b749..85c9f4a729 100644
--- a/variants/heltec_mesh_node_t114/variant.cpp
+++ b/variants/heltec_mesh_node_t114/variant.cpp
@@ -32,13 +32,7 @@ const uint32_t g_ADigitalPinMap[] = {
void initVariant()
{
- // LED1 & LED2
+ // LED1
pinMode(PIN_LED1, OUTPUT);
ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
-
- pinMode(PIN_LED3, OUTPUT);
- ledOff(PIN_LED3);
}
diff --git a/variants/heltec_mesh_node_t114/variant.h b/variants/heltec_mesh_node_t114/variant.h
index e8c3059902..454e669313 100644
--- a/variants/heltec_mesh_node_t114/variant.h
+++ b/variants/heltec_mesh_node_t114/variant.h
@@ -67,20 +67,17 @@ extern "C" {
#define NUM_ANALOG_OUTPUTS (0)
// LEDs
-#define PIN_LED1 (32 + 3) // 13 red (confirmed on 1.0 board)
-// Unused(by firmware) LEDs:
-#define PIN_LED2 (1 + 1) // 14 blue
-#define PIN_LED3 (1 + 11) // 15 green
-
-#define LED_RED PIN_LED3
-#define LED_BLUE PIN_LED1
-#define LED_GREEN PIN_LED2
-
-#define LED_BUILTIN LED_BLUE
-#define LED_CONN PIN_GREEN
-
+#define PIN_LED1 (32 + 3) // green (confirmed on 1.0 board)
+#define LED_BLUE PIN_LED1 // fake for bluefruit library
+#define LED_GREEN PIN_LED1
+#define LED_BUILTIN LED_GREEN
#define LED_STATE_ON 0 // State when LED is lit
+#define HAS_NEOPIXEL // Enable the use of neopixels
+#define NEOPIXEL_COUNT 2 // How many neopixels are connected
+#define NEOPIXEL_DATA 14 // gpio pin used to send data to the neopixels
+#define NEOPIXEL_TYPE (NEO_GRB + NEO_KHZ800) // type of neopixels in use
+
/*
* Buttons
*/
@@ -206,4 +203,4 @@ No longer populated on PCB
* Arduino objects - C++ only
*----------------------------------------------------------------------------*/
-#endif
\ No newline at end of file
+#endif
diff --git a/variants/lora_isp4520/platformio.ini b/variants/lora_isp4520/platformio.ini
deleted file mode 100644
index 9d6563515d..0000000000
--- a/variants/lora_isp4520/platformio.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[env:lora_isp4520]
-extends = nrf52_base
-board = lora_isp4520
-board_level = extra
-
-# add our variants files to the include and src paths
-build_flags = ${nrf52_base.build_flags} -Ivariants/lora_isp4520
-
-# No screen and GPS on the board. We still need RTC.cpp for the RTC clock.
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/lora_isp4520> - - + +
-lib_ignore = ${nrf52_base.lib_ignore}
- ESP8266_SSD1306
- SparkFun Ublox Arduino Library
- AXP202X_Library
- TinyGPSPlus
-
-upload_protocol = jlink
-monitor_port = /dev/ttyUSB0
\ No newline at end of file
diff --git a/variants/lora_isp4520/variant.cpp b/variants/lora_isp4520/variant.cpp
deleted file mode 100644
index 41b31384ae..0000000000
--- a/variants/lora_isp4520/variant.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-#include "nrf.h"
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- 25, // D0 SPI_MISO
- 24, // D1 SPI_NSS
- 23, // D2 SPI_SCK
- 4, // D3 VBAT
- 11, // D4 DIO1
- 27, // D5 BUSY
- 19, // D6 NRESET
- 12, // D7 BUTTON2
- 22, // D8 BUTTON3
- 26, // D9 SPI_MOSI
- 31, // D10 UART_RX
- 2, // D11 UART_TX
- 10, // D12 LED1 GREEN
- 17, // D13 LED2 RED
- 9, // D14 BUZZER
- 7, // D15 BUTTON1
-};
-
-#include
-void initVariant()
-{
- for (int i : {PIN_LED1, PIN_LED2}) {
- pinMode(i, OUTPUT);
- ledOff(i);
- }
-}
diff --git a/variants/lora_isp4520/variant.h b/variants/lora_isp4520/variant.h
deleted file mode 100644
index 30b8fc1694..0000000000
--- a/variants/lora_isp4520/variant.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef _VARIANT_LORA_ISP4520_
-#define _VARIANT_LORA_ISP4520_
-
-#define USE_SEGGER
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#define USE_LFXO
-
-// #define USE_SEGGER
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (16)
-#define NUM_DIGITAL_PINS (16)
-#define NUM_ANALOG_INPUTS (1)
-#define NUM_ANALOG_OUTPUTS (1)
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-// These are in arduino pin numbers,
-// translation in g_ADigitalPinMap in variants.cpp
-#define PIN_SPI_MISO (0)
-#define PIN_SPI_MOSI (9)
-#define PIN_SPI_SCK (2)
-
-/*
- * Wire Interfaces (I2C)
- */
-#define WIRE_INTERFACES_COUNT 0
-
-// GPIOs the SX1262 is connected
-#define USE_SX1262
-#define SX126X_CS 1 // aka SPI_NSS
-#define SX126X_DIO1 (4)
-#define SX126X_BUSY (5)
-#define SX126X_RESET (6)
-
-/*
- * Serial interfaces
- */
-#define PIN_SERIAL_RX (10)
-#define PIN_SERIAL_TX (11)
-// LEDs
-#define PIN_LED1 (12)
-#define PIN_LED2 (13)
-#define PIN_BUZZER (14)
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_BLUE PIN_LED2
-
-#define LED_STATE_ON 1 // State when LED is litted
-
-/*
- * Buttons
- */
-#define PIN_BUTTON1 (15)
-#define PIN_BUTTON2 (7)
-#define PIN_BUTTON3 (8)
-
-// ADC pin and voltage divider
-#define BATTERY_PIN 3
-#define ADC_MULTIPLIER 1.436
-
-#define SX126X_DIO2_AS_RF_SWITCH
-#define SX126X_DIO3_TCXO_VOLTAGE 1.8 // Not really an E22 but this board clones using DIO3 for tcxo control
-
-#endif
diff --git a/variants/rak11200/variant.h b/variants/rak11200/variant.h
index 259fa6e87d..01edb8b73c 100644
--- a/variants/rak11200/variant.h
+++ b/variants/rak11200/variant.h
@@ -70,12 +70,12 @@ static const uint8_t SCK = 33;
#define LORA_CS SS
#define USE_SX1262
-#define SX126X_ANT_SW WB_IO2
+#define SX126X_ANT_SW WB_IO3
#define SX126X_CS SS // NSS for SX126X
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY LORA_DIO2
#define SX126X_RESET LORA_RESET
-#define SX126X_POWER_EN WB_IO3
+#define SX126X_POWER_EN WB_IO2
// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8