Author: titmuss
Date: Mon Jun 16 13:57:58 2008
New Revision: 2569
URL: http://svn.slimdevices.com?rev=2569&root=Jive&view=rev
Log:
Bug: 6683
Description:
Move discovery of players in udap network configuration mode from SelectPlayer
into
SqueezeDiscovery. Update Player object to allow for players needing network
configuration.
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SetupSqueezebox/SetupSqueezeboxApplet.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryMeta.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SetupWireless/SetupWirelessApplet.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/jive/net/Wireless.lua
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
Mon Jun 16 13:57:58 2008
@@ -70,21 +70,20 @@
end
-function free(self)
- jnt:unsubscribe(self)
-end
-
-
function notify_playerDelete(self, player)
local mac = player.id
+
manageSelectPlayerMenu(self)
- if self.playerMenu and self.playerItem[mac] then
- self.playerMenu:removeItem(self.playerItem[mac])
- self.playerItem[mac] = nil
- end
-
- if player:getSlimServer() then
- self:_updateServerItem(player:getSlimServer())
+
+ if self.playerMenu then
+ if self.playerItem[mac] then
+ self.playerMenu:removeItem(self.playerItem[mac])
+ self.playerItem[mac] = nil
+ end
+
+ if player:getSlimServer() then
+ self:_updateServerItem(player:getSlimServer())
+ end
end
end
@@ -94,12 +93,13 @@
local mac = player.id
manageSelectPlayerMenu(self)
+
if self.playerMenu then
self:_addPlayerItem(player)
- end
-
- if player:getSlimServer() then
- self:_updateServerItem(player:getSlimServer())
+
+ if player:getSlimServer() then
+ self:_updateServerItem(player:getSlimServer())
+ end
end
end
@@ -117,12 +117,14 @@
return
end
+ self:_updateServerItem(server)
+
for id, player in server:allPlayers() do
self:_refreshPlayerItem(player)
end
+
self:manageSelectPlayerMenu()
-
- self:_updateServerItem(server)
+
end
@@ -131,12 +133,13 @@
return
end
+ self:_updateServerItem(server)
+
for id, player in server:allPlayers() do
self:_refreshPlayerItem(player)
end
+
self:manageSelectPlayerMenu()
-
- self:_updateServerItem(server)
end
@@ -167,11 +170,6 @@
end
-function _unifyMac(mac)
- return string.upper(string.gsub(mac, "[^%x]", ""))
-end
-
-
function _addPlayerItem(self, player)
local mac = player:getId()
local playerName = player:getName()
@@ -189,14 +187,14 @@
end
local item = {
- id = _unifyMac(mac),
+ id = mac,
text = playerName,
sound = "WINDOWSHOW",
callback = function()
- if self:selectPlayer(player) then
- self.setupNext()
- end
- end,
+ if self:selectPlayer(player) then
+ self.setupNext()
+ end
+ end,
focusGained = function(event)
self:_showWallpaper(mac)
end,
@@ -219,7 +217,8 @@
function _refreshPlayerItem(self, player)
local mac = player.id
- if player:isConnected() or player:needsMusicSource() then
+ -- XXXX
+ if player:isAvailable() then
local item = self.playerItem[mac]
if not item then
-- add player
@@ -241,40 +240,6 @@
self.playerItem[mac] = nil
end
end
-end
-
-
--- add a squeezebox discovered using udap or an adhoc network
-function _addSqueezeboxItem(self, mac, name)
- local item = {
- id = _unifyMac(mac),
- text = name or self:string("SQUEEZEBOX_NAME", string.sub(mac,
7)),
- sound = "WINDOWSHOW",
- callback = function()
- local sbsetup =
appletManager:loadApplet("SetupSqueezebox")
- if not sbsetup then
- return
- end
-
- local adhoc = self.scanResults[mac].adhoc
- if self.scanResults[mac].udap then
- adhoc = nil
- end
-
- -- setup squeezebox, this will set current
- -- player on completion
- sbsetup:startSqueezeboxSetup(mac, adhoc,
- function()
-
jiveMain:closeToHome()
- end)
- end,
- focusGained = function(event)
- self:_showWallpaper(nil)
- end,
- weight = 1
- }
- self.playerMenu:addItem(item)
- self.playerItem[mac] = item
end
@@ -329,9 +294,7 @@
self.selectedPlayer = appletManager:callService("getCurrentPlayer")
for mac, player in appletManager:callService("iteratePlayers") do
- if player:isConnected() or player:needsMusicSource() then
- _addPlayerItem(self, player)
- end
+ _addPlayerItem(self, player)
end
-- Display password protected servers
@@ -370,46 +333,6 @@
function _scan(self)
-- SqueezeCenter and player discovery
appletManager:callService("discoverPlayers")
-
- -- scan for players in setup state
- if hasWireless then
- self.wireless:scan(function(scanTable)
- _scanComplete(self, scanTable)
- end)
- end
-
- -- remove squeezeboxen not seen for 20 seconds
- local now = os.time()
- for mac, entry in pairs(self.scanResults) do
- if os.difftime(now, entry.lastScan) > 20 then
- self.playerMenu:removeItem(self.playerItem[mac])
- self.playerItem[mac] = nil
- self.scanResults[mac] = nil
- end
- end
-end
-
-
-function _scanComplete(self, scanTable, keepOldEntries)
- local now = os.time()
-
- for ssid, entry in pairs(scanTable) do
- local mac, ether = SetupSqueezeboxApplet:ssidIsSqueezebox(ssid)
-
- log:debug("MAC=", mac, " ETHER=", ether)
-
- if mac and not self.scanResults[mac] and
- -- FIXME Wireless class should be timing out entries
- -- See bug 6860.
- os.difftime(now, entry.lastScan) < 20 then
- self.scanResults[mac] = {
- lastScan = entry.lastScan,
- adhoc = ssid,
- }
-
- self:_addSqueezeboxItem(mac, name)
- end
- end
end
@@ -427,9 +350,22 @@
-- set the current player
appletManager:callService("setCurrentPlayer", player)
+ -- network configuration needed?
+ if player:needsNetworkConfig() then
+ -- XXXX convert to applet service call
+ local sbsetup = appletManager:loadApplet("SetupSqueezebox")
+ sbsetup:startSqueezeboxSetup(player:getId(),
+ player:getSSID(),
+ function()
+ jiveMain:closeToHome()
+ end)
+ return false
+ end
+
-- udap setup needed?
if player:needsMusicSource() then
appletManager:callService("selectMusicSource")
+ return false
end
return true
@@ -437,6 +373,7 @@
function free(self)
+ jnt:unsubscribe(self)
-- load the correct wallpaper on exit
if self.selectedPlayer and self.selectedPlayer:getId() then
@@ -446,6 +383,7 @@
end
appletManager:freeApplet("SetupWallpaper")
+
-- Never free this applet
return false
end
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SetupSqueezebox/SetupSqueezeboxApplet.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SetupSqueezebox/SetupSqueezeboxApplet.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SetupSqueezebox/SetupSqueezeboxApplet.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SetupSqueezebox/SetupSqueezeboxApplet.lua
Mon Jun 16 13:57:58 2008
@@ -23,6 +23,8 @@
local Textinput = require("jive.ui.Textinput")
local Window = require("jive.ui.Window")
local Popup = require("jive.ui.Popup")
+
+local Player = require("jive.slim.Player")
local Udap = require("jive.net.Udap")
local hasWireless, Wireless = pcall(require, "jive.net.Wireless")
@@ -252,15 +254,15 @@
function _scanComplete(self, scanTable, keepOldEntries)
- local now = os.time()
+ local now = Framework:getTicks()
for ssid, entry in pairs(scanTable) do
- local mac, ether = self:ssidIsSqueezebox(ssid)
+ local mac, ether = Player:ssidIsSqueezebox(ssid)
log:debug("ether=", ether, " mac=", mac)
if mac ~= nil then
- mac = string.upper(mac)
-
+ mac = string.upper(string.gsub(mac, ":", ""))
+
if not self.scanResults[mac] then
local item = {
text =
self:string("SQUEEZEBOX_BRIDGED_NAME", string.sub(mac, 7)),
@@ -284,7 +286,7 @@
self.scanResults[mac].adhoc = true
-- remove networks not seen for 10 seconds
- if keepOldEntries ~= true and os.difftime(now,
entry.lastScan) > 10 then
+ if keepOldEntries ~= true and now - entry.lastScan >
10000 then
log:debug(mac, " not seen for 10 seconds")
self.scanResults[mac].adhoc = nil
@@ -299,17 +301,6 @@
--[[
-Return the Squeezebox mac address from the ssid, or nil if the ssid is
-not from a Squeezebox in setup mode.
---]]
-function ssidIsSqueezebox(self, ssid)
- local hasEthernet, mac = string.match(ssid,
"logitech([%-%+])squeezebox[%-%+](%x+)")
-
- return mac, hasEthernet
-end
-
-
---[[
This function is the entry point after a squeezebox has been choosen
for setup, may be called from outside this applet.
@@ -319,6 +310,8 @@
--]]
function startSqueezeboxSetup(self, mac, adhoc, setupNext)
+ mac = string.gsub(mac, ":", "")
+
if setupNext then
self.setupNext = setupNext
end
@@ -334,7 +327,7 @@
if adhoc then
-- full configuration via adhoc network
- local _, hasEthernet = self:ssidIsSqueezebox(adhoc)
+ local _, hasEthernet = Player:ssidIsSqueezebox(adhoc)
-- find jive network configuration
Task("readConfig", self,
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
Mon Jun 16 13:57:58 2008
@@ -2323,7 +2323,7 @@
end
-- change player, only if multiple players
- local numPlayers = appletManager:callService("countConnectedPlayers")
+ local numPlayers = appletManager:callService("countPlayers")
if numPlayers > 1 and appletManager:hasApplet("SelectPlayer") then
menu:addItem({
text =
self:string("SLIMBROWSER_CHOOSE_PLAYER"),
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
Mon Jun 16 13:57:58 2008
@@ -35,6 +35,8 @@
local SocketUdp = require("jive.net.SocketUdp")
local Udap = require("jive.net.Udap")
+
+local hasWireless, Wireless = pcall(require, "jive.net.Wireless")
local Player = require("jive.slim.Player")
local SlimServer = require("jive.slim.SlimServer")
@@ -119,6 +121,7 @@
end
+-- udap packet received
function _udapSink(self, chunk, err)
if chunk == nil then
return -- ignore errors
@@ -137,6 +140,19 @@
local player = Player(jnt, playerId)
player:updateUdap(pkt)
+end
+
+
+-- wireless scan complete
+function _scanComplete(self, scanTable)
+ for ssid, entry in pairs(scanTable) do
+ local playerId = Player:ssidIsSqueezebox(ssid)
+
+ if playerId then
+ local player = Player(jnt, playerId)
+ player:updateSSID(ssid, entry.lastScan)
+ end
+ end
end
@@ -196,6 +212,11 @@
self:_udapSink(chunk, err)
end)
+ -- wireless discovery
+ if hasWireless then
+ obj.wireless = Wireless(jnt, "eth0")
+ end
+
-- discovery timer
obj.timer = Timer(DISCOVERY_PERIOD,
function() obj:_discover() end)
@@ -227,6 +248,15 @@
local packet = Udap.createAdvancedDiscover(nil, 1)
log:debug("sending udap discovery to 255.255.255.255")
self.udap:send(function() return packet end, "255.255.255.255")
+
+ -- Wireless discovery, only in probing state
+ if self.state == 'probing' and hasWireless then
+ self.wireless:scan(
+ function(scanTable)
+ _scanComplete(self, scanTable)
+ end)
+ end
+
-- Special case Squeezenetwork
if jnt:getUUID() then
@@ -436,18 +466,17 @@
function setCurrentPlayer(self, player)
- if self.currentPlayer == player then
- return -- no change
- end
-
- -- update player
- log:info("selected player: ", player)
- self.currentPlayer = player
-
- local settings = self:getSettings()
- settings.currentPlayer = player and player:getId() or false
- self:storeSettings()
-
+ if self.currentPlayer ~= player then
+ -- update player
+ log:info("selected player: ", player)
+ self.currentPlayer = player
+
+ local settings = self:getSettings()
+ settings.currentPlayer = player and player:getId() or false
+ self:storeSettings()
+ end
+
+ -- note: notify even if the player has not changed
jnt:notify("playerCurrent", player)
-- restart discovery when we have no player
@@ -488,18 +517,6 @@
end
-function countConnectedPlayers(self)
- local count = 0
- for i, player in Player:iterate() do
- if player:isConnected() then
- count = count + 1
- end
- end
-
- return count
-end
-
-
function countPlayers(self)
local count = 0
for i, player in Player:iterate() do
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryMeta.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryMeta.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryMeta.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryMeta.lua
Mon Jun 16 13:57:58 2008
@@ -58,7 +58,6 @@
meta:registerService("iteratePlayers")
meta:registerService("iterateSqueezeCenters")
- meta:registerService("countConnectedPlayers")
meta:registerService("countPlayers")
meta:registerService("getPollList")
@@ -69,7 +68,9 @@
local slimDiscovery = appletManager:loadApplet("SqueezeDiscovery")
-- Set current player
- slimDiscovery:setCurrentPlayer(Player(jnt, settings.currentPlayer))
+ if settings.currentPlayer then
+ slimDiscovery:setCurrentPlayer(Player(jnt,
settings.currentPlayer))
+ end
-- With the MP firmware when SqueezeNetwork is selected a dummy player
with an ff mac
-- address is selected, and then a firmware update starts. When this
mac address is seen
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
Mon Jun 16 13:57:58 2008
@@ -180,6 +180,7 @@
uuid = false,
slimServer = false,
config = false,
+ lastSeen = 0,
-- player info from SC
info = {},
@@ -250,7 +251,7 @@
-- callback happens.
oldInfo.connected = false
- -- player is now active
+ -- player is now available
playerList[self.id] = self
-- add to new server
@@ -306,7 +307,49 @@
self:free(self.slimServer)
end
- -- player is now active
+ -- player is now available
+ playerList[self.id] = self
+
+ self.jnt:notify('playerNew', self)
+end
+
+
+-- return the Squeezebox mac address from the ssid, or nil if the ssid is
+-- not from a Squeezebox in setup mode.
+function ssidIsSqueezebox(self, ssid)
+ local hasEthernet, mac = string.match(ssid,
"logitech([%-%+])squeezebox[%-%+](%x+)")
+
+ if mac then
+ mac = string.gsub(mac, "(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)",
"%1:%2:%3:%4:%5:%6")
+ end
+
+ return mac, hasEthernet
+end
+
+
+-- Update player state from an SSID
+function updateSSID(self, ssid, lastScan)
+ local mac = ssidIsSqueezebox(self, ssid)
+
+ assert(self.id, mac)
+
+ -- stale wlan scan results?
+ if lastScan < self.lastSeen then
+ return
+ end
+
+ self.config = "needsNetwork"
+ self.configSSID = ssid
+ self.info.connected = false
+
+ self.lastSeen = lastScan
+
+ -- The player is no longer connected to SqueezeCenter
+ if self.slimServer then
+ self:free(self.slimServer)
+ end
+
+ -- player is now available
playerList[self.id] = self
self.jnt:notify('playerNew', self)
@@ -509,6 +552,16 @@
--]]
function getId(self)
return self.id
+end
+
+
+-- Returns the player ssid if in setup mode, or nil
+function getSSID(self)
+ if self.config == 'needsNetwork' then
+ return self.configSSID
+ else
+ return nil
+ end
end
@@ -1115,6 +1168,18 @@
end
+-- return true if the player is available, that is when it is connected
+-- to SqueezeCenter, or in configuration mode (udap or wlan adhoc)
+function isAvailable(self)
+ return self.config ~= false
+end
+
+
+function needsNetworkConfig(self)
+ return self.config == "needsNetwork"
+end
+
+
function needsMusicSource(self)
return self.config == "needsServer"
end
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SetupWireless/SetupWirelessApplet.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SetupWireless/SetupWirelessApplet.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SetupWireless/SetupWirelessApplet.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SetupWireless/SetupWirelessApplet.lua
Mon Jun 16 13:57:58 2008
@@ -287,7 +287,7 @@
function _scanComplete(self, scanTable)
- local now = os.time()
+ local now = Framework:getTicks()
local associated = nil
for ssid, entry in pairs(scanTable) do
@@ -313,7 +313,7 @@
self.scanMenu:updatedItem(item)
-- remove networks not seen for 20 seconds
- if not entry.associated and os.difftime(now,
entry.lastScan) > 20 then
+ if not entry.associated and now - entry.lastScan
> 20000 then
self.scanMenu:removeItem(item)
self.scanResults[ssid] = nil
end
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/applets/SqueezeboxJive/SqueezeboxJiveApplet.lua
Mon Jun 16 13:57:58 2008
@@ -263,11 +263,14 @@
function notify_playerCurrent(self, player)
- local server
- if player then
- self.player = player
- self.server = player:getSlimServer()
- else
+ if not player then
+ return
+ end
+
+ self.player = player
+ self.server = player:getSlimServer()
+
+ if not self.server then
return
end
Modified:
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/jive/net/Wireless.lua
URL:
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/jive/net/Wireless.lua?rev=2569&root=Jive&r1=2568&r2=2569&view=diff
==============================================================================
---
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/jive/net/Wireless.lua
(original)
+++
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay_jive/share/jive/net/Wireless.lua
Mon Jun 16 13:57:58 2008
@@ -12,6 +12,7 @@
local debug = require("jive.utils.debug")
local log = require("jive.utils.log").logger("net.socket")
+local Framework = require("jive.ui.Framework")
local Socket = require("jive.net.Socket")
local Task = require("jive.ui.Task")
local wireless = require("jiveWireless")
@@ -206,7 +207,7 @@
level = level,
quality = quality,
associated = (ssid == associated),
- lastScan = os.time()
+ lastScan = Framework:getTicks()
}
end
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins