SVGHMI: Fixed typo on session manager unregister, leading to wrong count of sessions and then exceptions when creating more session than allowed in protocol options. Also added more safety check in protocol in case session would be missing.
// widget_input.ysl2
widget_desc("Input") {
longdesc
||
Input widget takes one variable path, and displays current value in
optional "value" labeled sub-element.
Click on optional "edit" labeled element opens keypad to edit value.
Operation on current value is performed when click on sub-elements with
label starting with '=', '+' or '-' sign. Value after sign is used as
operand.
||
shortdesc > Input field with predefined operation buttons
arg name="format" accepts="string" > optional printf-like format
path name="edit" accepts="HMI_INT, HMI_REAL, HMI_STRING" > single variable to edit
}
widget_class("Input")
||
on_op_click(opstr) {
this.change_hmi_value(0, opstr);
}
edit_callback(new_val) {
this.apply_hmi_value(0, new_val);
}
is_inhibited = false;
alert(msg){
this.is_inhibited = true;
this.display = msg;
setTimeout(() => this.stopalert(), 1000);
this.request_animate();
}
stopalert(){
this.is_inhibited = false;
this.display = this.last_value;
this.request_animate();
}
overshot(new_val, max) {
this.alert("max");
}
undershot(new_val, min) {
this.alert("min");
}
||
widget_defs("Input") {
const "value_elt" optional_labels("value");
const "have_value","string-length($value_elt)>0";
value "$value_elt";
const "edit_elt" optional_labels("edit");
const "have_edit","string-length($edit_elt)>0";
value "$edit_elt";
if "$have_value"
| frequency: 5,
| dispatch: function(value) {
if "$have_value or $have_edit" {
choose{
when "count(arg) = 1" {
| this.last_value = vsprintf("«arg[1]/@value»", [value]);
}
otherwise {
| this.last_value = value;
}
}
| if(!this.is_inhibited){
| this.display = this.last_value;
if "$have_value" {
| this.request_animate();
}
| }
}
| },
if "$have_value" {
| animate: function(){
| this.value_elt.textContent = String(this.display);
| },
}
| init: function() {
if "$have_edit" {
| this.edit_elt.onclick = () => edit_value("«path/@value»", "«path/@type»", this, this.last_value);
if "$have_value" {
| this.value_elt.style.pointerEvents = "none";
}
}
foreach "$hmi_element/*[regexp:test(@inkscape:label,'^[=+\-].+')]" {
| id("«@id»").onclick = () => this.on_op_click("«func:escape_quotes(@inkscape:label)»");
}
| },
}