Обработка масштабирования в графиках.
[weathermon.git] / bin / weather-lcd
index 9ee87ba529f4a7007dab6997818cf61889698e3f..8bf8ce56aa48c60a01bcd6aa9858e6985c6b3dde 100755 (executable)
@@ -47,22 +47,29 @@ function process_file()
 end
 
 function get_display_config()
+
   width  = tonumber(uci.get(config_name,"display","width"))
   height = tonumber(uci.get(config_name,"display","height"))
   charwidth  = tonumber(uci.get(config_name,"display","charwidth"))
   charheight = tonumber(uci.get(config_name,"display","charheight"))
-  cols   = tonumber(uci.get(config_name,"display","columns"))
   title  = uci.get(config_name,"display","title")
-  col_width = math.floor(width/cols)
   
   pages = {}
   pagetitles = {}
   pagedurations = {}
+  pagecolumns = {}
+  pagecolwidth = {}
   
   local page, def, line, col, pos
   
   cur.foreach(config_name,"display", function(s) 
       page = {}
+      local columns = s["columns"]
+      if not columns or columns == "" then
+        columns = 1
+      else 
+        columns = tonumber(columns)
+      end
       local pagetitle = s["title"]
       if not pagetitle then
         pagetitle = title
@@ -91,7 +98,7 @@ function get_display_config()
           page[#page+1] = def
         end
         col = col + 1
-        if col > cols then
+        if col > columns then
           col = 1
           line = line + 1
         end
@@ -99,6 +106,8 @@ function get_display_config()
       pages[#pages+1] = page
       pagetitles[#pages] = pagetitle
       pagedurations[#pages] = pageduration
+      pagecolumns[#pages] = columns
+      pagecolwidth[#pages] = math.floor(width/columns)
     end)
 
 end
@@ -144,15 +153,17 @@ function setup_pages(conn)
         pageid = def["sensor"].."."..def["param"]
         pagetitle = trim(def["label"])..", "..def["unit"]
         write_command(conn,"screen_add "..pageid)
-        write_command(conn,"screen_set "..pageid.." -cursor off")
-        write_command(conn,"screen_set "..pageid.." -name "..pagetitle.." -duration "..graph_duration)
+        write_command(conn,"screen_set "..pageid.." -cursor off -name "..pagetitle.." -duration "..graph_duration)
         write_command(conn,"widget_add "..pageid.." "..pageid..".title title")
-        write_command(conn,"widget_set "..pageid.." "..pageid..".title \"".. pagetitle.."\"")
         write_command(conn,"widget_add "..pageid.." "..pageid..".max string")
         write_command(conn,"widget_add "..pageid.." "..pageid..".min string")
-        for k=1,width-def["pos"] do
+        for k = 3,height-1 do
+          write_command(conn,"widget_add "..pageid.." "..pageid..".place"..trim(tostring(k)).." string")
+        end
+        for k=1,width do
           write_command(conn,"widget_add "..pageid.." "..pageid..".bar"..trim(tostring(k)).." vbar")
         end
+        write_command(conn,"widget_set "..pageid.." "..pageid..".title \"".. pagetitle.."\"")
       end
     end
   end
@@ -160,6 +171,7 @@ end
 
 function process_vals(vals)
   for i,page in pairs(pages) do
+    col_width = pagecolwidth[i]
     local pageid = "page"..trim(tostring(i))
     for j,def in pairs(page) do
       val = vals[def["sensor"]][def["param"]]
@@ -187,9 +199,9 @@ function process_graphs()
       local vals = {}
       local maxval = -99999999
       local minval =  99999999
-      for k=width-def["pos"],1,-1 do
+      for k=width,1,-1 do
         if row then
-          val = row["val"]
+          val = row["val"] * def["scale"]
           row = cur:fetch ({}, "a")
         else
           val = nil  
@@ -199,19 +211,28 @@ function process_graphs()
         if val and (val < minval) then minval = val; end
       end          
       minval = math.floor(minval)
-      minvalstr = trim(tostring(minval))
+      local minvalstr = trim(tostring(minval))
       maxval = math.ceil(maxval)
-      maxvalstr = trim(tostring(maxval))
+      local maxvalstr = trim(tostring(maxval))
+      local len = math.max(string.len(minvalstr),string.len(maxvalstr))
       write_command(conn,"widget_set "..pageid.." "..pageid..".max "..trim(tostring(width-string.len(maxvalstr)+1)).." 2 "..maxvalstr)
+      for k = 3,height-1 do
+        write_command(conn,"widget_set "..pageid.." "..pageid..".place"..trim(tostring(k)).." "..trim(tostring(width-len+1)).." "..k.." \" "..string.rep("-",len-1).."\"")
+      end
       write_command(conn,"widget_set "..pageid.." "..pageid..".min "..trim(tostring(width-string.len(minvalstr)+1)).." "..height.." "..minvalstr)
-      for k = 1,width-def["pos"] do
-        val = vals[k]
+      local m = width
+      for k = width-len,1,-1 do
+        val = vals[m]
         if val then
           h = math.floor(0.5+(val-minval)/(maxval-minval)*(height-1)*charheight)
         else
           h = 0
         end  
         write_command(conn,"widget_set "..pageid.." "..pageid..".bar"..trim(tostring(k)).." "..k.." "..height.." "..h)
+        m = m - 1
+      end
+      for k= m,1,-1 do
+        write_command(conn,"widget_set "..pageid.." "..pageid..".bar"..trim(tostring(k)).." 0 0 0")
       end
     end
   end