Added new mode: Scheduler -- clock based switching of lights

This commit is contained in:
2017-12-09 22:10:59 +01:00
parent 626fe42a90
commit 4aeebe1b33
12 changed files with 290 additions and 50 deletions

View File

@@ -61,6 +61,8 @@ let configNumLeds = Cfg.get('led.count');
let colorFile = Cfg.get('led.colorFile');
let animationFile = Cfg.get('led.animationFile');
let lampsFile = Cfg.get('led.lampsFile');
let scheduleFile = Cfg.get('led.scheduleFile');
let dynamicMode = Cfg.get('led.mode');
let useDefaults = Cfg.get('led.useDefaults');
let tickDuration = Cfg.get('led.tickDuration');
let numberOfLeds = configNumLeds, numberOfLedDefs = 0; // from config files, count led definition entries
@@ -155,6 +157,41 @@ function loadAnimDefs() {
json = null;
}
function loadScheduleDefs() {
// Load Animation Definitions
let json = File.read(scheduleFile);
let scheduleDef = [];
print('scheduleFile =', json);
if (json === '') {
print('ERROR: Schedule definition file does not exist!');
} else {
scheduleDef = JSON.parse(json);
}
LEDScheduler_init(scheduleDef.schedule.length, numberOfLeds, pin);
LEDScheduler_setWatch(2, 0, 1); // time 02:00, clock speed = 1 real time second per model minute
let ledMapping = scheduleDef.lampmapping;
let mapLed = function (name) {
for (let i=0; i<ledMapping.length; ++i) {
if (ledMapping[i] === name) return i;
}
print("**** ERROR in schedule definition file: no lamp mapping found for lamp", name);
return 0;
};
for (i=0; i<scheduleDef.schedule.length; ++i) {
print('- addScheduleItem', scheduleDef.schedule[i].time.h, ":", scheduleDef.schedule[i].time.m, "/",
scheduleDef.schedule[i].lamp, "=", mapLed(scheduleDef.schedule[i].lamp), "/",
scheduleDef.schedule[i].mode, "/",
scheduleDef.schedule[i].color);
LEDScheduler_addItem(scheduleDef.schedule[i].time.h, scheduleDef.schedule[i].time.m,
mapLed(scheduleDef.schedule[i].lamp),
scheduleDef.schedule[i].mode,
scheduleDef.schedule[i].color);
}
json = null;
}
function initialize() {
print('***** Start initialization', getInfo());
let i;
@@ -165,10 +202,30 @@ function initialize() {
startLEDStateEngine();
} else {
loadColorDefs();
loadLedDefs();
loadAnimDefs();
// Initialize LED State Engine
LEDStateEngine_init(pin, numberOfLeds);
if (dynamicMode === "animation") {
loadLedDefs();
loadAnimDefs();
// Initialize LED State Engine
LEDStateEngine_init(pin, numberOfLeds);
print('LED', 'Color', 'R', 'G', 'B', 'Tick', 'Level', 'Room', 'Id');
print('---', '-----', '---', '---', '-----', '---', '-----', '----', '--');
for (i=0; i<numberOfLeds; ++i) {
// print(i, LEDState_getRed(i), LEDState_getGreen(i), LEDState_getBlue(i), LEDState_getCurrentTick(i), LEDDefinition_getLevel(i), LEDDefinition_getRoom(i), LEDDefinition_getId(i))
print(i, LEDState_getColorName(i),
LEDDefinition_getOnColorRed(i),
LEDDefinition_getOnColorGreen(i),
LEDDefinition_getOnColorBlue(i),
LEDState_getCurrentTick(i),
LEDDefinition_getLevel(i),
LEDDefinition_getRoom(i),
LEDDefinition_getId(i));
}
} else if (dynamicMode === "schedule") {
loadScheduleDefs();
} else {
print("**** ERROR: Unknown dynamic mode", dynamicMode);
return;
}
}
allLedOff();
print('***** End of initialization', getInfo());
@@ -177,20 +234,7 @@ function initialize() {
print('NumLEDs:', numberOfLeds);
print('Ticks:', getTicks());
print('Tick duration:', tickDuration, 'ms');
print('Brightness:', LEDStateEngine_getBrightness(), '%');
print('LED', 'Color', 'R', 'G', 'B', 'Tick', 'Level', 'Room', 'Id');
print('---', '-----', '---', '---', '-----', '---', '-----', '----', '--');
for (i=0; i<numberOfLeds; ++i) {
// print(i, LEDState_getRed(i), LEDState_getGreen(i), LEDState_getBlue(i), LEDState_getCurrentTick(i), LEDDefinition_getLevel(i), LEDDefinition_getRoom(i), LEDDefinition_getId(i))
print(i, LEDState_getColorName(i),
LEDDefinition_getOnColorRed(i),
LEDDefinition_getOnColorGreen(i),
LEDDefinition_getOnColorBlue(i),
LEDState_getCurrentTick(i),
LEDDefinition_getLevel(i),
LEDDefinition_getRoom(i),
LEDDefinition_getId(i));
}
print('Brightness:', NeoPixel_getBrightness(), '%');
}
Timer.set(300, false, function() {
@@ -200,8 +244,14 @@ Timer.set(300, false, function() {
allLedOff();
print('***** LED test pattern', getInfo());
showLedTestPattern();
print('***** Start LED state engine and LED-update timer', getInfo());
LEDStateEngine_start();
if (dynamicMode === "animation") {
print('***** Start LED state engine and LED-update timer', getInfo());
LEDStateEngine_start();
} else if (dynamicMode === "schedule") {
print('***** Start schedule based animation', getInfo());
NeoPixel_clear();
LEDScheduler_run();
}
Timer.set(30000, true, function() {
print("Timer: minTickTime =", LEDStateEngine_getMinTickTime(),
"ms, maxTickTime =", LEDStateEngine_getMaxTickTime(), "ms");
@@ -215,7 +265,7 @@ RPC.addHandler('led.setBrightness', function(args) {
// print(args);
if (args !== undefined && args.level !== undefined) {
if (args.level > 0 && args.level <= 100) {
LEDStateEngine_setBrightness(args.level);
NeoPixel_setBrightness(args.level);
return { result: 'ok' };
} else {
return { error: 'Brightness level must be in the range 1..100' };
@@ -226,7 +276,7 @@ RPC.addHandler('led.setBrightness', function(args) {
}, "{level: %d}");
print(' led.getBrightness');
RPC.addHandler('led.getBrightness', function(args) {
let brightness = LEDStateEngine_getBrightness();
let brightness = NeoPixel_getBrightness();
return { result: 'ok', brightness: brightness };
}, null);
print(' led.pause');