dgaberscek@2944: // widget_circularbar.ysl2 dgaberscek@2944: dgaberscek@2944: dgaberscek@2944: template "widget[@type='CircularBar']", mode="widget_defs" { dgaberscek@2944: param "hmi_element"; dgaberscek@2944: | frequency: 10, dgaberscek@2944: labels("path"); dgaberscek@2944: optional_labels("value min max"); dgaberscek@2944: | dispatch: function(value) { dgaberscek@2944: | if(this.value_elt) dgaberscek@2944: | this.value_elt.textContent = String(value); dgaberscek@2944: | let [min,max,start,end] = this.range; dgaberscek@2944: | let [cx,cy] = this.center; dgaberscek@2944: | let [rx,ry] = this.proportions; dgaberscek@2944: | let tip = start + (end-start)*Number(value)/(max-min); dgaberscek@2944: | let size = 0; dgaberscek@2944: | if (tip-start > Math.PI) { dgaberscek@2944: | size = 1; dgaberscek@2944: | } else { dgaberscek@2944: | size = 0; dgaberscek@2944: | } dgaberscek@2944: | this.path_elt.setAttribute('d', "M "+(cx+rx*Math.cos(start))+","+(cy+ry*Math.sin(start))+" A "+rx+","+ry+" 0 "+size+" 1 "+(cx+rx*Math.cos(tip))+","+(cy+ry*Math.sin(tip))); dgaberscek@2944: | }, dgaberscek@2944: | range: undefined, dgaberscek@2944: | init: function() { dgaberscek@2944: | let start = Number(this.path_elt.getAttribute('sodipodi:start')); dgaberscek@2944: | let end = Number(this.path_elt.getAttribute('sodipodi:end')); dgaberscek@2944: | let cx = Number(this.path_elt.getAttribute('sodipodi:cx')); dgaberscek@2944: | let cy = Number(this.path_elt.getAttribute('sodipodi:cy')); dgaberscek@2944: | let rx = Number(this.path_elt.getAttribute('sodipodi:rx')); dgaberscek@2944: | let ry = Number(this.path_elt.getAttribute('sodipodi:ry')); dgaberscek@2944: | if (ry == 0) { dgaberscek@2944: | ry = rx; dgaberscek@2944: | } dgaberscek@2944: | if (start > end) { dgaberscek@2944: | end = end + 2*Math.PI; dgaberscek@2944: | } dgaberscek@2944: | let min = this.min_elt ? dgaberscek@2944: | Number(this.min_elt.textContent) : dgaberscek@2944: | this.args.length >= 1 ? this.args[0] : 0; dgaberscek@2944: | let max = this.max_elt ? dgaberscek@2944: | Number(this.max_elt.textContent) : dgaberscek@2944: | this.args.length >= 2 ? this.args[1] : 100; dgaberscek@2944: | this.range = [min, max, start, end]; dgaberscek@2944: | this.center = [cx, cy]; dgaberscek@2944: | this.proportions = [rx, ry]; dgaberscek@2944: | }, dgaberscek@2944: }