C++ runtime: WIP: untested PLCObject implementation. Still missing tracing.
// widget_assign.ysl2
widget_desc("Assign") {
longdesc
||
Arguments are either:
- name=value: setting variable with literal value.
- name=other_name: copy variable content into another
"active"+"inactive" labeled elements can be provided to show feedback when pressed
Exemples:
HMI:Assign:notify=1@notify=/PLCVAR
HMI:Assign:ack=2:notify=1@ack=.local_var@notify=/PLCVAR
||
shortdesc > Assign variables on click
}
widget_class("Assign") {
||
frequency = 2;
onmouseup(evt) {
svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
if(this.enable_state) {
this.activity_state = false
this.request_animate();
this.assign();
}
}
onmousedown(){
if(this.enable_state) {
svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
this.activity_state = true;
this.request_animate();
}
}
||
}
widget_defs("Assign") {
optional_activable();
| init: function() {
| this.bound_onmouseup = this.onmouseup.bind(this);
| this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
| },
| assignments: {},
| dispatch: function(value, oldval, varnum) {
const "widget", ".";
foreach "path" {
const "varid","generate-id()";
const "varnum","position()-1";
if "@assign" foreach "$widget/path[@assign]" if "$varid = generate-id()" {
| if(varnum == «$varnum») this.assignments["«@assign»"] = value;
}
}
| },
| assign: function() {
const "paths","path";
foreach "arg[contains(@value,'=')]"{
const "name","substring-before(@value,'=')";
const "value","substring-after(@value,'=')";
const "index" foreach "$paths" if "@assign = $name" value "position()-1";
const "isVarName", "regexp:test($value,'^[a-zA-Z_][a-zA-Z0-9_]*$')";
choose {
when "$isVarName"{
| const «$value» = this.assignments["«$value»"];
| if(«$value» != undefined)
| this.apply_hmi_value(«$index», «$value»);
}
otherwise {
| this.apply_hmi_value(«$index», «$value»);
}
}
}
| },
}