Merge branch 'meshcore-dev:dev' into dev

This commit is contained in:
Snayler 2026-04-10 18:31:52 +01:00 committed by GitHub
commit d360931aa7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 2118 additions and 23 deletions

View file

@ -0,0 +1,46 @@
#include <Arduino.h>
#include <Wire.h>
#include "GAT56MeshWatch13Board.h"
#ifdef NRF52_POWER_MANAGEMENT
// Static configuration for power management
// Values set in variant.h defines
const PowerMgtConfig power_config = {
.lpcomp_ain_channel = PWRMGT_LPCOMP_AIN,
.lpcomp_refsel = PWRMGT_LPCOMP_REFSEL,
.voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK
};
void GAT56MeshWatch13Board::initiateShutdown(uint8_t reason) {
if (reason == SHUTDOWN_REASON_LOW_VOLTAGE ||
reason == SHUTDOWN_REASON_BOOT_PROTECT) {
configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel);
}
enterSystemOff(reason);
}
#endif // NRF52_POWER_MANAGEMENT
void GAT56MeshWatch13Board::begin() {
NRF52BoardDCDC::begin();
pinMode(PIN_VBAT_READ, INPUT);
#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL)
Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL);
#endif
Wire.begin();
pinMode(SX126X_POWER_EN, OUTPUT);
#ifdef NRF52_POWER_MANAGEMENT
// Boot voltage protection check (may not return if voltage too low)
// We need to call this after we configure SX126X_POWER_EN as output but before we pull high
checkBootVoltage(&power_config);
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
}

View file

@ -0,0 +1,44 @@
#pragma once
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
class GAT56MeshWatch13Board : public NRF52BoardDCDC {
protected:
#ifdef NRF52_POWER_MANAGEMENT
void initiateShutdown(uint8_t reason) override;
#endif
public:
GAT56MeshWatch13Board() : NRF52Board("GAT562_OTA") {}
void begin();
#define BATTERY_SAMPLES 8
uint16_t getBattMilliVolts() override {
analogReadResolution(12);
uint32_t raw = 0;
for (int i = 0; i < BATTERY_SAMPLES; i++) {
raw += analogRead(PIN_VBAT_READ);
}
raw = raw / BATTERY_SAMPLES;
return (ADC_MULTIPLIER * raw) / 4096;
}
const char* getManufacturerName() const override {
return "GAT562 Mesh Watch 13";
}
void powerOff() override {
uint32_t button_pin = PIN_BUTTON1;
nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off();
}
};

View file

@ -0,0 +1,89 @@
[GAT562_Mesh_Watch13]
extends = nrf52_base
board = rak4631
board_check = true
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-UENV_INCLUDE_GPS
-I variants/gat562_mesh_watch13
-D RAK_4631
-D RAK_BOARD
-D NRF52_POWER_MANAGEMENT
-D PIN_BOARD_SCL=14
-D PIN_BOARD_SDA=13
-D PIN_OLED_RESET=-1
-D RADIO_CLASS=CustomSX1262
-D WRAPPER_CLASS=CustomSX1262Wrapper
-D LORA_TX_POWER=19
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D QSPIFLASH=1
build_src_filter = ${nrf52_base.build_src_filter}
+<../variants/gat562_mesh_watch13>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/sensors>
lib_deps =
${nrf52_base.lib_deps}
${sensor_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13
;[env:GAT562_Mesh_Watch13_repeater]
;extends = GAT562_Mesh_Watch13
;build_flags =
; ${GAT562_Mesh_Watch13.build_flags}
; -D DISPLAY_CLASS=SSD1306Display
; -D ADVERT_NAME='"GAT562 Repeater"'
; -D ADVERT_LAT=0.0
; -D ADVERT_LON=0.0
; -D ADMIN_PASSWORD='"password"'
; -D MAX_NEIGHBOURS=50
;; -D MESH_PACKET_LOGGING=1
;; -D MESH_DEBUG=1
;build_src_filter = ${GAT562_Mesh_Watch13.build_src_filter}
; +<helpers/ui/SSD1306Display.cpp>
; +<../examples/simple_repeater>
;[env:GAT562_Mesh_Watch13_room_server]
;extends = GAT562_Mesh_Watch13
;build_flags =
; ${GAT562_Mesh_Watch13.build_flags}
; -D DISPLAY_CLASS=SSD1306Display
; -D ADVERT_NAME='"GAT562 Room"'
; -D ADVERT_LAT=0.0
; -D ADVERT_LON=0.0
; -D ADMIN_PASSWORD='"password"'
; -D ROOM_PASSWORD='"hello"'
;; -D MESH_PACKET_LOGGING=1
;; -D MESH_DEBUG=1
;build_src_filter = ${GAT562_Mesh_Watch13.build_src_filter}
; +<helpers/ui/SSD1306Display.cpp>
; +<../examples/simple_room_server>
[env:GAT562_Mesh_Watch13_companion_radio_ble]
extends = GAT562_Mesh_Watch13
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld
board_upload.maximum_size = 712704
build_flags =
${GAT562_Mesh_Watch13.build_flags}
-I examples/companion_radio/ui-new
-D DISPLAY_CLASS=SSD1306Display
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456
-D BLE_DEBUG_LOGGING=1
-D OFFLINE_QUEUE_SIZE=256
; -D PIN_VIBRATION=36
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${GAT562_Mesh_Watch13.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/ui/GenericVibration.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${GAT562_Mesh_Watch13.lib_deps}
densaugeo/base64 @ ~1.4.0

View file

@ -0,0 +1,50 @@
#include <Arduino.h>
#include "target.h"
#include <helpers/ArduinoHelpers.h>
GAT56MeshWatch13Board board;
#ifndef PIN_USER_BTN
#define PIN_USER_BTN (-1)
#endif
#ifdef DISPLAY_CLASS
DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true, false, true);
#endif
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);
WRAPPER_CLASS radio_driver(radio, board);
VolatileRTCClock fallback_clock;
AutoDiscoverRTCClock rtc_clock(fallback_clock);
EnvironmentSensorManager sensors;
bool radio_init() {
rtc_clock.begin(Wire);
return radio.std_init(&SPI);
}
uint32_t radio_get_rng_seed() {
return radio.random(0x7FFFFFFF);
}
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
radio.setFrequency(freq);
radio.setSpreadingFactor(sf);
radio.setBandwidth(bw);
radio.setCodingRate(cr);
}
void radio_set_tx_power(int8_t dbm) {
radio.setOutputPower(dbm);
}
mesh::LocalIdentity radio_new_identity() {
RadioNoiseListener rng(radio);
return mesh::LocalIdentity(&rng); // create new random identity
}

View file

@ -0,0 +1,31 @@
#pragma once
#define RADIOLIB_STATIC_ONLY 1
#include <RadioLib.h>
#include <helpers/radiolib/RadioLibWrappers.h>
#include <GAT56MeshWatch13Board.h>
#include <helpers/radiolib/CustomSX1262Wrapper.h>
#include <helpers/AutoDiscoverRTCClock.h>
#include <helpers/sensors/EnvironmentSensorManager.h>
#ifdef DISPLAY_CLASS
#include <helpers/ui/SSD1306Display.h>
extern DISPLAY_CLASS display;
#include <helpers/ui/MomentaryButton.h>
extern MomentaryButton user_btn;
#endif
#ifdef PIN_VIBRATION
#include <helpers/ui/GenericVibration.h>
#endif
extern GAT56MeshWatch13Board board;
extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock;
extern EnvironmentSensorManager sensors;
bool radio_init();
uint32_t radio_get_rng_seed();
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
void radio_set_tx_power(int8_t dbm);
mesh::LocalIdentity radio_new_identity();

View file

@ -0,0 +1,44 @@
/*
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 "wiring_constants.h"
#include "wiring_digital.h"
#include "nrf.h"
const uint32_t g_ADigitalPinMap[] =
{
// P0
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
8 , 9 , 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31,
// P1
32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47
};
void initVariant()
{
}

View file

@ -0,0 +1,201 @@
/*
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_RAK4630_
#define _VARIANT_RAK4630_
#define RAK4630
/** Master clock frequency */
#define VARIANT_MCK (64000000ul)
#define USE_LFXO // Board uses 32khz crystal for LF
// define USE_LFRC // Board uses RC for LF
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include "WVariant.h"
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
/*
* WisBlock Base GPIO definitions
*/
static const uint8_t WB_IO1 = 17; // SLOT_A SLOT_B
static const uint8_t WB_IO2 = 34; // SLOT_A SLOT_B
static const uint8_t WB_IO3 = 21; // SLOT_C
static const uint8_t WB_IO4 = 4; // SLOT_C
static const uint8_t WB_IO5 = 9; // SLOT_D
static const uint8_t WB_IO6 = 10; // SLOT_D
static const uint8_t WB_SW1 = 33; // IO_SLOT
static const uint8_t WB_A0 = 5; // IO_SLOT
static const uint8_t WB_A1 = 31; // IO_SLOT
static const uint8_t WB_I2C1_SDA = 13; // SENSOR_SLOT IO_SLOT
static const uint8_t WB_I2C1_SCL = 14; // SENSOR_SLOT IO_SLOT
static const uint8_t WB_I2C2_SDA = 24; // IO_SLOT
static const uint8_t WB_I2C2_SCL = 25; // IO_SLOT
static const uint8_t WB_SPI_CS = 26; // IO_SLOT
static const uint8_t WB_SPI_CLK = 3; // IO_SLOT
static const uint8_t WB_SPI_MISO = 29; // IO_SLOT
static const uint8_t WB_SPI_MOSI = 30; // IO_SLOT
// Number of pins defined in PinDescription array
#define PINS_COUNT (48)
#define NUM_DIGITAL_PINS (48)
#define NUM_ANALOG_INPUTS (6)
#define NUM_ANALOG_OUTPUTS (0)
// LEDs
#define PIN_LED (-1)
#define LED_BUILTIN PIN_LED
#define LED_CONN PIN_LED
#define LED_GREEN PIN_LED
#define LED_BLUE PIN_LED
#define LED_STATE_ON 1 // State when LED is litted
/*
* Buttons
*/
#define PIN_BUTTON1 (9)
#define PIN_BUTTON2 (10)
#define PIN_USER_BTN PIN_BUTTON1
#define PIN_BACK_BTN PIN_BUTTON2
// Analog pins
#define PIN_VBAT_READ (5)
#define ADC_MULTIPLIER (3 * 1.75 * 1.187 * 1000)
/*
* Analog pins
*/
#define PIN_A0 (5) //(3)
#define PIN_A1 (31) //(4)
#define PIN_A2 (28)
#define PIN_A3 (29)
#define PIN_A4 (30)
#define PIN_A5 (31)
#define PIN_A6 (0xff)
#define PIN_A7 (0xff)
static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;
#define ADC_RESOLUTION 14
// Power management boot protection threshold (millivolts)
// Set to 0 to disable boot protection
#define PWRMGT_VOLTAGE_BOOTLOCK 3300 // Won't boot below this voltage (mV)
// LPCOMP wake configuration (voltage recovery from SYSTEMOFF)
// AIN3 = P0.05 = PIN_A0 / PIN_VBAT_READ
#define PWRMGT_LPCOMP_AIN 3
#define PWRMGT_LPCOMP_REFSEL 4 // 5/8 VDD (~3.13-3.44V)
// Other pins
#define PIN_AREF (2)
#define PIN_NFC1 (9)
#define PIN_NFC2 (10)
static const uint8_t AREF = PIN_AREF;
/*
* Serial interfaces
*/
// TXD1 RXD1 on Base Board
#define PIN_SERIAL1_RX (15)
#define PIN_SERIAL1_TX (16)
// TXD0 RXD0 on Base Board
#define PIN_SERIAL2_RX (19)
#define PIN_SERIAL2_TX (20)
/*
* SPI Interfaces
*/
#define SPI_INTERFACES_COUNT 1
#define PIN_SPI_MISO (29)
#define PIN_SPI_MOSI (30)
#define PIN_SPI_SCK (3)
static const uint8_t SS = 26;
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK = PIN_SPI_SCK;
// LoRa radio module pins for RAK4631
#define SX126X_POWER_EN (37)
#define P_LORA_RESET (38)
#define P_LORA_NSS (42)
#define P_LORA_SCLK (43)
#define P_LORA_MOSI (44)
#define P_LORA_MISO (45)
#define P_LORA_BUSY (46)
#define P_LORA_DIO_1 (47)
#define SX126X_DIO2_AS_RF_SWITCH true
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
/*
* Wire Interfaces
*/
#define WIRE_INTERFACES_COUNT 2
#define PIN_WIRE_SDA (13)
#define PIN_WIRE_SCL (14)
#define PIN_WIRE1_SDA (24)
#define PIN_WIRE1_SCL (25)
// QSPI Pins
// QSPI occupied by GPIO's
#define PIN_QSPI_SCK 3 // 19
#define PIN_QSPI_CS 26 // 17
#define PIN_QSPI_IO0 30 // 20
#define PIN_QSPI_IO1 29 // 21
#define PIN_QSPI_IO2 28 // 22
#define PIN_QSPI_IO3 2 // 23
// On-board QSPI Flash
#define EXTERNAL_FLASH_DEVICES W25Q16JV_IQ
#define EXTERNAL_FLASH_USE_QSPI
#ifdef __cplusplus
}
#endif
/*----------------------------------------------------------------------------
* Arduino objects - C++ only
*----------------------------------------------------------------------------*/
#endif

View file

@ -69,7 +69,7 @@ lib_deps =
extends = Generic_ESPNOW
build_flags =
${Generic_ESPNOW.build_flags}
-D ADVERT_NAME='"Heltec Room"'
-D ADVERT_NAME='"Generic ESPNow Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'

View file

@ -0,0 +1,66 @@
#include <Arduino.h>
#include <Wire.h>
#include "R1NeoBoard.h"
#ifdef NRF52_POWER_MANAGEMENT
// Static configuration for power management
// Values set in variant.h defines
const PowerMgtConfig power_config = {
.lpcomp_ain_channel = PWRMGT_LPCOMP_AIN,
.lpcomp_refsel = PWRMGT_LPCOMP_REFSEL,
.voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK
};
void R1NeoBoard::initiateShutdown(uint8_t reason) {
// Disable LoRa module power before shutdown
MESH_DEBUG_PRINTLN("R1Neo: shutting down");
digitalWrite(SX126X_POWER_EN, LOW);
if (reason == SHUTDOWN_REASON_LOW_VOLTAGE ||
reason == SHUTDOWN_REASON_BOOT_PROTECT) {
configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel);
}
enterSystemOff(reason);
}
#endif // NRF52_POWER_MANAGEMENT
void R1NeoBoard::begin() {
// R1 Neo peculiarity: tell DCDC converter to stay powered.
// Must be done as soon as practical during boot.
pinMode(PIN_DCDC_EN_MCU_HOLD, OUTPUT);
digitalWrite(PIN_DCDC_EN_MCU_HOLD, HIGH);
// R1 Neo peculiarity: Tell I/O Controller device is on
// Enables passthrough of buttons and LEDs
pinMode(PIN_SOFT_SHUTDOWN, OUTPUT);
digitalWrite(PIN_SOFT_SHUTDOWN, HIGH);
NRF52BoardDCDC::begin();
// button is active high and passed through from I/O controller
pinMode(PIN_USER_BTN, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
digitalWrite(PIN_BUZZER, LOW);
// battery pins
pinMode(PIN_BAT_CHG, INPUT);
pinMode(PIN_VBAT_READ, INPUT);
Wire.setPins(PIN_WIRE_SDA, PIN_WIRE_SCL);
Wire.begin();
pinMode(SX126X_POWER_EN, OUTPUT);
#ifdef NRF52_POWER_MANAGEMENT
// Boot voltage protection check (may not return if voltage too low)
// We need to call this after we configure SX126X_POWER_EN as output but before we pull high
checkBootVoltage(&power_config);
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
}

View file

@ -0,0 +1,56 @@
#pragma once
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include "NullDisplayDriver.h"
#include "MomentaryButton.h"
#define DISPLAY_CLASS NullDisplayDriver
class R1NeoBoard : public NRF52BoardDCDC {
protected:
#ifdef NRF52_POWER_MANAGEMENT
void initiateShutdown(uint8_t reason) override;
#endif
public:
R1NeoBoard() : NRF52Board("R1NEO_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
#if defined(LED_BLUE)
// turn off that annoying blue LED before transmitting
digitalWrite(LED_BLUE, LOW);
#endif
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
#if defined(LED_BLUE)
// do it after transmitting too, just in case
digitalWrite(LED_BLUE, LOW);
#endif
}
#endif
#define BATTERY_SAMPLES 8
uint16_t getBattMilliVolts() override {
MESH_DEBUG_PRINTLN("R1Neo: Sampling battery");
analogReadResolution(12);
uint32_t raw = 0;
for (int i = 0; i < BATTERY_SAMPLES; i++) {
raw += analogRead(PIN_VBAT_READ);
}
raw = raw / BATTERY_SAMPLES;
return (ADC_MULTIPLIER * raw) / 4096;
}
const char* getManufacturerName() const override {
return "muzi works R1 Neo";
}
};

View file

@ -0,0 +1,132 @@
[R1Neo]
extends = nrf52_base
board = rak4631
board_check = true
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-I variants/muziworks_r1_neo
-I src/helpers/ui
-D R1Neo
-D NRF52_POWER_MANAGEMENT
-D RADIO_CLASS=CustomSX1262
-D WRAPPER_CLASS=CustomSX1262Wrapper
-D LORA_TX_POWER=22
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D PIN_BUZZER=3
-D PIN_USER_BTN=26
-D USER_BTN_PRESSED=HIGH
-D PIN_GPS_TX=25
-D PIN_GPS_RX=24
-D PIN_GPS_EN=33
build_src_filter = ${nrf52_base.build_src_filter}
+<../variants/muziworks_r1_neo>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/ui/NullDisplayDriver.cpp>
+<helpers/sensors>
lib_deps =
${nrf52_base.lib_deps}
${sensor_base.lib_deps}
sparkfun/SparkFun u-blox GNSS Arduino Library@^2.2.27
[env:R1Neo_repeater]
extends = R1Neo
build_flags =
${R1Neo.build_flags}
-D ADVERT_NAME='"R1 Neo Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${R1Neo.build_src_filter}
+<../examples/simple_repeater>
[env:R1Neo_room_server]
extends = R1Neo
build_flags =
${R1Neo.build_flags}
-D ADVERT_NAME='"R1 Neo Test Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D ROOM_PASSWORD='"hello"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${R1Neo.build_src_filter}
+<../examples/simple_room_server>
[env:R1Neo_companion_radio_usb]
extends = R1Neo
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld
board_upload.maximum_size = 712704
build_flags =
${R1Neo.build_flags}
-I examples/companion_radio/ui-orig
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
build_src_filter = ${R1Neo.build_src_filter}
+<helpers/ui/buzzer.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-orig/*.cpp>
lib_deps =
${R1Neo.lib_deps}
densaugeo/base64 @ ~1.4.0
end2endzone/NonBlockingRTTTL@^1.3.0
[env:R1Neo_companion_radio_ble]
extends = R1Neo
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld
board_upload.maximum_size = 712704
build_flags =
${R1Neo.build_flags}
-I examples/companion_radio/ui-orig
-D ENV_INCLUDE_GPS=1
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456
-D BLE_DEBUG_LOGGING=1
-D OFFLINE_QUEUE_SIZE=256
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${R1Neo.build_src_filter}
+<helpers/ui/buzzer.cpp>
+<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-orig/*.cpp>
lib_deps =
${R1Neo.lib_deps}
${rak4631.lib_deps}
densaugeo/base64 @ ~1.4.0
end2endzone/NonBlockingRTTTL@^1.3.0
[env:R1Neo_terminal_chat]
extends = R1Neo
build_flags =
${R1Neo.build_flags}
-D MAX_CONTACTS=100
-D MAX_GROUP_CHANNELS=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${R1Neo.build_src_filter}
+<../examples/simple_secure_chat/main.cpp>
lib_deps =
${R1Neo.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:R1Neo_sensor]
extends = R1Neo
build_flags =
${R1Neo.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"R1 Neo Sensor"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
; -D MESH_PACKET_LOGGING=1
-D MESH_DEBUG=1
build_src_filter = ${R1Neo.build_src_filter}
+<../examples/simple_sensor>

View file

@ -0,0 +1,47 @@
#include <Arduino.h>
#include "target.h"
#include <helpers/ArduinoHelpers.h>
R1NeoBoard board;
DISPLAY_CLASS display;
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);
WRAPPER_CLASS radio_driver(radio, board);
VolatileRTCClock fallback_clock;
AutoDiscoverRTCClock rtc_clock(fallback_clock);
#if ENV_INCLUDE_GPS
#include <helpers/sensors/MicroNMEALocationProvider.h>
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock);
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea);
#else
EnvironmentSensorManager sensors;
#endif
bool radio_init() {
rtc_clock.begin(Wire);
return radio.std_init(&SPI);
}
uint32_t radio_get_rng_seed() {
return radio.random(0x7FFFFFFF);
}
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
radio.setFrequency(freq);
radio.setSpreadingFactor(sf);
radio.setBandwidth(bw);
radio.setCodingRate(cr);
}
void radio_set_tx_power(int8_t dbm) {
radio.setOutputPower(dbm);
}
mesh::LocalIdentity radio_new_identity() {
RadioNoiseListener rng(radio);
return mesh::LocalIdentity(&rng); // create new random identity
}

View file

@ -0,0 +1,22 @@
#pragma once
#define RADIOLIB_STATIC_ONLY 1
#include <RadioLib.h>
#include <helpers/radiolib/RadioLibWrappers.h>
#include <R1NeoBoard.h>
#include <helpers/radiolib/CustomSX1262Wrapper.h>
#include <helpers/AutoDiscoverRTCClock.h>
#include <helpers/sensors/EnvironmentSensorManager.h>
extern R1NeoBoard board;
extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock;
extern EnvironmentSensorManager sensors;
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;
bool radio_init();
uint32_t radio_get_rng_seed();
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
void radio_set_tx_power(int8_t dbm);
mesh::LocalIdentity radio_new_identity();

View file

@ -0,0 +1,92 @@
/*
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 "wiring_constants.h"
#include "wiring_digital.h"
#include "nrf.h"
const uint32_t g_ADigitalPinMap[] =
{
// P0
0, // P0.00 (NC) (XTAL)
1, // P0.01 (NC) (XTAL)
2, // P0.02 (30) GPS_PPS
3, // P0.03 (29) BUZZER_DRIVE
4, // P0.04 (41) NC
5, // P0.05 (40) NC
6, // P0.06 (NC) NOT_PRESENT
7, // P0.07 (NC) (TRACECLK)
8, // P0.08 (NC) NOT_PRESENT
9, // P0.09 (13) NC
10, // P0.10 (12) NC
11, // P0.11 (NC) NOT_PRESENT
12, // P0.12 (NC) NOT_PRESENT
13, // P0.13 (04) DCDC_EN_MCU_HOLD
14, // P0.14 (05) NC
15, // P0.15 (06) NC
16, // P0.16 (07) NC
17, // P0.17 (08) NC
18, // P0.18 (17) !RESET
19, // P0.19 (09) RTC_SDA
20, // P0.20 (10) RTC_SCL
21, // P0.21 (11) NC
22, // P0.22 (NC) NOT_PRESENT
23, // P0.23 (NC) NOT_PRESENT
24, // P0.24 (23) UART_GPS_RX
25, // P0.25 (24) UART_GPS_TX
26, // P0.26 (26) BTN_OK/USR_BTN_PROCESSED
27, // P0.27 (NC) NOT_PRESENT
28, // P0.28 (31) BLU_LED_RAK
29, // P0.29 (32) SOFT_SHUTDOWN_SIGNAL
30, // P0.30 (33) MCU_SIGNAL
31, // P0.31 (39) ADC_VBAT
// P1
32, // P1.00 (NC) NOT_PRESENT
33, // P1.01 (25) GPS_EN
34, // P1.02 (26) BAT_CHG_STATUS
35, // P1.03 (27) NC
36, // P1.04 (28) GRN_LED_RAK
37, // P1.05 (SX) SX126X_POWER_EN
38, // P1.06 (SX) P_LORA_RESET
39, // P1.07 (NC) NOT_PRESENT
40, // P1.08 (NC) NOT_PRESENT
41, // P1.09 (NC) NOT_PRESENT
42, // P1.10 (SX) P_LORA_NSS
43, // P1.11 (SX) P_LORA_SCLK
44, // P1.12 (SX) P_LORA_MOSI
45, // P1.13 (SX) P_LORA_MISO
46, // P1.14 (SX) P_LORA_BUSY
47 // P1.15 (SX) P_LORA_DIO_1
};
void initVariant()
{
// Red & Green LEDs - enable & turn off
pinMode(LED_GREEN, OUTPUT);
ledOff(LED_GREEN);
pinMode(LED_BLUE, OUTPUT);
ledOff(LED_BLUE);
pinMode(PIN_GPS_EN, OUTPUT);
}

View file

@ -0,0 +1,183 @@
/*
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_R1NEO_
#define _VARIANT_R1NEO_
#define RAK4630
/** Master clock frequency */
#define VARIANT_MCK (64000000ul)
#define USE_LFXO // Board uses 32khz crystal for LF
// define USE_LFRC // Board uses RC for LF
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include "WVariant.h"
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
/* Number of pins defined in PinDescription array */
#define PINS_COUNT (48)
#define NUM_DIGITAL_PINS (48)
#define NUM_ANALOG_INPUTS (8)
#define NUM_ANALOG_OUTPUTS (0)
/* R1Neo peculiarities */
#define PIN_DCDC_EN_MCU_HOLD (13) // P0.13 (04) DCDC_EN_MCU_HOLD
#define PIN_SOFT_SHUTDOWN (29) // P0.29 (32) SOFT_SHUTDOWN_SIGNAL
#define PIN_MCU_SIGNAL (30) // P0.30 (33) MCU_SIGNAL
/* R1Neo LoRa Radio */
// RAK4630/4631 pins
#define P_LORA_DIO_1 (47) // P1.15 (SX)
#define P_LORA_NSS (42) // P1.10 (SX)
#define P_LORA_RESET RADIOLIB_NC // P1.06 (SX) -- 38
#define P_LORA_BUSY (46) // P1.14 (SX)
#define P_LORA_SCLK (43) // P1.11 (SX)
#define P_LORA_MISO (45) // P1.13 (SX)
#define P_LORA_MOSI (44) // P1.12 (SX)
#define SX126X_POWER_EN (37) // P1.05 (SX)
#define SX126X_DIO2_AS_RF_SWITCH true
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
/* R1Neo peripherals */
/* GPS */
#define GPS_RX (24) // P0.24 (23) UART_GPS_RX
#define GPS_TX (25) // P0.25 (24) UART_GPS_TX
#define GPS_EN (33) // P1.01 (25) GPS_EN
#define GPS_PPS (2) // P0.02 (30) GPS_PPS
#define PIN_GPS_1PPS GPS_PPS
#define GPS_BAUD_RATE 9600
/* RTC */
#define RTC_SDA (19) // P0.19 (9) RTC_SDA
#define RTC_SCL (20) // P0.20 (10) RTC_SCL
/* LEDs */
#define LED_GREEN (36) // P1.04 (28) GRN_LED_RAK
#define LED_BLUE (28) // P0.28 (31) BLU_LED_RAK
#define LED_BUILTIN (0xFF)
#ifndef P_LORA_TX_LED
#define P_LORA_TX_LED LED_GREEN
#endif
#define LED_STATE_ON 1 // State when LED is lit
/* Buttons */
#define PIN_USER_BTN (26)
/* Buzzer */
#define PIN_BUZZER (3)
/* Analog pins */
// Arduino makes me angry
#define PIN_A0 (0xFF) // NOT_PRESENT
#define PIN_A1 (0xFF) // NOT_PRESENT
#define PIN_A2 (4) // P0.04 (41) NC
#define PIN_A3 (5) // P0.05 (40) NC
#define PIN_A4 (0xFF) // NOT_PRESENT
#define PIN_A5 (0xFF) // NOT_PRESENT
#define PIN_A6 (0xFF) // NOT_PRESENT
#define PIN_A7 (31) // P0.31 (39) ADC_VBAT
static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;
#define ADC_RESOLUTION 14
// Other pins
#define PIN_AREF (0xFF) // No analog reference
static const uint8_t AREF = PIN_AREF;
/* Serial interfaces */
#define PIN_GPS_TX (GPS_TX)
#define PIN_GPS_RX (GPS_RX)
#define PIN_GPS_EN (GPS_EN)
#define PIN_SERIAL1_TX (PIN_GPS_TX)
#define PIN_SERIAL1_RX (PIN_GPS_RX)
/* SPI Interfaces */
// unused pins - define anyways
#define SPI_INTERFACES_COUNT 1
#define PIN_SPI_MOSI (9) // P0.09 (13) NC
#define PIN_SPI_MISO (10) // P0.10 (12) NC
#define PIN_SPI_SCK (21) // P0.21 (11) NC
/* I2C Interfaces */
#define WIRE_INTERFACES_COUNT 1
#define PIN_WIRE_SDA (RTC_SDA)
#define PIN_WIRE_SCL (RTC_SCL)
/* QSPI Pins */
// interface occupied by peripherals, define anyways
#define PIN_QSPI_SCK (3) // P0.03 (29) BUZZER
#define PIN_QSPI_CS (26) // P0.26 (34) USER_BUTTON
#define PIN_QSPI_IO0 (30) // P0.30 (33) MCU_SIGNAL
#define PIN_QSPI_IO1 (29) // P0.29 (32) SOFT_SHUTDOWN
#define PIN_QSPI_IO2 (28) // P0.28 (31) BLU_LED_RAK
#define PIN_QSPI_IO3 (2) // P0.02 (30) GPS_PPS
/* On-board QSPI Flash */
// No QSPI (define anyways)
#define EXTERNAL_FLASH_DEVICES IS25LP080D
#define EXTERNAL_FLASH_USE_QSPI
/* Battery */
#define PIN_VBAT_READ (31) // P0.31 (39) ADC_VBAT
#define PIN_BAT_CHG (34) // P1.02 (26) BAT_CHG_STATUS
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000)
// Power management boot protection threshold (millivolts)
// Set to 0 to disable boot protection
// disabled for now until I can figure this out
#define PWRMGT_VOLTAGE_BOOTLOCK 0 // Won't boot below this voltage (mV)
// LPCOMP wake configuration (voltage recovery from SYSTEMOFF)
// AIN3 = P0.05 = PIN_A0 / PIN_VBAT_READ
#define PWRMGT_LPCOMP_AIN 5
#define PWRMGT_LPCOMP_REFSEL 4 // 5/8 VDD (~3.13-3.44V)
#ifdef __cplusplus
}
#endif
/*----------------------------------------------------------------------------
* Arduino objects - C++ only
*----------------------------------------------------------------------------*/
#endif

View file

@ -20,6 +20,7 @@ build_flags = ${nrf52_base.build_flags}
-D LORA_TX_POWER=22
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D ENV_INCLUDE_RAK12035=1
build_src_filter = ${nrf52_base.build_src_filter}
+<../variants/rak4631>
+<helpers/sensors>

View file

@ -58,7 +58,7 @@ build_src_filter = ${ThinkNode_M5.build_src_filter}
+<../examples/simple_repeater/*.cpp>
build_flags =
${ThinkNode_M5.build_flags}
-D ADVERT_NAME='"Thinknode M2 Repeater"'
-D ADVERT_NAME='"Thinknode M5 Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
@ -116,7 +116,7 @@ build_src_filter = ${ThinkNode_M5.build_src_filter}
+<../examples/simple_room_server>
build_flags =
${ThinkNode_M5.build_flags}
-D ADVERT_NAME='"Thinknode M2 Room Server"'
-D ADVERT_NAME='"Thinknode M5 Room Server"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
@ -193,8 +193,8 @@ build_flags =
-D MAX_GROUP_CHANNELS=40
-D OFFLINE_QUEUE_SIZE=256
-D WIFI_DEBUG_LOGGING=1
-D WIFI_SSID='"Livebox-633C"'
-D WIFI_PWD='"vvQUHGSxsWd7fKMYSr"'
-D WIFI_SSID='"myssid"'
-D WIFI_PWD='"mypwd"'
build_src_filter = ${ThinkNode_M5.build_src_filter}
+<helpers/esp32/*.cpp>
+<helpers/ui/MomentaryButton.cpp>