ESP32 Transceiver IEEE 802.15.4 Library
Loading...
Searching...
No Matches
ESP32TransceiverIEEE802_15_4.h
Go to the documentation of this file.
1#pragma once
2// make sure that logging works in Arduino environment
3#ifdef ARDUINO
4#include "Arduino.h"
5#endif
6
7#include <esp_ieee802154.h>
8#include <esp_log.h>
9#include <stdint.h>
10
11#include "Frame.h" // From shoderico/ieee802154_frame
12#include "esp_err.h"
13#include "esp_ieee802154.h"
14#include "freertos/FreeRTOS.h"
15#include "freertos/task.h"
16#include "nvs_flash.h"
17
18namespace ieee802154 {
19
20// forward declaration
21class ESP32TransceiverIEEE802_15_4;
22extern ESP32TransceiverIEEE802_15_4* pt_transceiver;
23
27enum class channel_t : uint8_t {
28 UNDEFINED = 0,
29 CHANNEL_11 = 11,
30 CHANNEL_12 = 12,
31 CHANNEL_13 = 13,
32 CHANNEL_14 = 14,
33 CHANNEL_15 = 15,
34 CHANNEL_16 = 16,
35 CHANNEL_17 = 17,
36 CHANNEL_18 = 18,
37 CHANNEL_19 = 19,
38 CHANNEL_20 = 20,
39 CHANNEL_21 = 21,
40 CHANNEL_22 = 22,
41 CHANNEL_23 = 23,
42 CHANNEL_24 = 24,
43 CHANNEL_25 = 25,
44 CHANNEL_26 = 26
45};
46
55 Frame& frame, esp_ieee802154_frame_info_t& frame_info, void* user_data);
56
67 const uint8_t* frame, const uint8_t* ack,
68 esp_ieee802154_frame_info_t* ack_frame_info, void* user_data);
69
78 const uint8_t* frame, esp_ieee802154_tx_error_t error, void* user_data);
79
85typedef void (*ieee802154_transceiver_sfd_callback_t)(void* user_data);
86
93typedef void (*ieee802154_transceiver_sfd_tx_callback_t)(uint8_t* frame,
94 void* user_data);
96inline Address BROADCAST_ADDRESS((uint8_t[2]){0xFF, 0xFF});
97
110 // Friend declarations for global callback functions
111 friend void receive_packet_task(void*);
112 friend void ::esp_ieee802154_receive_done(
113 uint8_t* frame, esp_ieee802154_frame_info_t* frame_info);
114 friend void ::esp_ieee802154_transmit_done(
115 const uint8_t* frame, const uint8_t* ack,
116 esp_ieee802154_frame_info_t* ack_frame_info);
117 friend void ::esp_ieee802154_transmit_failed(const uint8_t* frame,
118 esp_ieee802154_tx_error_t error);
119 friend void ::esp_ieee802154_receive_sfd_done(void);
120 friend void ::esp_ieee802154_transmit_sfd_done(uint8_t* frame);
121
122 public:
130 Address localAddress) {
131 this->channel = channel;
132 this->panID = panID;
133 this->local_address = localAddress;
134 pt_transceiver = this;
135 }
136
142 bool begin();
143
153 return begin();
154 }
155
161 bool end(void);
162
171 void* user_data);
172
182 void* user_data);
183
193 void* user_data);
194
204 void* user_data);
205
214 void* user_data);
222 bool send(uint8_t* data, size_t len);
223
234 bool send(Frame& frame);
235
244
249 channel_t getChannel() const { return channel; }
250
255 esp_ieee802154_pending_mode_t getPendingMode() {
256 return ::esp_ieee802154_get_pending_mode();
257 }
258
263 int8_t getTxPower() { return ::esp_ieee802154_get_txpower(); }
264
270 bool setTxPower(int power);
271
276 bool isCoordinatorActive() const { return is_coordinator; }
277
284 bool setCoordinatorActive(bool coordinator);
285
291
298 bool setPromiscuousModeActive(bool promiscuous);
299
304 bool isRxWhenIdleActive() const { return is_rx_when_idle; }
305
311 bool setRxWhenIdleActive(bool rx_when_idle);
312
317 void setDestinationAddress(const Address& address) {
318 destination_address = address;
319 }
320
325
333 }
334
342
343 /***
344 * @brief Get a reference to the actual frame object that is used for
345 * sending..
346 * @return Reference to the current Frame object.
347 */
348 Frame& getFrame() { return frame; }
349
354 void setReceiveTask(void (*task)(void* pvParameters)) {
355 receive_packet_task = task;
356 }
357
358 /***
359 * @brief Defines the receive buffer size for incoming frames.
360 * @param size The size of the receive buffer in bytes.
361 * @note This method must be called before begin() to take effect!
362 */
363 void setReceiveBufferSize(int size);
368 StreamBufferHandle_t getMessageBuffer() const { return message_buffer; }
369
377 void incrementSequenceNumber(int n = 1) {
379 // Ensure the sequence number wraps around at 255
381 }
382
388 void setAutoIncrementSequenceNumber(bool auto_increment) {
389 auto_increment_sequence_number = auto_increment;
390 }
391
398 void setAckTimeoutUs(uint32_t timeout_us) {
399 ack_timeout_us = timeout_us / 16 * 16; // Round to nearest multiple of 16
400 }
401
406 uint32_t getAckTimeoutUs() const { return ack_timeout_us; }
407
413 void setCCAActive(bool cca_enabled) { this->cca_enabled = cca_enabled; }
414
419 bool isCCAActive() const { return cca_enabled; }
420
421 protected:
423 bool is_coordinator = false;
424 bool is_rx_when_idle = true;
425 bool is_active = false;
426 // current frame
429 int16_t panID; // Personal Area Network Identifier
430 Address local_address; // Local address for filtering (0, 2, or 8 bytes)
434 StreamBufferHandle_t message_buffer = nullptr;
435 TaskHandle_t rx_task_handle = nullptr;
436 bool radio_enabled = false;
438 void* rx_callback_user_data_ = nullptr;
444 void* sfd_callback_user_data_ = nullptr;
447 static void default_receive_packet_task(void* pvParameters);
450 uint32_t ack_timeout_us = (2016 * 16);
452 bool cca_enabled = false;
453
454 esp_err_t transmit_frame(Frame* frame);
455 void onRxDone(uint8_t* frame, esp_ieee802154_frame_info_t* frame_info);
456 void onTransmitDone(const uint8_t* frame, const uint8_t* ack,
457 esp_ieee802154_frame_info_t* ack_frame_info);
458 void onTransmitFailed(const uint8_t* frame, esp_ieee802154_tx_error_t error);
461};
462
463} // namespace ieee802154
464
465#ifdef ARDUINO
466using namespace ieee802154;
467#endif
#define MAX_FRAME_LEN
Definition Frame.h:20
IEEE 802.15.4 Address abstraction.
Definition Frame.h:77
Class to manage an IEEE 802.15.4 transceiver using the ESP-IDF API. On the sending side we support br...
Definition ESP32TransceiverIEEE802_15_4.h:109
Frame & getFrame()
Definition ESP32TransceiverIEEE802_15_4.h:348
bool is_rx_when_idle
Definition ESP32TransceiverIEEE802_15_4.h:424
bool is_active
Definition ESP32TransceiverIEEE802_15_4.h:425
int16_t panID
Definition ESP32TransceiverIEEE802_15_4.h:429
void incrementSequenceNumber(int n=1)
Increment the sequence number in the current frame by a specified value.
Definition ESP32TransceiverIEEE802_15_4.h:377
ieee802154_transceiver_tx_done_callback_t tx_done_callback_
Definition ESP32TransceiverIEEE802_15_4.h:439
bool is_coordinator
Definition ESP32TransceiverIEEE802_15_4.h:423
esp_err_t transmit_frame(Frame *frame)
Definition ESP32TransceiverIEEE802_15_4.cpp:192
bool isCCAActive() const
Check if CCA (Clear Channel Assessment) is enabled.
Definition ESP32TransceiverIEEE802_15_4.h:419
int receive_msg_buffer_size
Definition ESP32TransceiverIEEE802_15_4.h:449
bool radio_enabled
Definition ESP32TransceiverIEEE802_15_4.h:436
bool setRxWhenIdleActive(bool rx_when_idle)
Set RX when idle mode for the transceiver.
Definition ESP32TransceiverIEEE802_15_4.cpp:451
void setReceiveBufferSize(int size)
Definition ESP32TransceiverIEEE802_15_4.cpp:288
channel_t channel
Definition ESP32TransceiverIEEE802_15_4.h:428
uint8_t transmit_buffer[MAX_FRAME_LEN]
Definition ESP32TransceiverIEEE802_15_4.h:433
void onStartFrameDelimiterReceived()
Definition ESP32TransceiverIEEE802_15_4.cpp:378
void setReceiveTask(void(*task)(void *pvParameters))
Set a custom FreeRTOS task function for processing received packets.
Definition ESP32TransceiverIEEE802_15_4.h:354
bool setRxCallback(ieee802154_transceiver_rx_callback_t callback, void *user_data)
Set the callback function for received frames.
Definition ESP32TransceiverIEEE802_15_4.cpp:183
void onTransmitFailed(const uint8_t *frame, esp_ieee802154_tx_error_t error)
Definition ESP32TransceiverIEEE802_15_4.cpp:371
int8_t getTxPower()
Get the current transmit power of the transceiver.
Definition ESP32TransceiverIEEE802_15_4.h:263
bool setChannel(channel_t channel)
Change the IEEE 802.15.4 channel.
Definition ESP32TransceiverIEEE802_15_4.cpp:256
FrameControlField frame_control_field
Definition ESP32TransceiverIEEE802_15_4.h:432
Address destination_address
Definition ESP32TransceiverIEEE802_15_4.h:431
ESP32TransceiverIEEE802_15_4(channel_t channel, int16_t panID, Address localAddress)
Construct a new ESP32TransceiverIEEE802_15_4 object.
Definition ESP32TransceiverIEEE802_15_4.h:129
uint32_t ack_timeout_us
Definition ESP32TransceiverIEEE802_15_4.h:450
uint32_t getAckTimeoutUs() const
Get the current acknowledgment timeout in microseconds.
Definition ESP32TransceiverIEEE802_15_4.h:406
bool setPromiscuousModeActive(bool promiscuous)
Set promiscuous mode for the transceiver.
Definition ESP32TransceiverIEEE802_15_4.cpp:441
void * sfd_callback_user_data_
Definition ESP32TransceiverIEEE802_15_4.h:444
bool isCoordinatorActive() const
Check if the transceiver is currently set as coordinator.
Definition ESP32TransceiverIEEE802_15_4.h:276
bool setTxFailedCallback(ieee802154_transceiver_tx_failed_callback_t callback, void *user_data)
Set the callback function for failed frame transmission.
Definition ESP32TransceiverIEEE802_15_4.cpp:340
void setFrameControlField(const FrameControlField &fcf)
Set the Frame Control Field (FCF) for outgoing frames.
Definition ESP32TransceiverIEEE802_15_4.h:331
void onStartFrameDelimiterTransmitDone(uint8_t *frame)
Definition ESP32TransceiverIEEE802_15_4.cpp:384
void setCCAActive(bool cca_enabled)
Enable or disable CCA (Clear Channel Assessment).
Definition ESP32TransceiverIEEE802_15_4.h:413
friend void receive_packet_task(void *)
Forward declarations.
void onRxDone(uint8_t *frame, esp_ieee802154_frame_info_t *frame_info)
Definition ESP32TransceiverIEEE802_15_4.cpp:299
void setDestinationAddress(const Address &address)
Set the destination address for outgoing frames.
Definition ESP32TransceiverIEEE802_15_4.h:317
bool begin(FrameControlField fcf)
Initialize the IEEE 802.15.4 transceiver with a specified channel.
Definition ESP32TransceiverIEEE802_15_4.h:151
Frame frame
Definition ESP32TransceiverIEEE802_15_4.h:427
ieee802154_transceiver_sfd_tx_callback_t sfd_tx_callback_
Definition ESP32TransceiverIEEE802_15_4.h:445
void(* receive_packet_task)(void *pvParameters)=default_receive_packet_task
Definition ESP32TransceiverIEEE802_15_4.h:448
esp_ieee802154_pending_mode_t getPendingMode()
Get the current pending mode of the transceiver.
Definition ESP32TransceiverIEEE802_15_4.h:255
bool end(void)
Deinitialize the IEEE 802.15.4 transceiver.
Definition ESP32TransceiverIEEE802_15_4.cpp:154
bool send(uint8_t *data, size_t len)
Transmit an IEEE 802.15.4 frame on the current channel.
Definition ESP32TransceiverIEEE802_15_4.cpp:227
bool setCoordinatorActive(bool coordinator)
Set the coordinator mode for the transceiver.
Definition ESP32TransceiverIEEE802_15_4.cpp:432
void setBroadcast()
Set the destination address to the broadcast address (0xFFFF).
Definition ESP32TransceiverIEEE802_15_4.h:324
bool setSfdCallback(ieee802154_transceiver_sfd_callback_t callback, void *user_data)
Set the callback function for SFD (Start Frame Delimiter) received event.
Definition ESP32TransceiverIEEE802_15_4.cpp:347
bool is_promiscuous_mode
Definition ESP32TransceiverIEEE802_15_4.h:422
Address local_address
Definition ESP32TransceiverIEEE802_15_4.h:430
static void default_receive_packet_task(void *pvParameters)
Definition ESP32TransceiverIEEE802_15_4.cpp:391
void setAutoIncrementSequenceNumber(bool auto_increment)
Enable or disable automatic incrementing of the sequence number after each successful transmission.
Definition ESP32TransceiverIEEE802_15_4.h:388
TaskHandle_t rx_task_handle
Definition ESP32TransceiverIEEE802_15_4.h:435
bool isRxWhenIdleActive() const
Check if RX when idle mode is active.
Definition ESP32TransceiverIEEE802_15_4.h:304
ieee802154_transceiver_tx_failed_callback_t tx_failed_callback_
Definition ESP32TransceiverIEEE802_15_4.h:441
ieee802154_transceiver_sfd_callback_t sfd_callback_
Definition ESP32TransceiverIEEE802_15_4.h:443
StreamBufferHandle_t getMessageBuffer() const
Get the FreeRTOS message buffer handle for received frames.
Definition ESP32TransceiverIEEE802_15_4.h:368
StreamBufferHandle_t message_buffer
Definition ESP32TransceiverIEEE802_15_4.h:434
void * rx_callback_user_data_
Definition ESP32TransceiverIEEE802_15_4.h:438
void * tx_done_callback_user_data_
Definition ESP32TransceiverIEEE802_15_4.h:440
ieee802154_transceiver_rx_callback_t rx_callback_
Definition ESP32TransceiverIEEE802_15_4.h:437
bool begin()
Initialize the IEEE 802.15.4 transceiver with a specified channel.
Definition ESP32TransceiverIEEE802_15_4.cpp:23
bool setTxDoneCallback(ieee802154_transceiver_tx_done_callback_t callback, void *user_data)
Set the callback function for successful frame transmission.
Definition ESP32TransceiverIEEE802_15_4.cpp:333
bool auto_increment_sequence_number
Definition ESP32TransceiverIEEE802_15_4.h:451
channel_t getChannel() const
Get the current channel of the transceiver.
Definition ESP32TransceiverIEEE802_15_4.h:249
void onTransmitDone(const uint8_t *frame, const uint8_t *ack, esp_ieee802154_frame_info_t *ack_frame_info)
Definition ESP32TransceiverIEEE802_15_4.cpp:361
void * sfd_tx_callback_user_data_
Definition ESP32TransceiverIEEE802_15_4.h:446
bool isPromiscuousModeActive() const
Check if promiscuous mode is active.
Definition ESP32TransceiverIEEE802_15_4.h:290
bool setSfdTxCallback(ieee802154_transceiver_sfd_tx_callback_t callback, void *user_data)
Set the callback function for SFD transmitted event.
Definition ESP32TransceiverIEEE802_15_4.cpp:354
bool setTxPower(int power)
Set the transmit power of the transceiver.
Definition ESP32TransceiverIEEE802_15_4.cpp:460
bool cca_enabled
Definition ESP32TransceiverIEEE802_15_4.h:452
void * tx_failed_callback_user_data_
Definition ESP32TransceiverIEEE802_15_4.h:442
FrameControlField & getFrameControlField()
Get a reference to the Frame Control Field (FCF) for outgoing frames.
Definition ESP32TransceiverIEEE802_15_4.h:341
void setAckTimeoutUs(uint32_t timeout_us)
Set the time in us to wait for the ack frame.
Definition ESP32TransceiverIEEE802_15_4.h:398
Definition ESP32TransceiverIEEE802_15_4.cpp:15
void(* ieee802154_transceiver_tx_done_callback_t)(const uint8_t *frame, const uint8_t *ack, esp_ieee802154_frame_info_t *ack_frame_info, void *user_data)
Callback function type for successful IEEE 802.15.4 frame transmission.
Definition ESP32TransceiverIEEE802_15_4.h:66
void(* ieee802154_transceiver_tx_failed_callback_t)(const uint8_t *frame, esp_ieee802154_tx_error_t error, void *user_data)
Callback function type for failed IEEE 802.15.4 frame transmission.
Definition ESP32TransceiverIEEE802_15_4.h:77
channel_t
Enum for IEEE 802.15.4 channel numbers (11-26).
Definition ESP32TransceiverIEEE802_15_4.h:27
ESP32TransceiverIEEE802_15_4 * pt_transceiver
accessible by global callback functions
Definition ESP32TransceiverIEEE802_15_4.cpp:18
void(* ieee802154_transceiver_sfd_callback_t)(void *user_data)
Callback function type for SFD (Start Frame Delimiter) received event.
Definition ESP32TransceiverIEEE802_15_4.h:85
void(* ieee802154_transceiver_rx_callback_t)(Frame &frame, esp_ieee802154_frame_info_t &frame_info, void *user_data)
Callback function type for received IEEE 802.15.4 frames.
Definition ESP32TransceiverIEEE802_15_4.h:54
Address BROADCAST_ADDRESS((uint8_t[2]){0xFF, 0xFF})
Broadcast address constant.
void(* ieee802154_transceiver_sfd_tx_callback_t)(uint8_t *frame, void *user_data)
Callback function type for SFD transmitted event.
Definition ESP32TransceiverIEEE802_15_4.h:93
IEEE 802.15.4 Frame Control Field (FCF) structure Bit fields are ordered LSB to MSB to match IEEE 802...
Definition Frame.h:53
IEEE 802.15.4 MAC frame structure.
Definition Frame.h:183
uint8_t sequenceNumber
Definition Frame.h:185
Structure to hold frame data and frame info.
Definition Frame.h:243