diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index af677537..ac8f9cdf 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -76,6 +76,10 @@ #include #include static RAK4631Board board; +#elif defined(T1000_E) + #include + #include + static T1000eBoard board; #else #error "need to provide a 'board' object" #endif diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 7d589828..29945748 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -70,6 +70,10 @@ #include #include static RAK4631Board board; +#elif defined(T1000_E) + #include + #include + static T1000eBoard board; #else #error "need to provide a 'board' object" #endif diff --git a/src/helpers/CustomLR1110.h b/src/helpers/CustomLR1110.h new file mode 100644 index 00000000..872bb1c3 --- /dev/null +++ b/src/helpers/CustomLR1110.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +#define LR1110_IRQ_HAS_PREAMBLE 0b0000000100 // 4 4 valid LoRa header received +#define LR1110_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received + +class CustomLR1110 : public LR1110 { + public: + CustomLR1110(Module *mod) : LR1110(mod) { } + + bool isReceiving() { + uint16_t irq = getIrqStatus(); + bool hasPreamble = ((irq & LR1110_IRQ_HEADER_VALID) && (irq & LR1110_IRQ_HAS_PREAMBLE)); + return hasPreamble; + } +}; \ No newline at end of file diff --git a/src/helpers/CustomLR1110Wrapper.h b/src/helpers/CustomLR1110Wrapper.h new file mode 100644 index 00000000..a3edfcb8 --- /dev/null +++ b/src/helpers/CustomLR1110Wrapper.h @@ -0,0 +1,27 @@ +#pragma once + +#include "CustomLR1110.h" +#include "RadioLibWrappers.h" + +class CustomLR1110Wrapper : public RadioLibWrapper { +public: + CustomLR1110Wrapper(CustomLR1110& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + bool isReceiving() override { + if (((CustomLR1110 *)_radio)->isReceiving()) return true; + + idle(); // put sx126x into standby + // do some basic CAD (blocks for ~12780 micros (on SF 10)!) + bool activity = (((CustomLR1110 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED); + idle(); + + return activity; + } + + void onSendFinished() override { + RadioLibWrapper::onSendFinished(); + _radio->setPreambleLength(8); // overcomes weird issues with small and big pkts + } + + float getLastRSSI() const override { return ((CustomLR1110 *)_radio)->getRSSI(); } + float getLastSNR() const override { return ((CustomLR1110 *)_radio)->getSNR(); } +}; diff --git a/src/helpers/nrf52/T1000eBoard.cpp b/src/helpers/nrf52/T1000eBoard.cpp new file mode 100644 index 00000000..84ca4caa --- /dev/null +++ b/src/helpers/nrf52/T1000eBoard.cpp @@ -0,0 +1,68 @@ +#include +#include "T1000eBoard.h" + +#include +#include + + + +#if 0 +static BLEDfu bledfu; + +static void connect_callback(uint16_t conn_handle) +{ + (void)conn_handle; + MESH_DEBUG_PRINTLN("BLE client connected"); +} + +static void disconnect_callback(uint16_t conn_handle, uint8_t reason) +{ + (void)conn_handle; + (void)reason; + + MESH_DEBUG_PRINTLN("BLE client disconnected"); +} + + +bool TrackerT1000eBoard::startOTAUpdate() { + // Config the peripheral connection with maximum bandwidth + // more SRAM required by SoftDevice + // Note: All config***() function must be called before begin() + Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); + Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16); + + Bluefruit.begin(1, 0); + // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4 + Bluefruit.setTxPower(4); + // Set the BLE device name + Bluefruit.setName("T1000E_OTA"); + + Bluefruit.Periph.setConnectCallback(connect_callback); + Bluefruit.Periph.setDisconnectCallback(disconnect_callback); + + // To be consistent OTA DFU should be added first if it exists + bledfu.begin(); + + // Set up and start advertising + // Advertising packet + Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); + Bluefruit.Advertising.addTxPower(); + Bluefruit.Advertising.addName(); + + /* Start Advertising + - Enable auto advertising if disconnected + - Interval: fast mode = 20 ms, slow mode = 152.5 ms + - Timeout for fast mode is 30 seconds + - Start(timeout) with timeout = 0 will advertise forever (until connected) + + For recommended advertising interval + https://developer.apple.com/library/content/qa/qa1931/_index.html + */ + Bluefruit.Advertising.restartOnDisconnect(true); + Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms + Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode + Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds + + return true; +} +#endif \ No newline at end of file diff --git a/src/helpers/nrf52/T1000eBoard.h b/src/helpers/nrf52/T1000eBoard.h new file mode 100644 index 00000000..4e5d6516 --- /dev/null +++ b/src/helpers/nrf52/T1000eBoard.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include + +// LoRa and SPI pins +#define P_LORA_DIO_1 (32 + 1) // P1.1 +#define P_LORA_NSS (0 + 12) // P0.12 +#define P_LORA_RESET (32 + 10) // P1.10 +#define P_LORA_BUSY (0 + 7) // P0.7 +#define P_LORA_SCLK (0 + 11) // P0.11 +#define P_LORA_MISO (32 + 8) // P1.8 +#define P_LORA_MOSI (32 + 9) // P0.9 +#define LR1110_POWER_EN 37 + +#define LR11X0_DIO_AS_RF_SWITCH true +#define LR11X0_DIO3_TCXO_VOLTAGE 1.6 + +// built-ins +//#define PIN_VBAT_READ 5 +//#define ADC_MULTIPLIER (3 * 1.73 * 1000) + +class T1000eBoard : public mesh::MainBoard { +protected: + uint8_t startup_reason; + +public: + void begin() { + // for future use, sub-classes SHOULD call this from their begin() + startup_reason = BD_STARTUP_NORMAL; + +// pinMode(PIN_VBAT_READ, INPUT); + +// Doesn't seem to be a pwr en pin ... +// pinMode(LR1110_POWER_EN, OUTPUT); +// digitalWrite(LR1110_POWER_EN, HIGH); + delay(10); // give sx1262 some time to power up + } + + uint16_t getBattMilliVolts() override { + return 0; + } + + uint8_t getStartupReason() const override { return startup_reason; } + + const char* getManufacturerName() const override { + return "Seeed Tracker T1000-e"; + } + + void reboot() override { + NVIC_SystemReset(); + } + +// bool startOTAUpdate() override; +};