Branch data Line data Source code
1 : : // src/espnow_driver.cpp
2 : :
3 : : #include "esp_log.h"
4 : :
5 : : #include "espnow_driver.hpp"
6 : :
7 : : const char *TAG = "EspNowDriver";
8 : :
9 : 10 : EspNowDriver::EspNowDriver(IWiFiHAL &wifi_hal, IEspNowHAL &espnow_hal)
10 : 10 : : wifi_hal_(wifi_hal)
11 : 10 : , espnow_hal_(espnow_hal)
12 : : {
13 : 10 : }
14 : :
15 : 9 : esp_err_t EspNowDriver::init(const EspNowConfig &config, esp_now_recv_cb_t recv_cb, esp_now_send_cb_t send_cb)
16 : : {
17 : 9 : esp_err_t err;
18 : :
19 : 9 : wifi_mode_t mode;
20 : 9 : err = wifi_hal_.wifi_get_mode(&mode);
21 [ + + ]: 9 : if (err != ESP_OK) {
22 : 1 : return init_fail(err, "Failed to get WiFi mode");
23 : : }
24 [ + + ]: 8 : if (mode == WIFI_MODE_NULL) {
25 : 1 : return init_fail(ESP_ERR_INVALID_STATE, "Mode is not supported");
26 : : }
27 : :
28 : 7 : err = espnow_hal_.hal_esp_now_init();
29 [ + + ]: 7 : if (err != ESP_OK) {
30 : 1 : return init_fail(err, "Failed to initialize ESP-NOW");
31 : : }
32 : :
33 : 6 : err = espnow_hal_.hal_espnow_register_recv_cb(recv_cb);
34 [ + + ]: 6 : if (err != ESP_OK) {
35 : 1 : return init_fail(err, "Failed to register ESP-NOW receive callback");
36 : : }
37 : :
38 : 5 : err = espnow_hal_.hal_espnow_register_send_cb(send_cb);
39 [ + + ]: 5 : if (err != ESP_OK) {
40 : 1 : return init_fail(err, "Failed to register ESP-NOW send callback");
41 : : }
42 : :
43 : 4 : err = wifi_hal_.wifi_set_channel(config.wifi_channel, WIFI_SECOND_CHAN_NONE);
44 [ + + ]: 4 : if (err != ESP_OK) {
45 : 1 : return init_fail(err, "Failed to set WiFi channel");
46 : : }
47 : :
48 : 3 : err = add_broadcast_peer();
49 [ + + ]: 3 : if (err != ESP_OK) {
50 : 1 : return init_fail(err, "Failed to add broadcast peer");
51 : : }
52 : :
53 : : return ESP_OK;
54 : : }
55 : :
56 : 9 : esp_err_t EspNowDriver::deinit()
57 : : {
58 : 9 : return espnow_hal_.hal_esp_now_deinit();
59 : : }
60 : :
61 : : // ===============================================================
62 : : // Private methods
63 : : // ===============================================================
64 : :
65 : : // Add broadcast peer to ESP-NOW
66 : 3 : esp_err_t EspNowDriver::add_broadcast_peer()
67 : : {
68 : 3 : esp_now_peer_info_t broadcast_peer = {};
69 : 3 : memcpy(broadcast_peer.peer_addr, BROADCAST_MAC, 6);
70 : 3 : broadcast_peer.channel = 0;
71 : 3 : broadcast_peer.ifidx = WIFI_IF_STA;
72 : 3 : broadcast_peer.encrypt = false;
73 : 3 : return espnow_hal_.hal_esp_now_add_peer(&broadcast_peer);
74 : : }
75 : :
76 : : // Helper to log error and deinit
77 : 7 : esp_err_t EspNowDriver::init_fail(esp_err_t ret, const char *step)
78 : : {
79 : 7 : ESP_LOGE(TAG, "%s failed: %s", step, esp_err_to_name(ret));
80 : 7 : deinit();
81 : 7 : return ret;
82 : : }
|