diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml
index 514304e65..2791f65e1 100644
--- a/.github/workflows/update_protobufs.yml
+++ b/.github/workflows/update_protobufs.yml
@@ -17,9 +17,9 @@ jobs:
- name: Download nanopb
run: |
- wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.4-linux-x86.tar.gz
- tar xvzf nanopb-0.4.4-linux-x86.tar.gz
- mv nanopb-0.4.4-linux-x86 nanopb-0.4.4
+ wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.5-linux-x86.tar.gz
+ tar xvzf nanopb-0.4.5-linux-x86.tar.gz
+ mv nanopb-0.4.5-linux-x86 nanopb-0.4.5
- name: Re-generate protocol buffers
run: |
diff --git a/bin/build-all.sh b/bin/build-all.sh
index 0645f05dd..a92a04745 100755
--- a/bin/build-all.sh
+++ b/bin/build-all.sh
@@ -9,7 +9,7 @@ BOARDS_ESP32="rak11200 tlora-v2 tlora-v1 tlora_v1_3 tlora-v2-1-1.6 tbeam heltec-
#BOARDS_ESP32=tbeam
# FIXME note nrf52840dk build is for some reason only generating a BIN file but not a HEX file nrf52840dk-geeksville is fine
-BOARDS_NRF52="rak4631_5005 rak4631_5005_eink rak4631_19003 t-echo"
+BOARDS_NRF52="rak4631_5005 rak4631_5005_eink rak4631_19003 t-echo pca10059_diy_eink"
#BOARDS_NRF52=""
OUTDIR=release/latest
diff --git a/bin/check-all.sh b/bin/check-all.sh
index dde1dd3b1..f18f87f15 100755
--- a/bin/check-all.sh
+++ b/bin/check-all.sh
@@ -13,7 +13,7 @@ if [[ $# -gt 0 ]]; then
# can override which environment by passing arg
BOARDS="$@"
else
- BOARDS="tlora-v2 tlora-v1 tlora_v1_3 tlora-v2-1-1.6 tbeam heltec-v1 heltec-v2.0 heltec-v2.1 tbeam0.7 meshtastic-diy-v1 rak4631_5005 rak4631_19003 rak11200 t-echo"
+ BOARDS="tlora-v2 tlora-v1 tlora_v1_3 tlora-v2-1-1.6 tbeam heltec-v1 heltec-v2.0 heltec-v2.1 tbeam0.7 meshtastic-diy-v1 rak4631_5005 rak4631_19003 rak11200 t-echo pca10059_diy_eink"
fi
echo "BOARDS:${BOARDS}"
diff --git a/boards/nordic_pca10059.json b/boards/nordic_pca10059.json
new file mode 100644
index 000000000..b3d2cc7bd
--- /dev/null
+++ b/boards/nordic_pca10059.json
@@ -0,0 +1,72 @@
+{
+ "build": {
+ "arduino": {
+ "ldscript": "nrf52840_s140_v6.ld"
+ },
+ "core": "nRF5",
+ "cpu": "cortex-m4",
+ "extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA",
+ "f_cpu": "64000000L",
+ "hwids": [
+ [
+ "0x239A",
+ "0x8029"
+ ],
+ [
+ "0x239A",
+ "0x0029"
+ ],
+ [
+ "0x239A",
+ "0x002A"
+ ],
+ [
+ "0x239A",
+ "0x802A"
+ ]
+ ],
+ "usb_product": "PCA10059",
+ "mcu": "nrf52840",
+ "variant": "nRF52840 Dongle",
+ "bsp": {
+ "name": "adafruit"
+ },
+ "softdevice": {
+ "sd_flags": "-DS140",
+ "sd_name": "s140",
+ "sd_version": "6.1.1",
+ "sd_fwid": "0x00B6"
+ },
+ "bootloader": {
+ "settings_addr": "0xFF000"
+ }
+ },
+ "connectivity": [
+ "bluetooth"
+ ],
+ "debug": {
+ "jlink_device": "nRF52840_xxAA",
+ "svd_path": "nrf52840.svd"
+ },
+ "frameworks": [
+ "arduino"
+ ],
+ "name": "nRF52840 Dongle",
+ "upload": {
+ "maximum_ram_size": 248832,
+ "maximum_size": 815104,
+ "speed": 115200,
+ "protocol": "nrfutil",
+ "protocols": [
+ "jlink",
+ "nrfjprog",
+ "nrfutil",
+ "stlink"
+ ],
+ "use_1200bps_touch": true,
+ "require_upload_port": true,
+ "wait_for_upload_port": true
+ },
+ "url": "https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle",
+ "vendor": "Nordic Semiconductor"
+}
diff --git a/platformio.ini b/platformio.ini
index c91b95247..b2c375901 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -20,6 +20,7 @@ default_envs = tbeam
;default_envs = rak4631_5005_eink
;default_envs = rak4631_19003
;default_envs = nano-g1
+;default_envs = pca10059_diy_eink
;default_envs = meshtastic-diy-v1
;default_envs = meshtastic-diy-v1.1
@@ -47,7 +48,7 @@ lib_deps =
https://github.com/meshtastic/arduino-fsm.git
https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git#31015a55e630a2df77d9d714669c621a5bf355ad
https://github.com/meshtastic/RadioLib.git#5582ac30578ff3f53f20630a00b2a8a4b8f92c74
- https://github.com/meshtastic/TinyGPSPlus.git#f0f47067ef2f67c856475933188251c1ef615e79
+ https://github.com/meshtastic/TinyGPSPlus.git
https://github.com/meshtastic/AXP202X_Library.git#8404abb6d4b486748636bc6ad72d2a47baaf5460
Wire ; explicitly needed here because the AXP202 library forgets to add it
SPI
diff --git a/proto b/proto
index 31eaff092..e1ef519d0 160000
--- a/proto
+++ b/proto
@@ -1 +1 @@
-Subproject commit 31eaff092449a75ebbbf0114cf120c746dc96349
+Subproject commit e1ef519d07b180a05298857374fd60a6165b7a75
diff --git a/src/configuration.h b/src/configuration.h
index d1b335ecb..742d9e75e 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -244,6 +244,10 @@ along with this program. If not, see .
#define HW_VENDOR HardwareModel_NANO_G1
+#elif defined(NORDIC_PCA10059)
+
+#define HW_VENDOR HardwareModel_NRF52840_PCA10059
+
#elif NRF52_SERIES
#define HW_VENDOR HardwareModel_NRF52_UNKNOWN
diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp
index 8c0f7571d..8562f0ebe 100644
--- a/src/gps/GPS.cpp
+++ b/src/gps/GPS.cpp
@@ -41,6 +41,25 @@ bool GPS::setupGPS()
#endif
#ifndef NO_ESP32
_serial_gps->setRxBufferSize(2048); // the default is 256
+#endif
+#ifdef TTGO_T_ECHO
+ // Switch to 4800 baud, then close and reopen port
+ _serial_gps->write("$PCAS01,0*1C\r\n");
+ delay(250);
+ _serial_gps->end();
+ delay(250);
+ _serial_gps->begin(4800);
+ delay(250);
+ // Initialize the L76K Chip, use GPS + GLONASS
+ _serial_gps->write("$PCAS04,5*1C\r\n");
+ delay(250);
+ // only ask for RMC and GGA
+ _serial_gps->write("$PCAS03,1,0,0,0,1,0,0,0,0,0,,,0,0*02\r\n");
+ delay(250);
+ // Switch to Vehicle Mode, since SoftRF enables Aviation < 2g
+ _serial_gps->write("$PCAS11,3*1E\r\n");
+ delay(250);
+
#endif
}
diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp
index adb284a74..47ced53c6 100644
--- a/src/graphics/EInkDisplay2.cpp
+++ b/src/graphics/EInkDisplay2.cpp
@@ -25,6 +25,11 @@
//1.54 inch 200x200 - GxEPD2_154_M09
//#define TECHO_DISPLAY_MODEL GxEPD2_154_M09
+#elif defined(PCA10059)
+
+//4.2 inch 300x400 - GxEPD2_420_M01
+#define TECHO_DISPLAY_MODEL GxEPD2_420_M01
+
#endif
GxEPD2_BW *adafruitDisplay;
@@ -47,6 +52,11 @@ EInkDisplay::EInkDisplay(uint8_t address, int sda, int scl)
//GxEPD2_154_M09
//setGeometry(GEOMETRY_RAWMODE, 200, 200);
+ #elif defined(PCA10059)
+
+ //GxEPD2_420_M01
+ setGeometry(GEOMETRY_RAWMODE, 300, 400);
+
#endif
// setGeometry(GEOMETRY_RAWMODE, 128, 64); // old resolution
// setGeometry(GEOMETRY_128_64); // We originally used this because I wasn't sure if rawmode worked - it does
@@ -71,8 +81,8 @@ bool EInkDisplay::forceDisplay(uint32_t msecLimit)
// FIXME - only draw bits have changed (use backbuf similar to the other displays)
// tft.drawBitmap(0, 0, buffer, 128, 64, TFT_YELLOW, TFT_BLACK);
- for (uint64_t y = 0; y < displayHeight; y++) {
- for (uint64_t x = 0; x < displayWidth; x++) {
+ for (uint32_t y = 0; y < displayHeight; y++) {
+ for (uint32_t x = 0; x < displayWidth; x++) {
// get src pixel in the page based ordering the OLED lib uses FIXME, super inefficent
auto b = buffer[x + (y / 8) * displayWidth];
@@ -81,11 +91,7 @@ bool EInkDisplay::forceDisplay(uint32_t msecLimit)
}
}
- #if defined(TTGO_T_ECHO)
- DEBUG_MSG("Updating T-ECHO E-Paper... ");
- #elif defined(RAK4630)
- DEBUG_MSG("Updating RAK4361_5005 E-Paper... ");
- #endif
+ DEBUG_MSG("Updating E-Paper... ");
#if defined(TTGO_T_ECHO)
// ePaper.Reset(); // wake the screen from sleep
@@ -101,6 +107,8 @@ bool EInkDisplay::forceDisplay(uint32_t msecLimit)
// 4.2 inch 300x400 - GxEPD2_420_M01
//adafruitDisplay->nextPage();
+ #elif defined(PCA10059)
+ adafruitDisplay->nextPage();
#endif
// Put screen to sleep to save power (possibly not necessary because we already did poweroff inside of display)
@@ -176,6 +184,14 @@ bool EInkDisplay::connect()
adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight);
}
+#elif defined(PCA10059)
+{
+ auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY);
+ adafruitDisplay = new GxEPD2_BW(*lowLevel);
+ adafruitDisplay->init(115200, true, 10, false, SPI1, SPISettings(4000000, MSBFIRST, SPI_MODE0));
+ adafruitDisplay->setRotation(3);
+ adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight);
+}
#endif
diff --git a/src/mesh/generated/mesh.pb.h b/src/mesh/generated/mesh.pb.h
index 653c36e2d..b4a9dbf90 100644
--- a/src/mesh/generated/mesh.pb.h
+++ b/src/mesh/generated/mesh.pb.h
@@ -63,6 +63,8 @@ typedef enum _HardwareModel {
HardwareModel_RAK11200 = 40,
/* B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano */
HardwareModel_NANO_G1 = 41,
+ /* nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/ */
+ HardwareModel_NRF52840_PCA10059 = 42,
/* Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. */
HardwareModel_PRIVATE_HW = 255
} HardwareModel;
diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h
index 1fb5ea0d7..b3bf3df1d 100644
--- a/src/mesh/generated/telemetry.pb.h
+++ b/src/mesh/generated/telemetry.pb.h
@@ -40,10 +40,10 @@ typedef struct _EnvironmentMetrics {
/* Types of Measurements the telemetry module is equipped to handle */
typedef struct _Telemetry {
- /* This is usually not sent over the mesh (to save space), but it is sent
- from the phone so that the local device can set its RTC If it is sent over
- the mesh (because there are devices on the mesh without GPS), it will only
- be sent by devices which has a hardware GPS clock (IE Mobile Phone).
+ /* This is usually not sent over the mesh (to save space), but it is sent
+ from the phone so that the local device can set its RTC If it is sent over
+ the mesh (because there are devices on the mesh without GPS), it will only
+ be sent by devices which has a hardware GPS clock (IE Mobile Phone).
seconds since 1970 */
uint32_t time;
/* Key native device metrics such as battery level */
diff --git a/variants/Dongle_nRF52840-pca10059-v1/platformio.ini b/variants/Dongle_nRF52840-pca10059-v1/platformio.ini
new file mode 100644
index 000000000..e527dd988
--- /dev/null
+++ b/variants/Dongle_nRF52840-pca10059-v1/platformio.ini
@@ -0,0 +1,9 @@
+[env:pca10059_diy_eink]
+extends = nrf52840_base
+board = nordic_pca10059
+build_flags = ${nrf52840_base.build_flags} -Ivariants/Dongle_nRF52840-pca10059-v1 -D NORDIC_PCA10059
+src_filter = ${nrf52_base.src_filter} +<../variants/Dongle_nRF52840-pca10059-v1>
+lib_deps =
+ ${nrf52840_base.lib_deps}
+ https://github.com/ZinggJM/GxEPD2.git
+debug_tool = jlink
diff --git a/variants/Dongle_nRF52840-pca10059-v1/variant.cpp b/variants/Dongle_nRF52840-pca10059-v1/variant.cpp
new file mode 100644
index 000000000..5b9288319
--- /dev/null
+++ b/variants/Dongle_nRF52840-pca10059-v1/variant.cpp
@@ -0,0 +1,43 @@
+/*
+ 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()
+{
+ // LED1 & LED2
+ pinMode(PIN_LED1, OUTPUT);
+ ledOff(PIN_LED1);
+
+ pinMode(PIN_LED2, OUTPUT);
+ ledOff(PIN_LED2);
+}
diff --git a/variants/Dongle_nRF52840-pca10059-v1/variant.h b/variants/Dongle_nRF52840-pca10059-v1/variant.h
new file mode 100644
index 000000000..9e69a3e9e
--- /dev/null
+++ b/variants/Dongle_nRF52840-pca10059-v1/variant.h
@@ -0,0 +1,180 @@
+/*
+ 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_NORDIC_PCA10059_
+#define _VARIANT_NORDIC_PCA10059_
+
+#define PCA10059
+
+/** 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 (6)
+#define NUM_ANALOG_OUTPUTS (0)
+
+// LEDs
+#define PIN_LED1 (0 + 12) // Blue LED P1.12
+#define PIN_LED2 (0 + 6) // Built in Green P0.06
+
+//Green Built in LED1
+//#define PIN_LED1 (0 + 6) // LED1 P1.15
+
+//RGB NeoPixel LED2
+//#define PIN_LED1 (0 + 8) Red
+//#define PIN_LED1 (32 + 9) Green
+//#define PIN_LED1 (0 + 12) Blue
+
+#define LED_BUILTIN PIN_LED1
+#define LED_CONN PIN_LED2
+
+#define LED_GREEN PIN_LED1
+#define LED_BLUE PIN_LED2
+
+#define LED_STATE_ON 0 // State when LED is litted
+
+/*
+ * Buttons
+ */
+
+#define PIN_BUTTON1 (32 + 6) // BTN_DN P1.06 Built in button
+
+/*
+ * Analog pins
+ */
+#define PIN_A0 (-1)
+
+static const uint8_t A0 = PIN_A0;
+#define ADC_RESOLUTION 14
+
+// Other pins
+#define PIN_AREF (-1) // AREF Not yet used
+
+
+static const uint8_t AREF = PIN_AREF;
+
+/*
+ * Serial interfaces
+ */
+#define PIN_SERIAL1_RX (-1)
+#define PIN_SERIAL1_TX (-1)
+
+// Connected to Jlink CDC
+#define PIN_SERIAL2_RX (-1)
+#define PIN_SERIAL2_TX (-1)
+
+/*
+ * SPI Interfaces
+ */
+#define SPI_INTERFACES_COUNT 2
+
+#define PIN_SPI_MISO (0 + 17) // MISO P0.17
+#define PIN_SPI_MOSI (0 + 15) // MOSI P0.15
+#define PIN_SPI_SCK (0 + 13) // SCK P0.13
+
+#define PIN_SPI1_MISO (-1) //
+#define PIN_SPI1_MOSI (10) // EPD_MOSI P0.10
+#define PIN_SPI1_SCK (9) // EPD_SCLK P0.09
+
+static const uint8_t SS = (0 + 31); // LORA_CS P0.31
+static const uint8_t MOSI = PIN_SPI_MOSI;
+static const uint8_t MISO = PIN_SPI_MISO;
+static const uint8_t SCK = PIN_SPI_SCK;
+
+ /*
+ * eink display pins
+ */
+
+//#define PIN_EINK_EN (-1)
+#define PIN_EINK_EN (0 + 6) // Turn on the Green built in LED
+#define PIN_EINK_CS (32) // EPD_CS
+#define PIN_EINK_BUSY (20) // EPD_BUSY
+#define PIN_EINK_DC (24) // EPD_D/C
+#define PIN_EINK_RES (-1) // Not Connected P0.22 available
+#define PIN_EINK_SCLK (9) // EPD_SCLK
+#define PIN_EINK_MOSI (10) // EPD_MOSI
+
+#define HAS_EINK
+
+/*
+ * Wire Interfaces
+ */
+#define WIRE_INTERFACES_COUNT 1
+
+#define PIN_WIRE_SDA (32 + 4) // SDA
+#define PIN_WIRE_SCL (32 + 7) // SCL
+
+// NiceRF 868 LoRa module
+#define USE_SX1262
+#define SX126X_CS (0 + 31) // LORA_CS P0.31
+#define SX126X_DIO1 (0 + 29) // DIO1 P0.29
+#define SX126X_BUSY (0 + 2) // LORA_BUSY P0.02
+#define SX126X_RESET (32 + 15) // LORA_RESET P1.15
+#define SX126X_TXEN (-1) // TXEN P1.13 NiceRF 868 dont use
+#define SX126X_RXEN (-1) // RXEN P1.10 NiceRF 868 dont use
+#define SX126X_E22
+
+#define PIN_GPS_EN (-1)
+#define PIN_GPS_PPS (-1) // Pulse per second input from the GPS
+
+#define GPS_RX_PIN PIN_SERIAL1_RX
+#define GPS_TX_PIN PIN_SERIAL1_TX
+
+// Battery
+// The battery sense is hooked to pin A0 (5)
+#define BATTERY_PIN PIN_A0
+// and has 12 bit resolution
+#define BATTERY_SENSE_RESOLUTION_BITS 12
+#define BATTERY_SENSE_RESOLUTION 4096.0
+// Definition of milliVolt per LSB => 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
+#define VBAT_MV_PER_LSB (0.73242188F)
+// Voltage divider value => 1.5M + 1M voltage divider on VBAT = (1.5M / (1M + 1.5M))
+#define VBAT_DIVIDER (0.4F)
+// Compensation factor for the VBAT divider
+#define VBAT_DIVIDER_COMP (1.73)
+// Fixed calculation of milliVolt from compensation value
+#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
+#undef AREF_VOLTAGE
+#define AREF_VOLTAGE 3.0
+#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
+#define ADC_MULTIPLIER VBAT_DIVIDER_COMP //REAL_VBAT_MV_PER_LSB
+#define VBAT_RAW_TO_SCALED(x) (REAL_VBAT_MV_PER_LSB * x)
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+ * Arduino objects - C++ only
+ *----------------------------------------------------------------------------*/
+
+#endif