espNowTest/main/espnow_handler.h

120 lines
3.5 KiB
C

#ifndef ESPNOW_HANDLER_H
#define ESPNOW_HANDLER_H
#include "shared.h"
#include <stdint.h>
#include <sys/types.h>
static bool isMaster;
#define MAX_PAYLOAD_SIZE 250
#define ESPNOW_QUEUE_SIZE 6
#define IS_BROADCAST_ADDR(addr) \
(memcmp(addr, s_broadcast_mac, ESP_NOW_ETH_ALEN) == 0)
typedef enum {
EXAMPLE_ESPNOW_SEND_CB,
EXAMPLE_ESPNOW_RECV_CB,
} espnow_event_id_t;
typedef struct {
uint8_t mac_addr[ESP_NOW_ETH_ALEN];
esp_now_send_status_t status;
} espnow_event_send_cb_t;
typedef struct {
uint8_t mac_addr[ESP_NOW_ETH_ALEN];
uint8_t *data;
int data_len;
} espnow_event_recv_cb_t;
typedef union {
espnow_event_send_cb_t send_cb;
espnow_event_recv_cb_t recv_cb;
} espnow_event_info_t;
typedef struct {
espnow_event_id_t id;
espnow_event_info_t info;
} espnow_event_t;
enum {
EXAMPLE_ESPNOW_DATA_BROADCAST,
EXAMPLE_ESPNOW_DATA_UNICAST,
EXAMPLE_ESPNOW_DATA_MAX,
};
enum {
UNION_STATUS,
UNION_SENSORDATA,
UNION_PING_PONG,
UNION_TEST,
};
typedef struct {
bool isMaster;
} __attribute__((packed)) payloadStatus;
typedef struct {
uint8_t dataPoint;
} __attribute__((packed)) payloadSensorData;
typedef struct {
uint startCounter;
} __attribute__((packed)) payloadPingPong;
typedef struct {
uint testNumber;
} __attribute__((packed)) payloadTesting;
union realPayload {
payloadStatus status;
payloadSensorData sensorData;
payloadPingPong pingPongData;
payloadTesting testingData;
};
/* User defined field of ESPNOW data in this example. */
typedef struct {
uint8_t type; // Broadcast or unicast ESPNOW data.
uint8_t state; // Indicate that if has received broadcast ESPNOW data or not.
uint16_t seq_num; // Sequence number of ESPNOW data.
uint16_t crc; // CRC16 value of ESPNOW data.
uint32_t magic; // Magic number which is used to determine which device to
// send unicast ESPNOW data.
uint8_t unionPage;
union realPayload realPayload; // Real payload of ESPNOW data.
} __attribute__((packed)) espnow_data_t;
static_assert(sizeof(espnow_data_t) <= MAX_PAYLOAD_SIZE,
"payloadData struct is too big to be sent in one part, keep it "
"under 250 Bytes!");
typedef struct {
bool unicast; // Send unicast ESPNOW data.
bool broadcast; // Send broadcast ESPNOW data.
uint8_t state; // Indicate that if has received broadcast ESPNOW data or not.
uint32_t magic; // Magic number which is used to determine which device to
// send unicast ESPNOW data.
uint16_t count; // Total count of unicast ESPNOW data to be sent.
uint16_t delay; // Delay between sending two ESPNOW data, unit: ms.
int len; // Length of ESPNOW data to be sent, unit: byte.
uint8_t *buffer; // Buffer pointing to ESPNOW data.
uint8_t dest_mac[ESP_NOW_ETH_ALEN]; // MAC address of destination device.
} espnow_send_param_t;
void wifi_init(void);
void espnow_deinit(espnow_send_param_t *send_param);
void espnow_data_prepare(espnow_send_param_t *send_param);
void espnow_send_cb(const uint8_t *mac_addr,
esp_now_send_status_t status);
void espnow_recv_cb(const esp_now_recv_info_t *recv_info,
const uint8_t *data, int len);
int espnow_data_parse(uint8_t *data, uint16_t data_len, uint8_t *state,
uint16_t *seq, uint32_t *magic, espnow_event_recv_cb_t* recv_cb);
esp_err_t espnow_init(void);
void espnow_task(void *pvParameter);
void setIsMaster(bool status);
#endif