mirror of
https://github.com/manuelbl/ttn-esp32.git
synced 2025-06-15 12:24:27 +02:00
Block member functions until operation is complete
This commit is contained in:
parent
989aad94d5
commit
c1760fed41
@ -34,9 +34,7 @@ static uint8_t msgData[] = "Hello, world";
|
|||||||
|
|
||||||
void send_messages(void* pvParameter)
|
void send_messages(void* pvParameter)
|
||||||
{
|
{
|
||||||
vTaskDelay(TX_INTERVAL * 1000 / portTICK_PERIOD_MS);
|
while (1) {
|
||||||
|
|
||||||
while(1) {
|
|
||||||
printf("Sending message...\n");
|
printf("Sending message...\n");
|
||||||
ttn_response_t res = ttn.sendBytes(msgData, sizeof(msgData) - 1);
|
ttn_response_t res = ttn.sendBytes(msgData, sizeof(msgData) - 1);
|
||||||
if (res == TTN_SUCCESSFUL_TRANSMISSION)
|
if (res == TTN_SUCCESSFUL_TRANSMISSION)
|
||||||
@ -68,7 +66,9 @@ extern "C" void app_main(void)
|
|||||||
|
|
||||||
ttn.provision(appEui, appKey, devEui);
|
ttn.provision(appEui, appKey, devEui);
|
||||||
|
|
||||||
|
printf("Joining...\n");
|
||||||
ttn.join();
|
ttn.join();
|
||||||
|
printf("Joined.\n");
|
||||||
|
|
||||||
xTaskCreate(send_messages, "send_messages", 1024 * 4, (void* )0, 3, NULL);
|
xTaskCreate(send_messages, "send_messages", 1024 * 4, (void* )0, 3, NULL);
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
* This the hardware abstraction layer to run LMIC in on ESP32 using ESP-iDF.
|
* This the hardware abstraction layer to run LMIC in on ESP32 using ESP-iDF.
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "esp_event.h"
|
||||||
#include "TheThingsNetwork.h"
|
#include "TheThingsNetwork.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "oslmic.h"
|
#include "oslmic.h"
|
||||||
@ -22,6 +24,8 @@ static TheThingsNetwork* ttnInstance;
|
|||||||
static uint8_t appEui[8];
|
static uint8_t appEui[8];
|
||||||
static uint8_t appKey[16];
|
static uint8_t appKey[16];
|
||||||
static uint8_t devEui[8];
|
static uint8_t devEui[8];
|
||||||
|
static QueueHandle_t result_queue;
|
||||||
|
|
||||||
|
|
||||||
static bool hexStringToBin(const char *hex, uint8_t *buf, int len);
|
static bool hexStringToBin(const char *hex, uint8_t *buf, int len);
|
||||||
static int hexTupleToByte(const char *hex);
|
static int hexTupleToByte(const char *hex);
|
||||||
@ -31,10 +35,12 @@ static void swapByteOrder(uint8_t* buf, int len);
|
|||||||
|
|
||||||
TheThingsNetwork::TheThingsNetwork(uint8_t sf, uint8_t fsb)
|
TheThingsNetwork::TheThingsNetwork(uint8_t sf, uint8_t fsb)
|
||||||
{
|
{
|
||||||
|
ASSERT(ttnInstance == NULL);
|
||||||
ttnInstance = this;
|
ttnInstance = this;
|
||||||
spreadingFactor = sf;
|
spreadingFactor = sf;
|
||||||
frequencySubband = fsb;
|
frequencySubband = fsb;
|
||||||
hal_initCriticalSection();
|
hal_initCriticalSection();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TheThingsNetwork::~TheThingsNetwork()
|
TheThingsNetwork::~TheThingsNetwork()
|
||||||
@ -54,6 +60,8 @@ void TheThingsNetwork::configurePins(spi_host_device_t spi_host, uint8_t nss, ui
|
|||||||
os_init();
|
os_init();
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
|
result_queue = xQueueCreate(12, sizeof(int));
|
||||||
|
assert(result_queue != NULL);
|
||||||
hal_startBgTask();
|
hal_startBgTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +118,16 @@ bool TheThingsNetwork::join(int8_t retries, uint32_t retryDelay)
|
|||||||
LMIC_startJoining();
|
LMIC_startJoining();
|
||||||
hal_wakeUp();
|
hal_wakeUp();
|
||||||
hal_leaveCriticalSection();
|
hal_leaveCriticalSection();
|
||||||
return true;
|
|
||||||
|
int result = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
xQueueReceive(result_queue, &result, portMAX_DELAY);
|
||||||
|
if (result != EV_JOINING)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result == EV_JOINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ttn_response_t TheThingsNetwork::sendBytes(const uint8_t *payload, size_t length, port_t port, bool confirm, uint8_t sf)
|
ttn_response_t TheThingsNetwork::sendBytes(const uint8_t *payload, size_t length, port_t port, bool confirm, uint8_t sf)
|
||||||
@ -125,7 +142,10 @@ ttn_response_t TheThingsNetwork::sendBytes(const uint8_t *payload, size_t length
|
|||||||
LMIC_setTxData2(port, (xref2u1_t)payload, length, confirm);
|
LMIC_setTxData2(port, (xref2u1_t)payload, length, confirm);
|
||||||
hal_wakeUp();
|
hal_wakeUp();
|
||||||
hal_leaveCriticalSection();
|
hal_leaveCriticalSection();
|
||||||
return TTN_SUCCESSFUL_TRANSMISSION;
|
|
||||||
|
int result = 0;
|
||||||
|
xQueueReceive(result_queue, &result, portMAX_DELAY);
|
||||||
|
return result == EV_TXCOMPLETE ? TTN_SUCCESSFUL_TRANSMISSION : TTN_ERROR_SEND_COMMAND_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -167,21 +187,18 @@ void os_getDevKey (u1_t* buf)
|
|||||||
|
|
||||||
void onEvent (ev_t ev) {
|
void onEvent (ev_t ev) {
|
||||||
#if CONFIG_LOG_DEFAULT_LEVEL >= 3
|
#if CONFIG_LOG_DEFAULT_LEVEL >= 3
|
||||||
ESP_LOGI(TAG, "%ld: event %s", os_getTime(), eventNames[ev]);
|
ESP_LOGI(TAG, "event %s", eventNames[ev]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ev == EV_JOINED)
|
if (ev == EV_TXCOMPLETE) {
|
||||||
{
|
if (LMIC.txrxFlags & TXRX_ACK)
|
||||||
// Disable link check validation (automatically enabled
|
ESP_LOGI(TAG, "Received ack\n");
|
||||||
// during join, but not supported by TTN at this time).
|
if (LMIC.dataLen)
|
||||||
LMIC_setLinkCheckMode(0);
|
ESP_LOGI(TAG, "Received %d bytes of payload\n", LMIC.dataLen);
|
||||||
} else if (ev == EV_TXCOMPLETE) {
|
|
||||||
if (LMIC.txrxFlags & TXRX_ACK)
|
|
||||||
printf("Received ack\n");
|
|
||||||
if (LMIC.dataLen) {
|
|
||||||
printf("Received %d bytes of payload\n", LMIC.dataLen);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int result = ev;
|
||||||
|
xQueueSend(result_queue, &result, 100 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
10
src/radio.c
10
src/radio.c
@ -500,7 +500,15 @@ static void txlora () {
|
|||||||
// select LoRa modem (from sleep mode)
|
// select LoRa modem (from sleep mode)
|
||||||
//writeReg(RegOpMode, OPMODE_LORA);
|
//writeReg(RegOpMode, OPMODE_LORA);
|
||||||
opmodeLora();
|
opmodeLora();
|
||||||
ASSERT((readReg(RegOpMode) & OPMODE_LORA) != 0);
|
// can take a moment to change; so try five times
|
||||||
|
u1_t reg;
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
reg = readReg(RegOpMode);
|
||||||
|
if ((reg & OPMODE_LORA) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ASSERT((reg & OPMODE_LORA) != 0);
|
||||||
|
|
||||||
// enter standby mode (required for FIFO loading))
|
// enter standby mode (required for FIFO loading))
|
||||||
opmode(OPMODE_STANDBY);
|
opmode(OPMODE_STANDBY);
|
||||||
|
Loading…
Reference in New Issue
Block a user