Files
Leo-led-truck/src/magicSwitchBoard.cpp
2020-11-08 22:06:41 +01:00

123 lines
2.0 KiB
C++

#include "magicSwitchBoard.h"
#include "Arduino.h"
#include "buttons.h"
#define CHANNELS 3
typedef enum
{
idle,
learn,
active,
last
} states;
states state = last;
uint8_t sequence[CHANNELS] = {0, 0, 0};
const uint8_t buttonIndex[CHANNELS] = {4, 5, 3};
const uint32_t leds[CHANNELS] = {LED1, LED2, LED3};
uint8_t learnIndex = 0;
void showLeds(void)
{
//loop through the button list
for (int i = 0; i < CHANNELS; i++)
{
//check if the position is already programmed
if (sequence[i])
{
//get the button pointer
buttons *currentbutton = getButton(buttonIndex[i]);
//verify that the button pointer is not NULL
if (currentbutton == NULL)
{
return;
}
//if the button is pressed, show LED or not
if (currentbutton->state() == !RELEASED)
{
//write sequence led on
digitalWrite(leds[sequence[i] + 1], 1);
}
else
{
//write sequence led off
digitalWrite(leds[sequence[i] + 1], 0);
}
}
}
}
void handleMagicSwitchBoard(void)
{
switch (state)
{
case idle:
{
if (anybutton())
{
state = learn;
}
else
{
for (auto &&i : leds)
{
digitalWrite(i, 0);
}
}
}
break;
case learn:
{
for (int i = 0; i < CHANNELS; i++)
{
buttons *currentbutton = getButton(buttonIndex[i]);
if (currentbutton == NULL)
{
return;
}
if (currentbutton->state() == !RELEASED)
{
bool duplicate = false;
for (auto &&n : sequence)
{
if (currentbutton->index() == n)
{
duplicate = true;
}
}
if (!duplicate)
{
sequence[learnIndex] = currentbutton->index();
learnIndex++;
}
}
}
if (learnIndex == CHANNELS)
{
state = active;
}
}
break;
case active:
{
}
break;
default:
{
state = idle;
}
break;
}
showLeds();
}