diff --git a/include/esp32-lora.h b/include/esp32-lora.h index 59a9d42..13260ab 100644 --- a/include/esp32-lora.h +++ b/include/esp32-lora.h @@ -86,6 +86,7 @@ const long long frequencies[3]; const long bandwidths[9]; typedef void (*receiveCallback)(uint8_t size); +typedef void (*txdoneCallback)(); typedef struct { EventGroupHandle_t events; @@ -108,6 +109,7 @@ typedef struct lora32_cfg_t { bool implicitHeader; receiveCallback receive; + txdoneCallback tx_done; spi_device_handle_t spi; lora32_handle_t handle; diff --git a/main/esp32-lora.c b/main/esp32-lora.c index 9f55836..ff50796 100644 --- a/main/esp32-lora.c +++ b/main/esp32-lora.c @@ -133,6 +133,8 @@ void lora32_enable_tx(lora32_cfg_t *lora) { } void lora32_send(lora32_cfg_t *lora, uint8_t *data, uint8_t len) { + lora32_write_reg(lora, REG_DIO_MAPPING_1, DIO0_MODE_TXDONE); + lora32_enable_tx(lora); uint8_t i = 0; @@ -143,18 +145,7 @@ void lora32_send(lora32_cfg_t *lora, uint8_t *data, uint8_t len) { lora32_write_reg(lora, REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX); - lora32_write_reg(lora, REG_DIO_MAPPING_1, DIO0_MODE_TXDONE); - ESP_LOGD(TAG, "lora32_send waiting for TX to finish"); - - // can be made async by waiting for DIO0 and checking for IRQ_TX_DONE_MASK - while((lora32_read_reg(lora, REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) == 0) { - vTaskDelay(1 / portTICK_PERIOD_MS); - } - - ESP_LOGD(TAG, "lora32_send TX done"); - - lora32_write_reg(lora, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK); } void lora32_set_frequency(lora32_cfg_t *lora, long frequency) { @@ -294,9 +285,14 @@ static void IRAM_ATTR lora32_dio0_task(void *arg) { lora32_write_reg(lora, REG_IRQ_FLAGS, irqs); // is this the right check? seems to work but looks off - if((irqs & IRQ_RX_DONE_MASK) == IRQ_RX_DONE_MASK) { + // TODO handle header validation + if((irqs & IRQ_RX_DONE) == IRQ_RX_DONE) { lora32_handle_receive(lora); } + + if((irqs & IRQ_TX_DONE) == IRQ_TX_DONE) { + if(lora->tx_done != NULL) lora->tx_done(); + } } }