我正在使用Arduino和一个LED灯带项目。我正在定义LEDPattern和LEDColourScheme类来控制LED的行为/外观。
pattern子类继承自父LEDPattern类,并控制打开哪些LED以及亮度。
配色方案子类继承自LEDcolourScheme父类并控制颜色。
我希望能够将每个LEDPattern子类配置为具有唯一的ColourSchemes选择。可以使用配置属性来初始化LEDPatterns和LEDColourSchemes。它们都定义了控制其自定义行为的虚拟方法。
对于模式,我使用了一组类实例:
#define NUM_PATTERNS 7
LedPattern* led_patterns[] = {
new patternBeatPulseGenerator(true), //Has a boolean configurable attribute that changes behaviour
new patternBeatPulseGenerator(false),
new patternMovingSineWave(),
new patternSolidBeatPulse(),
new patternMovingSegments(),
new patternRandomSparkle(),
new patternSineWavePulse(),
};
然后偶尔选择一个新的随机变量:
static LedPattern* pattern;
pattern_id = random(0,NUM_PATTERNS);
pattern = led_patterns[pattern_id];
patttern->initialise(); //Custom initialise method to 'reset' pattern each time it is selected (since instance is only initialized once when defined in array above)
现在,我希望能够对ColourSchemes做类似的事情,能够为每个Pattern定义一组ColourSchemes,并在Pattern类上有一个返回随机值的方法:
static ColourScheme* colour_scheme;
colour_scheme = pattern->GetColourScheme();
colour_scheme->initialise();
然后对于动画的每个“帧”,调用Pattern和ColourScheme方法:
pattern->newFrame();
colour_scheme->newFrame();
我尝试过这样定义它:
class LedPattern : public BaseLEDController {
protected:
ColourScheme* colour_schemes[6] = {
new colourRainbow(0, 3),
new colourCycleBeatRed(),
new colourChangeOnBeat(),
new colourRedHeart(),
new colourRandom(),
new colourRainbow(3, 3),
};
byte num_colour_schemes = 6;
public:
virtual ColourScheme* getColourMode() {
ColourScheme* colour_scheme;
byte choice = random(0, num_colour_schemes );
colour_scheme = colour_schemes[choice];
colour_scheme->initialise();
return colour_scheme;
}
...
}
然后在子类中覆盖colour_schemes []数组,但是它似乎不起作用,它似乎继续使用基类配置。而且我认为colour_schemes数组中的实例是为每个PAttern类实例新创建的,因此会占用大量内存。 我也意识到将所有LEDPatterns和ColourSchemes作为初始化实例占用内存是不理想的,而实际上一次只使用其中的一个。因此,我想到的另一种方法是使用条件/ switch语句作为方法工厂来生成这样的实例:
virtual ColourScheme* getColourMode() {
byte choice = random(0, num_colour_schemes );
static ColourScheme* colour_scheme;
delete[] colour_scheme; //Delete old one to free up memory
switch (choice) {
case 0:
colour_scheme= new colourRainbow(0, 3); //Static rainbow
break;
case 1:
colour_scheme= new colourCycleBeatRed();
break;
case 2:
colour_scheme= new colourChangeOnBeat();
break;
case 3:
colour_scheme= new colourRedHeart();
break;
case 4:
colour_scheme= new colourRandom();
break;
case 5:
colour_scheme= new colourRainbow(3, 3); //Moving rainbow
break;
default:
colour_scheme= new colourRainbow(3, 3);
break;
}
return colour_scheme;
}
这意味着一次将只有一个ColourScheme实例(如果我也做同样的事情,则为LEDPattern),这对内存有好处,这意味着我不需要自定义的initialize()方法来重置实例每次被选择(可以集成到标准类构造函数中)。
但是,更改LEDPattern子类上的ColourScheme配置变得很混乱...
如果有人对实现此功能的最佳方法有任何想法,将非常感谢!!奖励积分是否有可能将权重与每个Pattern / ColourScheme相关联,从而影响其被随机选择的可能性。