I'm writing some code for Neopixels (those colorful LED strips).
I have two (and counting) classes:
(abbreviated class definition):
class Fire
{
public:
Fire(void);
void init();
void right();
void left();
...
and:
class Water
{
public:
Water(void);
void init();
void right();
void left();
The above classes implement, "Fire" and "Water"-like led patterns, respectively.
My, "loop() {" code receives buttons from an IR remote (yes, I'm using NeoPixel DMA so it works) and depending on what button is pressed, it will instantiate either, "Water", or "Fire" classes.
I then want to call right() or left() on whatever has been instantiated, with code that doesn't care if it's the Fire or Water class. E.g.;
case WATER_BUTTON:
current_pattern = new Water();
break;
case FIRE_BUTTON:
current_pattern = new Fire();
break;
case LEFT_BUTTON:
current_pattern.left();
break;
case RIGHT_BUTTON:
current_pattern.right();
break;
Of course the above gives me compiler errors, I'm posting it to demonstrate what I'm trying to do.
So, how do I do this???
[color=#5e6d03]#include[/color] [color=#434f54]<[/color][color=#000000]memory[/color][color=#434f54]>[/color] [color=#434f54]// unique_ptr, make_unique[/color]
[color=#00979c]class[/color] [color=#000000]LEDEffect[/color] [color=#000000]{[/color]
[color=#00979c]public[/color][color=#434f54]:[/color]
[color=#00979c]virtual[/color] [color=#00979c]void[/color] [color=#000000]init[/color][color=#000000]([/color][color=#000000])[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#000000];[/color]
[color=#00979c]virtual[/color] [color=#00979c]void[/color] [color=#000000]left[/color][color=#000000]([/color][color=#000000])[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#000000];[/color]
[color=#00979c]virtual[/color] [color=#00979c]void[/color] [color=#000000]right[/color][color=#000000]([/color][color=#000000])[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#000000];[/color]
[color=#00979c]virtual[/color] [color=#434f54]~[/color][color=#000000]LEDEffect[/color][color=#000000]([/color][color=#000000])[/color] [color=#434f54]=[/color] [color=#5e6d03]default[/color][color=#000000];[/color]
[color=#000000]}[/color][color=#000000];[/color]
[color=#00979c]class[/color] [color=#000000]Water[/color] [color=#434f54]:[/color] [color=#00979c]public[/color] [color=#000000]LEDEffect[/color] [color=#000000]{[/color]
[color=#00979c]public[/color][color=#434f54]:[/color]
[color=#00979c]void[/color] [color=#000000]init[/color][color=#000000]([/color][color=#000000])[/color] [color=#5e6d03]override[/color] [color=#000000]{[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]__PRETTY_FUNCTION__[/color][color=#000000])[/color][color=#000000];[/color] [color=#000000]}[/color]
[color=#00979c]void[/color] [color=#000000]left[/color][color=#000000]([/color][color=#000000])[/color] [color=#5e6d03]override[/color] [color=#000000]{[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]__PRETTY_FUNCTION__[/color][color=#000000])[/color][color=#000000];[/color] [color=#000000]}[/color]
[color=#00979c]void[/color] [color=#000000]right[/color][color=#000000]([/color][color=#000000])[/color] [color=#5e6d03]override[/color] [color=#000000]{[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]__PRETTY_FUNCTION__[/color][color=#000000])[/color][color=#000000];[/color] [color=#000000]}[/color]
[color=#000000]}[/color][color=#000000];[/color]
[color=#00979c]class[/color] [color=#000000]Fire[/color] [color=#434f54]:[/color] [color=#00979c]public[/color] [color=#000000]LEDEffect[/color] [color=#000000]{[/color]
[color=#00979c]public[/color][color=#434f54]:[/color]
[color=#00979c]void[/color] [color=#000000]init[/color][color=#000000]([/color][color=#000000])[/color] [color=#5e6d03]override[/color] [color=#000000]{[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]__PRETTY_FUNCTION__[/color][color=#000000])[/color][color=#000000];[/color] [color=#000000]}[/color]
[color=#00979c]void[/color] [color=#000000]left[/color][color=#000000]([/color][color=#000000])[/color] [color=#5e6d03]override[/color] [color=#000000]{[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]__PRETTY_FUNCTION__[/color][color=#000000])[/color][color=#000000];[/color] [color=#000000]}[/color]
[color=#00979c]void[/color] [color=#000000]right[/color][color=#000000]([/color][color=#000000])[/color] [color=#5e6d03]override[/color] [color=#000000]{[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]__PRETTY_FUNCTION__[/color][color=#000000])[/color][color=#000000];[/color] [color=#000000]}[/color]
[color=#000000]}[/color][color=#000000];[/color]
[color=#000000]std[/color][color=#434f54]:[/color][color=#434f54]:[/color][color=#000000]unique_ptr[/color][color=#434f54]<[/color][color=#000000]LEDEffect[/color][color=#434f54]>[/color] [color=#000000]currentPattern[/color][color=#000000];[/color]
[color=#00979c]void[/color] [color=#5e6d03]setup[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color]
[color=#000000]currentPattern[/color] [color=#434f54]=[/color] [color=#000000]std[/color][color=#434f54]:[/color][color=#434f54]:[/color][color=#000000]make_unique[/color][color=#434f54]<[/color][color=#000000]Water[/color][color=#434f54]>[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color]
[b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]begin[/color][color=#000000]([/color][color=#000000]115200[/color][color=#000000])[/color][color=#000000];[/color]
[color=#000000]}[/color]
[color=#00979c]void[/color] [color=#5e6d03]loop[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color]
[color=#00979c]int[/color] [color=#000000]data[/color] [color=#434f54]=[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]read[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color]
[color=#5e6d03]switch[/color] [color=#000000]([/color][color=#000000]data[/color][color=#000000])[/color] [color=#000000]{[/color]
[color=#5e6d03]case[/color] [color=#00979c]'i'[/color][color=#434f54]:[/color] [color=#000000]currentPattern[/color][color=#434f54]-[/color][color=#434f54]>[/color][color=#000000]init[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color] [color=#5e6d03]break[/color][color=#000000];[/color]
[color=#5e6d03]case[/color] [color=#00979c]'l'[/color][color=#434f54]:[/color] [color=#000000]currentPattern[/color][color=#434f54]-[/color][color=#434f54]>[/color][color=#000000]left[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color] [color=#5e6d03]break[/color][color=#000000];[/color]
[color=#5e6d03]case[/color] [color=#00979c]'r'[/color][color=#434f54]:[/color] [color=#000000]currentPattern[/color][color=#434f54]-[/color][color=#434f54]>[/color][color=#000000]right[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color] [color=#5e6d03]break[/color][color=#000000];[/color]
[color=#5e6d03]case[/color] [color=#00979c]'w'[/color][color=#434f54]:[/color] [color=#000000]currentPattern[/color] [color=#434f54]=[/color] [color=#000000]std[/color][color=#434f54]:[/color][color=#434f54]:[/color][color=#000000]make_unique[/color][color=#434f54]<[/color][color=#000000]Water[/color][color=#434f54]>[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color] [color=#5e6d03]break[/color][color=#000000];[/color]
[color=#5e6d03]case[/color] [color=#00979c]'f'[/color][color=#434f54]:[/color] [color=#000000]currentPattern[/color] [color=#434f54]=[/color] [color=#000000]std[/color][color=#434f54]:[/color][color=#434f54]:[/color][color=#000000]make_unique[/color][color=#434f54]<[/color][color=#000000]Fire[/color][color=#434f54]>[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color] [color=#5e6d03]break[/color][color=#000000];[/color]
[color=#000000]}[/color]
[color=#000000]}[/color]
To try it, type some of the letters in the switch into the serial monitor (w to make the effect a Water, f for Fire, i to initialize, etc.).
I'm assuming here that since you're using DMA, you have access to the standard library. You should never use raw pointers in C++, only smart pointers.
Be careful when using dynamic memory on microcontrollers ...
Pieter
Delta_G:
Basically it's a base class where all any of the methods are virtual
I think it's called an "interface" in Java-land.
in arduino land it is very difficult for these little chips to handle the creation of a class during runtime. or asking for new unknown RAM for anything really. even if you could get this to compile, there is just not as much ram and speed available to juggle around unknown quantities of memory. youre almost always better off changing your approach to declairing everything you think you might need at the top. even if you reserve some extra that might not get used.
Thank you PieterP!!! Great answer!
FYI, I'm using an Adafruit Trinket M0, so I have, "lots" of memory and such.
tom