svghmi/widget_display.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Sat, 05 Mar 2022 11:14:00 +0100
branchwxPython4
changeset 3437 ce366d67a5b7
parent 3329 d44b6346d4c2
child 3524 27d298c6f961
permissions -rw-r--r--
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_display.ysl2

widget_desc("Display") {
    longdesc
    ||
    If Display widget is a svg:text element, then text content is replaced by
    value of given variables, space separated.

    Otherwise, if Display widget is a group containing a svg:text element
    labelled "format", then text content is replaced by printf-like formated
    string. In other words, if "format" labeled text is "%d %s %f", then 3
    variables paths are expected : HMI_IN, HMI_STRING and HMI_REAL.

    In case Display widget is a svg::text element, it is also possible to give
    format string as first argument.
    ||

    shortdesc > Printf-like formated text display 

    arg name="format" count="optional" accepts="string" > printf-like format string when not given as svg:text

    path name="fields" count="many" accepts="HMI_INT,HMI_REAL,HMI_STRING,HMI_BOOL" > variables to be displayed
    
}


widget_class("Display")
    ||
        frequency = 5;
        dispatch(value, oldval, index) {
            this.fields[index] = value;    
            this.request_animate();
        }
    ||

widget_defs("Display") {
    const "format" optional_labels("format");
    const "has_format","string-length($format)>0";
    value "$format";

    if "$hmi_element[not(self::svg:text)] and not($has_format)"
        error > Display Widget id="«$hmi_element/@id»" must be a svg::text element itself or a group containing a svg:text element labelled "format"

    const "field_initializer" foreach "path" {
        choose{
            when "@type='HMI_STRING'" > ""
            otherwise > 0
        }
        if "position()!=last()" > ,
    }
    |     fields: [«$field_initializer»],
    |     animate: function(){
    choose {
        when "$has_format" {
    |       if(this.format_elt.getAttribute("lang")) {
    |           this.format = svg_text_to_multiline(this.format_elt);
    |           this.format_elt.removeAttribute("lang");
    |       }
    |       let str = vsprintf(this.format,this.fields);
    |       multiline_to_svg_text(this.format_elt, str);
        }
        otherwise {
    |       let str = this.args.length == 1 ? vsprintf(this.args[0],this.fields) : this.fields.join(' ');
    |       multiline_to_svg_text(this.element, str);
        }
    }
    |     },
    |     
    if "$has_format" {
    |     init: function() {
    |       this.format = svg_text_to_multiline(this.format_elt);
    |     },
    }
}