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 < this.indexes.length; i++) { |
1077 <xsl:text> for(let i = 0; i < 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 > 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 < 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 < this.indexes.length; i++) { |
1159 <xsl:text> for(let i = 0; i < 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 > 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])=>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])=>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> |