Button fix if no active or inactive state, svghmi
authorusveticic
Thu, 01 Oct 2020 14:23:27 +0200
branchsvghmi
changeset 3062 9ec338a99a18
parent 3061 6dc33dae4074
child 3064 4b44d09c48a7
Button fix if no active or inactive state,
Widget animate changed to use anitmateTransform and added option to change rotation
Widget circular slider fixed so it is working on got and reprogramed so it similar to normal slider
Widget slider added support for changing size still need some changes to work properly
Added slider to svghmi test project
Changed svg in svhgmi_v2 project
svghmi/widget_animate.ysl2
svghmi/widget_button.ysl2
svghmi/widget_circularslider.ysl2
svghmi/widget_slider.ysl2
tests/svghmi/svghmi_0@svghmi/svghmi.svg
tests/svghmi_v2/plc.xml
tests/svghmi_v2/svghmi_0@svghmi/svghmi.svg
--- a/svghmi/widget_animate.ysl2	Wed Sep 30 12:31:59 2020 +0200
+++ b/svghmi/widget_animate.ysl2	Thu Oct 01 14:23:27 2020 +0200
@@ -5,9 +5,10 @@
     class AnimateWidget extends Widget{
         frequency = 5;
         speed = 0;
+        widget_center = undefined;
 
         dispatch(value) {
-            this.speed = value;
+            this.speed = value / 5;
 
             //reconfigure animation
             this.request_animate();
@@ -15,14 +16,29 @@
 
         animate(){
            // change animation properties
-           this.element.children[0].setAttribute("dur", String(this.speed)+"s")
+           for(let child of this.element.children){
+                if(child.nodeName == "animateTransform"){
+                    if(this.speed > 0){
+                        child.setAttribute("dur", this.speed+"s");
+                        child.setAttribute("from", "0 "+this.widget_center[0]+" "+this.widget_center[1]);
+                        child.setAttribute("to", "360 "+this.widget_center[0]+" "+this.widget_center[1]);
+                    }
+                    else if(this.speed < 0){
+                        child.setAttribute("dur", (-1)*this.speed+"s");
+                        child.setAttribute("from", "360 "+this.widget_center[0]+" "+this.widget_center[1]);
+                        child.setAttribute("to", "0 "+this.widget_center[0]+" "+this.widget_center[1]);
+                    }
+                    else{
+                        child.setAttribute("from", "0 "+this.widget_center[0]+" "+this.widget_center[1]);
+                        child.setAttribute("to", "0 "+this.widget_center[0]+" "+this.widget_center[1]);
+                    }
+                }
+           }
         }
 
         init() {
-             let width = this.element.getAttribute("width");
-             let height = this.element.getAttribute("height");
-             this.element.setAttribute("x",width/-2);
-             this.element.setAttribute("y",height/-2);
+            let widget_pos = this.element.getBBox();
+            this.widget_center = [(widget_pos.x+widget_pos.width/2), (widget_pos.y+widget_pos.height/2)];
         }
     }
     ||
--- a/svghmi/widget_button.ysl2	Wed Sep 30 12:31:59 2020 +0200
+++ b/svghmi/widget_button.ysl2	Thu Oct 01 14:23:27 2020 +0200
@@ -25,13 +25,15 @@
         }
 
         animate(){
-           // redraw button on screen refresh
-           if (this.state_hmi) {
-               this.active_elt.setAttribute("style", this.active_style);
-               this.inactive_elt.setAttribute("style", "display:none");
-           } else {
-               this.inactive_elt.setAttribute("style", this.inactive_style);
-               this.active_elt.setAttribute("style", "display:none");
+            if (this.active_style && this.inactive_style) {
+               // redraw button on screen refresh
+               if (this.state_hmi) {
+                   this.active_elt.setAttribute("style", this.active_style);
+                   this.inactive_elt.setAttribute("style", "display:none");
+               } else {
+                   this.inactive_elt.setAttribute("style", this.inactive_style);
+                   this.active_elt.setAttribute("style", "display:none");
+               }
            }
         }
 
--- a/svghmi/widget_circularslider.ysl2	Wed Sep 30 12:31:59 2020 +0200
+++ b/svghmi/widget_circularslider.ysl2	Thu Oct 01 14:23:27 2020 +0200
@@ -7,16 +7,33 @@
         range = undefined;
         circle = undefined;
         handle_pos = undefined;
-        svg_dist = undefined;
+        curr_value = 0;
         drag = false;
         enTimer = false;
         last_drag = false;
 
         dispatch(value) {
+            let [min,max,start,totallength] = this.range;
+            //save current value inside widget
+            this.curr_value = value;
+
+            //check if in range
+            if (this.curr_value > max){
+                this.curr_value = max;
+                this.apply_hmi_value(0, this.curr_value);
+            }
+            else if (this.curr_value < min){
+                this.curr_value = min;
+                this.apply_hmi_value(0, this.curr_value);
+            }
+
             if(this.value_elt)
                 this.value_elt.textContent = String(value);
 
-            this.update_DOM(value, this.handle_elt);
+            //don't update if draging and setpoint ghost doesn't exist
+            if(!this.drag || (this.setpoint_elt != undefined)){
+                this.update_DOM(value, this.handle_elt);
+            }
         }
 
         update_DOM(value, elt){
@@ -25,6 +42,7 @@
             let tip = this.range_elt.getPointAtLength(length);
             elt.setAttribute('transform',"translate("+(tip.x-this.handle_pos.x)+","+(tip.y-this.handle_pos.y)+")");
 
+            // show or hide ghost if exists
             if(this.setpoint_elt != undefined){
                 if(this.last_drag!= this.drag){
                     if(this.drag){
@@ -38,21 +56,28 @@
         }
 
         on_release(evt) {
+            //unbind events
             window.removeEventListener("touchmove", this.on_bound_drag, true);
             window.removeEventListener("mousemove", this.on_bound_drag, true);
 
             window.removeEventListener("mouseup", this.bound_on_release, true)
             window.removeEventListener("touchend", this.bound_on_release, true);
             window.removeEventListener("touchcancel", this.bound_on_release, true);
+
+            //reset drag flag
             if(this.drag){
                 this.drag = false;
             }
+
+            // get final position
             this.update_position(evt);
         }
 
         on_drag(evt){
+            //ignore drag event for X amount of time and if not selected
             if(this.enTimer && this.drag){
                 this.update_position(evt);
+
                 //reset timer
                 this.enTimer = false;
                 setTimeout("{hmi_widgets['"+this.element_id+"'].enTimer = true;}", 100);
@@ -103,40 +128,54 @@
 
                 //get handle distance from mouse position
                 if(fi<fiEnd){
-                    this.svg_dist=(fi)/(fiEnd)*(this.range[1]-this.range[0]);
+                   this.curr_value=(fi)/(fiEnd)*(this.range[1]-this.range[0]);
                 }
                 else if(fiEnd<fi && fi<fiEnd+minMax){
-                    this.svg_dist = this.range[1];
+                    this.curr_value = this.range[1];
                 }
                 else{
-                    this.svg_dist = this.range[0];
-                }
-
-
-                this.apply_hmi_value(0, Math.ceil(this.svg_dist));
-
-                // update ghost cursor
-                if(this.setpoint_elt != undefined){
-                    this.request_animate();
-                }
+                    this.curr_value = this.range[0];
+                }
+
+                //apply value to hmi
+                this.apply_hmi_value(0, Math.ceil(this.curr_value));
+
+                //redraw handle
+                this.request_animate();
+
             }
 
         }
 
         animate(){
-            this.update_DOM(this.svg_dist, this.setpoint_elt);
+            // redraw handle on screen refresh
+            // check if setpoint(ghost) handle exsist otherwise update main handle
+            if(this.setpoint_elt != undefined){
+                this.update_DOM(this.curr_value, this.setpoint_elt);
+            }
+            else{
+                this.update_DOM(this.curr_value, this.handle_elt);
+            }
         }
 
         on_select(evt){
+            //enable drag flag and timer
             this.drag = true;
             this.enTimer = true;
+
+            //bind events
             window.addEventListener("touchmove", this.on_bound_drag, true);
             window.addEventListener("mousemove", this.on_bound_drag, true);
 
-            window.addEventListener("mouseup", this.bound_on_release, true)
+            window.addEventListener("mouseup", this.bound_on_release, true);
             window.addEventListener("touchend", this.bound_on_release, true);
             window.addEventListener("touchcancel", this.bound_on_release, true);
+
+            //update postion on mouse press
             this.update_position(evt);
+
+            //prevent next events
+            evt.stopPropagation();
         }
 
         init() {
@@ -175,23 +214,19 @@
             this.bound_on_release = this.on_release.bind(this);
             this.on_bound_drag = this.on_drag.bind(this);
 
-            //init events
+            this.handle_elt.addEventListener("mousedown", this.bound_on_select);
             this.element.addEventListener("mousedown", this.bound_on_select);
             this.element.addEventListener("touchstart", this.bound_on_select);
-
+            //touch recognised as page drag without next command
+            document.body.addEventListener("touchstart", function(e){}, false);
+
+            //save ghost style
+            //save ghost style
             if(this.setpoint_elt != undefined){
                 this.setpoint_style = this.setpoint_elt.getAttribute("style");
                 this.setpoint_elt.setAttribute("style", "display:none");
             }
 
-
-            window.addEventListener("touchmove", hmi_widgets[this.element_id].update_position.bind(this));
-            window.addEventListener("mousemove", hmi_widgets[this.element_id].update_position.bind(this));
-
-            window.addEventListener("mouseup", hmi_widgets[this.element_id].on_release.bind(this))
-            window.addEventListener("touchend", hmi_widgets[this.element_id].on_release.bind(this));
-            window.addEventListener("touchcancel", hmi_widgets[this.element_id].on_release.bind(this));
-
         }
     }
     ||
@@ -199,6 +234,6 @@
 template "widget[@type='CircularSlider']", mode="widget_defs" {
     param "hmi_element";
     labels("handle range");
-    optional_labels("value min max");
+    optional_labels("value min max setpoint");
     |,
 }
--- a/svghmi/widget_slider.ysl2	Wed Sep 30 12:31:59 2020 +0200
+++ b/svghmi/widget_slider.ysl2	Thu Oct 01 14:23:27 2020 +0200
@@ -6,7 +6,9 @@
         frequency = 5;
         range = undefined;
         handle_orig = undefined;
-        scroll_size = 10;
+        scroll_size = undefined;
+        scroll_range = 0;
+        scroll_visible = 7;
         min_size = 0.07;
         fi = undefined;
         curr_value = 0;
@@ -15,16 +17,51 @@
         handle_click = undefined;
         last_drag = false;
 
-        dispatch(value) {
-            //save current value inside widget
-            this.curr_value = value;
-
-            if(this.value_elt)
-                this.value_elt.textContent = String(value);
+        dispatch(value,oldval, index) {
+            if (index == 0){
+                let [min,max,start,totallength] = this.range;
+                //save current value inside widget
+                this.curr_value = value;
+
+                //check if in range
+                if (this.curr_value > max){
+                    this.curr_value = max;
+                    this.apply_hmi_value(0, this.curr_value);
+                }
+                else if (this.curr_value < min){
+                    this.curr_value = min;
+                    this.apply_hmi_value(0, this.curr_value);
+                }
+
+                if(this.value_elt)
+                    this.value_elt.textContent = String(value);
+            }
+            else if(index == 1){
+                this.scroll_range = value;
+                this.set_scroll();
+            }
+            else if(index == 2){
+                this.scroll_visible = value;
+                this.set_scroll();
+            }
 
             //don't update if draging and setpoint ghost doesn't exist
             if(!this.drag || (this.setpoint_elt != undefined)){
-                this.update_DOM(value, this.handle_elt);
+                this.update_DOM(this.curr_value, this.handle_elt);
+            }
+        }
+
+        set_scroll(){
+            //check if range is bigger than visible and set scroll size
+            if(this.scroll_range > this.scroll_visible){
+                this.scroll_size = this.scroll_range - this.scroll_visible;
+                this.range[0] = 0;
+                this.range[1] = this.scroll_size;
+            }
+            else{
+                this.scroll_size = 1;
+                this.range[0] = 0;
+                this.range[1] = 1;
             }
         }
 
@@ -197,14 +234,13 @@
                 this.curr_value=Math.ceil((html_dist/range_length)*(this.range[1]-this.range[0])+this.range[0]);
             }
 
-            //check if in range
+            //check if in range and apply
             if (this.curr_value > max){
                 this.curr_value = max;
             }
             else if (this.curr_value < min){
                 this.curr_value = min;
             }
-
             this.apply_hmi_value(0, this.curr_value);
 
             //redraw handle
@@ -224,75 +260,45 @@
         }
 
         on_select(evt){
-            if (evt.currentTarget != this.up_elt || evt.currentTarget != this.down_elt){
-                //enable drag flag and timer
-                this.drag = true;
-                this.enTimer = true;
-
-                //bind events
-                window.addEventListener("touchmove", this.on_bound_drag, true);
-                window.addEventListener("mousemove", this.on_bound_drag, true);
-
-                window.addEventListener("mouseup", this.bound_on_release, true);
-                window.addEventListener("touchend", this.bound_on_release, true);
-                window.addEventListener("touchcancel", this.bound_on_release, true);
-
-                // check if handle was pressed
-                if (evt.currentTarget == this.handle_elt){
-                    //get mouse position on the handle
-                    let mouseX = undefined;
-                    let mouseY = undefined;
-                    if (evt.type.startsWith("touch")){
-                        mouseX = Math.ceil(evt.touches[0].clientX);
-                        mouseY = Math.ceil(evt.touches[0].clientY);
-                    }
-                    else{
-                        mouseX = evt.pageX;
-                        mouseY = evt.pageY;
-                    }
-                    //save coordinates and orig value
-                    this.handle_click = [mouseX,mouseY,this.curr_value];
+            //enable drag flag and timer
+            this.drag = true;
+            this.enTimer = true;
+
+            //bind events
+            window.addEventListener("touchmove", this.on_bound_drag, true);
+            window.addEventListener("mousemove", this.on_bound_drag, true);
+
+            window.addEventListener("mouseup", this.bound_on_release, true);
+            window.addEventListener("touchend", this.bound_on_release, true);
+            window.addEventListener("touchcancel", this.bound_on_release, true);
+
+            // check if handle was pressed
+            if (evt.currentTarget == this.handle_elt){
+                //get mouse position on the handle
+                let mouseX = undefined;
+                let mouseY = undefined;
+                if (evt.type.startsWith("touch")){
+                    mouseX = Math.ceil(evt.touches[0].clientX);
+                    mouseY = Math.ceil(evt.touches[0].clientY);
                 }
                 else{
-                    // get new handle position and reset if handle was not pressed
-                    this.handle_click = undefined;
-                    this.update_position(evt);
-                }
-
-                //prevent next events
-                evt.stopPropagation();
+                    mouseX = evt.pageX;
+                    mouseY = evt.pageY;
+                }
+                //save coordinates and orig value
+                this.handle_click = [mouseX,mouseY,this.curr_value];
             }
             else{
-                //prevent next events if up/down were pressed
-                evt.stopPropagation();
-            }
-        }
-
-        on_up_button(evt){
-            // go one position up and check if in bounds
-            this.curr_value = this.curr_value + 1;
-            if (this.curr_value > this.range[1]){
-                this.curr_value = this.range[1];
-            }
-
-            this.apply_hmi_value(0, this.curr_value);
-
-            //redraw handle
-            this.request_animate();
-        }
-
-        on_down_button(evt){
-            // go one position down
-            this.curr_value = this.curr_value - 1;
-            if (this.curr_value < this.range[0]){
-                this.curr_value = this.range[0];
-            }
-
-            this.apply_hmi_value(0, this.curr_value);
-
-            //redraw handle
-            this.request_animate();
-        }
+                // get new handle position and reset if handle was not pressed
+                this.handle_click = undefined;
+                this.update_position(evt);
+            }
+
+            //prevent next events
+            evt.stopPropagation();
+
+        }
+
 
         init() {
             //set min max value if not defined
@@ -303,13 +309,6 @@
                         Number(this.max_elt.textContent) :
                         this.args.length >= 2 ? this.args[1] : 100;
 
-            //init up down button if exists
-            if(this.up_elt){
-                this.up_elt.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_up_button(evt)");
-            }
-            if(this.down_elt){
-                this.down_elt.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_down_button(evt)");
-            }
 
             // save initial parameters
             this.range_elt.style.strokeMiterlimit="0";
@@ -325,9 +324,12 @@
             this.on_bound_drag = this.on_drag.bind(this);
 
             this.handle_elt.addEventListener("mousedown", this.bound_on_select);
-            this.range_elt.addEventListener("mousedown", this.bound_on_select);
-            this.range_elt.addEventListener("touchstart", this.bound_on_select);
-
+            this.element.addEventListener("mousedown", this.bound_on_select);
+            this.element.addEventListener("touchstart", this.bound_on_select);
+            //touch recognised as page drag without next command
+            document.body.addEventListener("touchstart", function(e){}, false);
+
+            //save ghost style
             if(this.setpoint_elt != undefined){
                 this.setpoint_style = this.setpoint_elt.getAttribute("style");
                 this.setpoint_elt.setAttribute("style", "display:none");
@@ -340,6 +342,6 @@
 template "widget[@type='Slider']", mode="widget_defs" {
     param "hmi_element";
     labels("handle range");
-    optional_labels("value min max setpoint up down");
+    optional_labels("value min max setpoint");
     |,
 }
--- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg	Wed Sep 30 12:31:59 2020 +0200
+++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg	Thu Oct 01 14:23:27 2020 +0200
@@ -16,7 +16,7 @@
    version="1.1"
    id="hmi0"
    sodipodi:docname="svghmi.svg"
-   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+   inkscape:version="0.92.5 (0.92.5+68)">
   <metadata
      id="metadata4542">
     <rdf:RDF>
@@ -197,16 +197,16 @@
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
      inkscape:document-units="px"
-     inkscape:current-layer="g1384"
+     inkscape:current-layer="hmi0"
      showgrid="false"
      units="px"
-     inkscape:zoom="1.0913159"
-     inkscape:cx="-911.00114"
-     inkscape:cy="181.96708"
-     inkscape:window-width="1800"
-     inkscape:window-height="836"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
+     inkscape:zoom="2.1826317"
+     inkscape:cx="-408.38959"
+     inkscape:cy="176.28106"
+     inkscape:window-width="1863"
+     inkscape:window-height="1176"
+     inkscape:window-x="57"
+     inkscape:window-y="24"
      inkscape:window-maximized="1"
      showguides="true"
      inkscape:guide-bbox="true" />
@@ -5223,6 +5223,9 @@
   <g
      id="g908"
      inkscape:label="HMI:VarInit:100@.range" />
+  <g
+     inkscape:label="HMI:VarInit:7@.visibleAlarms"
+     id="g906-3" />
   <rect
      style="color:#000000;fill:#4d4d4d"
      id="rect2015"
@@ -5549,32 +5552,53 @@
        sodipodi:type="star" />
   </g>
   <g
-     id="g1553"
-     transform="matrix(0.5,0,0,0.5,-774.48108,252.30551)">
+     id="g1766"
+     inkscape:label="HMI:Slider@.position@.range@.alarmVisible">
+    <g
+       transform="matrix(0.620824,0,0,0.5,-963.61047,260.72872)"
+       id="g1752"
+       inkscape:label="HMI:Input@.position">
+      <path
+         inkscape:label="+1"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.55573034px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         d="m 1175.2115,143.25263 34.1278,56.73732 h -68.2556 z"
+         id="path1266"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+      <path
+         inkscape:label="-1"
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path1268"
+         d="m 1175.2115,851.99803 34.1278,-54.90445 h -68.2556 z"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.51411843px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    </g>
+    <path
+       style="opacity:0;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00058591px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M -234.01102,648.56465 V 371.89445"
+       id="path1772"
+       inkscape:connector-curvature="0"
+       inkscape:label="range" />
     <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.30952382;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.03627348px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect1264-3"
+       width="42.374725"
+       height="276.64423"
+       x="-255.19838"
+       y="371.91068"
+       rx="7.6034913"
+       ry="6.8822322"
+       inkscape:label="background" />
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.11429262px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
        id="rect1264"
-       width="68.255615"
-       height="165.68298"
-       x="1141.0836"
-       y="420.78394"
-       rx="12.247418"
-       ry="14"
-       inkscape:label="cursor" />
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path1266"
-       d="m 1175.2115,371.25263 34.1278,34.74552 h -68.2556 z"
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       inkscape:label="backward" />
-    <path
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 1175.2115,635.99803 34.1278,-34.7453 h -68.2556 z"
-       id="path1268"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc"
-       inkscape:label="forward" />
+       width="42.374725"
+       height="82.841492"
+       x="-255.19838"
+       y="565.71338"
+       rx="7.6034913"
+       ry="7"
+       inkscape:label="handle" />
   </g>
   <g
      id="g893"
@@ -6029,16 +6053,6 @@
        x="-546.47461"
        id="tspan2172"
        sodipodi:role="line">Status</tspan></text>
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="-241.25107"
-     y="513.61072"
-     id="text2184"><tspan
-       sodipodi:role="line"
-       id="tspan2182"
-       x="-241.25107"
-       y="513.61072">TODO</tspan></text>
   <g
      transform="matrix(0.57180538,0,0,0.57180538,226.35945,-231.48695)"
      inkscape:label="HMI:Jump:AlarmPage"
--- a/tests/svghmi_v2/plc.xml	Wed Sep 30 12:31:59 2020 +0200
+++ b/tests/svghmi_v2/plc.xml	Thu Oct 01 14:23:27 2020 +0200
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2019-08-06T14:23:42"/>
-  <contentHeader name="Unnamed" modificationDateTime="2020-09-23T16:29:40">
+  <contentHeader name="Unnamed" modificationDateTime="2020-09-30T13:04:27">
     <coordinateInfo>
       <fbd>
         <scaling x="5" y="5"/>
@@ -77,7 +77,7 @@
             </variable>
             <variable name="Speed">
               <type>
-                <derived name="HMI_REAL"/>
+                <derived name="HMI_INT"/>
               </type>
             </variable>
           </localVars>
--- a/tests/svghmi_v2/svghmi_0@svghmi/svghmi.svg	Wed Sep 30 12:31:59 2020 +0200
+++ b/tests/svghmi_v2/svghmi_0@svghmi/svghmi.svg	Thu Oct 01 14:23:27 2020 +0200
@@ -16,7 +16,7 @@
    version="1.1"
    id="hmi0"
    sodipodi:docname="svghmi.svg"
-   inkscape:version="0.92.5 (0.92.5+68)"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
    inkscape:label="Layer">
   <metadata
      id="metadata4542">
@@ -109,13 +109,13 @@
      inkscape:current-layer="hmi0"
      showgrid="false"
      units="px"
-     inkscape:zoom="1.4142136"
-     inkscape:cx="660.12647"
-     inkscape:cy="334.93826"
-     inkscape:window-width="2503"
-     inkscape:window-height="1416"
-     inkscape:window-x="57"
-     inkscape:window-y="24"
+     inkscape:zoom="0.7071068"
+     inkscape:cx="-76.932824"
+     inkscape:cy="317.38961"
+     inkscape:window-width="1920"
+     inkscape:window-height="1137"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
      inkscape:window-maximized="1"
      showguides="true"
      inkscape:guide-bbox="true" />
@@ -129,7 +129,7 @@
      inkscape:label="HMI:Page:Home"
      sodipodi:insensitive="true" />
   <g
-     inkscape:label="HMI:Slider@/PUMP0/SLOTH"
+     inkscape:label="HMI:Slider@/SPEED"
      transform="matrix(7.5590552,0,0,7.5590552,-710.78539,551.61779)"
      id="g110-0">
     <path
@@ -1620,19 +1620,47 @@
        id="rect477hjoj"
        style="opacity:1;fill:#ff0015;fill-opacity:1;stroke:none" />
   </g>
-  <image
-     y="128.18585"
-     x="899.05353"
-     id="fan_rotatte"
-     xlink:href="data:image/png;base64,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 pwU/G0JIJP1/qNlc/9VTTLcAAAAASUVORK5CYII= "
-     preserveAspectRatio="none"
-     height="294"
-     width="312"
+  <g
+     id="g1439"
      inkscape:label="HMI:Animate@/SPEED">
-    <animateMotion
-       path="M 1060.6274,332 A 22.627417,23.688076 0 0 1 1038,355.68808 22.627417,23.688076 0 0 1 1015.3726,332 22.627417,23.688076 0 0 1 1038,308.31192 22.627417,23.688076 0 0 1 1060.6274,332 Z"
-       dur="0.5s"
-       rotate="auto"
+    <animateTransform
+       attributeName="transform"
+       attributeType="XML"
+       type="rotate"
+       from="0 1049 278"
+       to="360 1049 278"
+       dur="1s"
        repeatCount="indefinite" />
-  </image>
+    <circle
+       r="32.057827"
+       cy="278.18585"
+       cx="1049.0535"
+       id="path1380"
+       style="fill:#ececec;fill-opacity:1;stroke:#ff0000;stroke-width:2.95733476;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <rect
+       y="128.18585"
+       x="899.05353"
+       height="300"
+       width="300"
+       id="rect1382"
+       style="opacity:0;fill:#ececec;fill-opacity:1;stroke:none;stroke-width:3.69000006;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="sssssss"
+       inkscape:connector-curvature="0"
+       id="path1388"
+       d="m 1021.7548,245.83452 c 1.9692,9.54564 9.417,-4.37059 26.6751,-4.06174 27.2477,0.48762 30.0401,21.24497 35.5749,12.81174 6.6594,-10.14673 12.6699,-22.7446 14.75,-33.25 13.5509,-68.43783 -46.4736,-97.18589 -72,-91.49999 -40.88858,9.10778 -49.54078,47.21136 -31.99998,71.75 13.16428,18.41615 23.37448,26.67508 26.99998,44.24999 z"
+       style="fill:#fd0000;fill-opacity:1;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="sssssss"
+       inkscape:connector-curvature="0"
+       id="path1388-9"
+       d="m 1091.4532,274.25975 c -8.9783,-3.79302 -1.7422,10.23457 -11.7862,24.27224 -15.8577,22.16324 -34.5364,12.68834 -30.7308,22.03024 4.5788,11.24 11.5443,23.3361 19.0162,31.0083 48.6752,49.9808 106.3992,16.8549 116.1963,-7.3926 15.6932,-38.84015 -10.7791,-67.57972 -40.9378,-67.05341 -22.634,0.39495 -35.2273,4.11873 -51.7577,-2.86477 z"
+       style="fill:#fd0000;fill-opacity:1;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="sssssss"
+       inkscape:connector-curvature="0"
+       id="path1388-9-8"
+       d="m 1032.8567,317.85643 c 7.5732,-6.1355 -8.2092,-6.3552 -15.8654,-21.82523 -12.0882,-24.42445 5.0646,-36.44319 -4.9688,-37.48364 -12.07218,-1.25186 -26.02318,-0.80116 -36.30958,2.17903 -67.0109,19.41388 -64.9607,85.93594 -48.1806,105.99474 26.8787,32.1304 64.6969,22.3051 78.43058,-4.5502 10.3071,-20.1549 12.9505,-33.0184 26.8938,-44.3147 z"
+       style="fill:#fd0000;fill-opacity:1;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
 </svg>