Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions idf_component.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: "1.2.0"
description: "Midea UART protocol library for ESP-IDF and Arduino"
url: "https://github.com/dudanov/MideaUART"
repository: "https://github.com/dudanov/MideaUART.git"
dependencies:
idf:
version: ">=5.0"
2 changes: 1 addition & 1 deletion include/Appliance/AirConditioner/AirConditioner.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include "Appliance/ApplianceBase.h"
#include "Appliance/AirConditioner/Capabilities.h"
#include "Appliance/AirConditioner/StatusData.h"
Expand Down
2 changes: 1 addition & 1 deletion include/Appliance/AirConditioner/Capabilities.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include <set>

namespace dudanov {
Expand Down
2 changes: 1 addition & 1 deletion include/Appliance/AirConditioner/StatusData.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include "Frame/FrameData.h"

namespace dudanov {
Expand Down
2 changes: 1 addition & 1 deletion include/Appliance/ApplianceBase.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once
#include <deque>
#include <Arduino.h>
#include "Helpers/Platform.h"
#include "Frame/Frame.h"
#include "Frame/FrameData.h"
#include "Helpers/Timer.h"
Expand Down
2 changes: 1 addition & 1 deletion include/Frame/Frame.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include <vector>
#include "Frame/FrameData.h"
#include "Helpers/Helpers.h"
Expand Down
2 changes: 1 addition & 1 deletion include/Frame/FrameData.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include <vector>

class IPAddress;
Expand Down
2 changes: 1 addition & 1 deletion include/Helpers/Helpers.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include <initializer_list>

namespace dudanov {
Expand Down
4 changes: 3 additions & 1 deletion include/Helpers/Log.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"

namespace dudanov {

Expand All @@ -17,7 +17,9 @@ namespace dudanov {
#endif

void sv_log_printf_(int level, const char *tag, int line, const char *format, ...);
#ifdef ARDUINO
void sv_log_printf_(int level, const char *tag, int line, const __FlashStringHelper *format, ...);
#endif

#if LOG_LEVEL >= LOG_LEVEL_VERY_VERBOSE
#define sv_log_vv(tag, format, ...) \
Expand Down
2 changes: 1 addition & 1 deletion include/Helpers/Logger.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include <Arduino.h>
#include "Helpers/Platform.h"
#include <cstdarg>
#include <functional>

Expand Down
61 changes: 61 additions & 0 deletions include/Helpers/Platform.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#pragma once

#ifdef ARDUINO
#include <Arduino.h>
#else
// ESP-IDF compatibility layer
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <string>
#include <functional>

#include "esp_timer.h"
#include "esp_random.h"

// millis() replacement
inline unsigned long millis() {
return (unsigned long)(esp_timer_get_time() / 1000ULL);
}

// random() replacement
inline long random(long max) {
return esp_random() % max;
}

inline long random(long min, long max) {
return min + (esp_random() % (max - min));
}

// String replacement - use std::string
using String = std::string;

// F() macro - no-op on ESP-IDF (no flash strings needed)
#define F(x) x

// __FlashStringHelper - just const char* on ESP-IDF
using __FlashStringHelper = const char;

// Stream interface for ESP-IDF
class Stream {
public:
virtual ~Stream() = default;
virtual int available() = 0;
virtual int read() = 0;
virtual int peek() = 0;
virtual size_t write(uint8_t data) = 0;
virtual size_t write(const uint8_t *data, size_t size) = 0;
virtual void flush() = 0;
};

// IPAddress for ESP-IDF
class IPAddress {
public:
IPAddress() : addr_{0, 0, 0, 0} {}
IPAddress(uint8_t a, uint8_t b, uint8_t c, uint8_t d) : addr_{a, b, c, d} {}
uint8_t operator[](int index) const { return addr_[index]; }
private:
uint8_t addr_[4];
};

#endif // ARDUINO
2 changes: 1 addition & 1 deletion library.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
"license": "MIT",
"dependencies": {
},
"frameworks": "arduino",
"frameworks": ["arduino", "espidf"],
"platforms": ["espressif8266", "espressif32"]
}
60 changes: 55 additions & 5 deletions src/Appliance/ApplianceBase.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
#include "Appliance/ApplianceBase.h"
#include "Helpers/Log.h"
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>

#ifdef ARDUINO
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#define HAS_WIFI 1
#else
#include <ESP8266WiFi.h>
// ESP-IDF
#include "esp_wifi.h"
#include "esp_netif.h"
#define HAS_WIFI 1
#endif

namespace dudanov {
Expand Down Expand Up @@ -108,6 +117,7 @@ void ApplianceBase::m_handler(const Frame &frame) {
this->m_onRequest(frame);
}

#ifdef ARDUINO
static uint8_t getSignalStrength() {
const int32_t dbm = WiFi.RSSI();
if (dbm > -63)
Expand All @@ -119,11 +129,51 @@ static uint8_t getSignalStrength() {
return 1;
}

static bool isWifiConnected() {
return WiFi.isConnected();
}

static IPAddress getLocalIP() {
return WiFi.localIP();
}
#else
// ESP-IDF implementations
static uint8_t getSignalStrength() {
wifi_ap_record_t ap_info;
if (esp_wifi_sta_get_ap_info(&ap_info) == ESP_OK) {
int32_t dbm = ap_info.rssi;
if (dbm > -63) return 4;
if (dbm > -75) return 3;
if (dbm > -88) return 2;
}
return 1;
}

static bool isWifiConnected() {
wifi_ap_record_t ap_info;
return esp_wifi_sta_get_ap_info(&ap_info) == ESP_OK;
}

static IPAddress getLocalIP() {
esp_netif_ip_info_t ip_info;
esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
if (netif && esp_netif_get_ip_info(netif, &ip_info) == ESP_OK) {
return IPAddress(
ip_info.ip.addr & 0xFF,
(ip_info.ip.addr >> 8) & 0xFF,
(ip_info.ip.addr >> 16) & 0xFF,
(ip_info.ip.addr >> 24) & 0xFF
);
}
return IPAddress();
}
#endif

void ApplianceBase::m_sendNetworkNotify(FrameType msgType) {
NetworkNotifyData notify{};
notify.setConnected(WiFi.isConnected());
notify.setConnected(isWifiConnected());
notify.setSignalStrength(getSignalStrength());
notify.setIP(WiFi.localIP());
notify.setIP(getLocalIP());
notify.appendCRC();
if (msgType == NETWORK_NOTIFY) {
LOG_D(TAG, "Enqueuing a DEVICE_NETWORK(0x0D) notification...");
Expand Down
10 changes: 9 additions & 1 deletion src/Frame/FrameData.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
#include "Frame/FrameData.h"
#include <IPAddress.h>
#include "Helpers/Platform.h"

#ifndef PROGMEM
#define PROGMEM
#endif

#ifndef pgm_read_byte
#define pgm_read_byte(addr) (*(const uint8_t *)(addr))
#endif

namespace dudanov {
namespace midea {
Expand Down
2 changes: 2 additions & 0 deletions src/Helpers/Log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ void sv_log_printf_(int level, const char *tag, int line, const char *format, ..
va_end(arg);
}

#ifdef ARDUINO
void sv_log_printf_(int level, const char *tag, int line, const __FlashStringHelper *format, ...) {
if (logger_ == nullptr)
return;
Expand All @@ -24,5 +25,6 @@ void sv_log_printf_(int level, const char *tag, int line, const __FlashStringHel
logger_(level, tag, line, format, arg);
va_end(arg);
}
#endif

} // namespace dudanov
2 changes: 1 addition & 1 deletion src/Helpers/Timer.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include <Arduino.h>
#include "Helpers/Platform.h"
#include "Helpers/Timer.h"

namespace dudanov {
Expand Down