svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 3017 15e2df3e5610
parent 3008 dabad70db1bf
child 3022 f6fe42b7ce60
equal deleted inserted replaced
3008:dabad70db1bf 3017:15e2df3e5610
   167               <xsl:attribute name="value">
   167               <xsl:attribute name="value">
   168                 <xsl:value-of select="."/>
   168                 <xsl:value-of select="."/>
   169               </xsl:attribute>
   169               </xsl:attribute>
   170               <xsl:variable name="path" select="."/>
   170               <xsl:variable name="path" select="."/>
   171               <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/>
   171               <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/>
   172               <xsl:if test="count($item) = 1">
   172               <xsl:choose>
   173                 <xsl:attribute name="index">
   173                 <xsl:when test="count($item) = 1">
   174                   <xsl:value-of select="$item/@index"/>
   174                   <xsl:attribute name="index">
   175                 </xsl:attribute>
   175                     <xsl:value-of select="$item/@index"/>
   176                 <xsl:attribute name="type">
   176                   </xsl:attribute>
   177                   <xsl:value-of select="local-name($item)"/>
   177                   <xsl:attribute name="type">
   178                 </xsl:attribute>
   178                     <xsl:value-of select="local-name($item)"/>
   179               </xsl:if>
   179                   </xsl:attribute>
       
   180                 </xsl:when>
       
   181                 <xsl:otherwise>
       
   182                   <xsl:choose>
       
   183                     <xsl:when test="regexp:test($path,'^\.[a-zA-Z0-9_]+')">
       
   184                       <xsl:attribute name="type">
       
   185                         <xsl:text>PAGE_LOCAL</xsl:text>
       
   186                       </xsl:attribute>
       
   187                     </xsl:when>
       
   188                     <xsl:when test="regexp:test($path,'^[a-zA-Z0-9_]+')">
       
   189                       <xsl:attribute name="type">
       
   190                         <xsl:text>HMI_LOCAL</xsl:text>
       
   191                       </xsl:attribute>
       
   192                     </xsl:when>
       
   193                   </xsl:choose>
       
   194                 </xsl:otherwise>
       
   195               </xsl:choose>
   180             </path>
   196             </path>
   181           </xsl:if>
   197           </xsl:if>
   182         </xsl:for-each>
   198         </xsl:for-each>
   183       </widget>
   199       </widget>
   184     </xsl:if>
   200     </xsl:if>
   843     </xsl:variable>
   859     </xsl:variable>
   844     <xsl:variable name="indexes">
   860     <xsl:variable name="indexes">
   845       <xsl:for-each select="$widget/path">
   861       <xsl:for-each select="$widget/path">
   846         <xsl:choose>
   862         <xsl:choose>
   847           <xsl:when test="not(@index)">
   863           <xsl:when test="not(@index)">
   848             <xsl:message terminate="no">
   864             <xsl:choose>
   849               <xsl:text>Widget </xsl:text>
   865               <xsl:when test="not(@type)">
   850               <xsl:value-of select="$widget/@type"/>
   866                 <xsl:message terminate="yes">
   851               <xsl:text> id="</xsl:text>
   867                   <xsl:text>Widget </xsl:text>
   852               <xsl:value-of select="$eltid"/>
   868                   <xsl:value-of select="$widget/@type"/>
   853               <xsl:text>" : No match for path "</xsl:text>
   869                   <xsl:text> id="</xsl:text>
   854               <xsl:value-of select="@value"/>
   870                   <xsl:value-of select="$eltid"/>
   855               <xsl:text>" in HMI tree</xsl:text>
   871                   <xsl:text>" : No match for path "</xsl:text>
   856             </xsl:message>
   872                   <xsl:value-of select="@value"/>
       
   873                   <xsl:text>" in HMI tree</xsl:text>
       
   874                 </xsl:message>
       
   875               </xsl:when>
       
   876               <xsl:when test="@type = 'PAGE_LOCAL'">
       
   877                 <xsl:text>"</xsl:text>
       
   878                 <xsl:value-of select="substring(1,@value)"/>
       
   879                 <xsl:text>"</xsl:text>
       
   880                 <xsl:if test="position()!=last()">
       
   881                   <xsl:text>,</xsl:text>
       
   882                 </xsl:if>
       
   883               </xsl:when>
       
   884               <xsl:when test="@type = 'HMI_LOCAL'">
       
   885                 <xsl:text>hmi_local_index("</xsl:text>
       
   886                 <xsl:value-of select="@value"/>
       
   887                 <xsl:text>")</xsl:text>
       
   888                 <xsl:if test="position()!=last()">
       
   889                   <xsl:text>,</xsl:text>
       
   890                 </xsl:if>
       
   891               </xsl:when>
       
   892             </xsl:choose>
   857           </xsl:when>
   893           </xsl:when>
   858           <xsl:otherwise>
   894           <xsl:otherwise>
   859             <xsl:value-of select="@index"/>
   895             <xsl:value-of select="@index"/>
   860             <xsl:if test="position()!=last()">
   896             <xsl:if test="position()!=last()">
   861               <xsl:text>,</xsl:text>
   897               <xsl:text>,</xsl:text>
   903       <xsl:otherwise>
   939       <xsl:otherwise>
   904         <func:result select="$elts_with_type"/>
   940         <func:result select="$elts_with_type"/>
   905       </xsl:otherwise>
   941       </xsl:otherwise>
   906     </xsl:choose>
   942     </xsl:choose>
   907   </func:function>
   943   </func:function>
   908   <preamble:widget-base-class/>
   944   <preamble:local-variable-indexes/>
   909   <xsl:template match="preamble:widget-base-class">
   945   <xsl:template match="preamble:local-variable-indexes">
   910     <xsl:text>
   946     <xsl:text>
   911 </xsl:text>
   947 </xsl:text>
   912     <xsl:text>/* </xsl:text>
   948     <xsl:text>/* </xsl:text>
   913     <xsl:value-of select="local-name()"/>
   949     <xsl:value-of select="local-name()"/>
   914     <xsl:text> */
   950     <xsl:text> */
   915 </xsl:text>
   951 </xsl:text>
   916     <xsl:text>
   952     <xsl:text>
   917 </xsl:text>
   953 </xsl:text>
       
   954     <xsl:text>let hmi_locals = {};
       
   955 </xsl:text>
       
   956     <xsl:text>var last_remote_index = hmitree_types.length - 1;
       
   957 </xsl:text>
       
   958     <xsl:text>var next_available_index = hmitree_types.length;
       
   959 </xsl:text>
       
   960     <xsl:text>
       
   961 </xsl:text>
       
   962     <xsl:text>function page_local_index(varname, pagename){
       
   963 </xsl:text>
       
   964     <xsl:text>    let pagevars = hmi_locals[pagename];
       
   965 </xsl:text>
       
   966     <xsl:text>    if(pagevars == undefined){
       
   967 </xsl:text>
       
   968     <xsl:text>        let new_index = next_available_index++;
       
   969 </xsl:text>
       
   970     <xsl:text>        hmi_locals[pagename] = {varname:new_index}
       
   971 </xsl:text>
       
   972     <xsl:text>        return new_index;
       
   973 </xsl:text>
       
   974     <xsl:text>    } else {
       
   975 </xsl:text>
       
   976     <xsl:text>        let result = pagevars[varname];
       
   977 </xsl:text>
       
   978     <xsl:text>        if(result==undefined){
       
   979 </xsl:text>
       
   980     <xsl:text>            let new_index = next_available_index++;
       
   981 </xsl:text>
       
   982     <xsl:text>            pagevars[varname] = new_index;
       
   983 </xsl:text>
       
   984     <xsl:text>            return new_index;
       
   985 </xsl:text>
       
   986     <xsl:text>        }
       
   987 </xsl:text>
       
   988     <xsl:text>        return result;
       
   989 </xsl:text>
       
   990     <xsl:text>    }
       
   991 </xsl:text>
       
   992     <xsl:text>}
       
   993 </xsl:text>
       
   994     <xsl:text>
       
   995 </xsl:text>
       
   996     <xsl:text>function hmi_local_index(varname){
       
   997 </xsl:text>
       
   998     <xsl:text>    return page_local_index(varname, "HMI_LOCAL");
       
   999 </xsl:text>
       
  1000     <xsl:text>}
       
  1001 </xsl:text>
       
  1002     <xsl:text>
       
  1003 </xsl:text>
       
  1004   </xsl:template>
       
  1005   <preamble:widget-base-class/>
       
  1006   <xsl:template match="preamble:widget-base-class">
       
  1007     <xsl:text>
       
  1008 </xsl:text>
       
  1009     <xsl:text>/* </xsl:text>
       
  1010     <xsl:value-of select="local-name()"/>
       
  1011     <xsl:text> */
       
  1012 </xsl:text>
       
  1013     <xsl:text>
       
  1014 </xsl:text>
   918     <xsl:text>class Widget {
  1015     <xsl:text>class Widget {
   919 </xsl:text>
  1016 </xsl:text>
   920     <xsl:text>    offset = 0;
  1017     <xsl:text>    offset = 0;
   921 </xsl:text>
  1018 </xsl:text>
   922     <xsl:text>    frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */
  1019     <xsl:text>    frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */
   963 </xsl:text>
  1060 </xsl:text>
   964     <xsl:text>    }
  1061     <xsl:text>    }
   965 </xsl:text>
  1062 </xsl:text>
   966     <xsl:text>
  1063     <xsl:text>
   967 </xsl:text>
  1064 </xsl:text>
   968     <xsl:text>    sub(new_offset=0, relativeness){
  1065     <xsl:text>    sub(new_offset=0, relativeness, container_id){
   969 </xsl:text>
  1066 </xsl:text>
   970     <xsl:text>        this.offset = new_offset;
  1067     <xsl:text>        this.offset = new_offset;
   971 </xsl:text>
  1068 </xsl:text>
   972     <xsl:text>        this.relativeness = relativeness;
  1069     <xsl:text>        this.relativeness = relativeness;
   973 </xsl:text>
  1070 </xsl:text>
       
  1071     <xsl:text>        this.container_id = container_id ;
       
  1072 </xsl:text>
   974     <xsl:text>        /* add this's subsribers */
  1073     <xsl:text>        /* add this's subsribers */
   975 </xsl:text>
  1074 </xsl:text>
   976     <xsl:text>        if(!this.unsubscribable)
  1075     <xsl:text>        if(!this.unsubscribable)
   977 </xsl:text>
  1076 </xsl:text>
   978     <xsl:text>            for(let i = 0; i &lt; this.indexes.length; i++) {
  1077     <xsl:text>            for(let i = 0; i &lt; this.indexes.length; i++) {
   979 </xsl:text>
  1078 </xsl:text>
   980     <xsl:text>                let index = this.indexes[i];
  1079     <xsl:text>                let index = this.get_variable_index(i);
   981 </xsl:text>
  1080 </xsl:text>
   982     <xsl:text>                if(relativeness[i])
  1081     <xsl:text>                if(index &gt; last_remote_index) return;
   983 </xsl:text>
       
   984     <xsl:text>                    index += new_offset;
       
   985 </xsl:text>
  1082 </xsl:text>
   986     <xsl:text>                subscribers[index].add(this);
  1083     <xsl:text>                subscribers[index].add(this);
   987 </xsl:text>
  1084 </xsl:text>
   988     <xsl:text>            }
  1085     <xsl:text>            }
   989 </xsl:text>
  1086 </xsl:text>
   993 </xsl:text>
  1090 </xsl:text>
   994     <xsl:text>
  1091     <xsl:text>
   995 </xsl:text>
  1092 </xsl:text>
   996     <xsl:text>    apply_cache() {
  1093     <xsl:text>    apply_cache() {
   997 </xsl:text>
  1094 </xsl:text>
   998     <xsl:text>        if(!this.unsubscribable) for(let index of this.indexes){
  1095     <xsl:text>        if(!this.unsubscribable) for(let i = 0; i &lt; this.indexes.length; i++) {
   999 </xsl:text>
  1096 </xsl:text>
  1000     <xsl:text>            /* dispatch current cache in newly opened page widgets */
  1097     <xsl:text>            /* dispatch current cache in newly opened page widgets */
  1001 </xsl:text>
  1098 </xsl:text>
  1002     <xsl:text>            let realindex = index+this.offset;
  1099     <xsl:text>            let realindex = this.get_variable_index(i);
  1003 </xsl:text>
  1100 </xsl:text>
  1004     <xsl:text>            let cached_val = cache[realindex];
  1101     <xsl:text>            let cached_val = cache[realindex];
  1005 </xsl:text>
  1102 </xsl:text>
  1006     <xsl:text>            if(cached_val != undefined)
  1103     <xsl:text>            if(cached_val != undefined)
  1007 </xsl:text>
  1104 </xsl:text>
  1011 </xsl:text>
  1108 </xsl:text>
  1012     <xsl:text>    }
  1109     <xsl:text>    }
  1013 </xsl:text>
  1110 </xsl:text>
  1014     <xsl:text>
  1111     <xsl:text>
  1015 </xsl:text>
  1112 </xsl:text>
  1016     <xsl:text>    get_idx(index) {
  1113     <xsl:text>    get_variable_index(varnum) {
  1017 </xsl:text>
  1114 </xsl:text>
  1018     <xsl:text>         let orig = this.indexes[index];
  1115     <xsl:text>        let index = this.indexes[varnum];
  1019 </xsl:text>
  1116 </xsl:text>
  1020     <xsl:text>         return this.relativeness[index] ? orig + this.offset : orig;
  1117     <xsl:text>        if(typeof(index) == "string"){
       
  1118 </xsl:text>
       
  1119     <xsl:text>            let page = this.relativeness[varnum];
       
  1120 </xsl:text>
       
  1121     <xsl:text>            index = page_local_index(index, this.container_id);
       
  1122 </xsl:text>
       
  1123     <xsl:text>        } else {
       
  1124 </xsl:text>
       
  1125     <xsl:text>            if(this.relativeness[varnum]){
       
  1126 </xsl:text>
       
  1127     <xsl:text>                index += this.offset;
       
  1128 </xsl:text>
       
  1129     <xsl:text>            }
       
  1130 </xsl:text>
       
  1131     <xsl:text>        }
       
  1132 </xsl:text>
       
  1133     <xsl:text>        return index;
  1021 </xsl:text>
  1134 </xsl:text>
  1022     <xsl:text>    }
  1135     <xsl:text>    }
  1023 </xsl:text>
  1136 </xsl:text>
  1024     <xsl:text>    change_hmi_value(index,opstr) {
  1137     <xsl:text>    change_hmi_value(index,opstr) {
  1025 </xsl:text>
  1138 </xsl:text>
  1026     <xsl:text>        return change_hmi_value(this.get_idx(index), opstr);
  1139     <xsl:text>        return change_hmi_value(this.get_variable_index(index), opstr);
  1027 </xsl:text>
  1140 </xsl:text>
  1028     <xsl:text>    }
  1141     <xsl:text>    }
  1029 </xsl:text>
  1142 </xsl:text>
  1030     <xsl:text>
  1143     <xsl:text>
  1031 </xsl:text>
  1144 </xsl:text>
  1032     <xsl:text>    apply_hmi_value(index, new_val) {
  1145     <xsl:text>    apply_hmi_value(index, new_val) {
  1033 </xsl:text>
  1146 </xsl:text>
  1034     <xsl:text>        return apply_hmi_value(this.get_idx(0), new_val);
  1147     <xsl:text>        return apply_hmi_value(this.get_variable_index(0), new_val);
  1035 </xsl:text>
  1148 </xsl:text>
  1036     <xsl:text>    }
  1149     <xsl:text>    }
  1037 </xsl:text>
  1150 </xsl:text>
  1038     <xsl:text>
  1151     <xsl:text>
  1039 </xsl:text>
  1152 </xsl:text>
  1043 </xsl:text>
  1156 </xsl:text>
  1044     <xsl:text>            // TODO avoid searching, store index at sub()
  1157     <xsl:text>            // TODO avoid searching, store index at sub()
  1045 </xsl:text>
  1158 </xsl:text>
  1046     <xsl:text>            for(let i = 0; i &lt; this.indexes.length; i++) {
  1159     <xsl:text>            for(let i = 0; i &lt; this.indexes.length; i++) {
  1047 </xsl:text>
  1160 </xsl:text>
  1048     <xsl:text>                let refindex = this.indexes[i];
  1161     <xsl:text>                let refindex = this.get_variable_index(i);
  1049 </xsl:text>
       
  1050     <xsl:text>                if(this.relativeness[i])
       
  1051 </xsl:text>
       
  1052     <xsl:text>                    refindex += this.offset;
       
  1053 </xsl:text>
  1162 </xsl:text>
  1054     <xsl:text>
  1163     <xsl:text>
  1055 </xsl:text>
  1164 </xsl:text>
  1056     <xsl:text>                if(index == refindex) {
  1165     <xsl:text>                if(index == refindex) {
  1057 </xsl:text>
  1166 </xsl:text>
  4054 </xsl:text>
  4163 </xsl:text>
  4055           <xsl:text>
  4164           <xsl:text>
  4056 </xsl:text>
  4165 </xsl:text>
  4057           <xsl:text>function send_hmi_value(index, value) {
  4166           <xsl:text>function send_hmi_value(index, value) {
  4058 </xsl:text>
  4167 </xsl:text>
       
  4168           <xsl:text>    if(index &gt; last_remote_index){
       
  4169 </xsl:text>
       
  4170           <xsl:text>        cache[index] = value;
       
  4171 </xsl:text>
       
  4172           <xsl:text>        console.log("updated local variable ",index,value);
       
  4173 </xsl:text>
       
  4174           <xsl:text>        /* TODO : dispatch value ASAP */
       
  4175 </xsl:text>
       
  4176           <xsl:text>        return;
       
  4177 </xsl:text>
       
  4178           <xsl:text>    }
       
  4179 </xsl:text>
       
  4180           <xsl:text>
       
  4181 </xsl:text>
  4059           <xsl:text>    let iectype = hmitree_types[index];
  4182           <xsl:text>    let iectype = hmitree_types[index];
  4060 </xsl:text>
  4183 </xsl:text>
  4061           <xsl:text>    let tobinary = typedarray_types[iectype];
  4184           <xsl:text>    let tobinary = typedarray_types[iectype];
  4062 </xsl:text>
  4185 </xsl:text>
  4063           <xsl:text>    send_blob([
  4186           <xsl:text>    send_blob([
  4248 </xsl:text>
  4371 </xsl:text>
  4249           <xsl:text>    }
  4372           <xsl:text>    }
  4250 </xsl:text>
  4373 </xsl:text>
  4251           <xsl:text>    var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
  4374           <xsl:text>    var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
  4252 </xsl:text>
  4375 </xsl:text>
  4253           <xsl:text>    new_desc.widgets.map(([widget,relativeness])=&gt;widget.sub(new_offset,relativeness));
  4376           <xsl:text>
       
  4377 </xsl:text>
       
  4378           <xsl:text>    container_id = String([page_name, page_index]);
       
  4379 </xsl:text>
       
  4380           <xsl:text>
       
  4381 </xsl:text>
       
  4382           <xsl:text>    new_desc.widgets.map(([widget,relativeness])=&gt;widget.sub(new_offset,relativeness,container_id));
  4254 </xsl:text>
  4383 </xsl:text>
  4255           <xsl:text>
  4384           <xsl:text>
  4256 </xsl:text>
  4385 </xsl:text>
  4257           <xsl:text>    update_subscriptions();
  4386           <xsl:text>    update_subscriptions();
  4258 </xsl:text>
  4387 </xsl:text>