/ * * M o d i f i e d f r o m o r i g i n a l N o d e - R e d s o u r c e , f o r a u d i o s y s t e m v i s u a l i z a t i o n
* vim : set ts = 4 :
* Copyright 2013 IBM Corp .
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* * /
var RED = ( function ( ) {
$ ( '#btn-keyboard-shortcuts' ) . click ( function ( ) { showHelp ( ) ; } ) ;
function hideDropTarget ( ) {
$ ( "#dropTarget" ) . hide ( ) ;
RED . keyboard . remove ( /* ESCAPE */ 27 ) ;
}
$ ( '#chart' ) . on ( "dragenter" , function ( event ) {
if ( $ . inArray ( "text/plain" , event . originalEvent . dataTransfer . types ) != - 1 ) {
$ ( "#dropTarget" ) . css ( { display : 'table' } ) ;
RED . keyboard . add ( /* ESCAPE */ 27 , hideDropTarget ) ;
}
} ) ;
$ ( '#dropTarget' ) . on ( "dragover" , function ( event ) {
if ( $ . inArray ( "text/plain" , event . originalEvent . dataTransfer . types ) != - 1 ) {
event . preventDefault ( ) ;
}
} )
. on ( "dragleave" , function ( event ) {
hideDropTarget ( ) ;
} )
. on ( "drop" , function ( event ) {
var data = event . originalEvent . dataTransfer . getData ( "text/plain" ) ;
hideDropTarget ( ) ;
RED . view . importNodes ( data ) ;
event . preventDefault ( ) ;
} ) ;
function make _name ( n ) {
var name = ( n . name ? n . name : n . id ) ;
name = name . replace ( " " , "_" ) . replace ( "+" , "_" ) . replace ( "-" , "_" ) ;
return name
}
function save ( force ) {
RED . storage . update ( ) ;
if ( RED . nodes . hasIO ( ) ) {
var nns = RED . nodes . createCompleteNodeSet ( ) ;
// sort by horizontal position, plus slight vertical position,
// for well defined update order that follows signal flow
nns . sort ( function ( a , b ) { return ( a . x + a . y / 250 ) - ( b . x + b . y / 250 ) ; } ) ;
//console.log(JSON.stringify(nns));
//add the include files first
var cpp = "#include <OpenAudio_ArduinoLibrary.h>\n#include <Audio.h>\n"
+ "#include <Wire.h>\n"
+ "#include <SPI.h>\n#include <SD.h>\n#include <SerialFlash.h>\n\n"
+ "// GUItool: begin automatically generated code\n" ;
// generate code for all audio processing nodes
for ( var i = 0 ; i < nns . length ; i ++ ) {
var n = nns [ i ] ;
var node = RED . nodes . node ( n . id ) ;
if ( node && ( node . outputs > 0 || node . _def . inputs > 0 ) ) {
cpp += n . type + " " ;
for ( var j = n . type . length ; j < 24 ; j ++ ) cpp += " " ;
var name = make _name ( n )
cpp += name + "; " ;
for ( var j = n . id . length ; j < 14 ; j ++ ) cpp += " " ;
cpp += "//xy=" + n . x + "," + n . y + "\n" ;
}
}
// generate code for all connections (aka wires or links)
var cordcount = 1 ;
for ( var i = 0 ; i < nns . length ; i ++ ) {
var n = nns [ i ] ;
if ( n . wires ) {
for ( var j = 0 ; j < n . wires . length ; j ++ ) {
var wires = n . wires [ j ] ;
if ( ! wires ) continue ;
for ( var k = 0 ; k < wires . length ; k ++ ) {
var wire = n . wires [ j ] [ k ] ;
if ( wire ) {
var parts = wire . split ( ":" ) ;
if ( parts . length == 2 ) {
cpp += "AudioConnection_F32 patchCord" + cordcount + "(" ;
var src = RED . nodes . node ( n . id ) ;
var dst = RED . nodes . node ( parts [ 0 ] ) ;
var src _name = make _name ( src ) ;
var dst _name = make _name ( dst ) ;
if ( j == 0 && parts [ 1 ] == 0 && src && src . outputs == 1 && dst && dst . _def . inputs == 1 ) {
cpp += src _name + ", " + parts [ 0 ] ;
} else {
cpp += src _name + ", " + j + ", " + dst _name + ", " + parts [ 1 ] ;
}
cpp += ");\n" ;
cordcount ++ ;
}
}
}
}
}
}
// generate code for all control nodes (no inputs or outputs)
for ( var i = 0 ; i < nns . length ; i ++ ) {
var n = nns [ i ] ;
var node = RED . nodes . node ( n . id ) ;
if ( node && node . outputs == 0 && node . _def . inputs == 0 ) {
cpp += n . type + " " ;
for ( var j = n . type . length ; j < 24 ; j ++ ) cpp += " " ;
cpp += n . id + "; " ;
for ( var j = n . id . length ; j < 14 ; j ++ ) cpp += " " ;
cpp += "//xy=" + n . x + "," + n . y + "\n" ;
}
}
cpp += "// GUItool: end automatically generated code\n" ;
// generate setup()
cpp += "\n" ;
cpp += "\n" ;
cpp += "//The setup function is called once when the system starts up\n" ;
cpp += "void setup(void) {\n" ;
cpp += "\t" + "//Start the USB serial link (to enable debugging)\n" ;
cpp += "\t" + "Serial.begin(115200); delay(500);\n" ;
cpp += "\t" + "Serial.println(\"Setup starting...\");\n" ;
cpp += "\t" + "\n"
cpp += "\t" + "//Allocate dynamically shuffled memory for the audio subsystem\n" ;
cpp += "\t" + "AudioMemory(10); AudioMemory_F32(10);\n" ;
cpp += "\t" + "\n" ;
// Need to add "begin()" call for AudioControl objects!!!
cpp += "\t" + "//Put your own setup code here\n" ;
cpp += "\t" + "\n" ;
cpp += "\t" + "//End of setup\n" ;
cpp += "\t" + "Serial.println(\"Setup complete.\");\n" ;
cpp += "};\n" ;
// generate loop()
cpp += "\n" ;
cpp += "\n" ;
cpp += "//After setup(), the loop function loops forever.\n" ;
cpp += "//Note that the audio modules are called in the background.\n" ;
cpp += "//They do not need to be serviced by the loop() function.\n"
cpp += "void loop(void) {\n" ;
cpp += "\n" ;
cpp += "};" ;
//console.log(cpp);
RED . view . state ( RED . state . EXPORT ) ;
RED . view . getForm ( 'dialog-form' , 'export-clipboard-dialog' , function ( d , f ) {
$ ( "#node-input-export" ) . val ( cpp ) . focus ( function ( ) {
var textarea = $ ( this ) ;
textarea . select ( ) ;
textarea . mouseup ( function ( ) {
textarea . unbind ( "mouseup" ) ;
return false ;
} ) ;
} ) . focus ( ) ;
$ ( "#dialog" ) . dialog ( "option" , "title" , "Export to Arduino" ) . dialog ( "option" , "width" , 600 ) . dialog ( "open" ) ;
} ) ;
//RED.view.dirty(false);
} else {
$ ( "#node-dialog-error-deploy" ) . dialog ( {
title : "Error exporting data to Arduino IDE" ,
modal : true ,
autoOpen : false ,
width : 410 ,
height : 245 ,
buttons : [ {
text : "Ok" ,
click : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
} ]
} ) . dialog ( "open" ) ;
}
}
$ ( '#btn-deploy' ) . click ( function ( ) { save ( ) ; } ) ;
$ ( "#node-dialog-confirm-deploy" ) . dialog ( {
title : "Confirm deploy" ,
modal : true ,
autoOpen : false ,
width : 530 ,
height : 230 ,
buttons : [
{
text : "Confirm deploy" ,
click : function ( ) {
save ( true ) ;
$ ( this ) . dialog ( "close" ) ;
}
} ,
{
text : "Cancel" ,
click : function ( ) {
$ ( this ) . dialog ( "close" ) ;
}
}
]
} ) ;
// from http://css-tricks.com/snippets/javascript/get-url-variables/
function getQueryVariable ( variable ) {
var query = window . location . search . substring ( 1 ) ;
var vars = query . split ( "&" ) ;
for ( var i = 0 ; i < vars . length ; i ++ ) {
var pair = vars [ i ] . split ( "=" ) ;
if ( pair [ 0 ] == variable ) { return pair [ 1 ] ; }
}
return ( false ) ;
}
function loadNodes ( ) {
$ ( ".palette-scroll" ) . show ( ) ;
$ ( "#palette-search" ) . show ( ) ;
RED . storage . load ( ) ;
RED . view . redraw ( ) ;
setTimeout ( function ( ) {
$ ( "#btn-deploy" ) . removeClass ( "disabled" ) . addClass ( "btn-danger" ) ;
$ ( "#btn-import" ) . removeClass ( "disabled" ) . addClass ( "btn-success" ) ;
} , 1500 ) ;
$ ( '#btn-deploy' ) . click ( function ( ) { save ( ) ; } ) ;
// if the query string has ?info=className, populate info tab
var info = getQueryVariable ( "info" ) ;
if ( info ) {
RED . sidebar . info . setHelpContent ( '' , info ) ;
}
}
$ ( '#btn-node-status' ) . click ( function ( ) { toggleStatus ( ) ; } ) ;
var statusEnabled = false ;
function toggleStatus ( ) {
var btnStatus = $ ( "#btn-node-status" ) ;
statusEnabled = btnStatus . toggleClass ( "active" ) . hasClass ( "active" ) ;
RED . view . status ( statusEnabled ) ;
}
function showHelp ( ) {
var dialog = $ ( '#node-help' ) ;
//$("#node-help").draggable({
// handle: ".modal-header"
//});
dialog . on ( 'show' , function ( ) {
RED . keyboard . disable ( ) ;
} ) ;
dialog . on ( 'hidden' , function ( ) {
RED . keyboard . enable ( ) ;
} ) ;
dialog . modal ( ) ;
}
$ ( function ( ) {
$ ( ".palette-spinner" ) . show ( ) ;
// server test switched off - test purposes only
var patt = new RegExp ( /^[http|https]/ ) ;
var server = false && patt . test ( location . protocol ) ;
if ( ! server ) {
var data = $ . parseJSON ( $ ( "script[data-container-name|='NodeDefinitions']" ) . html ( ) ) ;
var nodes = data [ "nodes" ] ;
$ . each ( nodes , function ( key , val ) {
RED . nodes . registerType ( val [ "type" ] , val [ "data" ] ) ;
} ) ;
RED . keyboard . add ( /* ? */ 191 , { shift : true } , function ( ) {
showHelp ( ) ;
d3 . event . preventDefault ( ) ;
} ) ;
loadNodes ( ) ;
$ ( ".palette-spinner" ) . hide ( ) ;
} else {
$ . ajaxSetup ( { beforeSend : function ( xhr ) {
if ( xhr . overrideMimeType ) {
xhr . overrideMimeType ( "application/json" ) ;
}
} } ) ;
$ . getJSON ( "resources/nodes_def.json" , function ( data ) {
var nodes = data [ "nodes" ] ;
$ . each ( nodes , function ( key , val ) {
RED . nodes . registerType ( val [ "type" ] , val [ "data" ] ) ;
} ) ;
RED . keyboard . add ( /* ? */ 191 , { shift : true } , function ( ) { showHelp ( ) ; d3 . event . preventDefault ( ) ; } ) ;
loadNodes ( ) ;
$ ( ".palette-spinner" ) . hide ( ) ;
} )
}
} ) ;
return {
} ;
} ) ( ) ;