From 6f15b96a79a9f0041f3c953c92afeae4b17f4138 Mon Sep 17 00:00:00 2001 From: Alex Mikhalev Date: Sun, 30 Dec 2018 19:23:52 -0700 Subject: [PATCH] add error checking for tx --- components/sx127x_driver/sx127x_driver.c | 44 +++++++++++++++--------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/components/sx127x_driver/sx127x_driver.c b/components/sx127x_driver/sx127x_driver.c index 57890b7..6ce49cf 100644 --- a/components/sx127x_driver/sx127x_driver.c +++ b/components/sx127x_driver/sx127x_driver.c @@ -137,10 +137,17 @@ void sx127x_isr(void *arg) { } } +#define _TX_CHECK(_ret) \ + ret = (_ret); \ + if (ret != ESP_OK) { \ + goto error; \ + } + void sx127x_do_tx(sx127x_t *handle, sx127x_packet_t *packet) { - uint8_t op_mode, irq_flags, config_2; + esp_err_t ret; + uint8_t op_mode, irq_flags, config_2; while (handle->task_state == SX127X_TASK_RUNNING) { - sx127x_read_register(handle, REG_OP_MODE, &op_mode); + _TX_CHECK(sx127x_read_register(handle, REG_OP_MODE, &op_mode)); uint8_t mode = op_mode & SX127X_MODE; if (mode != SX127X_MODE_TX && mode != SX127X_MODE_FS_TX) { break; @@ -148,39 +155,44 @@ void sx127x_do_tx(sx127x_t *handle, sx127x_packet_t *packet) { vTaskDelay(1); // wait for finish transmitting } - sx127x_standby(handle); + _TX_CHECK(sx127x_standby(handle)); - sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags); + _TX_CHECK(sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags)); if (irq_flags & IRQ_TX_DONE_MASK) { // clear tx done bit - sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK); + _TX_CHECK(sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK)); } - sx127x_read_register(handle, REG_MODEM_CONFIG_2, &config_2); + _TX_CHECK(sx127x_read_register(handle, REG_MODEM_CONFIG_2, &config_2)); config_2 &= ~0x01; // set explicit header mode TODO: implicit header? - sx127x_write_register(handle, REG_MODEM_CONFIG_2, config_2); + _TX_CHECK(sx127x_write_register(handle, REG_MODEM_CONFIG_2, config_2)); - sx127x_write_register(handle, REG_FIFO_ADDR_PTR, 0); - sx127x_write_register(handle, REG_PAYLOAD_LENGTH, 0); + _TX_CHECK(sx127x_write_register(handle, REG_FIFO_ADDR_PTR, 0)); + _TX_CHECK(sx127x_write_register(handle, REG_PAYLOAD_LENGTH, 0)); - sx127x_write_fifo(handle, packet->data, packet->data_len); - sx127x_write_register(handle, REG_PAYLOAD_LENGTH, packet->data_len); + _TX_CHECK(sx127x_write_fifo(handle, packet->data, packet->data_len)); + _TX_CHECK(sx127x_write_register(handle, REG_PAYLOAD_LENGTH, packet->data_len)); - sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_FS_TX); + _TX_CHECK(sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_FS_TX)); vTaskDelay(pdMS_TO_TICKS(1)); - sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_TX); + _TX_CHECK(sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_TX)); // wait for transmission to finish while (true) { - sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags); + _TX_CHECK(sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags)); if (irq_flags & IRQ_TX_DONE_MASK) { // if the transmission is done break; } vTaskDelay(1); } // clear tx done bit - sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK); + _TX_CHECK(sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK)); +error: + if (ret != ESP_OK) { + const char *error_name = esp_err_to_name(ret); + ESP_LOGE(SX127X_TAG, "tx error: %s (%d)", error_name, ret); + } // go back to rx mode sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_RX_CONT); } @@ -222,7 +234,7 @@ esp_err_t sx127x_start(sx127x_t *handle) { handle->intr_semaphore = xSemaphoreCreateBinary(); // handle->recv_packet_queue = xQueueCreate(8, 10); - handle->tx_packet_queue = xQueueCreate(4, sizeof(sx127x_packet_t)); + handle->tx_packet_queue = xQueueCreate(8, sizeof(sx127x_packet_t)); handle->task_state = SX127X_TASK_RUNNING; BaseType_t pdRet =