Ver código fonte

Move html_server to separate folder. Update html server templates.

Vasilii Chernov 8 anos atrás
pai
commit
3bf5383a7e
62 arquivos alterados com 476 adições e 565 exclusões
  1. 12 14
      CMakeLists.txt
  2. 4 7
      html_server/html_server.py
  3. 0 0
      html_server/static/codebase/dhtmlx.css
  4. 0 0
      html_server/static/codebase/dhtmlx.js
  5. 0 0
      html_server/static/codebase/dhtmlx_deprecated.js
  6. 0 0
      html_server/static/codebase/ext/dhxupload.xap
  7. 0 0
      html_server/static/codebase/ext/swfobject.js
  8. 0 0
      html_server/static/codebase/ext/uploader.swf
  9. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/blank.gif
  10. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/but_cut.gif
  11. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/folderClosed.gif
  12. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/folderOpen.gif
  13. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/iconCheckAll.gif
  14. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/iconCheckDis.gif
  15. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/iconCheckGray.gif
  16. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/iconUncheckAll.gif
  17. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/iconUncheckDis.gif
  18. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/leaf.gif
  19. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line.gif
  20. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line1.gif
  21. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line1_rtl.gif
  22. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line2.gif
  23. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line2_rtl.gif
  24. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line3.gif
  25. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line3_rtl.gif
  26. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line4.gif
  27. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/line4_rtl.gif
  28. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/lock.gif
  29. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus.gif
  30. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus1.gif
  31. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus2.gif
  32. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus2_rtl.gif
  33. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus3.gif
  34. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus3_rtl.gif
  35. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus4.gif
  36. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus4_rtl.gif
  37. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus5.gif
  38. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/minus5_rtl.gif
  39. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus.gif
  40. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus1.gif
  41. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus2.gif
  42. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus2_rtl.gif
  43. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus3.gif
  44. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus3_rtl.gif
  45. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus4.gif
  46. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus4_rtl.gif
  47. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus5.gif
  48. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/plus5_rtl.gif
  49. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/radio_off.gif
  50. 0 0
      html_server/static/codebase/imgs/dhxtree_skyblue/radio_on.gif
  51. 0 0
      html_server/static/codebase/thirdparty/excanvas/AUTHORS
  52. 0 0
      html_server/static/codebase/thirdparty/excanvas/COPYING
  53. 0 0
      html_server/static/codebase/thirdparty/excanvas/README
  54. 0 0
      html_server/static/codebase/thirdparty/excanvas/excanvas.js
  55. 0 0
      html_server/static/jquery-2.2.1.js
  56. 219 0
      html_server/templates/base.html
  57. 93 0
      html_server/templates/property_info.html
  58. 148 0
      html_server/templates/register_info.html
  59. 0 0
      html_server/templates/registers_list.html
  60. 0 347
      pywrap/templates/base.html
  61. 0 91
      pywrap/templates/property_info.html
  62. 0 106
      pywrap/templates/register_info.html

+ 12 - 14
CMakeLists.txt

@@ -112,20 +112,18 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pcilib/version.h.in ${CMAKE_CURRENT_B
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/docs/Doxyfile)
 
 if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
-    file(COPY ${CMAKE_SOURCE_DIR}/xml DESTINATION ${CMAKE_BINARY_DIR})
-    file(COPY ${CMAKE_SOURCE_DIR}/pci
-	 DESTINATION ${CMAKE_BINARY_DIR}
-	 FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
-    )
-    file(COPY ${CMAKE_SOURCE_DIR}/run
-	 DESTINATION ${CMAKE_BINARY_DIR}
-	 FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
-    )
-    
-    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/xml DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
-   file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/pywrap/templates DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/pywrap)
-   file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/pywrap/static DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/pywrap)
-   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pywrap/html_server.py ${CMAKE_CURRENT_BINARY_DIR}/pywrap/html_server.py)
+   file(COPY ${CMAKE_SOURCE_DIR}/xml DESTINATION ${CMAKE_BINARY_DIR})
+   file(COPY ${CMAKE_SOURCE_DIR}/pci
+   DESTINATION ${CMAKE_BINARY_DIR}
+   FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+   )
+   file(COPY ${CMAKE_SOURCE_DIR}/run
+   DESTINATION ${CMAKE_BINARY_DIR}
+   FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+   )
+
+   file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/xml DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+   file(COPY ${CMAKE_SOURCE_DIR}/html_server DESTINATION ${CMAKE_BINARY_DIR})
 endif(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
 
 install(FILES 

+ 4 - 7
pywrap/html_server.py → html_server/html_server.py

@@ -158,8 +158,7 @@ def get_property_list():
    return render_template('property_info.html',
                           value = value,
                           branch = branch,
-                          properties = prop_info,
-                          json = json
+                          properties = prop_info
                          )
                          
 @app.route("/")
@@ -168,12 +167,8 @@ def greet():
                           device = device,
                           model = model)
 
-@app.route('/<path:path>')
-def send_file(path):
-    return send_from_directory('static', path)
-
 if __name__ == "__main__":
-   #parce command line options
+   #parse command line options
    parser = OptionParser()
    parser.add_option("-p", "--port",  action="store",
                      type="int", dest="port", default=5000,
@@ -192,6 +187,8 @@ if __name__ == "__main__":
    device = opts.device
    model = opts.model
    
+   app.debug = True
+   
    pcilib = pcipywrap.Pcipywrap(device, model)
    pcipywrap.__redirect_logs_to_exeption()
    app.run(host = HOST_NAME, port = PORT_NUMBER)

+ 0 - 0
pywrap/static/codebase/dhtmlx.css → html_server/static/codebase/dhtmlx.css


+ 0 - 0
pywrap/static/codebase/dhtmlx.js → html_server/static/codebase/dhtmlx.js


+ 0 - 0
pywrap/static/codebase/dhtmlx_deprecated.js → html_server/static/codebase/dhtmlx_deprecated.js


+ 0 - 0
pywrap/static/codebase/ext/dhxupload.xap → html_server/static/codebase/ext/dhxupload.xap


+ 0 - 0
pywrap/static/codebase/ext/swfobject.js → html_server/static/codebase/ext/swfobject.js


+ 0 - 0
pywrap/static/codebase/ext/uploader.swf → html_server/static/codebase/ext/uploader.swf


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/blank.gif → html_server/static/codebase/imgs/dhxtree_skyblue/blank.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/but_cut.gif → html_server/static/codebase/imgs/dhxtree_skyblue/but_cut.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/folderClosed.gif → html_server/static/codebase/imgs/dhxtree_skyblue/folderClosed.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/folderOpen.gif → html_server/static/codebase/imgs/dhxtree_skyblue/folderOpen.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/iconCheckAll.gif → html_server/static/codebase/imgs/dhxtree_skyblue/iconCheckAll.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/iconCheckDis.gif → html_server/static/codebase/imgs/dhxtree_skyblue/iconCheckDis.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/iconCheckGray.gif → html_server/static/codebase/imgs/dhxtree_skyblue/iconCheckGray.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/iconUncheckAll.gif → html_server/static/codebase/imgs/dhxtree_skyblue/iconUncheckAll.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/iconUncheckDis.gif → html_server/static/codebase/imgs/dhxtree_skyblue/iconUncheckDis.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/leaf.gif → html_server/static/codebase/imgs/dhxtree_skyblue/leaf.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line1.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line1.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line1_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line1_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line2.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line2.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line2_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line2_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line3.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line3.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line3_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line3_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line4.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line4.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/line4_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/line4_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/lock.gif → html_server/static/codebase/imgs/dhxtree_skyblue/lock.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus1.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus1.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus2.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus2.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus2_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus2_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus3.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus3.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus3_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus3_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus4.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus4.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus4_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus4_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus5.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus5.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/minus5_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/minus5_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus1.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus1.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus2.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus2.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus2_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus2_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus3.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus3.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus3_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus3_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus4.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus4.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus4_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus4_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus5.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus5.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/plus5_rtl.gif → html_server/static/codebase/imgs/dhxtree_skyblue/plus5_rtl.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/radio_off.gif → html_server/static/codebase/imgs/dhxtree_skyblue/radio_off.gif


+ 0 - 0
pywrap/static/codebase/imgs/dhxtree_skyblue/radio_on.gif → html_server/static/codebase/imgs/dhxtree_skyblue/radio_on.gif


+ 0 - 0
pywrap/static/codebase/thirdparty/excanvas/AUTHORS → html_server/static/codebase/thirdparty/excanvas/AUTHORS


+ 0 - 0
pywrap/static/codebase/thirdparty/excanvas/COPYING → html_server/static/codebase/thirdparty/excanvas/COPYING


+ 0 - 0
pywrap/static/codebase/thirdparty/excanvas/README → html_server/static/codebase/thirdparty/excanvas/README


+ 0 - 0
pywrap/static/codebase/thirdparty/excanvas/excanvas.js → html_server/static/codebase/thirdparty/excanvas/excanvas.js


+ 0 - 0
pywrap/static/jquery-2.2.1.js → html_server/static/jquery-2.2.1.js


+ 219 - 0
html_server/templates/base.html

@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title>{% block title %}Device {{ device }}{% endblock %}</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+	<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+	<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='codebase/dhtmlx.css') }}"/>
+   <script type=text/javascript src="{{ url_for('static', filename='jquery-2.2.1.js') }}"></script>
+	<script src="{{ url_for('static', filename='codebase/dhtmlx.js') }}"></script>
+   <script src="{{ url_for('static', filename='check_err.js') }}"></script>
+	<script>
+      var propsTree
+      function createPropertyTree(branch, id) {
+         
+         function getPropertyItemsOnLevel(branch, id) {
+            pathToProperties = "{{ url_for('get_property_list_json') }}"
+            completePath = pathToProperties + '?branch=' + branch
+            
+            $.getJSON(completePath, 
+                      function(json) {
+                           checkError(json)
+                           parsePropertyItems(json, branch, id)
+                         });
+         }
+         
+         function parsePropertyItems(json, branch, id) {
+            
+            function loadPropertyInfo(branch) {
+               
+               var pathToProperties = "{{ url_for('get_property_list') }}"
+               var completePath = pathToProperties + '?branch=' + branch
+               
+               $("#prop_info_place").load(completePath)
+            }
+            
+            
+            function setPropertyField(id, name, branch) {
+               
+               var func = function(){loadPropertyInfo(branch)}
+               propsTree.insertNewItem(id, branch,
+                                       name, 
+                                       func);
+               propsTree.closeAllItems()
+            }
+            
+            for(var i = 0; i < json.length; i++) {
+               
+               setPropertyField(id, json[i].name, json[i].path)
+               if(json[i].flags.indexOf("childs") != -1)
+                  getPropertyItemsOnLevel(json[i].path, json[i].path)
+            }  
+         }
+         
+         getPropertyItemsOnLevel(branch, id)
+      }
+      
+      var regTree
+      function createRegistersList() {
+         function parseJsonRegisterList(json) {
+            
+            checkError(json)
+            if(json.lenght <= 0)
+               return
+            
+            //sort registers by bank
+            function compareRegistersByBank(a,b) {
+               if (a.bank < b.bank)
+                  return -1;
+               else if (a.bank > b.bank)
+                  return 1;
+               else 
+                  return 0;
+            }
+            json.sort(compareRegistersByBank)
+            
+            
+            //create bank dirs
+            var curBankName = json[0].bank
+            var created = 0
+            for(var i = 0; i < json.length; i++) {
+               
+               //create new bank tab if it has not created already
+               if(json[i].bank != curBankName) {
+                  curBankName = json[i].bank
+                  created = 0
+               }
+               
+               if(!created) {
+                  regTree.insertNewItem(0, json[i].bank, json[i].bank, 0);
+                  created = 1
+               }
+               
+               
+               //insert register info to bank
+               function loadRegisterInfo(bank, name) {
+                  var pathToGetProperty = "{{ url_for('get_register_info') }}"
+                  var completePath = pathToGetProperty + '?bank=' + bank +
+                                 '&name=' + name
+               
+                  $("#reg_info_place").load(completePath)
+               }
+               
+               function setRegisterField(id, bank, name) {
+                  
+                  var itemId = bank + "_" + name
+                  var func = function(){loadRegisterInfo(bank, name)}
+                  
+                  regTree.insertNewItem(id, itemId, name, func)
+                  regTree.closeAllItems()
+               }
+               
+               setRegisterField(json[i].bank, json[i].bank, json[i].name)
+            }
+         }
+         
+         //get registers json list
+         getRegistersListPath = "{{ url_for('get_registers_list_json') }}" 
+         $.getJSON(getRegistersListPath, parseJsonRegisterList);
+      }
+      
+		function doOnLoad()
+      {
+			propsTree = new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);
+			propsTree.setImagePath("codebase/imgs/dhxtree_skyblue/");
+         //generating properties list
+         createPropertyTree('', 0)
+         
+			regTree = new dhtmlXTreeObject("treeboxbox_tree2","100%","100%",0,0,0,0,'SELECT')
+			regTree.setImagePath("codebase/imgs/dhxtree_skyblue/");
+         createRegistersList()
+		}
+	</script>
+</head>
+<body onload="doOnLoad()">
+	{% block info %}
+      <div class="block1" >
+         <h2>Device {{ device }} model={{ model }} control page </h2>
+      </div>
+   {% endblock %}
+   
+   <style>
+      .tabs > div, .tabs > input { display: none; }
+
+      .tabs label {
+               padding: 5px;
+               border: 1px solid #aaa;
+               line-height: 28px;
+               cursor: pointer;
+               position: relative;
+               bottom: 1px;
+               background: #fff;
+            }
+            
+      .tabs input[type="radio"]:checked + label { border-bottom: 2px solid #fff; }
+
+      .tabs > input:nth-of-type(1):checked ~ div:nth-of-type(1),
+      .tabs > input:nth-of-type(2):checked ~ div:nth-of-type(2) {
+                                                      display: block; 
+                                                      padding: 5px; 
+                                                      border: 
+                                                      1px solid #aaa;
+                                                   }
+      .tree {
+               height: 85vh;
+               padding: 5px;
+               border: 1px solid #aaa;
+               line-height: 28px;
+               cursor: pointer;
+               position: relative;
+               bottom: 1px;
+               background: #fff;
+               overflow:auto;
+            }
+            
+      .infoTable {
+               padding: 5px;
+               
+               border: 1px solid #aaa;
+               line-height: 28px;
+               cursor: pointer;
+               position: relative;
+               background: #fff;
+               overflow:auto;
+               bottom: 1px;
+               
+               text-align: left;
+            }
+   </style>
+   
+   <div class="tabs">
+      <input type="radio" name="current" checked="checked" id="props_id"/>
+      <label for="props_id">Properties</label>
+      <input type="radio" name="current" id="labels_id"/>
+      <label for="labels_id">Registers</label>
+      <div>
+         <table>
+            <tr>
+               <td valign="top">
+                  <div id="treeboxbox_tree" class = "tree"></div>
+               </td>
+               <td valign="top" id="prop_info_place" />
+            </tr>
+         </table>         
+      </div>
+      <div>
+         <table>
+            <tr>
+               <td valign="top">
+                  <div id="treeboxbox_tree2" class="tree"></div>
+               </td>
+               <td valign="top" id="reg_info_place" />
+            </tr>
+         </table>
+      </div>
+   </div>
+   {% block content %}
+   {% endblock %}
+</body>
+</html>

+ 93 - 0
html_server/templates/property_info.html

@@ -0,0 +1,93 @@
+{% block content %}
+
+{% if standalone %}
+<script src="{{ url_for('static', filename='codebase/dhtmlx.js') }}"></script>
+<script src="{{ url_for('static', filename='check_err.js') }}"></script>
+{% endif %}
+
+<script>
+   function updateProperty(prop) {
+      var pathToGetProperty = "{{ url_for('get_property_json') }}"
+      var completePath = pathToGetProperty + '?prop=' + prop
+      
+      $.getJSON(completePath, function(json){
+                  checkError(json)
+                  var valFieldId = "#actVal"+prop.split('/').join("_")
+                  $(valFieldId).text(json.value)
+               })
+   }
+   
+   function setProperty(prop)
+   {
+      var value = document.getElementById("set_val_" + prop).value;
+      if(value == "")
+         return
+      
+      var pathToGetProperty = "{{ url_for('set_property_json') }}"
+      var completePath = pathToGetProperty + '?prop=' + prop +
+                     '&val=' + value;
+                        
+      $.getJSON(completePath, 
+                function(json) {
+                   checkError(json)
+                   updateProperty(prop)
+                })
+   };
+</script>
+   
+<table class="infoTable">
+   <tr class="infoTable">
+      <td class="infoTable">Name</td>
+      <td class="infoTable">Description</td>
+      <td class="infoTable">Value</td>
+      <td class="infoTable">Mode</td>
+      <td class="infoTable">Type</td>
+      <td class="infoTable">Unit</td>
+      <td class="infoTable">Path</td>
+   </tr>
+   {% for property in properties %}
+      <tr class="infoTable">
+         <td class="infoTable">{{ property.name }}</td>
+         <td class="infoTable">
+         {% if 'description' in property %}
+             {{ property.description }}
+         {% endif %}
+         </td>
+         <td class="infoTable">
+            <table>
+               <tr>
+                  <td id = "actVal{{ property.path.replace('/', '_') }}" class="infoTable"> 
+                     {{ value }}
+                  </td>
+                  {% if 'R' in property.mode %}
+                  <td> 
+                     <input type="button" value="update" style="width:100%;height:100%" onclick="updateProperty('{{ property.path }}')">
+                  </td>
+                  {% endif %}
+               </tr>
+               {% if 'W' in property.mode %}
+                  <tr>
+                     <td> 
+                           <input type="text" name="set_val_{{ property.path }}" id="set_val_{{ property.path }}" value="" />
+                     </td>
+                     <td> 
+                           <input type="button" value="set" style="width:100%;height:100%" onclick="setProperty('{{ property.path }}')">
+                     </td>
+                  </tr>
+               {% endif %}
+            </table>
+         </td>
+         <td class="infoTable">
+            <ul>
+            {% for m in property.mode %}
+               {{ m + ';  '}}
+            {% endfor %}
+            </ul>
+         </td>
+         <td class="infoTable"> {{ property.type }} </td>
+         <td class="infoTable"> {{ property.unit }} </td>
+         <td class="infoTable"> {{ property.path }} </td>
+      </tr>
+   {% endfor %}
+</table>
+{% endblock %}

+ 148 - 0
html_server/templates/register_info.html

@@ -0,0 +1,148 @@
+{% block content %}
+
+{% if standalone %}
+<script src="{{ url_for('static', filename='codebase/dhtmlx.js') }}"></script>
+<script src="{{ url_for('static', filename='check_err.js') }}"></script>
+{% endif %}
+
+<script>
+   function updateRegister(bank, name) {
+      var pathToReadRegister = "{{ url_for('read_register_json') }}"
+      var completePath = pathToReadRegister + '?bank=' + bank +
+                     '&name=' + name
+      
+      $.getJSON(completePath, function(json){
+                  checkError(json)
+                  $("#actVal").text(json.value)
+               })
+   }
+   
+   function writeRegister(bank, name)
+   {
+      var value = document.getElementById("set_val_box").value;
+      if(value == "")
+         return
+      
+      var pathToReadRegister = "{{ url_for('write_register_json') }}"
+      var completePath = pathToReadRegister + '?bank=' + bank +
+                     '&name=' + name + '&val=' + value;
+                        
+      $.getJSON(completePath, 
+                function(json) {
+                   checkError(json)
+                   updateRegister(bank, name)
+                })
+   }; 
+</script>
+
+<table class="infoTable">
+   <tr class="infoTable">
+      {% if 'description' in register %}
+      <td class="infoTable"> Description </td>
+      {% endif %}
+      <td class="infoTable"> Value </td>
+      <td class="infoTable">Default value</td>
+      <td class="infoTable">Bank</td>
+      <td class="infoTable">Mode</td>
+      {% if 'range' in register %}
+         <td class="infoTable">Range</td>
+      {% endif %}
+      {% if 'values' in register %}
+         <td class="infoTable">Values</td>
+      {% endif %}
+   </tr>
+   
+   <tr class="infoTable">
+      {% if 'description' in register %}
+         <td class="infoTable"> {{ register.description }} </td>
+      {% endif %}
+      <td class="infoTable">
+         <table>
+            <tr class="infoTable">
+               <td id="actVal" class="infoTable"> {{ value }} </td>
+               {% if 'R' in register.mode %}
+                  <td> 
+                     <input type="button" value="update"
+                            style="width:100%;height:100%"
+                            onclick="updateRegister('{{ register.bank }}', '{{ register.name }}')">
+                  </td>
+               {% endif %}
+            </tr>
+            {% if 'W' in register.mode %}
+               <tr class="infoTable">
+                  <td> 
+                     <input type="text" name="set_val_box" id="set_val_box" value="" />
+                  </td>
+                  <td> 
+                     <input type="button" value="set" 
+                            style="width:100%;height:100%" 
+                            onclick="writeRegister('{{ register.bank }}', '{{ register.name }}')">
+                  </td>
+               </tr>
+            {% endif %}
+         </table>
+      </td>
+      <td class="infoTable">{{ register.defvalue }}</td>
+      <td class="infoTable">{{ register.bank }}</td>
+      <td class="infoTable">
+         <ul>
+         {% for m in register.mode %}
+            {{ m + ';  '}}
+         {% endfor %}
+         </ul>
+      </td>
+      {% if 'range' in register %}
+         <td class="infoTable">
+            <table>
+               <tr class="infoTable">
+                  <td class="infoTable"> min </td>
+                  <td class="infoTable"> max </td>
+               </tr>
+               <tr class="infoTable">
+                  <td class="infoTable"> {{ register.range.min }} </td>
+                  <td class="infoTable"> {{ register.range.max }} </td>
+               </tr>
+            </table>
+         </td>
+      {% endif %}
+      {% if 'values' in register %}
+      <td class="infoTable">
+         <table>
+            <tr>
+            {% for v in register['values'] %}
+               <td>
+               <table>
+                  {% if 'name' in v %}
+                     <tr class="infoTable">
+                        <td class="infoTable"> Name </td>
+                        <td class="infoTable"> {{v.name}} </td>
+                     </tr>
+                  {% endif %}
+                  {% if 'description' in v %}
+                     <tr class="infoTable">
+                        <td class="infoTable"> Description </td>
+                        <td class="infoTable"> {{ v.description }} </td>
+                     </tr>
+                  {% endif %}
+                  <tr class="infoTable">
+                     <td class="infoTable"> Min </td>
+                     <td class="infoTable"> {{ v.min }} </td>
+                  </tr>
+                  <tr class="infoTable">
+                     <td class="infoTable"> Max </td>
+                     <td class="infoTable"> {{ v.max }} </td>
+                  </tr>
+                  <tr class="infoTable">
+                     <td class="infoTable"> Value </td>
+                     <td class="infoTable"> {{ v.value }} </td>
+                  </tr>
+               </table>
+               </td>
+            {% endfor %}
+            </tr>
+         </table>
+      </td>
+      {% endif %}
+   </tr>
+</table>
+{% endblock %}

+ 0 - 0
pywrap/templates/registers_list.html → html_server/templates/registers_list.html


+ 0 - 347
pywrap/templates/base.html

@@ -1,347 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-	<title>{% block title %}Device {{ device }}{% endblock %}</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-	<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
-	<link rel="stylesheet" type="text/css" href="codebase/dhtmlx.css"/>
-   <script type=text/javascript src="{{ url_for('static', filename='jquery-2.2.1.js') }}"></script>
-	<script src="codebase/dhtmlx.js"></script>
-   <script src="pcilib_tree.js"></script>
-	<script>
-      var propsTree
-      
-      function checkError(json)
-      {
-         if(json.error)
-            alert('Error:\n' + json.error)
-      }
-      
-      function createPropertyTree(branch, id)
-      {
-         function getPropertyItemsOnLevel(branch, id)
-         {
-            pathToProperties = "{{ url_for('get_property_list_json') }}"
-            completePath = pathToProperties + '?branch=' + branch
-            
-            $.getJSON(completePath, 
-                      function(json) {
-                         checkError(json)
-                         parsePropertyItems(json, branch, id)
-                         });
-         }
-         
-         function parsePropertyItems(json, branch, id)
-         {
-            function updatePropertyValue(id, path)
-            {
-               pathToGetProperty = "{{ url_for('get_property_json') }}"
-               completePath = pathToGetProperty + '?prop=' + path
-               
-               $.getJSON(completePath, function(json){
-                           checkError(json)
-                           propsTree.updateItem(id, 'value: ' + json.value);
-                        })
-            }
-         
-            function writePropertyValue(id, path)
-            {
-               value = window.prompt("Enter new property value");
-               
-               if(value != null)
-               {
-                  pathToGetProperty = "{{ url_for('set_property_json') }}"
-                  completePath = pathToGetProperty + '?prop=' + path +'&val=' + value
-                  
-                  $.getJSON(completePath, 
-                            function(json) {
-                              checkError(json)
-                              updatePropertyValue(id, path)
-                             })
-               }
-               else
-                  updatePropertyValue(id, path)
-            }
-            
-            function setCurrentValueField(id, path, mode)
-            {
-               var propValId = id + 'CurrVal'
-               var func = 0
-               
-               if(mode)
-                  func = function(){writePropertyValue(propValId, path)}
-               else
-                  func = function(){updatePropertyValue(propValId, path)}
-                  
-               propsTree.insertNewItem(id, propValId,
-                                    'value: ', 
-                                    func);
-               
-               updatePropertyValue(propValId, path)
-            }
-            
-            for(var i = 0; i < json.length; i++)
-            {
-               propsTree.insertNewItem(id, json[i].path, json[i].name, 0);
-               
-               if(json[i].flags.indexOf("childs") != -1)
-               {
-                  getPropertyItemsOnLevel(json[i].path, json[i].path)
-               }
-               else
-               {
-                  if(json[i].mode.indexOf("R") != -1)
-                  {
-                     var mode = (json[i].mode.indexOf("W") != -1)
-                     setCurrentValueField(json[i].path, json[i].path, mode)
-                  }
-               }
-               
-               //show aviable info
-               if(json[i].description)
-                  propsTree.insertNewItem(json[i].path, json[i].path + 'Desc',
-                                       'description:\n' + json[i].description, 0);
-               if(json[i].type)
-                  propsTree.insertNewItem(json[i].path, json[i].path + 'Type',
-                                       'type: ' + json[i].type, 0);
-               if(json[i].unit)
-                  propsTree.insertNewItem(json[i].path, json[i].path + 'Unit',
-                                       'unit: ' + json[i].unit, 0);
-                                       
-               if(json[i].mode)
-               {
-                  var modeId = json[i].path + 'Mode'
-                  propsTree.insertNewItem(json[i].path, modeId,
-                                       'mode', 0);
-                  
-                  for(var j = 0; j < json[i].mode.length; j++)
-                     propsTree.insertNewItem(modeId, modeId + j,
-                                       json[i].mode[j], 0);
-                  propsTree.closeItem(modeId)
-               }
-               
-               if(json[i].path)
-                  propsTree.insertNewItem(json[i].path, json[i].path + 'Path',
-                                       'path: ' + json[i].path, 0);
-                                       
-               propsTree.closeItem(json[i].path);
-            }  
-      }
-         
-         getPropertyItemsOnLevel(branch, id)
-      }
-      
-      var regTree
-      function createRegistersList()
-      {
-         function parseJsonRegisterList(json)
-         {
-            checkError(json)
-            
-            function compareRegistersByBank(a,b) 
-            {
-               if (a.bank < b.bank)
-                  return -1;
-               else if (a.bank > b.bank)
-                  return 1;
-               else 
-                  return 0;
-            }
-            
-            if(json.lenght <= 0)
-               return
-            
-            //sort registers by bank
-            json.sort(compareRegistersByBank)
-            
-            //create bank dirs
-            var curBankName = json[0].bank
-            var created = 0
-            for(var i = 0; i < json.length; i++)
-            {
-               //create new bank tab if it has not created already
-               if(json[i].bank != curBankName)
-               {
-                  curBankName = json[i].bank
-                  created = 0
-               }
-               if(!created)
-               {
-                  regTree.insertNewItem(0, json[i].bank, json[i].bank, 0);
-                  created = 1
-               }
-               
-               //insert register info to bank
-               var itemId = json[i].bank + "_" + json[i].name
-               regTree.insertNewItem(json[i].bank, itemId, json[i].name)
-               
-               function updateRegisterValue(id, bank, name)
-               {
-                  pathToGetProperty = "{{ url_for('read_register_json') }}"
-                  completePath = pathToGetProperty + '?bank=' + bank +
-                                 '&name=' + name
-                  
-                  $.getJSON(completePath, function(json){
-                              checkError(json)
-                              regTree.updateItem(id, 'value: ' + json.value);
-                           })
-               }
-         
-
-               function writeRegisterValue(id, bank, name)
-               {
-                  value = window.prompt("Enter new register value");
-                  
-                  if(value != null)
-                  {
-                     pathToGetProperty = "{{ url_for('write_register_json') }}"
-                     completePath = pathToGetProperty + '?bank=' + bank +
-                                    '&name=' + name + '&val=' + value;
-                     
-                     $.getJSON(completePath, 
-                               function(json) {
-                                 checkError(json)
-                                 updateRegisterValue(id, bank, name)
-                                })
-                  }
-                  else
-                     updateRegisterValue(id, bank, name)
-               }
-
-               function setCurrentValueField(id, bank, name, mode)
-               {
-                  var regValId = id + 'CurrVal'
-                  var func = 0
-                  
-                  if(mode)
-                     func = function(){writeRegisterValue(regValId, bank, name)}
-                  else
-                     func = function(){updateRegisterValue(regValId, bank, name)}
-                     
-                  regTree.insertNewItem(id, regValId,
-                                       'value: ', 
-                                       func);
-                  updateRegisterValue(regValId, bank, name)
-               }
-               
-               if(json[i].mode.indexOf("R") != -1)
-               {
-                  var mode = (json[i].mode.indexOf("W") != -1)
-                  setCurrentValueField(itemId, json[i].bank, json[i].name, mode)
-               }
-               
-               //show aviable info
-               if(json[i].description)
-                  regTree.insertNewItem(itemId, itemId + 'Desc',
-                                        'description:\n' + json[i].description, 0);
-               if(json[i].defvalue)
-                  regTree.insertNewItem(itemId, itemId + 'Defvalue',
-                                       'defvalue: ' + json[i].defvalue, 0);
-               
-               if(json[i].mode)
-               {
-                  var modeId = itemId + 'Mode'
-                  regTree.insertNewItem(itemId, modeId,
-                                       'mode', 0);
-                  
-                  for(var j = 0; j < json[i].mode.length; j++)
-                     regTree.insertNewItem(modeId, modeId + j,
-                                       json[i].mode[j], 0);
-                  regTree.closeItem(modeId)
-               }
-               
-               if(json[i].range)
-               {
-                  var rangeId = itemId + 'Range'
-                  regTree.insertNewItem(itemId, rangeId,
-                                       'range', 0);
-                  regTree.insertNewItem(rangeId, rangeId + 'Min',
-                                       'min: ' + json[i].range.min, 0);
-                  regTree.insertNewItem(rangeId, rangeId + 'Max',
-                                       'max: ' + json[i].range.max, 0);
-                  regTree.closeItem(rangeId)
-               }
-               
-               if(json[i].values)
-               {
-                  var valuesId = itemId + 'Values'
-                  regTree.insertNewItem(itemId, valuesId,
-                                       'values', 0);
-                                       
-                  function addValueInfo(valuesId, value)
-                  {
-                     var valueId = valuesId + value.name
-                     regTree.insertNewItem(valuesId, valueId, value.name, 0);
-                     
-                     if(value.description)
-                        regTree.insertNewItem(valueId, valueId + 'Desc',
-                                              'description: ' + value.description, 0);
-                     if(value.value)
-                        regTree.insertNewItem(valueId, valueId + 'Value',
-                                              'value: ' + value.value, 0);
-                     if(value.min)
-                        regTree.insertNewItem(valueId, valueId + 'Min',
-                                              'min: ' + value.min, 0);
-                     if(value.max)
-                        regTree.insertNewItem(valueId, valueId + 'Max',
-                                              'max: ' + value.max, 0);   
-                  }
-                  
-                  for(var j = 0; j < json[i].values.length; j++)
-                  {
-                     addValueInfo(valuesId, json[i].values[j])
-                  }
-                  regTree.closeItem(valuesId)
-               }
-                                       
-               propsTree.closeItem(json[i].path);
-               
-               regTree.closeItem(itemId);
-            }
-         }
-         
-         //get registers json list
-         getRegistersListPath = "{{ url_for('get_registers_list_json') }}" 
-         $.getJSON(getRegistersListPath, parseJsonRegisterList);
-      }
-      
-		function doOnLoad()
-      {
-			propsTree = new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);
-			propsTree.setImagePath("codebase/imgs/dhxtree_skyblue/");
-         //generating properties list
-         createPropertyTree('', 0)
-         
-			regTree = new dhtmlXTreeObject("treeboxbox_tree2","100%","100%",0,0,0,0,'SELECT')
-			regTree.setImagePath("codebase/imgs/dhxtree_skyblue/");
-         createRegistersList()
-		}
-	</script>
-</head>
-<body onload="doOnLoad()">
-	{% block info %}
-      <h2>Device {{ device }} model={{ model }} control page </h2>
-   {% endblock %}
-   
-   {% block content %}
-   {% endblock %}
-	<table>
-		<tr>
-         <td>
-            <h3>Properties Tree</h3>
-         </td>
-         <td>
-            <h3>Registers Tree</h3>
-         </td>
-		</tr>
-		<tr>
-         <td valign="top">
-				<div id="treeboxbox_tree" style="background-color:#f5f5f5;border :1px solid Silver; overflow:auto;"></div>
-			</td>
-			<td valign="top">
-				<div id="treeboxbox_tree2" style="background-color:#f5f5f5;border :1px solid Silver; overflow:auto;"></div>
-			</td>
-		</tr>
-	</table>
-</body>
-</html>

+ 0 - 91
pywrap/templates/property_info.html

@@ -1,91 +0,0 @@
-{% extends "base.html" %}
-{% block title %}Property list{% endblock %}
-{% block info %}
-<h1>List of properties in branch {{ branch }}</h1>
-{% endblock %}
-
-{% block content %}
-
-   <script>
-      function set_property()
-      {
-         var value = document.getElementById("set_val_box").value;
-         window.location.href = "{{ url_for('set_property') }}?prop={{ branch }}&"+
-                                'val='+value;
-      };
-   </script>
-
-<table border="1" style="width:100%">
-   <tr>
-    <th>Name</th>
-    <th>Description</th> 
-   </tr>
-   {% for property in properties %}
-   <tr>
-      {% if ('childs' in property.flags) or (properties|length != 1) %}
-         <td><a href="{{ url_for('get_property_list', branch = property.path) }}">"{{ property.name }}"</td>
-         {% if 'description' in property %}
-      <script>
-      function set_property()
-      {
-         var value = document.getElementById("set_val_box").value;
-         window.location.href = "{{ url_for('set_property') }}?prop={{ branch }}&"+
-                                'val='+value;
-      };
-   </script>
-         <td>{{ property.description }}</td>
-            {% else %}
-            <td></td>
-            {% endif %}
-         {% else %}
-            <td>{{ property.name }}"</td>
-            <td>
-               <table border="1" style="width:100%">
-                  {% if 'description' in property %}
-                  <tr>
-                     <th> Description </th>
-                     <td> {{ property.description }} </td>
-                  </tr>
-                  {% endif %}
-                  <tr>
-                     <th> Current value </th>
-                     <td> {{ value }} </td>
-                  </tr>
-                  {% if 'W' in property.mode %}
-                     <tr>
-                        <th> Set value</th>
-                        <td> 
-                           <input type="text" name="set_val_box" id="set_val_box" value="" />
-                           <input type="button" value="set" onclick="set_property()">
-                        </td>
-                     </tr>
-                  {% endif %}
-                  <tr>
-                     <th>Mode</th>
-                     <td>
-                        <ul>
-                           {% for m in property.mode %}
-                              <li>{{ m }}</li>
-                           {% endfor %}
-                        </ul>
-                     </td>
-                  </tr>
-                  <tr>
-                     <th>Type</th>
-                     <td> {{ property.type }} </td>
-                  </tr>
-                  <tr>
-                     <th>Unit</th>
-                     <td> {{ property.unit }} </td>
-                  </tr>
-                  <tr>
-                     <th>Path</th>
-                     <td> {{ property.path }} </td>
-                  </tr>
-               </table>
-            </td>
-         {% endif %}
-      </tr>
-      {% endfor %}
-   </table>
-{% endblock %}

+ 0 - 106
pywrap/templates/register_info.html

@@ -1,106 +0,0 @@
-{% extends "base.html" %}
-{% block title %}Register info{% endblock %}
-{% block info %}
-<h1>Register '{{ register.name }}' info</h1>
-{% endblock %}
-
-{% block content %}
-   <script>
-      function write_register()
-      {
-         var value = document.getElementById("set_val_box").value;
-         window.location.href = "{{ url_for('write_register') }}?name={{ register.name }}&"+
-                                'bank={{ register.bank }}&val='+value;
-      };
-   </script>
-
-   <table border="1" style="width:100%">
-      {% if 'description' in register %}
-      <tr>
-         <th> Description </th>
-         <td> {{ register.description }} </td>
-      </tr>
-      {% endif %}
-      <tr>
-         <th> Current value </th>
-         <td> {{ value }} </td>
-      </tr>
-      {% if 'W' in register.mode %}
-         <tr>
-            <th> Set value</th>
-            <td> 
-               <input type="text" name="set_val_box" id="set_val_box" value="" />
-               <input type="button" value="set" onclick="write_register()">
-            </td>
-         </tr>
-      {% endif %}
-      <tr>
-         <th>Bank</th>
-         <td>{{ register.bank }}</td>
-      </tr>
-      <tr>
-         <th>Default value</th>
-         <td>{{ register.defvalue }}</td>
-      </tr>
-      <tr>
-         <th>Mode</th>
-         <td>
-            <ul>
-               {% for m in register.mode %}
-                  <li>{{ m }}</li>
-               {% endfor %}
-            </ul>
-         </td>
-      </tr>
-      {% if 'range' in register %}
-      <tr>
-         <th>
-            Range
-         </th>
-         <td>
-            <table>
-               <tr>
-                  <th> min </th>
-                  <td> {{ register.range.min }} </td>
-               </tr>
-               <tr>
-                  <th> max </th>
-                  <td> {{ register.range.max }} </td>
-               </tr>
-            </table>
-         </td>
-      </tr>
-      {% endif %}
-      {% if 'values' in register %}
-         {% for v in register['values'] %}
-            <tr>
-               {% if 'name' in v %}
-                  <th> {{v.name}} </th>
-               {% endif %}
-               <td>
-                  <table>
-                     {% if 'description' in v %}
-                     <tr>
-                        <th> description </th>
-                        <td> {{ v.description }} </td>
-                     </tr>
-                     {% endif %}
-                     <tr>
-                        <th> min </th>
-                        <td> {{ v.min }} </td>
-                     </tr>
-                     <tr>
-                        <th> max </th>
-                        <td> {{ v.max }} </td>
-                     </tr>
-                     <tr>
-                        <th> value </th>
-                        <td> {{ v.value }} </td>
-                     </tr>
-                  </table>
-               </td>
-            </tr>
-         {% endfor %}
-      {% endif %}
-   </table>
-{% endblock %}