Author: richard
Date: Mon Apr 27 14:01:45 2009
New Revision: 5497

URL: http://svn.slimdevices.com/jive?rev=5497&view=rev
Log:
Bug: 11824
Description:
Improved hueristics for power management.

1. The default time to suspend has been reduced, to 40 minutes when the 
playmode is 'play' (eg 
when the player being controller is playing), and 20 minutes at other times.

2. Motion does not prevent the device from suspending. You actually have to use 
the buttons/wheel 
to keep the Controller awake. This prevents accidental motion from keeping the 
controller from 
suspending, and also allows the controller to suspend quickly if accidentally 
woken up.


Modified:
    
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
    
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveMeta.lua

Modified: 
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
URL: 
http://svn.slimdevices.com/jive/7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua?rev=5497&r1=5496&r2=5497&view=diff
==============================================================================
--- 
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
 (original)
+++ 
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
 Mon Apr 27 14:01:45 2009
@@ -191,19 +191,24 @@
                                      return EVENT_CONSUME
                              end)
 
-       -- power management
-       self.powerTimer = Timer(0, function() sleep(self) end)
+       -- power management (evaluate every minute)
+       self.lastMotion = Framework:getTicks()
+       self.lastPress = self.lastMotion
+       self.powerTimer = Timer(10000, function()
+               sleep(self)
+       end)
+
        Framework:addListener(EVENT_MOTION,
                              function(event) 
                                      if not self.acpower then
-                                             wakeup(self)
+                                             wakeup(self, 'motion')
                                      end
                                      return EVENT_UNUSED
                              end)
 
        Framework:addListener(EVENT_SCROLL,
                              function(event) 
-                                     wakeup(self)
+                                     wakeup(self, 'press')
                                      return EVENT_UNUSED
                              end)
 
@@ -218,7 +223,7 @@
                                              return EVENT_CONSUME
                                      end
 
-                                     wakeup(self)
+                                     wakeup(self, 'press')
                                      return EVENT_UNUSED
                              end)
 
@@ -579,7 +584,14 @@
 
 
 -- called to wake up jive
-function wakeup(self)
+function wakeup(self, action)
+       if action == 'motion' then
+               self.lastMotion = Framework:getTicks()
+       end
+       if action == 'press' then
+               self.lastPress = Framework:getTicks()
+       end
+
        if self.lockedPopup then
                -- we're locked do nothing
                return
@@ -595,41 +607,70 @@
 
 -- called to sleep jive
 function sleep(self)
+       local settings = self:getSettings()
+
+       local now = Framework:getTicks()
+       local deltaMotion = now - self.lastMotion
+       local deltaPress = now - self.lastPress
+
+       local motionTimeout = 0
+       local pressTimeout = 0
+       local nextState = false
+
        -- don't sleep or suspend with a popup visible
        -- e.g. Bug 6641 during a firmware upgrade
        local topWindow = Framework.windowStack[1]
        if not topWindow:canActivatePowersave()then
-               self:setPowerState("active")
+               pressTimeout = now
+               nextState = "active"
 
        elseif self.powerState == "active" then
-               self:setPowerState("dimmed")
+               motionTimeout = settings.dimmedTimeout
+               pressTimeout = settings.dimmedTimeout
+               nextState = "dimmed"
 
        elseif self.powerState == "locked" then
-               self:setPowerState("sleep")
-
-       else
-               if self.powerState == "dimmed" then
-                       self:setPowerState("sleep")
-               elseif self.powerState == "sleep" then
-                       self:setPowerState("suspend")
-               elseif self.powerState == "suspend" then
-                       -- we can't go to sleep anymore
-               end
+               motionTimeout = settings.dimmedTimeout
+               pressTimeout = settings.dimmedTimeout
+               nextState = "sleep"
+
+       elseif self.powerState == "dimmed" then
+               motionTimeout = settings.dimmedTimeout + settings.sleepTimeout
+               pressTimeout = settings.dimmedTimeout + settings.sleepTimeout
+               nextState = "sleep"
+
+       elseif self.powerState == "sleep" then
+               -- motion timeout to enter sleep is shorter than the press
+               -- timeout, so accidental motion does not prevent suspend
+               motionTimeout = settings.dimmedTimeout + settings.sleepTimeout
+
+               -- suspend timeout varies depending on playmode
+               local player = appletManager:callService("getCurrentPlayer")    
+               if player and player:getPlayMode() == "play" then
+                       pressTimeout = settings.sleepTimeout + 
settings.suspendWhenPlayingTimeout
+               else
+                       pressTimeout = settings.sleepTimeout + 
settings.suspendWhenStoppedTimeout
+               end
+               nextState = "suspend"
+
+       elseif self.powerState == "suspend" then
+               -- we can't go to sleep anymore
+       end
+
+       log:debug("powerState=", self.powerState, " nextState=", nextState, " 
motion=", (motionTimeout - deltaMotion), " press=", (pressTimeout - deltaPress))
+
+       if nextState and (deltaMotion >= motionTimeout) and (deltaPress >= 
pressTimeout) then
+               self:setPowerState(nextState)
        end
 end
 
 
 -- set the power state and update devices
-function setPowerState(self, state)
+function setPowerState(self, state, action)
        local settings = self:getSettings()
 
        log:info("setPowerState=", state, " acpower=", self.acpower)
        self.powerState = state
-
-       -- kill the timer
-       self.powerTimer:stop()
-
-       local interval = 0
 
        if self.acpower then
                -- charging
@@ -643,7 +684,6 @@
 
                if state == "active" then
                        self:setBrightness()
-                       interval = settings.dimmedTimeout
                        
                elseif state == "dimmed" then
                        if settings.dimmedAC then
@@ -651,7 +691,6 @@
                        else
                                self:setBrightness()
                        end
-                       interval = settings.sleepTimeout
 
                elseif state == "sleep" then
                        if settings.dimmedAC then
@@ -674,8 +713,6 @@
                                self.audioVolume = nil
                        end
 
-                       interval = settings.dimmedTimeout
-
                elseif state == "locked" then
                        self:_cpuPowerSave(true)
                        self:setBrightness()
@@ -687,7 +724,6 @@
                        end
 
                        self.lockedTimer:restart()
-                       interval = settings.dimmedTimeout
 
                elseif state == "dimmed" then
                        self:_cpuPowerSave(true)
@@ -695,8 +731,6 @@
                                self:_setBrightness(true, 8, 0)
                        end
 
-                       interval = settings.sleepTimeout
-
                else
                        self:_setBrightness(true, 0, 0)
                        self:_cpuPowerSave(false)
@@ -707,10 +741,7 @@
                                Sample:setEffectVolume(0)
                        end
 
-                       if state == "sleep" then
-                               interval = settings.suspendTimeout
-
-                       elseif state == "suspend" then
+                       if state == "suspend" then
                                if settings.suspendEnabled then
                                        self:_suspend()
                                end
@@ -721,10 +752,7 @@
        -- update wlan power save mode
        self:_wlanPowerSave()
 
-       if interval > 0 then
-               self.powerTimer:setInterval(interval)
-               self.powerTimer:start()
-       end
+       self.powerTimer:restart()
 end
 
 
@@ -948,10 +976,10 @@
                end
        end
 
-       local suspendOptions = { 10, 30, 60, 600, 3600 }
+       local suspendOptions = { 10, 20, 30, 60, 600, 3600 }
        local suspendIndex
        for i, v in ipairs(suspendOptions) do
-               if v == (settings.suspendTimeout / 1000) then
+               if v == (settings.suspendWhenPlayingTimeout / 1000) then
                        suspendIndex = i
                        break
                end
@@ -965,7 +993,7 @@
                                      sleepOptions,
                                      function(obj, selectedIndex)
                                              settings.sleepTimeout = 
sleepOptions[selectedIndex] * 1000
-                                             log:info("sleepTimeout=", 
settings.sleepTimeout)
+                                             log:debug("sleepTimeout=", 
settings.sleepTimeout)
                                      end,
                                      sleepIndex
                              )
@@ -976,8 +1004,9 @@
                                      "choice", 
                                      suspendOptions,
                                      function(obj, selectedIndex)
-                                             settings.suspendTimeout = 
suspendOptions[selectedIndex] * 1000
-                                             log:info("suspendTimeout=", 
settings.suspendTimeout)
+                                             
settings.suspendWhenPlayingTimeout = suspendOptions[selectedIndex] * 1000
+                                             
settings.suspendWhenStoppedTimeout = (suspendOptions[selectedIndex] * 1000) / 2
+                                             
log:debug("suspendWhenPlayingTimeout=", settings.suspendWhenPlayingTimeout)
                                      end,
                                      suspendIndex
                              )

Modified: 
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveMeta.lua
URL: 
http://svn.slimdevices.com/jive/7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveMeta.lua?rev=5497&r1=5496&r2=5497&view=diff
==============================================================================
--- 
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveMeta.lua
 (original)
+++ 
7.3/trunk/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveMeta.lua
 Mon Apr 27 14:01:45 2009
@@ -23,7 +23,8 @@
                brightness      = 32,
                dimmedTimeout   = 10000,        -- 10 seconds
                sleepTimeout    = 60000,        -- 60 seconds
-               suspendTimeout  = 3600000,      -- 1 hour
+               suspendWhenPlayingTimeout = 2400000, -- 40 minutes
+               suspendWhenStoppedTimeout = 1200000, -- 20 minutes
                suspendEnabled  = true,
                suspendWake     = nil,
                dimmedAC        = false,
@@ -37,9 +38,13 @@
 
        -- Fixup settings after upgrade
        local settings = meta:getSettings()
-       if not settings.suspendTimeout then
-               settings.suspendTimeout = 3600000 -- 1 hour
+       if not settings.suspendWhenPlayingTimeout then
+               settings.suspendTimeout = nil
+               settings.suspendWhenPlayingTimeout = 2400000
+               settings.suspendWhenStoppedTimeout = 1200000
+               meta:storeSettings()
        end
+
 
        -- Set player device type
        LocalPlayer:setDeviceType("controller", "Controller")

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins

Reply via email to