[luci] expand the sensor page with type and function fields + validation
This commit is contained in:
parent
f55b344ec4
commit
3c5dacaf56
|
@ -1,19 +1,25 @@
|
||||||
--[[
|
--[[
|
||||||
LuCI - Lua Configuration Interface
|
|
||||||
|
|
||||||
Copyright 2008 Steven Barth <steven@midlink.org>
|
sensor.lua - LuCI cbi model for the Flukso sensor page
|
||||||
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
|
|
||||||
Copyright 2011 Bart Van Der Meerssche <bart.vandermeerssche@flukso.net>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Copyright (C) 2011 Bart Van Der Meerssche <bart.vandermeerssche@flukso.net>
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
$Id: network.lua 5949 2010-03-27 14:56:35Z jow $
|
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
|
|
||||||
local uci = require "luci.model.uci".cursor()
|
local uci = require "luci.model.uci".cursor()
|
||||||
|
|
||||||
local FLUKSO = uci:get_all("flukso")
|
local FLUKSO = uci:get_all("flukso")
|
||||||
|
@ -22,18 +28,12 @@ local MAX_SENSORS = tonumber(FLUKSO.main.max_sensors)
|
||||||
|
|
||||||
m = Map("flukso", translate("Sensor"), translate("Fluksometer sensor configuration"))
|
m = Map("flukso", translate("Sensor"), translate("Fluksometer sensor configuration"))
|
||||||
|
|
||||||
-- sync with the sensor board after committing to the uci file
|
|
||||||
m.on_after_commit = function(self)
|
|
||||||
luci.util.exec("fsync")
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
s = m:section(NamedSection, "main", "settings", "general settings")
|
s = m:section(NamedSection, "main", "settings", "general settings")
|
||||||
phase = s:option(ListValue, "phase", translate("phase"))
|
phase = s:option(ListValue, "phase", translate("phase"))
|
||||||
phase:value("1")
|
phase:value("1")
|
||||||
phase:value("3")
|
phase:value("3")
|
||||||
|
|
||||||
-- (ab)use phase validation callback to assign port numbers to sensors
|
-- (ab)use phase validation callback to assgn port numbers to sensors
|
||||||
function phase:validate(value, section)
|
function phase:validate(value, section)
|
||||||
if value == "1" then
|
if value == "1" then
|
||||||
uci:set_list("flukso", "1", "port", "1")
|
uci:set_list("flukso", "1", "port", "1")
|
||||||
|
@ -53,30 +53,98 @@ function phase:validate(value, section)
|
||||||
return value
|
return value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
s = {}
|
|
||||||
|
|
||||||
for i = 1, MAX_SENSORS do
|
for i = 1, MAX_SENSORS do
|
||||||
s[i] = m:section(NamedSection, tostring(i), "sensor", "sensor #" .. i)
|
s = m:section(NamedSection, tostring(i), "sensor", "sensor #" .. i)
|
||||||
s[i].addremove = false
|
s.addremove = false
|
||||||
|
|
||||||
s[i]:option(DummyValue, "id", translate("identifier"))
|
enable = s:option(Flag, "enable", translate("enable"))
|
||||||
s[i]:option(DummyValue, "class", translate("class"))
|
enable.rmempty = false
|
||||||
|
|
||||||
|
s:option(DummyValue, "id", translate("identifier"))
|
||||||
|
s:option(DummyValue, "class", translate("class"))
|
||||||
|
|
||||||
if FLUKSO[tostring(i)].class == "analog" then
|
if FLUKSO[tostring(i)].class == "analog" then
|
||||||
s[i]:option(Value, "voltage", translate("voltage"))
|
typ = s:option(DummyValue, "type", translate("type"))
|
||||||
current = s[i]:option(ListValue, "current", translate("current"))
|
|
||||||
|
func = s:option(Value, "function", translate("function"))
|
||||||
|
func:depends("enable", "1")
|
||||||
|
func.rmempty = true
|
||||||
|
|
||||||
|
voltage = s:option(Value, "voltage", translate("voltage"))
|
||||||
|
voltage.rmempty = false
|
||||||
|
|
||||||
|
current = s:option(ListValue, "current", translate("current"))
|
||||||
current:value("50")
|
current:value("50")
|
||||||
current:value("100")
|
current:value("100")
|
||||||
current:value("250")
|
current:value("250")
|
||||||
current:value("500")
|
current:value("500")
|
||||||
|
current.rmempty = false
|
||||||
|
|
||||||
elseif FLUKSO[tostring(i)].class == "pulse" then
|
elseif FLUKSO[tostring(i)].class == "pulse" then
|
||||||
s[i]:option(Value, "constant", translate("constant"))
|
typ = s:option(Value, "type", translate("type"))
|
||||||
|
typ.rmempty = true
|
||||||
|
|
||||||
|
func = s:option(Value, "function", translate("function"))
|
||||||
|
func:depends("enable", "1")
|
||||||
|
func.rmempty = true
|
||||||
|
|
||||||
|
constant = s:option(Value, "constant", translate("constant"))
|
||||||
|
constant.rmempty = false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
enable = s[i]:option(Flag, "enable", translate("enable"))
|
|
||||||
enable.rmempty = false
|
-- section-level validation does not seem to work with NamedSections
|
||||||
|
-- so we're resorting to hackery page-level validation instead
|
||||||
|
function m:parse(...)
|
||||||
|
-- insert custom processing
|
||||||
|
|
||||||
|
for _, sobj in ipairs(self.children) do
|
||||||
|
local sid = sobj.section
|
||||||
|
|
||||||
|
-- only process the 'sensor' sections
|
||||||
|
if tonumber(sid) then
|
||||||
|
local err = {}
|
||||||
|
local field = {}
|
||||||
|
|
||||||
|
for _, fld in ipairs(sobj.children) do
|
||||||
|
field[fld.option] = fld
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- an enabled sensor requires a non-empty function/name
|
||||||
|
if field["class"]:cfgvalue(sid) ~= "uart"
|
||||||
|
and field["enable"]:formvalue(sid) == "1"
|
||||||
|
and field["function"]:formvalue(sid) == "" then
|
||||||
|
|
||||||
|
err[#err + 1] = "an enabled sensor must have a name"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- an enabled sensor requires a non-empty type
|
||||||
|
if field["class"]:cfgvalue(sid) == "pulse"
|
||||||
|
and field["enable"]:formvalue(sid) == "1"
|
||||||
|
and field["type"]:formvalue(sid) == "" then
|
||||||
|
|
||||||
|
err[#err + 1] = "an enabled sensor must have a type"
|
||||||
|
end
|
||||||
|
|
||||||
|
if next(err) then
|
||||||
|
self.save = false
|
||||||
|
|
||||||
|
field["enable"].section.error = {
|
||||||
|
[sid] = err
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- and now call the authentic parser
|
||||||
|
Map.parse(self, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- sync with the sensor board after committing changes to the uci file
|
||||||
|
m.on_after_commit = function(self)
|
||||||
|
luci.util.exec("fsync")
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
|
Loading…
Reference in New Issue