Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Roslibjs logging 211 #299

Merged
merged 11 commits into from
Feb 15, 2020
108 changes: 108 additions & 0 deletions robot/basestation/static/js/roslibjs/ros-helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ REQUEST_TIMEOUT = 3000
ROTATE_TIMEOUT = 1000
lastRotate = 0

// ROS logging severity level constants
const ROSDEBUG = 1 // debug level
const ROSINFO = 2 // general level
const ROSWARN = 4 // warning level
const ROSERROR = 8 // error level
const ROSFATAL = 16 // fatal/critical level

function initRosWeb () {
ros = new ROSLIB.Ros({
url: 'ws://' + env.HOST_IP + ':9090'
Expand All @@ -20,6 +27,15 @@ function initRosWeb () {
appendToConsole('Connection to websocket server closed.')
})

/* Logging */

// publishes log messages to /rosout
ros_logger = new ROSLIB.Topic({
ros: ros,
name: 'rosout',
messageType: 'rosgraph_msgs/Log'
})

/* general controls */

// setup a client for the ping service
Expand Down Expand Up @@ -188,6 +204,98 @@ function initRosWeb () {
}

/* functions used in main code */

function getTimestamp () {
MartensCedric marked this conversation as resolved.
Show resolved Hide resolved
// next few lines taken and adjusted from roslibjs action server example
let currentTime = new Date()
let secs = currentTime.getTime()/1000 // seconds before truncating the decimal
let secsFloored = Math.floor(secs) // seconds after truncating
let nsecs = Math.round(1000000000*(secs-secsFloored)) // nanoseconds since the previous second
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I say rename this nanoSecs to make the name clearer

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


// return a dictionary for the ROS log and a string for the gui console
let stampTime = currentTime.toString().split(' ')[4] // hh:mm:ss from date object
return [{secs : secsFloored, nsecs : nsecs}, stampTime]
}

function publishRosLog (logLevel, timestamp, message) {
ros_logger.publish(
new ROSLIB.Message({
// I'm only publishing the essentials. We could include more info if so desired
header : {
// seq // uint32: sequence ID, seems to increment automatically
stamp : timestamp // dictionary: contains truncated seconds and nanoseconds
// frame_id // string: probably only useful for tf
},
level : logLevel, // int: see log level constants above
// name : '/web_gui', // name of the node (proposed)
msg : message, // string: this is the log message
// file // string: we could specify the js file that generated the log
// function // string: we could specify the parent function that generated the log
// line // uint32: we could specify the specific line of code that generated the log
// topics // string[]: topic names that the node publishes
})
)
}

function rosLog (logLevel, message) {
let prefix, isError
MartensCedric marked this conversation as resolved.
Show resolved Hide resolved
switch (logLevel) {
case ROSDEBUG:
// unlike rospy, currently the debug messages we generate will get published
prefix = '[DEBUG]'
isError = false
break
case ROSINFO:
prefix = '[INFO]'
isError = false
break
case ROSWARN:
prefix = '[WARN]'
isError = true
break
case ROSERROR:
prefix = '[ERROR]'
isError = true
break
case ROSFATAL:
prefix = '[FATAL]'
isError = true
break
}

stamps = getTimestamp()
consoleMsg = prefix + ' [' + stamps[1] + ']: ' + message

// info goes to stdout, warn-error-fatal go to stderr
if (!isError) {
console.log(consoleMsg)
} else {
console.error(consoleMsg)
}
appendToConsole(consoleMsg, false)

// All log messages should go to the log file: currently goes to rosout.log
publishRosLog(logLevel, stamps[0], message)
}

// these functions copy the rospy logging functions
function logDebug (message) {
// unlike rospy, currently the debug messages we generate will get published
MartensCedric marked this conversation as resolved.
Show resolved Hide resolved
rosLog(ROSDEBUG, message)
}
function logInfo (message) {
rosLog(ROSINFO, message)
}
function logWarn (message) {
rosLog(ROSWARN, message)
}
function logErr (message) {
rosLog(ROSERROR, message)
}
function logFatal (message) {
rosLog(ROSFATAL, message)
}

function requestMuxChannel (elemID, callback, timeout = REQUEST_TIMEOUT) {
let dev = elemID[elemID.length - 1]
let request = new ROSLIB.ServiceRequest({ device: dev })
Expand Down