diff --git a/include/TheThingsNetwork.h b/include/TheThingsNetwork.h index 59b48f1..f579244 100644 --- a/include/TheThingsNetwork.h +++ b/include/TheThingsNetwork.h @@ -216,6 +216,17 @@ public: */ 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: TTNMessageCallback messageCallback; diff --git a/src/TheThingsNetwork.cpp b/src/TheThingsNetwork.cpp index 9924168..b95fc4f 100644 --- a/src/TheThingsNetwork.cpp +++ b/src/TheThingsNetwork.cpp @@ -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) { - lmic_pins.spi_host = spi_host; - lmic_pins.nss = nss; - lmic_pins.rxtx = rxtx; - lmic_pins.rst = rst; - lmic_pins.dio0 = dio0; - lmic_pins.dio1 = dio1; + ttn_hal.configurePins(spi_host, nss, rxtx, rst, dio0, dio1); - os_init(); + os_init_ex(NULL); reset(); resultQueue = xQueueCreate(12, sizeof(int)); @@ -216,19 +211,16 @@ bool TheThingsNetwork::isProvisioned() return provisioning.haveKeys(); } +void TheThingsNetwork::setRSSICal(int8_t rssiCal) +{ + ttn_hal.rssiCal = rssiCal; +} + // --- LMIC functions --- #if CONFIG_LOG_DEFAULT_LEVEL >= 3 -static const char *eventNames[] = { - 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" -}; +static const char *eventNames[] = { LMIC_EVENT_NAME_TABLE__INIT }; #endif void onEvent (ev_t ev) { diff --git a/src/hal/hal_esp32.cpp b/src/hal/hal_esp32.cpp index a29fa3b..f449773 100755 --- a/src/hal/hal_esp32.cpp +++ b/src/hal/hal_esp32.cpp @@ -24,7 +24,6 @@ static const char * const TAG = "ttn_hal"; -lmic_pinmap lmic_pins; HAL_ESP32 ttn_hal; @@ -41,13 +40,24 @@ struct HALQueueItem { // Constructor HAL_ESP32::HAL_ESP32() - : nextTimerEvent(0x200000000) + : rssiCal(10), nextTimerEvent(0x200000000) { } // ----------------------------------------------------------------------------- // 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) { uint64_t now; @@ -61,73 +71,73 @@ void IRAM_ATTR HAL_ESP32::dioIrqHandler(void *arg) void HAL_ESP32::ioInit() { - // NSS and DIO0 and DIO1 are required - ASSERT(lmic_pins.nss != LMIC_UNUSED_PIN); - ASSERT(lmic_pins.dio0 != LMIC_UNUSED_PIN); - ASSERT(lmic_pins.dio1 != LMIC_UNUSED_PIN); + // pinNSS and pinDIO0 and pinDIO1 are required + ASSERT(pinNSS != LMIC_UNUSED_PIN); + ASSERT(pinDIO0 != LMIC_UNUSED_PIN); + ASSERT(pinDIO1 != LMIC_UNUSED_PIN); - gpio_pad_select_gpio(lmic_pins.nss); - gpio_set_level((gpio_num_t)lmic_pins.nss, 0); - gpio_set_direction((gpio_num_t)lmic_pins.nss, GPIO_MODE_OUTPUT); + gpio_pad_select_gpio(pinNSS); + gpio_set_level(pinNSS, 0); + 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_set_level((gpio_num_t)lmic_pins.rxtx, 0); - gpio_set_direction((gpio_num_t)lmic_pins.rxtx, GPIO_MODE_OUTPUT); + gpio_pad_select_gpio(pinRxTx); + gpio_set_level(pinRxTx, 0); + 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_set_level((gpio_num_t)lmic_pins.rst, 0); - gpio_set_direction((gpio_num_t)lmic_pins.rst, GPIO_MODE_OUTPUT); + gpio_pad_select_gpio(pinRst); + gpio_set_level(pinRst, 0); + gpio_set_direction(pinRst, GPIO_MODE_OUTPUT); } dioQueue = xQueueCreate(12, sizeof(HALQueueItem)); ASSERT(dioQueue != NULL); - gpio_pad_select_gpio(lmic_pins.dio0); - gpio_set_direction((gpio_num_t)lmic_pins.dio0, GPIO_MODE_INPUT); - gpio_set_intr_type((gpio_num_t)lmic_pins.dio0, GPIO_INTR_POSEDGE); - gpio_isr_handler_add((gpio_num_t)lmic_pins.dio0, dioIrqHandler, (void *)0); + gpio_pad_select_gpio(pinDIO0); + gpio_set_direction(pinDIO0, GPIO_MODE_INPUT); + gpio_set_intr_type(pinDIO0, GPIO_INTR_POSEDGE); + gpio_isr_handler_add(pinDIO0, dioIrqHandler, (void *)0); - gpio_pad_select_gpio((gpio_num_t)lmic_pins.dio1); - gpio_set_direction((gpio_num_t)lmic_pins.dio1, GPIO_MODE_INPUT); - gpio_set_intr_type((gpio_num_t)lmic_pins.dio1, GPIO_INTR_POSEDGE); - gpio_isr_handler_add((gpio_num_t)lmic_pins.dio1, dioIrqHandler, (void *)1); + gpio_pad_select_gpio(pinDIO1); + gpio_set_direction(pinDIO1, GPIO_MODE_INPUT); + gpio_set_intr_type(pinDIO1, GPIO_INTR_POSEDGE); + gpio_isr_handler_add(pinDIO1, dioIrqHandler, (void *)1); ESP_LOGI(TAG, "IO initialized"); } void hal_pin_rxtx(u1_t val) { - if (lmic_pins.rxtx == LMIC_UNUSED_PIN) + if (ttn_hal.pinRxTx == LMIC_UNUSED_PIN) 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) { - if (lmic_pins.rst == LMIC_UNUSED_PIN) + if (ttn_hal.pinRst == LMIC_UNUSED_PIN) return; if (val == 0 || val == 1) { // drive pin - gpio_set_level((gpio_num_t)lmic_pins.rst, val); - gpio_set_direction((gpio_num_t)lmic_pins.rst, GPIO_MODE_OUTPUT); + gpio_set_level(ttn_hal.pinRst, val); + gpio_set_direction(ttn_hal.pinRst, GPIO_MODE_OUTPUT); } else { // keep pin floating - gpio_set_level((gpio_num_t)lmic_pins.rst, val); - gpio_set_direction((gpio_num_t)lmic_pins.rst, GPIO_MODE_INPUT); + gpio_set_level(ttn_hal.pinRst, val); + gpio_set_direction(ttn_hal.pinRst, GPIO_MODE_INPUT); } } s1_t hal_getRssiCal (void) { - return lmic_pins.rssi_cal; + return ttn_hal.rssiCal; } ostime_t hal_setModuleActive (bit_t val) @@ -153,11 +163,11 @@ void HAL_ESP32::spiInit() spiConfig.clock_speed_hz = CONFIG_TTN_SPI_FREQ; spiConfig.command_bits = 0; spiConfig.address_bits = 8; - spiConfig.spics_io_num = lmic_pins.nss; + spiConfig.spics_io_num = pinNSS; spiConfig.queue_size = 1; 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_LOGI(TAG, "SPI initialized"); diff --git a/src/hal/hal_esp32.h b/src/hal/hal_esp32.h index 5a7a3c6..42ddd83 100644 --- a/src/hal/hal_esp32.h +++ b/src/hal/hal_esp32.h @@ -18,22 +18,6 @@ #include #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 { DIO0 = 0, @@ -57,6 +41,7 @@ class HAL_ESP32 public: 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 startBackgroundTask(); void wakeUp(); @@ -69,6 +54,14 @@ public: void sleep(); 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: static void backgroundTask(void* pvParameter); static void dioIrqHandler(void* arg);