2013-06-19 11:06:14 +00:00
// Get access to the background window object
// This object is used to pass current connectionId to the backround page
// so the onClosed event can close the port for us if it was left opened, without this
// users can experience weird behavior if they would like to access the serial bus afterwards.
chrome . runtime . getBackgroundPage ( function ( result ) {
backgroundPage = result ;
2013-12-06 17:32:32 +00:00
backgroundPage . app _window = window ;
2013-06-19 11:06:14 +00:00
} ) ;
2013-08-26 12:41:10 +00:00
// Google Analytics stuff begin
var service = analytics . getService ( 'ice_cream_app' ) ;
var ga _tracker = service . getTracker ( 'UA-32728876-6' ) ;
ga _tracker . sendAppView ( 'Application Started' ) ;
// Google Analytics stuff end
2013-06-13 11:11:53 +00:00
2013-12-18 13:57:27 +00:00
$ ( document ) . ready ( function ( ) {
2014-01-18 18:21:30 +00:00
// bind controls
$ ( '#frame .minimize' ) . click ( function ( ) {
chrome . app . window . current ( ) . minimize ( ) ;
} ) ;
$ ( '#frame .maximize' ) . click ( function ( ) {
2014-02-22 08:52:28 +00:00
chrome . app . window . current ( ) . maximize ( ) ;
2014-01-18 18:21:30 +00:00
} ) ;
$ ( '#frame .close' ) . click ( function ( ) {
chrome . app . window . current ( ) . close ( ) ;
2014-02-03 05:21:26 +00:00
} ) ;
// alternative - window.navigator.appVersion.match(/Chrome\/([0-9.]*)/)[1];
2014-02-03 08:38:16 +00:00
GUI . log ( 'Running - OS: <strong>' + GUI . operating _system + '</strong>, ' +
'Chrome: <strong>' + window . navigator . appVersion . replace ( /.*Chrome\/([0-9.]*).*/ , "$1" ) + '</strong>, ' +
'Configurator: <strong>' + chrome . runtime . getManifest ( ) . version + '</strong>' ) ;
2014-02-10 19:01:08 +00:00
// notification messages for various operating systems
switch ( GUI . operating _system ) {
case 'Windows' :
break ;
case 'MacOS' :
var main _chromium _version = window . navigator . appVersion . replace ( /.*Chrome\/([0-9.]*).*/ , "$1" ) . split ( '.' ) [ 0 ] ;
if ( main _chromium _version >= 33 ) {
GUI . log ( ' Configurator detected that you are running Chrome / Chromium with broken < strong > Serial API < / s t r o n g > w h i c h \
< strong style = "color: red" > breaks < / s t r o n g > t h e c o m m u n i c a t i o n c o m p l e t e l y o n t h i s p l a t f o r m ' ) ;
GUI . log ( ' You can find more about this issue on this address \
< strong > "<a href=" https : //code.google.com/p/chromium/issues/detail?id=337482" title="Chromium Bug Tracker" target="_blank">new serial API fails to set higher baudrate then 38400</a>"</strong>');
}
break ;
case 'ChromeOS' :
break ;
case 'Linux' :
break ;
case 'UNIX' :
break ;
}
2014-01-18 18:21:30 +00:00
// Tabs
2013-04-13 00:43:23 +00:00
var tabs = $ ( '#tabs > ul' ) ;
2013-04-08 19:10:47 +00:00
$ ( 'a' , tabs ) . click ( function ( ) {
if ( $ ( this ) . parent ( ) . hasClass ( 'active' ) == false ) { // only initialize when the tab isn't already active
2014-01-18 11:09:12 +00:00
if ( configuration _received == false ) { // if there is no active connection, return
2014-02-03 07:45:21 +00:00
GUI . log ( 'You need to connect before you can view any of the tabs' , 'red' ) ;
2013-04-08 19:10:47 +00:00
return ;
}
2013-11-09 05:14:21 +00:00
var self = this ;
GUI . tab _switch _cleanup ( function ( ) {
2013-12-09 18:34:34 +00:00
// disable previously active tab highlight
2013-11-09 05:14:21 +00:00
$ ( 'li' , tabs ) . removeClass ( 'active' ) ;
2013-12-09 18:34:34 +00:00
// get tab class name (there should be only one class listed)
var tab = $ ( self ) . parent ( ) . prop ( 'class' ) ;
// Highlight selected tab
2013-11-09 05:14:21 +00:00
$ ( self ) . parent ( ) . addClass ( 'active' ) ;
2013-12-09 18:34:34 +00:00
switch ( tab ) {
case 'tab_initial_setup' :
2014-01-24 16:06:54 +00:00
tab _initialize _initial _setup ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_pid_tuning' :
2014-01-24 16:06:54 +00:00
tab _initialize _pid _tuning ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_receiver' :
2014-01-24 16:06:54 +00:00
tab _initialize _receiver ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_auxiliary_configuration' :
2014-01-24 16:06:54 +00:00
tab _initialize _auxiliary _configuration ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_servos' :
2014-01-24 16:06:54 +00:00
tab _initialize _servos ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_gps' :
2014-01-24 16:06:54 +00:00
tab _initialize _gps ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_motor_outputs' :
2014-01-24 16:06:54 +00:00
tab _initialize _motor _outputs ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_sensors' :
2014-01-24 16:06:54 +00:00
tab _initialize _sensors ( ) ;
2013-12-09 18:34:34 +00:00
break ;
case 'tab_cli' :
2014-01-24 16:06:54 +00:00
tab _initialize _cli ( ) ;
2013-12-09 18:34:34 +00:00
break ;
2013-11-09 05:14:21 +00:00
}
} ) ;
2013-04-08 19:10:47 +00:00
}
} ) ;
2013-04-09 15:58:54 +00:00
2013-10-30 16:42:04 +00:00
tab _initialize _default ( ) ;
2014-01-15 19:25:51 +00:00
2014-01-15 23:55:45 +00:00
// listen to all input change events and adjust the value within limits if necessary
2014-01-24 15:44:08 +00:00
$ ( "#content" ) . on ( 'focus' , 'input[type="number"]' , function ( ) {
2014-01-16 00:58:07 +00:00
var element = $ ( this ) ;
var val = element . val ( ) ;
if ( ! isNaN ( val ) ) {
element . data ( 'previousValue' , parseFloat ( val ) ) ;
}
} ) ;
2014-01-24 15:44:08 +00:00
$ ( "#content" ) . on ( 'keydown' , 'input[type="number"]' , function ( e ) {
// whitelist all that we need for numeric control
if ( ( e . keyCode >= 96 && e . keyCode <= 105 ) || ( e . keyCode >= 48 && e . keyCode <= 57 ) ) { // allow numpad and standard number keypad
2014-01-29 19:22:14 +00:00
} else if ( e . keyCode == 109 || e . keyCode == 189 ) { // minus on numpad and in standard keyboard
} else if ( e . keyCode == 8 || e . keyCode == 46 ) { // backspace and delete
2014-01-24 15:44:08 +00:00
} else if ( e . keyCode == 190 || e . keyCode == 110 ) { // allow and decimal point
} else if ( ( e . keyCode >= 37 && e . keyCode <= 40 ) || e . keyCode == 13 ) { // allow arrows, enter
} else {
// block everything else
e . preventDefault ( ) ;
}
} ) ;
$ ( "#content" ) . on ( 'change' , 'input[type="number"]' , function ( ) {
2014-01-16 00:58:07 +00:00
var element = $ ( this ) ;
var min = parseFloat ( element . prop ( 'min' ) ) ;
var max = parseFloat ( element . prop ( 'max' ) ) ;
var step = parseFloat ( element . prop ( 'step' ) ) ;
var val = parseFloat ( element . val ( ) ) ;
2014-01-15 19:25:51 +00:00
2014-01-15 23:55:45 +00:00
// only adjust minimal end if bound is set
2014-01-16 00:58:07 +00:00
if ( element . prop ( 'min' ) ) {
if ( val < min ) element . val ( min ) ;
2014-01-15 19:25:51 +00:00
}
2014-01-15 23:55:45 +00:00
// only adjust maximal end if bound is set
2014-01-16 00:58:07 +00:00
if ( element . prop ( 'max' ) ) {
if ( val > max ) element . val ( max ) ;
}
// if entered value is illegal use previous value instead
if ( isNaN ( val ) ) {
element . val ( element . data ( 'previousValue' ) ) ;
}
// if step is not set or step is int and value is float use previous value instead
if ( isNaN ( step ) || step % 1 === 0 ) {
if ( val % 1 !== 0 ) {
element . val ( element . data ( 'previousValue' ) ) ;
}
2014-01-15 19:25:51 +00:00
}
2014-01-29 19:22:14 +00:00
// if step is set and is float and value is int, convert to float, keep decimal places in float according to step *experimental*
if ( ! isNaN ( step ) && step % 1 !== 0 ) {
var decimal _places = String ( step ) . split ( '.' ) [ 1 ] . length ;
if ( val % 1 === 0 ) {
element . val ( val . toFixed ( decimal _places ) ) ;
} else if ( String ( val ) . split ( '.' ) [ 1 ] . length != decimal _places ) {
element . val ( val . toFixed ( decimal _places ) ) ;
}
}
2014-01-15 19:25:51 +00:00
} ) ;
2013-11-08 17:31:19 +00:00
} ) ;
2013-11-13 08:49:03 +00:00
function microtime ( ) {
var now = new Date ( ) . getTime ( ) / 1000 ;
return now ;
2013-11-20 11:24:37 +00:00
}
2014-01-23 22:47:14 +00:00
/ *
2014-01-22 14:36:34 +00:00
function add _custom _spinners ( ) {
var spinner _element = '<div class="spinner"><div class="up"></div><div class="down"></div></div>' ;
$ ( 'input[type="number"]' ) . each ( function ( ) {
var input = $ ( this ) ;
2014-01-22 15:02:55 +00:00
2014-01-22 16:05:34 +00:00
// only add new spinner if one doesn't already exist
if ( ! input . next ( ) . hasClass ( 'spinner' ) ) {
var isInt = true ;
if ( input . prop ( 'step' ) == '' ) {
2014-01-22 15:02:55 +00:00
isInt = true ;
} else {
2014-01-22 16:05:34 +00:00
if ( input . prop ( 'step' ) . indexOf ( '.' ) == - 1 ) {
isInt = true ;
} else {
isInt = false ;
}
2014-01-22 14:36:34 +00:00
}
2014-01-22 16:05:34 +00:00
// make space for spinner
input . width ( input . width ( ) - 16 ) ;
// add spinner
input . after ( spinner _element ) ;
// get spinner refference
var spinner = input . next ( ) ;
// bind UI hooks to spinner
$ ( '.up' , spinner ) . click ( function ( ) {
up ( ) ;
} ) ;
$ ( '.up' , spinner ) . mousedown ( function ( ) {
GUI . timeout _add ( 'spinner' , function ( ) {
GUI . interval _add ( 'spinner' , function ( ) {
up ( ) ;
} , 100 , true ) ;
} , 250 ) ;
} ) ;
$ ( '.up' , spinner ) . mouseup ( function ( ) {
GUI . timeout _remove ( 'spinner' ) ;
GUI . interval _remove ( 'spinner' ) ;
} ) ;
$ ( '.up' , spinner ) . mouseleave ( function ( ) {
GUI . timeout _remove ( 'spinner' ) ;
GUI . interval _remove ( 'spinner' ) ;
} ) ;
$ ( '.down' , spinner ) . click ( function ( ) {
down ( ) ;
} ) ;
$ ( '.down' , spinner ) . mousedown ( function ( ) {
GUI . timeout _add ( 'spinner' , function ( ) {
GUI . interval _add ( 'spinner' , function ( ) {
down ( ) ;
} , 100 , true ) ;
} , 250 ) ;
} ) ;
$ ( '.down' , spinner ) . mouseup ( function ( ) {
GUI . timeout _remove ( 'spinner' ) ;
GUI . interval _remove ( 'spinner' ) ;
} ) ;
$ ( '.down' , spinner ) . mouseleave ( function ( ) {
GUI . timeout _remove ( 'spinner' ) ;
GUI . interval _remove ( 'spinner' ) ;
} ) ;
var up = function ( ) {
if ( isInt ) {
var current _value = parseInt ( input . val ( ) ) ;
input . val ( current _value + 1 ) ;
} else {
var current _value = parseFloat ( input . val ( ) ) ;
var step = parseFloat ( input . prop ( 'step' ) ) ;
var step _decimals = input . prop ( 'step' ) . length - 2 ;
input . val ( ( current _value + step ) . toFixed ( step _decimals ) ) ;
}
2014-01-22 14:36:34 +00:00
2014-01-22 16:05:34 +00:00
input . change ( ) ;
} ;
2014-01-22 14:36:34 +00:00
2014-01-22 16:05:34 +00:00
var down = function ( ) {
if ( isInt ) {
var current _value = parseInt ( input . val ( ) ) ;
input . val ( current _value - 1 ) ;
} else {
var current _value = parseFloat ( input . val ( ) ) ;
var step = parseFloat ( input . prop ( 'step' ) ) ;
var step _decimals = input . prop ( 'step' ) . length - 2 ;
input . val ( ( current _value - step ) . toFixed ( step _decimals ) ) ;
}
input . change ( ) ;
} ;
}
2014-01-22 14:36:34 +00:00
} ) ;
2014-01-23 22:47:14 +00:00
}
* /