@@ -76,6 +76,10 @@
|
|||||||
#include <helpers/nrf52/RAK4631Board.h>
|
#include <helpers/nrf52/RAK4631Board.h>
|
||||||
#include <helpers/CustomSX1262Wrapper.h>
|
#include <helpers/CustomSX1262Wrapper.h>
|
||||||
static RAK4631Board board;
|
static RAK4631Board board;
|
||||||
|
#elif defined(T1000_E)
|
||||||
|
#include <helpers/nrf52/T1000eBoard.h>
|
||||||
|
#include <helpers/CustomLR1110Wrapper.h>
|
||||||
|
static T1000eBoard board;
|
||||||
#else
|
#else
|
||||||
#error "need to provide a 'board' object"
|
#error "need to provide a 'board' object"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -70,6 +70,10 @@
|
|||||||
#include <helpers/nrf52/RAK4631Board.h>
|
#include <helpers/nrf52/RAK4631Board.h>
|
||||||
#include <helpers/CustomSX1262Wrapper.h>
|
#include <helpers/CustomSX1262Wrapper.h>
|
||||||
static RAK4631Board board;
|
static RAK4631Board board;
|
||||||
|
#elif defined(T1000_E)
|
||||||
|
#include <helpers/nrf52/T1000eBoard.h>
|
||||||
|
#include <helpers/CustomLR1110Wrapper.h>
|
||||||
|
static T1000eBoard board;
|
||||||
#else
|
#else
|
||||||
#error "need to provide a 'board' object"
|
#error "need to provide a 'board' object"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
17
src/helpers/CustomLR1110.h
Normal file
17
src/helpers/CustomLR1110.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <RadioLib.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
};
|
||||||
27
src/helpers/CustomLR1110Wrapper.h
Normal file
27
src/helpers/CustomLR1110Wrapper.h
Normal file
@@ -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(); }
|
||||||
|
};
|
||||||
68
src/helpers/nrf52/T1000eBoard.cpp
Normal file
68
src/helpers/nrf52/T1000eBoard.cpp
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include "T1000eBoard.h"
|
||||||
|
|
||||||
|
#include <bluefruit.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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
|
||||||
55
src/helpers/nrf52/T1000eBoard.h
Normal file
55
src/helpers/nrf52/T1000eBoard.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <MeshCore.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user