|
/*
|
|
|
|
COMPATIBILITY BETWEEN 2.3.0 and latest versions
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "espurna.h"
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Core version 2.4.2 and higher changed the cont_t structure to a pointer:
|
|
// https://github.com/esp8266/Arduino/commit/5d5ea92a4d004ab009d5f642629946a0cb8893dd#diff-3fa12668b289ccb95b7ab334833a4ba8L35
|
|
// Core version 2.5.0 introduced EspClass helper method:
|
|
// https://github.com/esp8266/Arduino/commit/0e0e34c614fe8a47544c9998201b1d9b3c24eb18
|
|
// -----------------------------------------------------------------------------
|
|
|
|
extern "C" {
|
|
#include <cont.h>
|
|
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) \
|
|
|| defined(ARDUINO_ESP8266_RELEASE_2_4_0) \
|
|
|| defined(ARDUINO_ESP8266_RELEASE_2_4_1)
|
|
extern cont_t g_cont;
|
|
#define getFreeStack() cont_get_free_stack(&g_cont)
|
|
#elif defined(ARDUINO_ESP8266_RELEASE_2_4_2)
|
|
extern cont_t* g_pcont;
|
|
#define getFreeStack() cont_get_free_stack(g_pcont)
|
|
#else
|
|
#define getFreeStack() ESP.getFreeContStack()
|
|
#endif
|
|
}
|
|
|
|
#include <pgmspace.h>
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// ref: https://github.com/esp8266/Arduino/blob/master/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h
|
|
// __STRINGIZE && __STRINGIZE_NX && PROGMEM definitions port
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// Do not replace macros unless running version older than 2.5.0
|
|
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) \
|
|
|| defined(ARDUINO_ESP8266_RELEASE_2_4_0) \
|
|
|| defined(ARDUINO_ESP8266_RELEASE_2_4_1) \
|
|
|| defined(ARDUINO_ESP8266_RELEASE_2_4_2)
|
|
|
|
// Quoting esp8266/Arduino comments:
|
|
// "Since __section__ is supposed to be only use for global variables,
|
|
// there could be conflicts when a static/inlined function has them in the
|
|
// same file as a non-static PROGMEM object.
|
|
// Ref: https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html
|
|
// Place each progmem object into its own named section, avoiding conflicts"
|
|
|
|
#define __TO_STR_(A) #A
|
|
#define __TO_STR(A) __TO_STR_(A)
|
|
|
|
#undef PROGMEM
|
|
#define PROGMEM __attribute__((section( "\".irom.text." __FILE__ "." __TO_STR(__LINE__) "." __TO_STR(__COUNTER__) "\"")))
|
|
|
|
// "PSTR() macro modified to start on a 32-bit boundary. This adds on average
|
|
// 1.5 bytes/string, but in return memcpy_P and strcpy_P will work 4~8x faster"
|
|
#undef PSTR
|
|
#define PSTR(s) (__extension__({static const char __c[] __attribute__((__aligned__(4))) PROGMEM = (s); &__c[0];}))
|
|
|
|
#endif
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Division by zero bug
|
|
// https://github.com/esp8266/Arduino/pull/2397
|
|
// https://github.com/esp8266/Arduino/pull/2408
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0)
|
|
long __attribute__((deprecated("Please avoid using map() with Core 2.3.0"))) map(long x, long in_min, long in_max, long out_min, long out_max);
|
|
#endif
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Proxy min & max same as the latest Arduino.h
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0)
|
|
|
|
#undef min
|
|
#undef max
|
|
#undef _min
|
|
#undef _max
|
|
|
|
#include <algorithm>
|
|
|
|
using std::min;
|
|
using std::max;
|
|
using std::isinf;
|
|
using std::isnan;
|
|
|
|
#define _min(a,b) ({ decltype(a) _a = (a); decltype(b) _b = (b); _a < _b? _a : _b; })
|
|
#define _max(a,b) ({ decltype(a) _a = (a); decltype(b) _b = (b); _a > _b? _a : _b; })
|
|
|
|
#endif
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// std::make_unique backport for C++11, since we still use it
|
|
// -----------------------------------------------------------------------------
|
|
#if 201103L >= __cplusplus
|
|
|
|
#include <memory>
|
|
namespace std {
|
|
template<typename T, typename... Args>
|
|
std::unique_ptr<T> make_unique(Args&&... args) {
|
|
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|