Get rid of lmic_pins

This commit is contained in:
Manuel Bl 2019-10-06 21:49:25 +02:00
parent 1e1cadf400
commit d7d4a40c4f
4 changed files with 73 additions and 67 deletions

View File

@ -216,6 +216,17 @@ public:
*/ */
bool isProvisioned(); bool isProvisioned();
/**
* @brief Sets the RSSI calibration value for LBT (Listen Before Talk).
*
* This value is added to RSSI measured prior to decision. It must include the guardband.
* Ignored in US, EU, IN and other countries where LBT is not required.
* Default to 10 dB.
*
* @param rssiCal RSSI calibration value, in dB
*/
void setRSSICal(int8_t rssiCal);
private: private:
TTNMessageCallback messageCallback; TTNMessageCallback messageCallback;

View File

@ -55,14 +55,9 @@ TheThingsNetwork::~TheThingsNetwork()
void TheThingsNetwork::configurePins(spi_host_device_t spi_host, uint8_t nss, uint8_t rxtx, uint8_t rst, uint8_t dio0, uint8_t dio1) void TheThingsNetwork::configurePins(spi_host_device_t spi_host, uint8_t nss, uint8_t rxtx, uint8_t rst, uint8_t dio0, uint8_t dio1)
{ {
lmic_pins.spi_host = spi_host; ttn_hal.configurePins(spi_host, nss, rxtx, rst, dio0, dio1);
lmic_pins.nss = nss;
lmic_pins.rxtx = rxtx;
lmic_pins.rst = rst;
lmic_pins.dio0 = dio0;
lmic_pins.dio1 = dio1;
os_init(); os_init_ex(NULL);
reset(); reset();
resultQueue = xQueueCreate(12, sizeof(int)); resultQueue = xQueueCreate(12, sizeof(int));
@ -216,19 +211,16 @@ bool TheThingsNetwork::isProvisioned()
return provisioning.haveKeys(); return provisioning.haveKeys();
} }
void TheThingsNetwork::setRSSICal(int8_t rssiCal)
{
ttn_hal.rssiCal = rssiCal;
}
// --- LMIC functions --- // --- LMIC functions ---
#if CONFIG_LOG_DEFAULT_LEVEL >= 3 #if CONFIG_LOG_DEFAULT_LEVEL >= 3
static const char *eventNames[] = { static const char *eventNames[] = { LMIC_EVENT_NAME_TABLE__INIT };
nullptr,
"EV_SCAN_TIMEOUT", "EV_BEACON_FOUND",
"EV_BEACON_MISSED", "EV_BEACON_TRACKED", "EV_JOINING",
"EV_JOINED", "EV_RFU1", "EV_JOIN_FAILED", "EV_REJOIN_FAILED",
"EV_TXCOMPLETE", "EV_LOST_TSYNC", "EV_RESET",
"EV_RXCOMPLETE", "EV_LINK_DEAD", "EV_LINK_ALIVE", "EV_SCAN_FOUND",
"EV_TXSTART"
};
#endif #endif
void onEvent (ev_t ev) { void onEvent (ev_t ev) {

View File

@ -24,7 +24,6 @@
static const char * const TAG = "ttn_hal"; static const char * const TAG = "ttn_hal";
lmic_pinmap lmic_pins;
HAL_ESP32 ttn_hal; HAL_ESP32 ttn_hal;
@ -41,13 +40,24 @@ struct HALQueueItem {
// Constructor // Constructor
HAL_ESP32::HAL_ESP32() HAL_ESP32::HAL_ESP32()
: nextTimerEvent(0x200000000) : rssiCal(10), nextTimerEvent(0x200000000)
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// I/O // I/O
void HAL_ESP32::configurePins(spi_host_device_t spi_host, uint8_t nss, uint8_t rxtx, uint8_t rst, uint8_t dio0, uint8_t dio1)
{
spiHost = spi_host;
pinNSS = (gpio_num_t)nss;
pinRxTx = (gpio_num_t)rxtx;
pinRst = (gpio_num_t)rst;
pinDIO0 = (gpio_num_t)dio0;
pinDIO1 = (gpio_num_t)dio1;
}
void IRAM_ATTR HAL_ESP32::dioIrqHandler(void *arg) void IRAM_ATTR HAL_ESP32::dioIrqHandler(void *arg)
{ {
uint64_t now; uint64_t now;
@ -61,73 +71,73 @@ void IRAM_ATTR HAL_ESP32::dioIrqHandler(void *arg)
void HAL_ESP32::ioInit() void HAL_ESP32::ioInit()
{ {
// NSS and DIO0 and DIO1 are required // pinNSS and pinDIO0 and pinDIO1 are required
ASSERT(lmic_pins.nss != LMIC_UNUSED_PIN); ASSERT(pinNSS != LMIC_UNUSED_PIN);
ASSERT(lmic_pins.dio0 != LMIC_UNUSED_PIN); ASSERT(pinDIO0 != LMIC_UNUSED_PIN);
ASSERT(lmic_pins.dio1 != LMIC_UNUSED_PIN); ASSERT(pinDIO1 != LMIC_UNUSED_PIN);
gpio_pad_select_gpio(lmic_pins.nss); gpio_pad_select_gpio(pinNSS);
gpio_set_level((gpio_num_t)lmic_pins.nss, 0); gpio_set_level(pinNSS, 0);
gpio_set_direction((gpio_num_t)lmic_pins.nss, GPIO_MODE_OUTPUT); gpio_set_direction(pinNSS, GPIO_MODE_OUTPUT);
if (lmic_pins.rxtx != LMIC_UNUSED_PIN) if (pinRxTx != LMIC_UNUSED_PIN)
{ {
gpio_pad_select_gpio(lmic_pins.rxtx); gpio_pad_select_gpio(pinRxTx);
gpio_set_level((gpio_num_t)lmic_pins.rxtx, 0); gpio_set_level(pinRxTx, 0);
gpio_set_direction((gpio_num_t)lmic_pins.rxtx, GPIO_MODE_OUTPUT); gpio_set_direction(pinRxTx, GPIO_MODE_OUTPUT);
} }
if (lmic_pins.rst != LMIC_UNUSED_PIN) if (pinRst != LMIC_UNUSED_PIN)
{ {
gpio_pad_select_gpio((gpio_num_t)lmic_pins.rst); gpio_pad_select_gpio(pinRst);
gpio_set_level((gpio_num_t)lmic_pins.rst, 0); gpio_set_level(pinRst, 0);
gpio_set_direction((gpio_num_t)lmic_pins.rst, GPIO_MODE_OUTPUT); gpio_set_direction(pinRst, GPIO_MODE_OUTPUT);
} }
dioQueue = xQueueCreate(12, sizeof(HALQueueItem)); dioQueue = xQueueCreate(12, sizeof(HALQueueItem));
ASSERT(dioQueue != NULL); ASSERT(dioQueue != NULL);
gpio_pad_select_gpio(lmic_pins.dio0); gpio_pad_select_gpio(pinDIO0);
gpio_set_direction((gpio_num_t)lmic_pins.dio0, GPIO_MODE_INPUT); gpio_set_direction(pinDIO0, GPIO_MODE_INPUT);
gpio_set_intr_type((gpio_num_t)lmic_pins.dio0, GPIO_INTR_POSEDGE); gpio_set_intr_type(pinDIO0, GPIO_INTR_POSEDGE);
gpio_isr_handler_add((gpio_num_t)lmic_pins.dio0, dioIrqHandler, (void *)0); gpio_isr_handler_add(pinDIO0, dioIrqHandler, (void *)0);
gpio_pad_select_gpio((gpio_num_t)lmic_pins.dio1); gpio_pad_select_gpio(pinDIO1);
gpio_set_direction((gpio_num_t)lmic_pins.dio1, GPIO_MODE_INPUT); gpio_set_direction(pinDIO1, GPIO_MODE_INPUT);
gpio_set_intr_type((gpio_num_t)lmic_pins.dio1, GPIO_INTR_POSEDGE); gpio_set_intr_type(pinDIO1, GPIO_INTR_POSEDGE);
gpio_isr_handler_add((gpio_num_t)lmic_pins.dio1, dioIrqHandler, (void *)1); gpio_isr_handler_add(pinDIO1, dioIrqHandler, (void *)1);
ESP_LOGI(TAG, "IO initialized"); ESP_LOGI(TAG, "IO initialized");
} }
void hal_pin_rxtx(u1_t val) void hal_pin_rxtx(u1_t val)
{ {
if (lmic_pins.rxtx == LMIC_UNUSED_PIN) if (ttn_hal.pinRxTx == LMIC_UNUSED_PIN)
return; return;
gpio_set_level((gpio_num_t)lmic_pins.rxtx, val); gpio_set_level(ttn_hal.pinRxTx, val);
} }
void hal_pin_rst(u1_t val) void hal_pin_rst(u1_t val)
{ {
if (lmic_pins.rst == LMIC_UNUSED_PIN) if (ttn_hal.pinRst == LMIC_UNUSED_PIN)
return; return;
if (val == 0 || val == 1) if (val == 0 || val == 1)
{ // drive pin { // drive pin
gpio_set_level((gpio_num_t)lmic_pins.rst, val); gpio_set_level(ttn_hal.pinRst, val);
gpio_set_direction((gpio_num_t)lmic_pins.rst, GPIO_MODE_OUTPUT); gpio_set_direction(ttn_hal.pinRst, GPIO_MODE_OUTPUT);
} }
else else
{ // keep pin floating { // keep pin floating
gpio_set_level((gpio_num_t)lmic_pins.rst, val); gpio_set_level(ttn_hal.pinRst, val);
gpio_set_direction((gpio_num_t)lmic_pins.rst, GPIO_MODE_INPUT); gpio_set_direction(ttn_hal.pinRst, GPIO_MODE_INPUT);
} }
} }
s1_t hal_getRssiCal (void) s1_t hal_getRssiCal (void)
{ {
return lmic_pins.rssi_cal; return ttn_hal.rssiCal;
} }
ostime_t hal_setModuleActive (bit_t val) ostime_t hal_setModuleActive (bit_t val)
@ -153,11 +163,11 @@ void HAL_ESP32::spiInit()
spiConfig.clock_speed_hz = CONFIG_TTN_SPI_FREQ; spiConfig.clock_speed_hz = CONFIG_TTN_SPI_FREQ;
spiConfig.command_bits = 0; spiConfig.command_bits = 0;
spiConfig.address_bits = 8; spiConfig.address_bits = 8;
spiConfig.spics_io_num = lmic_pins.nss; spiConfig.spics_io_num = pinNSS;
spiConfig.queue_size = 1; spiConfig.queue_size = 1;
spiConfig.cs_ena_posttrans = 2; spiConfig.cs_ena_posttrans = 2;
esp_err_t ret = spi_bus_add_device(lmic_pins.spi_host, &spiConfig, &spiHandle); esp_err_t ret = spi_bus_add_device(spiHost, &spiConfig, &spiHandle);
ESP_ERROR_CHECK(ret); ESP_ERROR_CHECK(ret);
ESP_LOGI(TAG, "SPI initialized"); ESP_LOGI(TAG, "SPI initialized");

View File

@ -18,22 +18,6 @@
#include <freertos/queue.h> #include <freertos/queue.h>
#include "driver/spi_master.h" #include "driver/spi_master.h"
extern "C" {
typedef struct lmic_pinmap {
spi_host_device_t spi_host;
uint8_t nss;
uint8_t rxtx;
uint8_t rst;
uint8_t dio0;
uint8_t dio1;
int8_t rssi_cal; // cal in dB -- added to RSSI measured prior to decision. Must include noise guardband!
} lmic_pinmap;
extern lmic_pinmap lmic_pins;
}
enum HAL_Event { enum HAL_Event {
DIO0 = 0, DIO0 = 0,
@ -57,6 +41,7 @@ class HAL_ESP32
public: public:
HAL_ESP32(); HAL_ESP32();
void configurePins(spi_host_device_t spi_host, uint8_t nss, uint8_t rxtx, uint8_t rst, uint8_t dio0, uint8_t dio1);
void init(); void init();
void startBackgroundTask(); void startBackgroundTask();
void wakeUp(); void wakeUp();
@ -69,6 +54,14 @@ public:
void sleep(); void sleep();
void waitUntil(uint32_t time); void waitUntil(uint32_t time);
spi_host_device_t spiHost;
gpio_num_t pinNSS;
gpio_num_t pinRxTx;
gpio_num_t pinRst;
gpio_num_t pinDIO0;
gpio_num_t pinDIO1;
int8_t rssiCal;
private: private:
static void backgroundTask(void* pvParameter); static void backgroundTask(void* pvParameter);
static void dioIrqHandler(void* arg); static void dioIrqHandler(void* arg);