0

我正在尝试将 Jason Coon 的“FastLED + ESP8266 Web 服务器”:https ://github.com/jasoncoon/esp8266-fastled-webserver移植到 ESPAsyncWebServer,并提供一些额外的好处......

我的项目位于这里https://github.com/kelexel/esp8266-fastled-async-webserver-2.0/

我在这个项目上的主要工作是将所有内容包装成漂亮的类,并尝试提供某种模块化。

编辑:正如许多人在下面的评论中指出的那样,我试图完成的事情显然是错误的。我正在寻找的只是关于应该做什么的想法、代码示例、文档、参考资料,这样我就可以学习和改进......

我对 C++ 完全陌生,所以请放纵..

我想要完成的是获得我新手只能解释为对象的集合,每个对象都有一个 String name和 method pattern。所述模式应该是 ESPLedDriver.cpp 类的方法

问题在于,在 ESPLedDriver.h 和 ESPLedDriver.cpp 中,我尝试创建一个引用 ESPLedDriver:: 的 Struct

我做了一段代码来说明这个问题:

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 )

4

1 回答 1

2

如果所有对象都是字符串和模式,则可以将它们建模为抽象基类:

class String_Pattern
{
  public:  
    virtual void pattern_method(ESPLedDriver& driver_to_use) = 0;
  private:
    std::string  text;
};

请注意,此设计需要将驱动程序传递给字符串模式对象。想想这给对象一个驱动程序来使用。

于 2016-11-16T16:45:23.190 回答