Tests: Enhance robustness of stdout driven waiting state in Sikuli based tests.
Some tests were randomly passing, because from time to time waiting for idle was skiped. It was combination of multiple problems :
- buffering on stdout (now use readline + flush for each write to log)
- it is sometime required to wait for activity before waiting for timeout added "WaitForChangeAndIdle" to "stdoutIdleObserver"
// 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)»");
}
| },
}