From d14602071911bf14d561292c5b870c12000ce0c3 Mon Sep 17 00:00:00 2001 From: Glen Turner <8gt6@queensu.ca> Date: Fri, 19 Jun 2015 14:41:28 -0700 Subject: [PATCH] fixed douplicate functions for getting nodes and topics --- ProjectFiles/js/ros_scripts.js | 181 -------------------------------- ProjectFiles/js/update_guis.js | 115 -------------------- backend/images/D-pad.png | Bin 0 -> 10048 bytes backend/images/D-pad_blank.png | Bin 0 -> 600 bytes backend/images/D-pad_center.png | Bin 0 -> 5661 bytes backend/images/D-pad_left.png | Bin 0 -> 3528 bytes backend/images/D-pad_up.png | Bin 0 -> 3633 bytes backend/js/custom_nodes.js | 1 + backend/js/custom_topics.js | 55 ++++++++++ backend/js/ros_scripts.js | 124 ++++++++++++++++++++++ backend/js/update_guis.js | 161 ++++++++++++++++++++++++++++ index.html | 16 +-- robot_display.html | 16 ++- 13 files changed, 361 insertions(+), 308 deletions(-) delete mode 100644 ProjectFiles/js/ros_scripts.js delete mode 100644 ProjectFiles/js/update_guis.js create mode 100644 backend/images/D-pad.png create mode 100644 backend/images/D-pad_blank.png create mode 100644 backend/images/D-pad_center.png create mode 100644 backend/images/D-pad_left.png create mode 100644 backend/images/D-pad_up.png create mode 100644 backend/js/custom_nodes.js create mode 100644 backend/js/custom_topics.js create mode 100644 backend/js/ros_scripts.js create mode 100644 backend/js/update_guis.js diff --git a/ProjectFiles/js/ros_scripts.js b/ProjectFiles/js/ros_scripts.js deleted file mode 100644 index 0532e98..0000000 --- a/ProjectFiles/js/ros_scripts.js +++ /dev/null @@ -1,181 +0,0 @@ -var ros = new ROSLIB.Ros(); - -ros.topics = []; -ros.nodes = []; - -ros.recording = false; - - -ros.connectionName = 'ws://192.168.1.105:9090'; - -// If there is an error on the backend, an 'error' emit will be emitted. -ros.on('error', function(error) { - document.getElementById("ConnectionIPForm").className = "form-group has-warning has-feedback"; - document.getElementById("ConnectionIPInput").value = ros.connectionName; - document.getElementById("ConnectionIPLabel").innerHTML = 'No connection'; - document.getElementById("ConnectionButton").className = "btn btn-warning" - document.getElementById("rosbridgeconnection_badge").innerHTML = 'No connection'; - document.getElementById("ROSNodes").innerHTML = ""; - - rosbridgeconnection_badge - console.log(error);192 -}); -// Find out exactly when we made a connection. -ros.on('connection', function() { - console.log('Connection made!'); - document.getElementById("ConnectionIPForm").className = "form-group has-success has-feedback"; - document.getElementById("ConnectionIPInput").value = ros.connectionName; - document.getElementById("ConnectionIPLabel").innerHTML = 'Connection made at:'; - document.getElementById("rosbridgeconnection_badge").innerHTML = 'Connected'; - document.getElementById("ConnectionButton").className = "btn btn-success" - - - ros.nodes = []; - ros.topics = []; - -}); - -ros.on('close', function() { - console.log('Connection closed.'); - - document.getElementById("ConnectionIPForm").className = "form-group has-warning has-feedback"; - document.getElementById("ConnectionIPLabel").innerHTML = 'Connection closed'; - document.getElementById("ConnectionButton").className = "btn btn-warning" - document.getElementById("rosbridgeconnection_badge").innerHTML = 'Connection closed'; - ros.nodes = []; - ros.topics = []; -}); -// Create a connection to the rosbridge WebSocket server. -ros.connect(ros.connectionName); - - -/////////////////////////////////////////////////////////////////////////////////// -// Publishers -/////////////////////////////////////////////////////////////////////////////////// - -function publishBagMessage(bagFilename) -{ - var bagMessage = new ROSLIB.Message({ - data : bagFilename - }) - bagPublisher.publish(bagMessage) -} - -//////////////////////////////////////////////////////////////// -// Topics -//////////////////////////////////////////////////////////////// - -var bagPublisher = new ROSLIB.Topic({ - ros : ros, - name : 'bag_publisher', - messageType : 'std_msgs/String' -}); - -var bagNotifier = new ROSLIB.Topic({ - ros : ros, - name : 'bag_notifier', - messageType : 'std_msgs/String' -}); - -//////////////////////////////////////////////////////////////// -// Subscribers -//////////////////////////////////////////////////////////////// - - -bagNotifier.subscribe(function(message) { - if (message.data === "STARTED") { - document.getElementById("recordButtonText").innerHTML = "Stop" - document.getElementById("recordButton").className = "btn btn-danger" - } else { - document.getElementById("recordButtonText").innerHTML = "Start" - document.getElementById("recordButton").className = "btn btn-primary" - } -}); - - -/////////////////////////////////////////////////////////////////////////////////// -// Functions -/////////////////////////////////////////////////////////////////////////////////// - - - -// attept to connect to the ros master from the IP given orgrab it from the form -ros.attemptConnection = function(ipAddress) -{ - if( typeof ipAddress !== "undefined") - { - ros.connectionName = ipAddress; - } - else - { - ros.connectionName = document.getElementById("ConnectionIPInput").value - } - console.log('Connection = ' + ros.connectionName); - ros.connect(ros.connectionName); -} - - -function getTopics() { - - var topicsClient = new ROSLIB.Service({ - ros : ros, - name : '/rosapi/topics', - serviceType : '/rosapi/Topics' - }); - - var request = new ROSLIB.ServiceRequest(); - - // ros.topics = []; - topicsClient.callService(request, function(result) { - ros.topics = result.topics; - }); - - return ros.topics; -}; - -function getNodes() { - - var topicsClient = new ROSLIB.Service({ - ros : ros, - name : '/rosapi/nodes', - serviceType : '/rosapi/nodes' - }); - - var request = new ROSLIB.ServiceRequest(); - - // ros.nodes = []; - topicsClient.callService(request, function(result) { - ros.nodes = result.nodes; - }); - - return ros.nodes; -}; - -function getTime() { - - var topicsClient = new ROSLIB.Service({ - ros : ros, - name : '/rosapi/get_time', - serviceType : '/rosapi/GetTime' - }); - - var request = new ROSLIB.ServiceRequest({}); - - topicsClient.callService(request, function(result) { - console.log("Getting Time..."); - console.log(result.time.secs); - }); -}; - -function toggleRecording() -{ - document.getElementById("recordButtonText").innerHTML = "Wait" - document.getElementById("recordButton").className = "btn btn-warning" - if (!ros.recording) { - ros.recording = true - publishBagMessage(document.getElementById("recordText").value) - } else { - ros.recording = false - publishBagMessage("STOP") - } -} diff --git a/ProjectFiles/js/update_guis.js b/ProjectFiles/js/update_guis.js deleted file mode 100644 index f75ab30..0000000 --- a/ProjectFiles/js/update_guis.js +++ /dev/null @@ -1,115 +0,0 @@ - - - -function updateVoltage(voltage) -{ - - var voltage_min = 9.5; - var voltage_max = 12.5; - var voltage_range = voltage_max - voltage_min; - - var voltage_percentage = (voltage - voltage_min) / voltage_range * 100; - - var voltage_string = ""; - voltage_string = voltage_string.concat(voltage_percentage); - voltage_string = voltage_string.substring(0,4); - voltage_string = voltage_string.concat('%'); - - document.getElementById("VoltageDisplay").style.width = voltage_string; - document.getElementById("VoltageDisplay").innerHTML = voltage_string; - - if (voltage_percentage < 50 && voltage_percentage > 25 ) { - document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-warning" - } - else if ( voltage_percentage <= 25) - { - document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-danger" - var sound = document.getElementById("audio"); - sound.play() - console.log("Pay Sound") - } - else - { - document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-success" - } -}; - -function updateTopicsGUI() -{ - - topics = getTopics() - topics.sort(); - if(topics != null){ - var innerHTML = ""; - for (var i = 0; i < topics.length; i++ ) - { - innerHTML = innerHTML.concat(topics[i]); - innerHTML = innerHTML.concat("
"); - } - document.getElementById("ROSTopics").innerHTML = innerHTML; - } - -}; - -function updateNodesGUI() -{ - - nodes = getNodes() - nodes.sort() - if(nodes != null){ - var innerHTML = ""; - for (var i = 0; i < nodes.length; i++ ) - { - innerHTML = innerHTML.concat(nodes[i]); - innerHTML = innerHTML.concat("
"); - } - document.getElementById("ROSNodes").innerHTML = innerHTML; - } - -}; - -window.setInterval(function(){ - updateTopicsGUI() - updateNodesGUI() -}, 500); - -function validateForm() -{ - ros.attemptConnection(); - return false; -}; - -function addInputsForConnection() -{ - - var innerHTML = ""; - - for (var i = 0; i < ros.connectioninfo.length; i ++) - { - - console.log(ros.connectioninfo[i]) - el = document.getElementById("ConnectionInformation") - - innerHTML = innerHTML.concat(""); - innerHTML = innerHTML.concat("") - innerHTML = innerHTML.concat("") - if(i >0 && i < 4) - { - innerHTML = innerHTML.concat(".") - } - - - } - el.innerHTML = innerHTML; - - console.log(innerHTML) - - -} - - - - - diff --git a/backend/images/D-pad.png b/backend/images/D-pad.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3d51637343e8e00d44f692476675149fdfa4e8 GIT binary patch literal 10048 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 Oh4oZfTdDjB4EaBLgtd79 literal 0 HcmV?d00001 diff --git a/backend/images/D-pad_blank.png b/backend/images/D-pad_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..72e465455103943881cc32cea58871b1ffa330c8 GIT binary patch literal 600 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 Wt{cNYln4D@8f~<`243AZ@_ztSU(P%L literal 0 HcmV?d00001 diff --git a/backend/images/D-pad_left.png b/backend/images/D-pad_left.png new file mode 100644 index 0000000000000000000000000000000000000000..f601748634fcf9b77f1cb5a3b00bf8b6393b8025 GIT binary patch literal 3528 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 aKm3Dy8L*yO=R)w;46r@zfT3IZB>f*%!GJ*k literal 0 HcmV?d00001 diff --git a/backend/images/D-pad_up.png b/backend/images/D-pad_up.png new file mode 100644 index 0000000000000000000000000000000000000000..a78b4a3b4417b567fa367d20f6c384ed60012165 GIT binary patch literal 3633 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 literal 0 HcmV?d00001 diff --git a/backend/js/custom_nodes.js b/backend/js/custom_nodes.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/backend/js/custom_nodes.js @@ -0,0 +1 @@ + diff --git a/backend/js/custom_topics.js b/backend/js/custom_topics.js new file mode 100644 index 0000000..f1eb1cc --- /dev/null +++ b/backend/js/custom_topics.js @@ -0,0 +1,55 @@ +function Topic(name, type) +{ + this.name = name; + this.type = type; + + this.includeInBag = false; + + this.equals = function (otherTopic) + { + if( this.name == otherTopic.name && this.type == otherTopic.type) + { + return true; + } + return false; + }; + +}; + +function containsTopic(obj, list) { + var x; + for (x in list) { + if (obj.equals(list[x])) { + return true; + } + } + + return false; +} + +function testToics() +{ + var topics = [new Topic("a","a_t"), new Topic("b","b_t"), new Topic("c","c_t")]; + + console.log("Testing Topic"); + + if (containsTopic(new Topic("a","a_t"),topics) == true) + { + console.log("pass") + } + else + { + console.log(" contains true fail") + } + + if (containsTopic(new Topic("d","d_t"),topics) == false) + { + console.log("pass") + } + else + { + console.log(" contains d fail") + } +} + +testToics(); \ No newline at end of file diff --git a/backend/js/ros_scripts.js b/backend/js/ros_scripts.js new file mode 100644 index 0000000..93b818c --- /dev/null +++ b/backend/js/ros_scripts.js @@ -0,0 +1,124 @@ +var ros = new ROSLIB.Ros(); + +ros.recording = false; + +// ros.connectionName = 'ws://192.168.1.105:9090'; +ros.connectionName = 'ws://localhost:9090'; + +// If there is an error on the backend, an 'error' emit will be emitted. +ros.on('error', function(error) { + document.getElementById("ConnectionIPForm").className = "form-group has-warning has-feedback"; + document.getElementById("ConnectionIPInput").value = ros.connectionName; + document.getElementById("ConnectionIPLabel").innerHTML = 'No connection'; + document.getElementById("ConnectionButton").className = "btn btn-warning" + document.getElementById("rosbridgeconnection_badge").innerHTML = 'No connection'; + document.getElementById("ROSNodes").innerHTML = "No Nodes Detected"; + + rosbridgeconnection_badge + console.log(error);192 +}); +// Find out exactly when we made a connection. +ros.on('connection', function() { + console.log('Connection made!'); + document.getElementById("ConnectionIPForm").className = "form-group has-success has-feedback"; + document.getElementById("ConnectionIPInput").value = ros.connectionName; + document.getElementById("ConnectionIPLabel").innerHTML = 'Connection made at:'; + document.getElementById("rosbridgeconnection_badge").innerHTML = 'Connected'; + document.getElementById("ConnectionButton").className = "btn btn-success" + + ros.nodes = []; + ros.topics = []; + +}); + +ros.on('close', function() { + console.log('Connection closed.'); + + document.getElementById("ConnectionIPForm").className = "form-group has-warning has-feedback"; + document.getElementById("ConnectionIPLabel").innerHTML = 'Connection closed'; + document.getElementById("ConnectionButton").className = "btn btn-warning" + document.getElementById("rosbridgeconnection_badge").innerHTML = 'Connection closed'; + ros.nodes = []; + ros.topics = []; +}); +// Create a connection to the rosbridge WebSocket server. +ros.connect(ros.connectionName); + + +/////////////////////////////////////////////////////////////////////////////////// +// Publishers +/////////////////////////////////////////////////////////////////////////////////// + +function publishBagMessage(bagFilename) +{ + var bagMessage = new ROSLIB.Message({ + data : bagFilename + }) + bagPublisher.publish(bagMessage) +} + +//////////////////////////////////////////////////////////////// +// Topics +//////////////////////////////////////////////////////////////// + +var bagPublisher = new ROSLIB.Topic({ + ros : ros, + name : 'bag_publisher', + messageType : 'std_msgs/String' +}); + +var bagNotifier = new ROSLIB.Topic({ + ros : ros, + name : 'bag_notifier', + messageType : 'std_msgs/String' +}); + +//////////////////////////////////////////////////////////////// +// Subscribers +//////////////////////////////////////////////////////////////// + + +bagNotifier.subscribe(function(message) { + if (message.data === "STARTED") { + document.getElementById("recordButtonText").innerHTML = "Stop" + document.getElementById("recordButton").className = "btn btn-danger" + } else { + document.getElementById("recordButtonText").innerHTML = "Start" + document.getElementById("recordButton").className = "btn btn-primary" + } +}); + + +/////////////////////////////////////////////////////////////////////////////////// +// Functions +/////////////////////////////////////////////////////////////////////////////////// + + + +// attept to connect to the ros master from the IP given orgrab it from the form +ros.attemptConnection = function(ipAddress) +{ + if( typeof ipAddress !== "undefined") + { + ros.connectionName = ipAddress; + } + else + { + ros.connectionName = document.getElementById("ConnectionIPInput").value + } + console.log('Connection = ' + ros.connectionName); + ros.connect(ros.connectionName); +} + +function toggleRecording() +{ + document.getElementById("recordButtonText").innerHTML = "Wait" + document.getElementById("recordButton").className = "btn btn-warning" + if (!ros.recording) { + ros.recording = true + publishBagMessage(document.getElementById("recordText").value) + } else { + ros.recording = false + publishBagMessage("STOP") + } +} diff --git a/backend/js/update_guis.js b/backend/js/update_guis.js new file mode 100644 index 0000000..5a60a11 --- /dev/null +++ b/backend/js/update_guis.js @@ -0,0 +1,161 @@ + +ros.topics = []; +ros.nodes = []; + +$("#myImage").click ( function (evt) { + + var jThis = $(this); + var offsetFromParent = jThis.position (); + var topThickness = (jThis.outerHeight(true) - jThis.height() ) / 2; + var leftThickness = (jThis.outerWidth (true) - jThis.width () ) / 2; + + //--- (x,y) coordinates of the mouse click relative to the image. + var x = evt.pageX - offsetFromParent.left - leftThickness; + var y = evt.pageY - offsetFromParent.top - topThickness; + + ReportDims (); + $('#rez').append ('

User clicked at: ' + x + ', ' + y + ' (x,y).

') +} ); + + +function ReportDims () { + w = $("#myImage").width (); + h = $("#myImage").height (); + $('#rez').text ('The image is ' + w + ' by ' + h + ' (w by h).'); +} + +ReportDims (); + +function updateVoltage(voltage) +{ + + var voltage_min = 9.5; + var voltage_max = 12.5; + var voltage_range = voltage_max - voltage_min; + + var voltage_percentage = (voltage - voltage_min) / voltage_range * 100; + + var voltage_string = ""; + voltage_string = voltage_string.concat(voltage_percentage); + voltage_string = voltage_string.substring(0,4); + voltage_string = voltage_string.concat('%'); + + document.getElementById("VoltageDisplay").style.width = voltage_string; + document.getElementById("VoltageDisplay").innerHTML = voltage_string; + + if (voltage_percentage < 50 && voltage_percentage > 25 ) { + document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-warning" + } + else if ( voltage_percentage <= 25) + { + document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-danger" + var sound = document.getElementById("audio"); + sound.play() + console.log("Pay Sound") + } + else + { + document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-success" + } +}; + +function updateTopicsGUI() +{ + + ros.getTopics(function(result) + { + ros.topics = result; + } + ); + + var topics = ros.topics; + + topics.sort(); + if(topics != null){ + var innerHTML = ""; + for (var i = 0; i < topics.length; i++ ) + { + innerHTML = innerHTML.concat(generateCheckbox(topics[i])); + } + document.getElementById("ROSTopics").innerHTML = innerHTML; + } + +}; + +function generateCheckbox(name) +{ + var str = "
"); + return str; +}; + +function updateNodesGUI() +{ + + ros.getNodes(function(result) + { + ros.nodes = result; + }); + + var nodes = ros.nodes; + nodes.sort() + + if(nodes != null){ + var innerHTML = ""; + for (var i = 0; i < nodes.length; i++ ) + { + innerHTML = innerHTML.concat(nodes[i]); + innerHTML = innerHTML.concat("
"); + + } + document.getElementById("ROSNodes").innerHTML = innerHTML; + } + +}; + +window.setInterval(function(){ + updateTopicsGUI() + updateNodesGUI() +}, 500); + +function validateForm() +{ + ros.attemptConnection(); + return false; +}; + +function addInputsForConnection() +{ + + var innerHTML = ""; + + for (var i = 0; i < ros.connectioninfo.length; i ++) + { + + console.log(ros.connectioninfo[i]) + el = document.getElementById("ConnectionInformation") + + innerHTML = innerHTML.concat(""); + innerHTML = innerHTML.concat("") + innerHTML = innerHTML.concat("") + if(i >0 && i < 4) + { + innerHTML = innerHTML.concat(".") + } + + + } + el.innerHTML = innerHTML; + + console.log(innerHTML) + + +} + + + + + diff --git a/index.html b/index.html index c8898ed..feec01f 100644 --- a/index.html +++ b/index.html @@ -19,10 +19,12 @@ Tutorials can be found here: http://www.w3schools.com/bootstrap/default.asp - + - - + + + + @@ -88,9 +90,9 @@ Tutorials can be found here: http://www.w3schools.com/bootstrap/default.asp - +
- + @@ -114,7 +116,7 @@ Tutorials can be found here: http://www.w3schools.com/bootstrap/default.asp
- +
-
+
N/A
diff --git a/robot_display.html b/robot_display.html index 984088c..8967f9d 100644 --- a/robot_display.html +++ b/robot_display.html @@ -1,3 +1,14 @@ + + + +

Click in the actual image. Relative coordinates will be displayed.

+

+
+ + + + +
@@ -43,11 +54,6 @@ Camera Image
-
-
- No Camera Image - -
No Camera Image