Я пытаюсь смиренно портировать «FastLED + ESP8266 Web Server» от Джейсона Куна: https://github.com/jasoncoon/esp8266-fastled-webserver ESPAsyncWebServer, с несколькими дополнительными вкусностями …
Мой проект находится здесь https://github.com/kelexel/esp8266-fastled-async-webserver-2.0/
Моя основная работа над этим проектом — обернуть все в красивые классы и попытаться позволить себе какую-то модульность.
Я совершенно новичок в C ++, поэтому, пожалуйста, будьте снисходительны ..
Я пытаюсь добиться того, что я, неофит, могу объяснить только как совокупность объектов, каждый из которых имеет строку название и метод шаблон. Сказал шаблон должен быть методом класса ESPLedDriver.cpp
Проблема заключается в том, что в ESPLedDriver.h и ESPLedDriver.cpp я пытаюсь создать структуру, которая ссылается на ESPLedDriver ::
Я сделал фрагмент кода, чтобы проиллюстрировать проблему:
ESPLedDriver.cpp
void ESPLedDriver::colorwaves()
{
// ...
}
void ESPLedDriver::palettetest()
{
// ...
}
void ESPLedDriver::setPatterns()
{
// const uint8_t patternCount;
_patterns = {
// ERROR: src/ESPLedDriver.cpp:225:3: error: cannot convert 'ESPLedDriver::colorwaves' from type 'void (ESPLedDriver::)()' to type 'ESPLedDriver::Pattern {aka void (*)()}'
{ colorwaves, "Color Waves" },
// ERROR: src/ESPLedDriver.cpp:225:3: error: cannot convert 'ESPLedDriver::palettetest' from type 'void (ESPLedDriver::)()' to type 'ESPLedDriver::Pattern {aka void (*)()}'
{ this->palettetest, "Palette Test" },
};
}
ESPLedDriver.h
#include "FastLED.h"
class ESPLedDriver
{
public:
ESPLedDriver();
// ...
private:
void setPatterns();
typedef void (*Pattern)();
typedef Pattern PatternList[];
typedef struct {
Pattern pattern;
String name;
} PatternAndName;
typedef PatternAndName PatternAndNameList[];
/* Patterns */
void colorwaves();
void palettetest();
PatternAndNameList _patterns;
uint8_t _patternCount;
}
(Или, если хотите, как суть:
https://gist.github.com/kelexel/ab5687cf83e376c709e49fbfbcfc100b )
Если все объекты строковые и шаблонные, вы можете смоделировать их как абстрактный базовый класс:
class String_Pattern
{
public:
virtual void pattern_method(ESPLedDriver& driver_to_use) = 0;
private:
std::string text;
};
Обратите внимание, что этот дизайн требует передачи драйвера объекту строкового шаблона. Подумайте об этом, предоставив объекту драйвер для использования.
Других решений пока нет …