159 lines
4.6 KiB
TypeScript
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);
|
|
}
|
|
}
|