first brainstorming
authorChristian Thaeter <ct@pipapo.org>
Sat, 2 Jan 2010 05:50:21 +0000 (06:50 +0100)
committerChristian Thaeter <ct@pipapo.org>
Sat, 2 Jan 2010 05:50:21 +0000 (06:50 +0100)
profiled.lua [new file with mode: 0644]

diff --git a/profiled.lua b/profiled.lua
new file mode 100644 (file)
index 0000000..d15103d
--- /dev/null
@@ -0,0 +1,244 @@
+
+local EMPTY = {}
+queries = {}
+
+function queries.test()
+   return { test = 'working' }
+end
+
+function queries.defaults()
+   return defaults or EMPTY
+end
+
+
+-- orientation = function() end
+-- moving = function () end
+-- charging = function () end
+-- playing = function () end
+-- display = function () end
+-- locked = function () end
+
+
+engines = {}
+
+function engines.test(state)
+   print("test state:", state)
+end
+
+--engines.gps(state)
+--engines.availability(state)
+--engines.profile(state)
+--engines.celluar(state)
+--engines.secure(state)
+--engines.lock(state)
+--engines.wlan(state)
+
+-- by location, gps must be enabled for this, gps will not be enabled for this rules, 'unknown' is special for any unknown position
+location = {
+   home = {
+      secure = 'no'
+   },
+
+   unknown = {
+      secure = 'yes',
+      celluar = 'on',
+      wlan = 'off',
+      gps = 'on'
+   }
+}
+
+function vote(votes, key, value)
+   attr, bias = value:match("^([^+-]*)([+-]*)")
+
+   if bias == "" then
+      bias = "+"
+   end
+
+   local counter = 0
+
+   for v in bias:gmatch "." do
+      if v == "+" then
+         counter = counter + 1
+      elseif v == "-" then
+         counter = counter - 1
+      else
+         break
+      end
+   end
+
+   if votes[key] == nil then
+      votes[key] = {}
+   end
+   if votes[key][attr] == nil then
+      votes[key][attr] = 0
+   end
+   votes[key][attr] = votes[key][attr] + counter
+
+   print("voting:", counter, "for:", key..":"..attr, "giving:", votes[key][attr])
+end
+
+function mainloop()
+   --sleep(sample_interval)
+   --config()
+
+   print("mainloop")
+
+   local votes = {}
+
+   -- do the voting
+   for name, func in pairs(queries) do
+      if type(_G[name]) == 'table' then
+      print(name,func)
+         for k,v in pairs(func()) do
+            vote(votes, k, v)
+         end
+      end
+   end
+
+   -- calculate results
+   for engine, values in pairs(votes) do
+      if engines[engine] then
+         local winner
+         local winning_votes = 0
+         for attr, votes in pairs(values) do
+            print (attr, votes)
+            if votes > winning_votes then
+               winner = attr
+               winning_votes = votes
+            end
+         end
+         print ("elected:", engine..":"..winner, "votes:", winning_votes)
+
+         if winner then
+            engines[engine](winner)
+         end
+      end
+   end
+end
+
+
+-- example config:
+
+sample_interval = 30000
+
+--voting system, not fair but usable
+-- Examples:
+--  key = 'value'     votes +1 for 'value' on 'key'
+--  key = 'value-'    votes -1 for 'value' on 'key'
+--  key = 'value+++'  votes +4 for 'value' on 'key'
+--  key = 'value---'  votes -3 for 'value' on 'key'
+--  key = 'value++--' votes +1 for 'value' on 'key'
+--
+-- only things which got not manually altered get voted for,
+-- after voting the value with the most votes and being positive is choosen
+-- if it passes this becomes the new setting for the associated thing.
+--
+
+-- the default table gives some bias for all voting
+defaults = {
+   gps = 'on--',    -- need at least 2 votes to turn the gps on
+}
+
+
+-- timespans hh:mm in hhmm notation (700 is 7:00h)
+time = {
+   [100] = {
+      availability = 'offline',
+      profile = 'silent',
+      celluar = 'off',
+   },
+   [700] = {
+   },
+}
+
+-- loadavg times 100
+load = {
+   [0] = {},
+   [20] = {
+      secure = 'no',
+      lock = 'no',
+      wlan = 'on'
+   }
+}
+
+
+-- orientation of the device
+orientation = {
+   face_down = {
+      availability = 'offline',
+      profile = 'silent',
+      celluar = 'off',
+      secure = 'yes',
+      gps = 'off'
+   },
+   face_up = {
+      gps = 'on'
+   }
+}
+
+-- moving around
+moving = {
+   yes = {
+      availability = 'online',
+      profile = 'normal',
+      celluar = 'on',
+      secure = 'no',
+      gps = 'on'
+   },
+   no = {
+      availability = 'offline',
+      secure = 'yes'
+   }
+}
+
+-- connected to charger
+charging = {
+   yes = {
+      celluar = 'on',
+      wlan = 'on',
+      gps = 'off'
+   }
+}
+
+-- if sound/multimedia is playing
+playing = {
+   yes = {
+      secure = 'no',
+   }
+}
+
+-- display state
+display = {
+   on = {
+      secure = 'no'
+   }
+}
+
+-- manually locked
+locked = {
+   yes = {
+      secure = 'yes'
+   },
+   no = {
+      secure = 'no'
+   }
+}
+
+-- by location, gps must be enabled for this, gps will not be enabled for this rules, 'unknown' is special for any unknown position
+location = {
+   home = {
+      secure = 'no'
+   },
+
+   unknown = {
+      secure = 'yes',
+      celluar = 'on',
+      wlan = 'off',
+      gps = 'on'
+   }
+}
+
+test = {}
+
+
+mainloop()