You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.5 KiB
92 lines
3.5 KiB
#include <esp_log.h> |
|
#include <freertos/FreeRTOS.h> |
|
#include <freertos/queue.h> |
|
#include <freertos/semphr.h> |
|
#include <freertos/task.h> |
|
#include <stdatomic.h> |
|
|
|
#include "sdkconfig.h" |
|
|
|
#define SX127X_TASK_STACK_SIZE CONFIG_SX127X_TASK_STACK_SIZE |
|
#define SX127X_TASK_PRIORITY CONFIG_SX127X_TASK_PRIORITY |
|
#define SX127X_RX_QUEUE_LEN CONFIG_SX127X_RX_QUEUE_LEN |
|
#define SX127X_TX_QUEUE_LEN CONFIG_SX127X_TX_QUEUE_LEN |
|
#define SX127X_SPI_QUEUE_SIZE CONFIG_SX127X_SPI_QUEUE_SIZE |
|
#define SX127X_SPI_DMA_CHAN CONFIG_SX127X_SPI_DMA_CHAN |
|
#define SX127X_SPI_CLOCK_HZ CONFIG_SX127X_SPI_CLOCK_HZ |
|
|
|
#define SX127X_MAX_TRANSFER (256) |
|
#define SX127X_RESET_DELAY (pdMS_TO_TICKS(15)) |
|
#define SX127X_MUTEX_TIMOUT (pdMS_TO_TICKS(100)) |
|
|
|
|
|
#ifdef NODEBUG |
|
#define SX127X_CHECK(check, str, ret_val, ...) \ |
|
if (!(check)) { \ |
|
ESP_LOGE(SX127X_TAG, str, ##__VA_ARGS__); \ |
|
return (ret_val); \ |
|
} |
|
#define SX127X_ERROR_CHECK(ret) \ |
|
{ \ |
|
esp_err_t _error_code = (ret); \ |
|
if (_error_code != ESP_OK) { \ |
|
return _error_code; \ |
|
} \ |
|
} |
|
#define SX127X_ERROR_CHECK2(ret, fun) SX127X_CHECK(ret) |
|
#else |
|
#define SX127X_CHECK(check, str, ret_val, ...) \ |
|
if (!(check)) { \ |
|
ESP_LOGE(SX127X_TAG, "%s:%d: check %s failed: " str, __FUNCTION__, \ |
|
__LINE__, #check, ##__VA_ARGS__); \ |
|
return (ret_val); \ |
|
} |
|
#define SX127X_ERROR_CHECK(ret) \ |
|
{ \ |
|
esp_err_t _error_code = (ret); \ |
|
if (_error_code != ESP_OK) { \ |
|
const char *_error_name = esp_err_to_name(_error_code); \ |
|
ESP_LOGE(SX127X_TAG, "%s:%d: %s (%d)", __FUNCTION__, __LINE__, \ |
|
_error_name, _error_code); \ |
|
return _error_code; \ |
|
} \ |
|
} |
|
#define SX127X_ERROR_CHECK2(ret, fun) \ |
|
{ \ |
|
esp_err_t _error_code = (ret); \ |
|
if (_error_code != ESP_OK) { \ |
|
const char *_error_name = esp_err_to_name(_error_code); \ |
|
ESP_LOGE(SX127X_TAG, "%s:%d: %s failed: %s (%d)", __FUNCTION__, \ |
|
__LINE__, #fun, _error_name, _error_code); \ |
|
return _error_code; \ |
|
} \ |
|
} |
|
#endif |
|
|
|
typedef enum sx127x_task_state { |
|
SX127X_TASK_STOPPED = 0, |
|
SX127X_TASK_RUNNING = 1, |
|
SX127X_TASK_STOPPING = 2, |
|
} sx127x_task_state_t; |
|
|
|
typedef struct sx127x_packet { |
|
uint8_t * data; |
|
size_t data_len; |
|
} sx127x_packet_t; |
|
|
|
typedef struct sx127x { |
|
sx127x_config_t config; |
|
spi_device_handle_t device_handle; |
|
SemaphoreHandle_t spi_mutex; |
|
TaskHandle_t task_handle; |
|
_Atomic(sx127x_task_state_t) task_state; |
|
// binary semaphore which is given when an interrupt is received from the |
|
// radio |
|
SemaphoreHandle_t intr_semaphore; |
|
// queue of packets received from the radio |
|
QueueHandle_t rx_packet_queue; |
|
// queue of packets to send to the radio |
|
QueueHandle_t tx_packet_queue; |
|
} sx127x_t; |
|
|
|
const char *SX127X_TAG;
|
|
|