Обработка сообщения от процессов завернута в pcall для большей падежеустойчивости...
authorRoman Bazalevsky <rvb@rvb.name>
Tue, 13 Nov 2018 07:55:29 +0000 (10:55 +0300)
committerRoman Bazalevsky <rvb@rvb.name>
Tue, 13 Nov 2018 07:55:29 +0000 (10:55 +0300)
bin/weather-display
bin/weathermon
bin/weathermon-iio

index 1e0993b31e2cd4c2c16514f906deeccab82be047..ef210ff5a68c17c383e07d64e25d992978d149cd 100755 (executable)
@@ -160,103 +160,115 @@ while true do
 
   local timestr = os.date(timestr_template)
 
-  local mod = lfs.attributes(watch_file,"modification")
-  local muted_mod = lfs.attributes(mute_file,"modification")
-  local muted_beep = muted_mod and (muted_mod > (os.time() - mute_time))
-  
-  if mod then
+  pcall(function ()
+
+    local mod = lfs.attributes(watch_file,"modification")
+    local muted_mod = lfs.attributes(mute_file,"modification")
+    local muted_beep = muted_mod and (muted_mod > (os.time() - mute_time))
   
-    if last < mod then
-      last = mod
-      res,sensor_data = pcall(function ()
-        local f = io.open(watch_file,"r")
-        content = f:read("*all")
-        io.close(f)
-        return json.decode(content)
-      end)      
+    if mod then
+   
+      if last < mod then
+        last = mod
+        res,sensor_data = pcall(function ()
+          local f = io.open(watch_file,"r")
+          content = f:read("*all")
+          io.close(f)
+          return json.decode(content)
+        end)      
     
-      write_file(w_led,w_engage)
+        write_file(w_led,w_engage)
    
-    else
+      else
 
-      write_file(w_led,w_disengage)
+        write_file(w_led,w_disengage)
       
-    end 
-
-    local values = {}
-    local printable = {}
-
-    for sensor,sensor_params in pairs(sensor_data[web_id]) do
-      if sensor ~= "timestamp" then
-        for param,value in pairs(sensor_params) do
-          local name = sensor.."."..param
-          values[name]=value
-          if a_formats[name] then
-            printable[name]=string.format("%"..a_formats[name][1],value*a_formats[name][2])
-          end  
+      end 
+
+      local values = {}
+      local printable = {}
+
+      for sensor,sensor_params in pairs(sensor_data[web_id]) do
+        if sensor ~= "timestamp" then
+          for param,value in pairs(sensor_params) do
+            local name = sensor.."."..param
+            values[name]=value
+            if a_formats[name] then
+              printable[name]=string.format("%"..a_formats[name][1],value*a_formats[name][2])
+            end  
+          end
+        end  
+      end
+
+      level = 1
+      alarms = ""
+
+      if not muted_beep then
+        for key,value in pairs(values) do
+          value_level = check_limit(key,value,limits)
+          if value_level > level then
+            level = value_level
+            alarms = a_names[key]
+          elseif value_level == level then  
+            alarms = alarms.." "..a_names[key]
+          end   
         end
       end  
-    end
-
-    level = 1
-    alarms = ""
-
-    if not muted_beep then
-      for key,value in pairs(values) do
-        value_level = check_limit(key,value,limits)
-        if value_level > level then
-          level = value_level
-          alarms = a_names[key]
-        elseif value_level == level then  
-          alarms = alarms.." "..a_names[key]
-        end   
-      end
-    end  
 
-    leds_engage = {} 
+      leds_engage = {} 
     
-    for key,value in pairs(a_engage[level]) do
-      leds_engage[value] = a_engage_mode[level]
-    end
-
-    for led,mode in pairs(a_leds) do
-      if leds_engage[led] then
-        write_file(led,leds_engage[led])
-      else  
-        write_file(led,mode)
+      for key,value in pairs(a_engage[level]) do
+        leds_engage[value] = a_engage_mode[level]
+      end
+      for led,mode in pairs(a_leds) do
+        if leds_engage[led] then
+          write_file(led,leds_engage[led])
+        else  
+          write_file(led,mode)
+        end
       end
-    end
   
-    alarms = trim(alarms)
-    alarmstr = a_levels[level]..": "..alarms
+      alarms = trim(alarms)
+      alarmstr = a_levels[level]..": "..alarms
     
-    if alarmstr:len()>alarmstr_len then
-      alarmstr=alarmstr:sub(1,alarmstr_len)
-    elseif alarmstr:len()<alarmstr_len then
-      local delta = alarmstr_len - alarmstr:len()
-      local before = math.floor(delta/2)
-      local after = delta - before
-      alarmstr = string.rep(" ",before)..alarmstr..string.rep(" ",after)
-    end
+      if alarmstr:len()>alarmstr_len then
+        alarmstr=alarmstr:sub(1,alarmstr_len)
+      elseif alarmstr:len()<alarmstr_len then
+        local delta = alarmstr_len - alarmstr:len()
+        local before = math.floor(delta/2)
+        local after = delta - before
+        alarmstr = string.rep(" ",before)..alarmstr..string.rep(" ",after)
+      end
 
-    sensstr = string.gsub(senstemplate,"%{.-%}", function (s) return printable[s:sub(2,s:len()-1)]; end)
+      sensstr = string.gsub(senstemplate,"%{.-%}", function (s) return printable[s:sub(2,s:len()-1)]; end)
 
-    if onoff and (level>=alarm_raise) then
-       data = alarmstr..sensstr
-    else
+      if onoff and (level>=alarm_raise) then
+       data = alarmstr..sensstr
+      else
         data = timestr..sensstr
-    end
+      end
 
-    if old_data ~= data then
+      if old_data ~= data then
    
-      old_data = data
-      print(data)
-      write_file(out_file,data)
+        old_data = data
+        print(data)
+        write_file(out_file,data)
    
-    end   
+      end   
   
+    end
+    
+  end)  
+
+  local t = os.date("*t",os.time()+60) 
+  t["sec"] = 0
+  local sec = os.time(t)-os.time()
+  if sec>0 then
+    if sec>5 then
+      sec=5
+    end
+    socket.sleep(sec)
   end
-  
-  socket.sleep(1)
 
 end
index 03fad42630200d77a989ee62d40f395aee07f183..6980cc835dfc8e2aa6caa9794e282ce3c8ec7443 100755 (executable)
@@ -388,21 +388,28 @@ end
 records = {}
 
 while 1 do
+
   line=serialin:read("*l")
+
   if line == nil then
     break
   end
-  printLog("Received: "..line);
-  if startswith(line,'{') then
-    processJson(line)
-  else
-    processLine(line)
-  end
 
-  if dump_file then
-    local f = io.open(dump_file,"w")
-    io.output(f)
-    io.write(json.encode(records))
-    io.close(f)
-  end
+  pcall(function ()
+  
+    printLog("Received: "..line)
+    if startswith(line,'{') then
+      processJson(line)
+    else
+      processLine(line)
+    end
+
+    if dump_file then
+      local f = io.open(dump_file,"w")
+      io.output(f)
+      io.write(json.encode(records))
+      io.close(f)
+    end
+  end)
+    
 end
index 7fe5f68af08639a3340c5f348b177235324915d6..df32c3ad5849bc90d793f4379aa76b61667f1da0 100755 (executable)
@@ -189,16 +189,17 @@ if not delay then
 end
 
 while true do
-  values = get_parameters(parameters)
-  records = {}
-  records[web_id] = {}
-  for key,record in pairs(values) do
-    records[web_id][key] = record
-    records[web_id]["timestamp"] = os.date("%Y-%m-%dT%H:%M:%S")
-  end
-  for key,value in pairs(values) do
-    value["device"] = key
-    print(json.encode(value))
+  if pcall(function () values = get_parameters(parameters) end) then
+    records = {}
+    records[web_id] = {}
+    for key,record in pairs(values) do
+      records[web_id][key] = record
+      records[web_id]["timestamp"] = os.date("%Y-%m-%dT%H:%M:%S")
+    end
+    for key,value in pairs(values) do
+      value["device"] = key
+      print(json.encode(value))
+    end
   end  
   socket.sleep(delay)
 end