[tuxdroid-svn] r4844 - in software_suite_v3/smart-core/smart-server/trunk: data/web_interface/user
Status: Beta
Brought to you by:
ks156
Author: remi
Date: 2009-06-21 20:02:04 +0200 (Sun, 21 Jun 2009)
New Revision: 4844
Added:
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/hashtable.js
Modified:
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/css/livewithtux.css
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/common.js
software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/xsl/livewithtux.xsl
software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
software_suite_v3/smart-core/smart-server/trunk/resources/07_web_interfaces/01_resourceWIUser01.py
Log:
* Work on "Live with Tux" page
- Control of gadgets
- Thumbnail bar
- Status
- ...
Modified: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/css/livewithtux.css
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/css/livewithtux.css 2009-06-20 15:00:05 UTC (rev 4843)
+++ software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/css/livewithtux.css 2009-06-21 18:02:04 UTC (rev 4844)
@@ -7,6 +7,8 @@
}
div.thumbnailBarView{
+ top:0px;
+ left:0px;
margin-left:10px;
margin-top:0px;
height:90px;
@@ -17,6 +19,159 @@
float:left;
}
+div.thumbnailBarGadgetFirstDiv{
+ top:0px;
+ left:0px;
+ width:44px;
+ height:44px;
+ margin-left:28px!important;
+ /margin-left:14px;
+ margin-top:17px;
+ display:table;
+ float:left;
+}
+
+.thumbnailBarGadget01Name{
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:80px;
+ height:14px;
+ margin-left:87px;
+ margin-top:84px;
+ display:table;
+ float:left;
+ line-height:14px;
+ font-size:11px;
+ color:#FFFFFF;
+ text-align:center;
+ text-decoration:none;
+ overflow:hidden;
+}
+
+.thumbnailBarGadget02Name{
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:80px;
+ height:14px;
+ margin-left:187px;
+ margin-top:84px;
+ display:table;
+ float:left;
+ line-height:14px;
+ font-size:11px;
+ color:#FFFFFF;
+ text-align:center;
+ text-decoration:none;
+ overflow:hidden;
+}
+
+.thumbnailBarGadget03Name{
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:80px;
+ height:14px;
+ margin-left:287px;
+ margin-top:84px;
+ display:table;
+ float:left;
+ line-height:14px;
+ font-size:11px;
+ color:#FFFFFF;
+ text-align:center;
+ text-decoration:none;
+ overflow:hidden;
+}
+
+.thumbnailBarGadget05Name{
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:80px;
+ height:14px;
+ margin-left:487px;
+ margin-top:84px;
+ display:table;
+ float:left;
+ line-height:14px;
+ font-size:11px;
+ color:#FFFFFF;
+ text-align:center;
+ text-decoration:none;
+ overflow:hidden;
+}
+
+.thumbnailBarGadget06Name{
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:80px;
+ height:14px;
+ margin-left:587px;
+ margin-top:84px;
+ display:table;
+ float:left;
+ line-height:14px;
+ font-size:11px;
+ color:#FFFFFF;
+ text-align:center;
+ text-decoration:none;
+ overflow:hidden;
+}
+
+.thumbnailBarGadget07Name{
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:80px;
+ height:14px;
+ margin-left:687px;
+ margin-top:84px;
+ display:table;
+ float:left;
+ line-height:14px;
+ font-size:11px;
+ color:#FFFFFF;
+ text-align:center;
+ text-decoration:none;
+ overflow:hidden;
+}
+
+div.thumbnailBarGadgetDivFift{
+ top:0px;
+ left:0px;
+ width:44px;
+ height:44px;
+ margin-left:43px;
+ margin-top:17px;
+ display:table;
+ float:left;
+}
+
+div.thumbnailBarGadgetDivCenter{
+ top:0px;
+ left:0px;
+ width:70px;
+ height:70px;
+ margin-left:43px;
+ margin-top:10px;
+ display:table;
+ float:left;
+}
+
+div.thumbnailBarGadgetDiv{
+ top:0px;
+ left:0px;
+ width:44px;
+ height:44px;
+ margin-left:56px;
+ margin-top:17px;
+ display:table;
+ float:left;
+}
+
div.frame01Top{
margin-top:0px;
font-family:Verdana, Bitstream Vera Sans;
@@ -153,12 +308,13 @@
overflow:hidden;
}
-img.notifyHintGadgetIcon{
+div.notifyHintGadgetDiv{
top:0px;
left:0px;
width:24px;
height:24px;
- margin-left:64px;
+ margin-left:64px!important;
+ /margin-left:32px;
margin-top:7px;
display:table;
float:left;
Modified: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/common.js
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/common.js 2009-06-20 15:00:05 UTC (rev 4843)
+++ software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/common.js 2009-06-21 18:02:04 UTC (rev 4844)
@@ -248,6 +248,130 @@
/**
*
*/
+function requestData(url, values)
+{
+ var httpRequest = false;
+ var isIe = false;
+ var result = new Hashtable();
+ if (window.XMLHttpRequest)
+ { // Mozilla, Safari,...
+ httpRequest = new XMLHttpRequest();
+ if (httpRequest.overrideMimeType)
+ {
+ httpRequest.overrideMimeType('text/xml');
+ }
+ }
+ else
+ {
+ isIe = true;
+ if (window.ActiveXObject)
+ { // IE
+ try
+ {
+ httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
+ }
+ catch (e)
+ {
+ try
+ {
+ httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+ }
+ catch (e){}
+ }
+ }
+ }
+ if (!httpRequest)
+ {
+ return null;
+ }
+ var data = "";
+ for (var property in values)
+ {
+ if (values.hasOwnProperty(property))
+ {
+ if (data.length > 0)
+ {
+ data += "&";
+ }
+ data += property + "=" + values[property];
+ }
+ }
+ httpRequest.open('POST', url, false);
+ var stateChangeFunction = function() {
+ if(httpRequest.readyState == 4)
+ {
+ if (httpRequest.status == 200)
+ {
+ try
+ {
+ var xmldoc = httpRequest.responseXML;
+ var root = xmldoc.getElementsByTagName('root').item(0);
+ var dataCount = 0;
+ var dataNodeName = "";
+ for (var iNode = 0; iNode < root.childNodes.length; iNode++)
+ {
+ var node = root.childNodes.item(iNode);
+ if (node.firstChild.nodeValue != null)
+ {
+ result.put(node.nodeName, node.firstChild.data);
+ }
+ else
+ {
+ var subDict = new Hashtable();
+ for (var jNode = 0; jNode < node.childNodes.length; jNode++)
+ {
+ var node1 = node.childNodes.item(jNode);
+ subDict.put(node1.nodeName, node1.firstChild.data);
+ }
+ if (node.nodeName == "data")
+ {
+ dataNodeName = "data" + dataCount;
+ dataCount++;
+ }
+ else
+ {
+ dataNodeName = node.nodeName;
+ }
+ result.put(dataNodeName, subDict);
+ }
+ }
+ result.put("dataCount", dataCount);
+ }
+ catch (e)
+ {
+ result = null;
+ }
+ }
+ else
+ {
+ result = null;
+ }
+ }
+ }
+ if (isIe)
+ {
+ httpRequest.onreadystatechange = stateChangeFunction;
+ }
+ else
+ {
+ httpRequest.onload = stateChangeFunction;
+ }
+
+ try
+ {
+ httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ httpRequest.send(data);
+ }
+ catch (e)
+ {
+ return null;
+ }
+ return result;
+}
+
+/**
+ *
+ */
function gotoLocation(url, values)
{
url += "?";
Added: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/hashtable.js
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/hashtable.js (rev 0)
+++ software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/js/hashtable.js 2009-06-21 18:02:04 UTC (rev 4844)
@@ -0,0 +1,145 @@
+// Code from :
+// http://dev-for-fun.blogspot.com/2007/11/javascript-hashtable.html
+function Hashtable()
+{
+ this.clear = hashtable_clear;
+ this.containsKey = hashtable_containsKey;
+ this.containsValue = hashtable_containsValue;
+ this.get = hashtable_get;
+ this.isEmpty = hashtable_isEmpty;
+ this.keys = hashtable_keys;
+ this.put = hashtable_put;
+ this.remove = hashtable_remove;
+ this.size = hashtable_size;
+ this.toString = hashtable_toString;
+ this.values = hashtable_values;
+ this.hashtable = new Array();
+}
+
+function hashtable_clear()
+{
+ this.hashtable = new Array();
+}
+
+function hashtable_containsKey(key)
+{
+ var exists = false;
+
+ for (var i in this.hashtable)
+ {
+ if (i == key && this.hashtable[i] != null)
+ {
+ exists = true;
+ break;
+ }
+ }
+
+ return exists;
+}
+
+function hashtable_containsValue(value)
+{
+ var contains = false;
+
+ if (value != null)
+ {
+ for (var i in this.hashtable)
+ {
+ if (this.hashtable[i] == value)
+ {
+ contains = true;
+ break;
+ }
+ }
+ }
+
+ return contains;
+}
+
+function hashtable_get(key)
+{
+ return this.hashtable[key];
+}
+
+function hashtable_isEmpty()
+{
+ return (this.size == 0) ? true : false;
+}
+
+function hashtable_keys()
+{
+ var keys = new Array();
+
+ for (var i in this.hashtable)
+ {
+ if (this.hashtable[i] != null)
+ {
+ keys.push(i);
+ }
+ }
+
+ return keys;
+}
+
+function hashtable_put(key, value)
+{
+ if (key == null || value == null)
+ {
+ throw 'NullPointerException {' + key + '},{' + value + '}';
+ }
+ else
+ {
+ this.hashtable[key] = value;
+ }
+}
+
+function hashtable_remove(key)
+{
+ var rtn = this.hashtable[key];
+
+ this.hashtable[key] = null;
+
+ return rtn;
+}
+
+function hashtable_size()
+{
+ var size = 0;
+
+ for (var i in this.hashtable)
+ {
+ if (this.hashtable[i] != null)
+ size ++;
+ }
+
+ return size;
+}
+
+function hashtable_toString()
+{
+ var result = '';
+
+ for (var i in this.hashtable)
+ {
+ if (this.hashtable[i] != null)
+ {
+ result += '{' + i + '},{' + this.hashtable[i] + '}\n';
+ }
+ }
+ return result;
+}
+
+function hashtable_values()
+{
+ var values = new Array();
+
+ for (var i in this.hashtable)
+ {
+ if (this.hashtable[i] != null)
+ {
+ values.push(this.hashtable[i]);
+ }
+ }
+
+ return values;
+}
\ No newline at end of file
Modified: software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/xsl/livewithtux.xsl
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/xsl/livewithtux.xsl 2009-06-20 15:00:05 UTC (rev 4843)
+++ software_suite_v3/smart-core/smart-server/trunk/data/web_interface/user_01/xsl/livewithtux.xsl 2009-06-21 18:02:04 UTC (rev 4844)
@@ -9,18 +9,123 @@
<html>
<head>
<LINK href="/data/web_interface/user_01/css/livewithtux.css" rel="stylesheet" type="text/css"/>
+ <script src="/data/web_interface/user_01/js/hashtable.js" type="text/javascript"/>
<script src="/data/web_interface/user_01/js/common.js" type="text/javascript"/>
<script type="text/javascript" src="/data/web_interface/user_01/js/prototype.js"></script>
<script type="text/javascript" src="/data/web_interface/user_01/js/lightbox.js"></script>
<script language="javascript">
<![CDATA[
+ var knowedDongleState = "off";
+ var knowedRadioState = "off";
+ var knowedBatteryState = "0";
+ var knowedSoundState = "off";
+ var knowedGadget01Name = null;
+ var knowedGadget01Icon = null;
+ var knowedGadget01Uuid = null;
+ var knowedGadget02Name = null;
+ var knowedGadget02Icon = null;
+ var knowedGadget02Uuid = null;
+ var knowedGadget03Name = null;
+ var knowedGadget03Icon = null;
+ var knowedGadget03Uuid = null;
+ var knowedGadget04Name = null;
+ var knowedGadget04Icon = null;
+ var knowedGadget04Uuid = null;
+ var knowedGadget05Name = null;
+ var knowedGadget05Icon = null;
+ var knowedGadget05Uuid = null;
+ var knowedGadget06Name = null;
+ var knowedGadget06Icon = null;
+ var knowedGadget06Uuid = null;
+ var knowedGadget07Name = null;
+ var knowedGadget07Icon = null;
+ var knowedGadget07Uuid = null;
+
+ function updateStates()
+ {
+ var dongleState = "off";
+ var radioState = "off";
+ var batteryState = "0";
+ var soundState = "off";
+
+ var states = requestData("/wi_user_01/get_states", {});
+ if (states != null)
+ {
+ dongleState = states.get("data0").get("dongleState");
+ radioState = states.get("data0").get("radioState");
+ batteryState = states.get("data0").get("batteryState");
+ soundState = states.get("data0").get("soundState");
+ var gadgets = states.get("gadgets");
+ updateCurrentGadget(gadgets.get("gadget_04_uuid"),
+ gadgets.get("gadget_04_name"),
+ gadgets.get("gadget_04_icon"));
+ updateGadgetThumb01(gadgets.get("gadget_01_uuid"),
+ gadgets.get("gadget_01_name"),
+ gadgets.get("gadget_01_icon"));
+ updateGadgetThumb02(gadgets.get("gadget_02_uuid"),
+ gadgets.get("gadget_02_name"),
+ gadgets.get("gadget_02_icon"));
+ updateGadgetThumb03(gadgets.get("gadget_03_uuid"),
+ gadgets.get("gadget_03_name"),
+ gadgets.get("gadget_03_icon"));
+ updateGadgetThumb05(gadgets.get("gadget_05_uuid"),
+ gadgets.get("gadget_05_name"),
+ gadgets.get("gadget_05_icon"));
+ updateGadgetThumb06(gadgets.get("gadget_06_uuid"),
+ gadgets.get("gadget_06_name"),
+ gadgets.get("gadget_06_icon"));
+ updateGadgetThumb07(gadgets.get("gadget_07_uuid"),
+ gadgets.get("gadget_07_name"),
+ gadgets.get("gadget_07_icon"));
+ }
+ if (batteryState != knowedBatteryState)
+ {
+ knowedBatteryState = batteryState;
+ showBatteryState(batteryState);
+ }
+ if (soundState != knowedSoundState)
+ {
+ knowedSoundState = soundState;
+ if (soundState == "off")
+ {
+ showSoundOff();
+ }
+ else
+ {
+ showSoundOn();
+ }
+ }
+ if (radioState != knowedRadioState)
+ {
+ knowedRadioState = radioState;
+ if (radioState == "off")
+ {
+ showRadioOff();
+ }
+ else
+ {
+ showRadioOn();
+ }
+ }
+ if (dongleState != knowedDongleState)
+ {
+ knowedDongleState = dongleState;
+ if (dongleState == "off")
+ {
+ showDongleOff();
+ }
+ else
+ {
+ showDongleOn();
+ }
+ }
+ setTimeout("updateStates();", 500);
+ }
+
function initialization()
{
hideError();
- showSoundOff();
- showBatteryState("100");
- showRadioOff();
- showDongleOff();
+ updateStates();
}
function showError(message)
@@ -44,12 +149,22 @@
document.getElementById("statusBtnSoundOff").src = "/data/web_interface/user_01/img/status_btn_soundoff_enable.png";
}
+ function setSoundOn()
+ {
+ getRequest("/robot_content_interactions/unmute", {});
+ }
+
function showSoundOff()
{
document.getElementById("statusBtnSoundOn").src = "/data/web_interface/user_01/img/status_btn_soundon_enable.png";
document.getElementById("statusBtnSoundOff").src = "/data/web_interface/user_01/img/status_btn_soundoff_activate.png";
}
+ function setSoundOff()
+ {
+ getRequest("/robot_content_interactions/mute", {});
+ }
+
function showBatteryState(state)
{
if (state == 'charge')
@@ -108,6 +223,125 @@
{
document.getElementById("statusDongleOnOff").src = "/data/web_interface/user_01/img/status_active_off.png";
}
+
+ function previousGadget()
+ {
+ getRequest("/robot_content_interactions/previous_gadget", {});
+ }
+
+ function nextGadget()
+ {
+ getRequest("/robot_content_interactions/next_gadget", {});
+ }
+
+ function startGadget()
+ {
+ getRequest("/robot_content_interactions/start_gadget", {});
+ }
+
+ function stopGadget()
+ {
+ getRequest("/robot_content_interactions/stop_gadget", {});
+ }
+
+ function updateCurrentGadget(uuid, name, icon)
+ {
+ if ((knowedGadget04Name != name) || (knowedGadget04Uuid != uuid))
+ {
+ knowedGadget04Name = name;
+ knowedGadget04Uuid = uuid;
+ knowedGadget04Icon = icon;
+ document.getElementById("notifyHintGadgetIcon").src = icon;
+ setpng(document.getElementById('notifyHintGadgetIcon'));
+ document.getElementById("thumbnailBarGadgetIcon04").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon04'));
+ document.getElementById("notifyHintGadgetName").firstChild.nodeValue = name;
+ }
+ }
+
+ function updateGadgetThumb01(uuid, name, icon)
+ {
+ if ((knowedGadget01Name != name) || (knowedGadget01Uuid != uuid))
+ {
+ knowedGadget01Name = name;
+ knowedGadget01Uuid = uuid;
+ knowedGadget01Icon = icon;
+ document.getElementById("thumbnailBarGadgetIcon01").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon01'));
+ if (name.length > 10) {name = name.slice(0, 8) + "...";}
+ document.getElementById("thumbnailBarGadgetName01").firstChild.nodeValue = name;
+ }
+ }
+
+ function updateGadgetThumb02(uuid, name, icon)
+ {
+ if ((knowedGadget02Name != name) || (knowedGadget02Uuid != uuid))
+ {
+ knowedGadget02Name = name;
+ knowedGadget02Uuid = uuid;
+ knowedGadget02Icon = icon;
+ document.getElementById("thumbnailBarGadgetIcon02").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon02'));
+ if (name.length > 10) {name = name.slice(0, 8) + "...";}
+ document.getElementById("thumbnailBarGadgetName02").firstChild.nodeValue = name;
+ }
+ }
+
+ function updateGadgetThumb03(uuid, name, icon)
+ {
+ if ((knowedGadget03Name != name) || (knowedGadget03Uuid != uuid))
+ {
+ knowedGadget03Name = name;
+ knowedGadget03Uuid = uuid;
+ knowedGadget03Icon = icon;
+ document.getElementById("thumbnailBarGadgetIcon03").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon03'));
+ if (name.length > 10) {name = name.slice(0, 8) + "...";}
+ document.getElementById("thumbnailBarGadgetName03").firstChild.nodeValue = name;
+ }
+ }
+
+ function updateGadgetThumb05(uuid, name, icon)
+ {
+ if ((knowedGadget05Name != name) || (knowedGadget05Uuid != uuid))
+ {
+ knowedGadget05Name = name;
+ knowedGadget05Uuid = uuid;
+ knowedGadget05Icon = icon;
+ document.getElementById("thumbnailBarGadgetIcon05").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon05'));
+ if (name.length > 10) {name = name.slice(0, 8) + "...";}
+ document.getElementById("thumbnailBarGadgetName05").firstChild.nodeValue = name;
+ }
+ }
+
+ function updateGadgetThumb06(uuid, name, icon)
+ {
+ if ((knowedGadget06Name != name) || (knowedGadget06Uuid != uuid))
+ {
+ knowedGadget06Name = name;
+ knowedGadget06Uuid = uuid;
+ knowedGadget06Icon = icon;
+ document.getElementById("thumbnailBarGadgetIcon06").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon06'));
+ if (name.length > 10) {name = name.slice(0, 8) + "...";}
+ document.getElementById("thumbnailBarGadgetName06").firstChild.nodeValue = name;
+ }
+ }
+
+ function updateGadgetThumb07(uuid, name, icon)
+ {
+ if ((knowedGadget07Name != name) || (knowedGadget07Uuid != uuid))
+ {
+ knowedGadget07Name = name;
+ knowedGadget07Uuid = uuid;
+ knowedGadget07Icon = icon;
+ document.getElementById("thumbnailBarGadgetIcon07").src = icon;
+ setpng(document.getElementById('thumbnailBarGadgetIcon07'));
+ if (name.length > 10) {name = name.slice(0, 8) + "...";}
+ document.getElementById("thumbnailBarGadgetName07").firstChild.nodeValue = name;
+ }
+ }
]]>
</script>
</head>
@@ -123,16 +357,85 @@
<!-- PREVIOUS BUTTON -->
<xsl:element name="a">
<xsl:attribute name="class">thumbnailBarBtnPrevious</xsl:attribute>
- <xsl:attribute name="onclick">javascript:showThumbnails(-1);return false;</xsl:attribute>
+ <xsl:attribute name="onclick">javascript:previousGadget();return false;</xsl:attribute>
<xsl:attribute name="href">#</xsl:attribute>
</xsl:element>
<!-- THUMBNAIL BAR -->
<div class="thumbnailBarView">
+ <!-- THUMBNAIL 01 -->
+ <div class="thumbnailBarGadgetFirstDiv">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon01</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">44</xsl:attribute>
+ <xsl:attribute name="width">44</xsl:attribute>
+ </xsl:element>
+ </div>
+ <!-- THUMBNAIL 02 -->
+ <div class="thumbnailBarGadgetDiv">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon02</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">44</xsl:attribute>
+ <xsl:attribute name="width">44</xsl:attribute>
+ </xsl:element>
+ </div>
+ <!-- THUMBNAIL 03 -->
+ <div class="thumbnailBarGadgetDiv">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon03</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">44</xsl:attribute>
+ <xsl:attribute name="width">44</xsl:attribute>
+ </xsl:element>
+ </div>
+ <!-- THUMBNAIL 04 -->
+ <div class="thumbnailBarGadgetDivCenter">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon04</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">70</xsl:attribute>
+ <xsl:attribute name="width">70</xsl:attribute>
+ </xsl:element>
+ </div>
+ <!-- THUMBNAIL 05 -->
+ <div class="thumbnailBarGadgetDivFift">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon05</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">44</xsl:attribute>
+ <xsl:attribute name="width">44</xsl:attribute>
+ </xsl:element>
+ </div>
+ <!-- THUMBNAIL 06 -->
+ <div class="thumbnailBarGadgetDiv">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon06</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">44</xsl:attribute>
+ <xsl:attribute name="width">44</xsl:attribute>
+ </xsl:element>
+ </div>
+ <!-- THUMBNAIL 07 -->
+ <div class="thumbnailBarGadgetDiv">
+ <xsl:element name="img">
+ <xsl:attribute name="id">thumbnailBarGadgetIcon07</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">44</xsl:attribute>
+ <xsl:attribute name="width">44</xsl:attribute>
+ </xsl:element>
+ </div>
+ <span class="thumbnailBarGadget01Name" id="thumbnailBarGadgetName01">Gadget</span>
+ <span class="thumbnailBarGadget02Name" id="thumbnailBarGadgetName02">Gadget</span>
+ <span class="thumbnailBarGadget03Name" id="thumbnailBarGadgetName03">Gadget</span>
+ <span class="thumbnailBarGadget05Name" id="thumbnailBarGadgetName05">Gadget</span>
+ <span class="thumbnailBarGadget06Name" id="thumbnailBarGadgetName06">Gadget</span>
+ <span class="thumbnailBarGadget07Name" id="thumbnailBarGadgetName07">Gadget</span>
</div>
<!-- NEXT BUTTON -->
<xsl:element name="a">
<xsl:attribute name="class">thumbnailBarBtnNext</xsl:attribute>
- <xsl:attribute name="onclick">javascript:showThumbnails(1);return false;</xsl:attribute>
+ <xsl:attribute name="onclick">javascript:nextGadget();return false;</xsl:attribute>
<xsl:attribute name="href">#</xsl:attribute>
</xsl:element>
</div>
@@ -149,11 +452,14 @@
<!-- NOTIFIER HINT CONTENT -->
<div class="notifyHintContent">
<!-- GADGET ICON -->
- <xsl:element name="img">
- <xsl:attribute name="class">notifyHintGadgetIcon</xsl:attribute>
- <xsl:attribute name="id">notifyHintGadgetIcon</xsl:attribute>
- <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
- </xsl:element>
+ <div class="notifyHintGadgetDiv">
+ <xsl:element name="img">
+ <xsl:attribute name="id">notifyHintGadgetIcon</xsl:attribute>
+ <xsl:attribute name="src">/data/web_interface/user_01/img/notify_pic_tux_idle.png</xsl:attribute>
+ <xsl:attribute name="height">24</xsl:attribute>
+ <xsl:attribute name="width">24</xsl:attribute>
+ </xsl:element>
+ </div>
<!-- GADGET NAME -->
<span class="notifyHintGadgetName" id="notifyHintGadgetName">My gadget</span>
<!-- CONFIGURE BUTTON -->
@@ -167,14 +473,14 @@
<!-- START BUTTON -->
<xsl:element name="a">
<xsl:attribute name="class">notifyBtnStartStop</xsl:attribute>
- <xsl:attribute name="onclick"></xsl:attribute>
+ <xsl:attribute name="onclick">javascript:startGadget();return false;</xsl:attribute>
<xsl:attribute name="href">#</xsl:attribute>
<xsl:value-of select="root/translations/start"/>
</xsl:element>
<!-- STOP BUTTON -->
<xsl:element name="a">
<xsl:attribute name="class">notifyBtnStartStop</xsl:attribute>
- <xsl:attribute name="onclick"></xsl:attribute>
+ <xsl:attribute name="onclick">javascript:stopGadget();return false;</xsl:attribute>
<xsl:attribute name="href">#</xsl:attribute>
<xsl:value-of select="root/translations/stop"/>
</xsl:element>
@@ -231,7 +537,7 @@
<xsl:element name="img">
<xsl:attribute name="class">statusBtnSoundOn</xsl:attribute>
<xsl:attribute name="id">statusBtnSoundOn</xsl:attribute>
- <xsl:attribute name="onclick">javascript:showSoundOn();return false;</xsl:attribute>
+ <xsl:attribute name="onclick">javascript:setSoundOn();return false;</xsl:attribute>
<xsl:attribute name="src">/data/web_interface/user_01/img/status_btn_soundon_enable.png</xsl:attribute>
</xsl:element>
<span class="statusBtnSoundOnLabel"><xsl:value-of select="root/translations/sound_on"/></span>
@@ -239,7 +545,7 @@
<xsl:element name="img">
<xsl:attribute name="class">statusBtnSoundOff</xsl:attribute>
<xsl:attribute name="id">statusBtnSoundOff</xsl:attribute>
- <xsl:attribute name="onclick">javascript:showSoundOff();return false;</xsl:attribute>
+ <xsl:attribute name="onclick">javascript:setSoundOff();return false;</xsl:attribute>
<xsl:attribute name="src">/data/web_interface/user_01/img/status_btn_soundoff_activate.png</xsl:attribute>
</xsl:element>
<span class="statusBtnSoundOffLabel"><xsl:value-of select="root/translations/sound_off"/></span>
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-20 15:00:05 UTC (rev 4843)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/04_robot_content_interactions/00_resourceRobotContentInteractions.py 2009-06-21 18:02:04 UTC (rev 4844)
@@ -359,6 +359,8 @@
self.__loopThread = None
self.__onDemandList = []
self.__onDemandIndex = 0
+ self.__onDemandDictForThumbnailBar = {}
+ self.__onDemandDictForThumbnailBarMutex = threading.Lock()
self.__lastRunStopActionTime = time.time()
self.__lastRunStopActionTimeMutex = threading.Lock()
@@ -366,6 +368,7 @@
"""
"""
self.__onDemandList.append(ugc)
+ self.computeOnDemandDictForThumbnailBar()
def removeOnDemand(self, ugc):
"""
@@ -373,6 +376,7 @@
for odUgc in self.__onDemandList:
if odUgc == ugc:
self.__onDemandList.remove(ugc)
+ self.computeOnDemandDictForThumbnailBar()
return
def __speakOnDemand(self):
@@ -399,6 +403,7 @@
self.__onDemandIndex += 1
if self.__onDemandIndex >= len(self.__onDemandList):
self.__onDemandIndex = 0
+ self.computeOnDemandDictForThumbnailBar()
resourceTuxDriver.playSound(11, 100.0)
self.__speakOnDemand()
@@ -408,9 +413,45 @@
self.__onDemandIndex -= 1
if self.__onDemandIndex < 0:
self.__onDemandIndex = len(self.__onDemandList) - 1
+ self.computeOnDemandDictForThumbnailBar()
resourceTuxDriver.playSound(11, 100.0)
self.__speakOnDemand()
+ def computeOnDemandDictForThumbnailBar(self):
+ """
+ """
+ self.__onDemandDictForThumbnailBarMutex.acquire()
+ self.__onDemandDictForThumbnailBar = {}
+ if len(self.__onDemandList) == 0:
+ self.__onDemandDictForThumbnailBarMutex.release()
+ return
+ maxListSize = len(self.__onDemandList)
+ minIdx = 0
+ maxIdx = maxListSize - 1
+ centerIdx = self.__onDemandIndex
+ def fillByIndex(rel, number):
+ currIdx = (centerIdx + rel) % maxListSize
+ ugc = self.__onDemandList[currIdx]
+ self.__onDemandDictForThumbnailBar["gadget_%.2d_name" % number] = ugc.getDescription().getName()
+ self.__onDemandDictForThumbnailBar["gadget_%.2d_uuid" % number] = ugc.getDescription().getUuid()
+ self.__onDemandDictForThumbnailBar["gadget_%.2d_icon" % number] = "/%s/icon.png" % ugc.getParentGadget().getDescription().getUuid()
+ fillByIndex(-3, 1)
+ fillByIndex(-2, 2)
+ fillByIndex(-1, 3)
+ fillByIndex(0, 4)
+ fillByIndex(1, 5)
+ fillByIndex(2, 6)
+ fillByIndex(3, 7)
+ self.__onDemandDictForThumbnailBarMutex.release()
+
+ def getOnDemandDictForThumbnailBar(self):
+ """
+ """
+ self.__onDemandDictForThumbnailBarMutex.acquire()
+ result = self.__onDemandDictForThumbnailBar
+ self.__onDemandDictForThumbnailBarMutex.release()
+ return result
+
def __setStarted(self, value):
"""
"""
@@ -445,12 +486,15 @@
def mute(self):
"""
"""
- pass
+ self.stop()
+ resourceTuxDriver.playSound(12, 100.0)
+ self.__contextBtStandby("remote", ("K_STANDBY", 0.0))
def unmute(self):
"""
"""
- pass
+ resourceTuxDriver.playSound(12, 100.0)
+ self.start()
def __executionLoop(self):
"""
@@ -731,6 +775,49 @@
self.__setLastRunStopActionTime()
ugc.start(ugc.getDefaultRunCommandName())
+ def startCurrentGadget(self):
+ """
+ """
+ if not self.isStarted():
+ return
+ # Return if foreground context exists
+ if self.getForegroundPguContext() != None:
+ if self.getForegroundPguContext().executionIsStarted():
+ return
+ # Else return if background context exists
+ if self.getBackgroundPguContext() != None:
+ if self.getBackgroundPguContext().executionIsStarted():
+ return
+ # Else load current selected on demand gadget
+ if len(self.__onDemandList) > 0:
+ ugc = self.__onDemandList[self.__onDemandIndex]
+ self.__setLastRunStopActionTime()
+ t = threading.Thread(target = ugc.start, args = (ugc.getDefaultRunCommandName(),))
+ t.start()
+
+ def stopCurrentGadget(self):
+ """
+ """
+ if not self.isStarted():
+ return
+ # Abort foreground context if exists
+ if self.getForegroundPguContext() != None:
+ if self.getForegroundPguContext().executionIsStarted():
+ if not self.__checkLastRunStopActionTime():
+ return
+ self.getForegroundPguContext().stopExecution()
+ return
+ # Else abort background context if exists
+ if self.getBackgroundPguContext() != None:
+ if self.getBackgroundPguContext().executionIsStarted():
+ # Exception for plugins commands with attribute "allUserButtons"
+ if self.backgroundPguContextNeedAllUserButtons():
+ return
+ if not self.__checkLastRunStopActionTime():
+ return
+ self.getBackgroundPguContext().stopExecution()
+ return
+
def __contextLTPrevious(self, eventName, *args):
"""
"""
@@ -742,6 +829,18 @@
return
self.__onDemandPrevious()
+ def previousGadget(self):
+ """
+ """
+ if not self.isStarted():
+ return
+ if self.getForegroundPguContext() != None:
+ return
+ if self.getBackgroundPguContext() != None:
+ if self.getBackgroundPguContext().executionIsStarted():
+ return
+ self.__onDemandPrevious()
+
def __contextRBNext(self, eventName, *args):
"""
"""
@@ -753,16 +852,25 @@
return
self.__onDemandNext()
+ def nextGadget(self):
+ """
+ """
+ if not self.isStarted():
+ return
+ if self.getForegroundPguContext() != None:
+ return
+ if self.getBackgroundPguContext() != None:
+ if self.getBackgroundPguContext().executionIsStarted():
+ return
+ self.__onDemandNext()
+
def __contextBtMute(self, eventName, *args):
"""
"""
if self.isStarted():
- self.stop()
- resourceTuxDriver.playSound(12, 100.0)
- self.__contextBtStandby("remote", ("K_STANDBY", 0.0))
+ self.mute()
else:
- resourceTuxDriver.playSound(12, 100.0)
- self.start()
+ self.unmute()
def __contextBtStandby(self, eventName, *args):
"""
@@ -911,3 +1019,139 @@
"resourceRobotContentInteractions")
# Register the resource into the resources manager
resourcesManager.addResource(resourceRobotContentInteractions)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "mute".
+# ------------------------------------------------------------------------------
+class TDSServiceRobotContentInteractionsMute(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = True
+ self.name = "mute"
+ self.comment = "Mute Tux Droid."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ resourceRobotContentInteractions.getPguContextsManager().mute()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceRobotContentInteractions.addService(TDSServiceRobotContentInteractionsMute)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "unmute".
+# ------------------------------------------------------------------------------
+class TDSServiceRobotContentInteractionsUnmute(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = True
+ self.name = "unmute"
+ self.comment = "Unmute Tux Droid."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ resourceRobotContentInteractions.getPguContextsManager().unmute()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceRobotContentInteractions.addService(TDSServiceRobotContentInteractionsUnmute)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "next_gadget".
+# ------------------------------------------------------------------------------
+class TDSServiceRobotContentInteractionsNextGadget(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = True
+ self.name = "next_gadget"
+ self.comment = "Go to next gadget."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ t = threading.Thread(target = resourceRobotContentInteractions.getPguContextsManager().nextGadget)
+ t.start()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceRobotContentInteractions.addService(TDSServiceRobotContentInteractionsNextGadget)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "previous_gadget".
+# ------------------------------------------------------------------------------
+class TDSServiceRobotContentInteractionsPreviousGadget(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = True
+ self.name = "previous_gadget"
+ self.comment = "Go to previous gadget."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ t = threading.Thread(target = resourceRobotContentInteractions.getPguContextsManager().previousGadget)
+ t.start()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceRobotContentInteractions.addService(TDSServiceRobotContentInteractionsPreviousGadget)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "start_gadget".
+# ------------------------------------------------------------------------------
+class TDSServiceRobotContentInteractionsStartGadget(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = True
+ self.name = "start_gadget"
+ self.comment = "Start the current gadget."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ t = threading.Thread(target = resourceRobotContentInteractions.getPguContextsManager().startCurrentGadget)
+ t.start()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceRobotContentInteractions.addService(TDSServiceRobotContentInteractionsStartGadget)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "stop_gadget".
+# ------------------------------------------------------------------------------
+class TDSServiceRobotContentInteractionsStopGadget(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = True
+ self.name = "stop_gadget"
+ self.comment = "Stop the current gadget."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ t = threading.Thread(target = resourceRobotContentInteractions.getPguContextsManager().stopCurrentGadget)
+ t.start()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceRobotContentInteractions.addService(TDSServiceRobotContentInteractionsStopGadget)
Modified: software_suite_v3/smart-core/smart-server/trunk/resources/07_web_interfaces/01_resourceWIUser01.py
===================================================================
--- software_suite_v3/smart-core/smart-server/trunk/resources/07_web_interfaces/01_resourceWIUser01.py 2009-06-20 15:00:05 UTC (rev 4843)
+++ software_suite_v3/smart-core/smart-server/trunk/resources/07_web_interfaces/01_resourceWIUser01.py 2009-06-21 18:02:04 UTC (rev 4844)
@@ -19,6 +19,56 @@
self.fileName = RESOURCE_FILENAME
self.translations = Translation("wi_user")
+ def getStates(self):
+ state = eventsHandler.getEventHandler(ST_NAME_DONGLE_PLUG).getLastState()
+ if state == None:
+ dongleState = "off"
+ else:
+ if state[0]:
+ dongleState = "on"
+ else:
+ dongleState = "off"
+ state = eventsHandler.getEventHandler(ST_NAME_RADIO_STATE).getLastState()
+ if state == None:
+ radioState = False
+ else:
+ if state[0]:
+ radioState = "on"
+ else:
+ radioState = "off"
+ state = eventsHandler.getEventHandler(ST_NAME_BATTERY_LEVEL).getLastState()
+ if state == None:
+ batteryState = "0"
+ else:
+ rndVal = int(state[0] / 240) * 240
+ if rndVal <= 4800:
+ batteryState = "0"
+ elif rndVal == 5040:
+ batteryState = "20"
+ elif rndVal == 5280:
+ batteryState = "40"
+ elif rndVal == 5520:
+ batteryState = "60"
+ elif rndVal == 5760:
+ batteryState = "80"
+ else:
+ batteryState = "100"
+ state = eventsHandler.getEventHandler(ST_NAME_CHARGER_STATE).getLastState()
+ if state != None:
+ if state[0] != "UNPLUGGED":
+ batteryState = "charge"
+ state = resourceRobotContentInteractions.getPguContextsManager().isStarted()
+ if state:
+ soundState = "on"
+ else:
+ soundState = "off"
+ result = {}
+ result['dongleState'] = dongleState
+ result['radioState'] = radioState
+ result['batteryState'] = batteryState
+ result['soundState'] = soundState
+ return result
+
# Create an instance of the resource
resourceWIUser01 = TDSResourceWIUser01("resourceWIUser01")
# Register the resource into the resources manager
@@ -59,7 +109,7 @@
# Register the service into the resource
resourceWIUser01.addService(TDSServiceWIUser01Index)
# Bind the resource index url to this service
-resourcesManager.addBinding("user", "wi_user_01", "index", "skin=user_01&language=en&menu=livewithtux")
+resourcesManager.addBinding("user", "wi_user_01", "index", "skin=user_01&language=fr&menu=livewithtux")
resourcesManager.addBinding("user/index", "wi_user_01", "index", "skin=user_01&language=en&menu=livewithtux")
# ------------------------------------------------------------------------------
@@ -89,7 +139,31 @@
contentStruct['root']['language'] = language
self.haveXsl = True
self.xslPath = "/data/web_interface/%s/xsl/livewithtux.xsl" % skin
+ resourceWIUser01.getStates()
return headersStruct, contentStruct
# Register the service into the resource
resourceWIUser01.addService(TDSServiceWIUser01LiveWithTux)
+
+# ------------------------------------------------------------------------------
+# Declaration of the service "get_states".
+# ------------------------------------------------------------------------------
+class TDSServiceWIUser01GetStates(TDSService):
+
+ def configure(self):
+ self.parametersDict = {}
+ self.minimalUserLevel = TDS_CLIENT_LEVEL_ANONYMOUS
+ self.exclusiveExecution = False
+ self.name = "get_states"
+ self.comment = "Get Tux Droid and gadget states."
+
+ def execute(self, id, parameters):
+ headersStruct = self.getDefaultHeadersStruct()
+ contentStruct = self.getDefaultContentStruct()
+ contentStruct['root']['result'] = getStrError(E_TDREST_SUCCESS)
+ contentStruct['root']['data'] = resourceWIUser01.getStates()
+ contentStruct['root']['gadgets'] = resourceRobotContentInteractions.getPguContextsManager().getOnDemandDictForThumbnailBar()
+ return headersStruct, contentStruct
+
+# Register the service into the resource
+resourceWIUser01.addService(TDSServiceWIUser01GetStates)
|