Animation works with default animation

This commit is contained in:
2017-11-27 06:47:27 +01:00
parent e2209504da
commit 54a6ee1cd1
14 changed files with 216 additions and 918 deletions

View File

@@ -64,6 +64,7 @@ void LEDDefinition_add(char *level, char *room, char *id, uint8_t red, uint8_t g
ledDefinition[numberOfLEDDefinitions].level = level;
ledDefinition[numberOfLEDDefinitions].room = room;
ledDefinition[numberOfLEDDefinitions].id = id;
ledDefinition[numberOfLEDDefinitions].onColor.name = "autoColor";
ledDefinition[numberOfLEDDefinitions].onColor.red = red;
ledDefinition[numberOfLEDDefinitions].onColor.green = green;
ledDefinition[numberOfLEDDefinitions].onColor.blue = blue;
@@ -72,6 +73,7 @@ void LEDDefinition_add(char *level, char *room, char *id, uint8_t red, uint8_t g
LOG(LL_ERROR, ("Error: Too many LED Definitions to load, ignoring level=%s, room=%s, id=%s", level, room, id));
}
}
void LEDDefinition_init(int numberOfLeds, bool loadDefaultData) {
// initialize
numberOfLEDDefinitions = 0;
@@ -95,3 +97,27 @@ void LEDDefinition_init(int numberOfLeds, bool loadDefaultData) {
}
}
char *LEDDefinition_getLevel(int ledNum) {
ledNum = verifyLedDefinitionNum(ledNum);
return ledDefinition[ledNum].level;
}
char *LEDDefinition_getRoom(int ledNum) {
ledNum = verifyLedDefinitionNum(ledNum);
return ledDefinition[ledNum].room;
}
char *LEDDefinition_getId(int ledNum) {
ledNum = verifyLedDefinitionNum(ledNum);
return ledDefinition[ledNum].id;
}
int LEDDefinition_getOnColorRed(int ledNum) {
ledNum = verifyLedDefinitionNum(ledNum);
return ledDefinition[ledNum].onColor.red;
}
int LEDDefinition_getOnColorGreen(int ledNum) {
ledNum = verifyLedDefinitionNum(ledNum);
return ledDefinition[ledNum].onColor.green;
}
int LEDDefinition_getOnColorBlue(int ledNum) {
ledNum = verifyLedDefinitionNum(ledNum);
return ledDefinition[ledNum].onColor.blue;
}

View File

@@ -36,6 +36,12 @@ extern LEDDefinition ledDefinition[MAX_LEDS];
extern LEDDefinition *LEDDefinition_get(int ledNum);
extern void LEDDefinition_init(int numberOfLeds, bool loadDefaultData);
void LEDDefinition_add(char *level, char *room, char *id, uint8_t red, uint8_t green, uint8_t blue);
extern void LEDDefinition_add(char *level, char *room, char *id, uint8_t red, uint8_t green, uint8_t blue);
extern char *LEDDefinition_getLevel(int ledNum);
extern char *LEDDefinition_getRoom(int ledNum);
extern char *LEDDefinition_getId(int ledNum);
extern int LEDDefinition_getOnColorRed(int ledNum);
extern int LEDDefinition_getOnColorGreen(int ledNum);
extern int LEDDefinition_getOnColorBlue(int ledNum);
#endif

View File

@@ -6,6 +6,9 @@
static LEDStateEngine theLEDStateEngine;
static int ticks = 0;
int getTicks(void) { return ticks; }
void LEDStateEngine_setNumberOfLeds(int numberOfLeds) {
if (numberOfLeds < 1 || numberOfLeds > MAX_LEDS) {
@@ -13,13 +16,14 @@ void LEDStateEngine_setNumberOfLeds(int numberOfLeds) {
numberOfLeds = MAX_LEDS;
}
theLEDStateEngine.numberOfLeds = numberOfLeds;
LOG(LL_INFO, ("LEDStateEngine initialized: numLEDs=%d, MAX_LEDS=%d", numberOfLeds, MAX_LEDS));
}
void LEDStateEngine_init(int numberOfLeds) {
LEDStateEngine_setNumberOfLeds(numberOfLeds);
theLEDStateEngine.comment = "";
for (int i=0; i<numberOfLeds; ++i) {
LEDstate_init(i, LEDDefinition_get(i));
LEDState_init(i, LEDDefinition_get(i));
}
}
@@ -33,24 +37,26 @@ uint16_t LEDStateEngine_getNumberOfLeds() {
void LEDStateEngine_tick() {
++ticks;
// LOG(LL_INFO, ("# %d/%d", theLEDStateEngine.numberOfLeds, ticks));
for (int i=0; i<theLEDStateEngine.numberOfLeds; ++i) {
LEDState_tick(i);
}
}
void LEDState_tick(int ledNum) {
LEDState *state = &theLEDStateEngine.ledState[ledNum];
if (/*state->index < 0 ||*/ state->index >= theLEDStateEngine.numberOfLeds)
return; // ignore LED entries, that are not setup correctly
state->currentTick++;
LEDState *state = LEDStateEngine_getLedState(ledNum);
state->currentTick = state->currentTick + 1;
// LOG(LL_INFO,("LEDState_tick(%d) %d", ledNum, state->currentTick));
if (state->currentTick == state->nextTick) {
// perform/initiate next state change
//LOG(LL_INFO, ("State change for led %d", ledNum));
state->currentAnimationStep = AnimationConfig_getNextAnimationStepForLED(ledNum, state->currentAnimationStep);
state->nextTick = state->currentTick + theAnimationConfig.animationStep[state->currentAnimationStep].durationTicks;
state->mode = theAnimationConfig.animationStep[state->currentAnimationStep].ledMode;
switch (state->mode) {
case LEDMode_on:
state->currentColor = state->onColor;
state->currentColor = state->ledDefinition->onColor; // state->onColor;
break;
case LEDMode_off:
state->currentColor = offColor;
@@ -79,35 +85,57 @@ static int verifyLedNumber(int n) {
return n;
}
void LEDstate_initDefault(int n, LEDMode defaultMode) {
void LEDState_initDefault(int n, LEDMode defaultMode) {
n = verifyLedNumber(n);
LEDState *state = &theLEDStateEngine.ledState[n];
state->index = n;
state->mode = defaultMode;
state->nextTick = 0;
state->ledDefinition = LEDDefinition_get(n);
}
void LEDstate_init(int n, LEDDefinition *ledDefinition) {
n = verifyLedNumber(n);
LEDstate_initDefault(n, LEDMode_off);
LEDState *state = LEDStateEngine_getLedState(n);
state->index = n;
state->mode = defaultMode;
state->currentTick = -10;
state->nextTick = 0;
state->ledDefinition = LEDDefinition_get(n);
state->currentAnimationStep = AnimationConfig_getNextAnimationStepForLED(n, 0);
}
void LEDState_init(int n, LEDDefinition *ledDefinition) {
n = verifyLedNumber(n);
LEDState_initDefault(n, LEDMode_off);
LEDState *state = LEDStateEngine_getLedState(n);
state->ledDefinition = ledDefinition;
state->onColor = ledDefinition->onColor;
// state->onColor = ledDefinition->onColor;
state->onColor.name = ledDefinition->onColor.name;
state->onColor.red = ledDefinition->onColor.red;
state->onColor.green = ledDefinition->onColor.green;
state->onColor.blue = ledDefinition->onColor.blue;
}
int LEDState_getLedRed(int ledNum) {
ledNum = verifyLedNumber(ledNum);
LEDState *state = LEDStateEngine_getLedState(ledNum);
return state->currentColor.red;
}
int LEDState_getLedGreen(int ledNum) {
ledNum = verifyLedNumber(ledNum);
LEDState *state = LEDStateEngine_getLedState(ledNum);
return state->currentColor.green;
}
int LEDState_getLedBlue(int ledNum) {
ledNum = verifyLedNumber(ledNum);
LEDState *state = LEDStateEngine_getLedState(ledNum);
return state->currentColor.blue;
}
char * LEDState_getLedColorName(int ledNum) {
ledNum = verifyLedNumber(ledNum);
LEDState *state = LEDStateEngine_getLedState(ledNum);
return state->currentColor.name;
}
int LEDState_getCurrentTick(int ledNum) {
ledNum = verifyLedNumber(ledNum);
LEDState *state = LEDStateEngine_getLedState(ledNum);
return state->currentTick;
}
int LEDState_getNextTick(int ledNum) {
ledNum = verifyLedNumber(ledNum);
LEDState *state = LEDStateEngine_getLedState(ledNum);
return state->nextTick;
}

View File

@@ -28,6 +28,8 @@ typedef struct LEDStateEngine_t {
char *comment;
} LEDStateEngine;
extern int getTicks(void);
/* LEDStateEngine */
extern void LEDStateEngine_init(int numberOfLeds);
extern void LEDStateEngine_addComment(char *comment);
@@ -37,11 +39,14 @@ extern void LEDStateEngine_tick();
extern uint16_t LEDStateEngine_getNumberOfLeds();
/* LEDState */
extern void LEDstate_init(int n, LEDDefinition *ledDefinition);
extern void LEDstate_initDefault(int n, LEDMode defaultMode);
extern void LEDState_init(int n, LEDDefinition *ledDefinition);
extern void LEDState_initDefault(int n, LEDMode defaultMode);
extern void LEDState_tick(int ledNum);
extern int LEDState_getLedRed(int ledNum);
extern int LEDState_getLedGreen(int ledNum);
extern int LEDState_getLedBlue(int ledNum);
extern char * LEDState_getLedColorName(int ledNum);
extern int LEDState_getCurrentTick(int ledNum);
extern int LEDState_getNextTick(int ledNum);
#endif

View File

@@ -37,9 +37,9 @@ int get_led_gpio_pin(void) {
LEDStateEngine ledStateEngine;
static bool stateEngineRunning = false;
static void timer_cb() {
static void stateEngineTickTimer() {
if (stateEngineRunning) {
LOG(LL_INFO, ("tick"));
// LOG(LL_INFO, ("digg"));
LEDStateEngine_tick();
} else {
LOG(LL_INFO, ("--paused--"));
@@ -47,12 +47,13 @@ static void timer_cb() {
}
static void delayed_boot() {
mgos_set_timer(100, true, timer_cb, NULL); // every 0.1 second call timer_cb
LOG(LL_INFO, ("*** Start timer for LED state engine ticks"));
mgos_set_timer(100, true, stateEngineTickTimer, NULL); // every 0.1 second call timer_cb
}
enum mgos_app_init_result mgos_app_init(void) {
int numberOfLeds = 20; /*mgos_sys_config_get_led_count()*/
bool loadDefaultData = true; /*mgos_sys_config_get_led_useDefaults()*/
int numberOfLeds = mgos_sys_config_get_led_count();
bool loadDefaultData = mgos_sys_config_get_led_useDefaults();
LEDColor_init(loadDefaultData);
LEDDefinition_init(numberOfLeds, loadDefaultData);
@@ -88,7 +89,9 @@ void addAnimationStep(int ledIndex, int ledMode, int duration) {
void startLEDStateEngine(void) {
stateEngineRunning = true;
LOG(LL_INFO, ("LEDStateEngine started"));
}
void pauseLEDStateEngine(void) {
stateEngineRunning = false;
LOG(LL_INFO, ("LEDStateEngine stopped"));
}