CameraTrigger/ts/mainview.ts

159 lines
4.6 KiB
TypeScript

/*
* SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
/// <reference path="view.ts" />
/// <reference path="cameratrigger.ts" />
class MainView extends View {
constructor(app: CameraTrigger) {
super(app);
if (!this.app.pinMapping) {
this.app.getPinMapping(this, this.render);
} else {
this.render();
}
}
finish() {
}
render() {
var template = $("#tplMain").html();
var data:any = {};
data.l = this.app.lang;
var keys = Object.keys(this.app.pinMapping);
data.pinmapping = [];
keys.forEach(function(key){
var pin = this.app.pinMapping[key];
if (pin[1] !== "none" && pin[1] !== "trigger") {
data.pinmapping.push({pin: key, name: pin[0]});
}
});
var html = Mustache.render(template, data);
this.root.html(html);
this.root.find("button.add").on("click", this, this.addTime);
this.root.on("click","button.del", this, this.delTime);
this.root.find(".minmax").on("click", this, this.toggleExpansion);
this.root.find("#trigger button.trigger").on("click", this, this.trigger);
this.root.find("#trigger button.save").on("click", this, this.save);
}
addTime(event: JQuery.TriggeredEvent) {
event.preventDefault();
var target = $(event.currentTarget);
var template = $("#tplMainTime").html();
var data:any = {};
var fform = target.parents(".fform");
data.name = fform.data("pin");
data.index = fform.find(".time").length;
data.delta = event.data.app.pinMapping[data.name][1]==="digitalout";
data.l = event.data.app.lang;
var html = Mustache.render(template, data);
target.before(html);
}
delTime(event: JQuery.TriggeredEvent) {
event.preventDefault();
var target = $(event.currentTarget).parent();
target.remove();
}
toggleExpansion(event: JQuery.TriggeredEvent) {
event.preventDefault();
var form = $(event.currentTarget).parents("div.fform")
form.toggleClass("min");
return false;
}
trigger(event: JQuery.TriggeredEvent) {
event.preventDefault();
event.data.realTrigger(true)
}
save(event: JQuery.TriggeredEvent) {
event.preventDefault();
event.data.realTrigger(false)
}
realTrigger(alsoTrigger: boolean) {
// get list of active pins
var times={};
var inputs = this.root.find("form").serializeArray();
for (var i = 0 ; i < inputs.length; ++i) {
var tokens = inputs[i].name.split("_");
var type = tokens[0]
var pin = parseInt(tokens[1].substr(1));
var time = parseInt(inputs[i].value);
if (type === "delta") {
time += parseInt(inputs[i-1].value);
}
if (!times[time]) {
times[time] = [];
}
var start = type === "start";
if (this.app.pinMapping[tokens[1]][2]) // inverted
start = !start;
switch (this.app.pinMapping[tokens[1]][1]) { // type
case "digitalout":
times[time].push((start ? "E" : "D") + pin);
break;
case "ircanon":
times[time].push("C" + pin);
break;
case "irnikon":
times[time].push("N" + pin);
break;
case "irsony":
times[time].push("S" + pin);
break;
}
}
var keys = Object.keys(times).sort(function(a,b){var A=parseInt(a);var B=parseInt(b);return A<B ? -1 : ((A==B) ? 0 : 1);});
var cmdString = "";
var curTime = 0;
var needDelay = 0;
this.root.find(".error").html("");
for (var j = 0; j < keys.length ; ++j) {
var diff = parseInt(keys[j]) - curTime;
if (needDelay > diff) {
var err = this.app.lang.main.needpause.replace("$1", needDelay);
$.toast({
text: err,
position: 'top-right',
icon: 'error'
});
this.root.find(".error").html(err);
return;
}
if (diff>0) {
cmdString += "d" + diff + ";";
}
needDelay = 0;
times[keys[j]].forEach(function(a) {
if (a[0] === 'C')
needDelay = 10;
else if (a[0] === 'N')
needDelay = 136;
else if (a[0] === 'S')
needDelay = 39;
});
cmdString += times[keys[j]].join(";") + ";";
curTime = parseInt(keys[j]);
}
//check for trigger
keys = Object.keys(this.app.pinMapping)
for (var k = 0; k < keys.length ; ++k) {
if (this.app.pinMapping[keys[k]][1] === "trigger") {
cmdString += "T" + keys[k].substr(1) + ";";
}
console.log(this.app.pinMapping[keys[k]]);
}
Api.post("/run", {"cmd": cmdString, "trigger": alsoTrigger}, this, this.app.success, this.app.error);
}
}