Browse Source

Merge pull request #130 from mamuesp/master

Improvement: import is now very error tolerant
dds
Paul Stoffregen 9 years ago
parent
commit
f665c5b421
4 changed files with 184 additions and 103 deletions
  1. +47
    -1
      gui/index.html
  2. +30
    -11
      gui/red/main.js
  3. +62
    -50
      gui/red/nodes.js
  4. +45
    -41
      gui/red/ui/view.js

+ 47
- 1
gui/index.html View File

TODO: add "parameters" fields, to replace the form html stuff TODO: add "parameters" fields, to replace the form html stuff
--> -->


<script type="text/x-red" data-container-name="NodeDefinitions">
{"nodes":[
{"type":"AudioInputI2S","data":{"defaults":{"name":{"value":"new"}},"shortName":"i2s","inputs":0,"outputs":2,"category":"input-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioInputAnalog","data":{"defaults":{"name":{"value":"new"}},"shortName":"adc","inputs":0,"outputs":1,"category":"input-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioInputI2Sslave","data":{"defaults":{"name":{"value":"new"}},"shortName":"i2ss","inputs":0,"outputs":2,"category":"input-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputI2S","data":{"defaults":{"name":{"value":"new"}},"shortName":"i2s","inputs":2,"outputs":0,"category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputSPDIF","data":{"defaults":{"name":{"value":"new"}},"shortName":"spdif","inputs":2,"outputs":0,"category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputAnalog","data":{"defaults":{"name":{"value":"new"}},"shortName":"dac","inputs":1,"outputs":0,"category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputPWM","data":{"defaults":{"name":{"value":"new"}},"shortName":"pwm","inputs":1,"outputs":0,"category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputI2Sslave","data":{"defaults":{"name":{"value":"new"}},"shortName":"i2ss","inputs":2,"outputs":0,"category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioMixer4","data":{"defaults":{"name":{"value":"new"}},"shortName":"mixer","inputs":4,"outputs":1,"category":"mixer-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioPlayMemory","data":{"defaults":{"name":{"value":"new"}},"shortName":"playMem","inputs":0,"outputs":1,"category":"play-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioPlaySdWav","data":{"defaults":{"name":{"value":"new"}},"shortName":"playSdWav","inputs":0,"outputs":2,"category":"play-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioPlaySdRaw","data":{"defaults":{"name":{"value":"new"}},"shortName":"playSdRaw","inputs":0,"outputs":1,"category":"play-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioPlaySerialflashRaw","data":{"defaults":{"name":{"value":"new"}},"shortName":"playFlashRaw","inputs":0,"outputs":1,"category":"play-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioPlayQueue","data":{"defaults":{"name":{"value":"new"}},"shortName":"queue","inputs":0,"outputs":1,"category":"play-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioRecordQueue","data":{"defaults":{"name":{"value":"new"}},"shortName":"queue","inputs":1,"outputs":0,"category":"record-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthWaveformSine","data":{"defaults":{"name":{"value":"new"}},"shortName":"sine","inputs":0,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthWaveformSineModulated","data":{"defaults":{"name":{"value":"new"}},"shortName":"sine_fm","inputs":1,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthWaveform","data":{"defaults":{"name":{"value":"new"}},"shortName":"waveform","inputs":0,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthToneSweep","data":{"defaults":{"name":{"value":"new"}},"shortName":"tonesweep","inputs":0,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthWaveformDc","data":{"defaults":{"name":{"value":"new"}},"shortName":"dc","inputs":0,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthNoiseWhite","data":{"defaults":{"name":{"value":"new"}},"shortName":"noise","inputs":0,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthNoisePink","data":{"defaults":{"name":{"value":"new"}},"shortName":"pink","inputs":0,"outputs":1,"category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectFade","data":{"defaults":{"name":{"value":"new"}},"shortName":"fade","inputs":1,"outputs":1,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectChorus","data":{"defaults":{"name":{"value":"new"}},"shortName":"chorus","inputs":1,"outputs":1,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectFlange","data":{"defaults":{"name":{"value":"new"}},"shortName":"flange","inputs":1,"outputs":1,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectEnvelope","data":{"defaults":{"name":{"value":"new"}},"shortName":"envelope","inputs":1,"outputs":1,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectMultiply","data":{"defaults":{"name":{"value":"new"}},"shortName":"multiply","inputs":2,"outputs":1,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectDelay","data":{"defaults":{"name":{"value":"new"}},"shortName":"delay","inputs":1,"outputs":8,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectDelayExternal","data":{"defaults":{"name":{"value":"new"}},"shortName":"delayExt","inputs":1,"outputs":8,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectBitcrusher","data":{"shortName":"bitcrusher","inputs":1,"outputs":1,"category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioFilterBiquad","data":{"defaults":{"name":{"value":"new"}},"shortName":"biquad","inputs":1,"outputs":1,"category":"filter-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioFilterFIR","data":{"defaults":{"name":{"value":"new"}},"shortName":"fir","inputs":1,"outputs":1,"category":"filter-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioFilterStateVariable","data":{"defaults":{"name":{"value":"new"}},"shortName":"filter","inputs":2,"outputs":3,"category":"filter-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioAnalyzePeak","data":{"defaults":{"name":{"value":"new"}},"shortName":"peak","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioAnalyzeFFT256","data":{"defaults":{"name":{"value":"new"}},"shortName":"fft256","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioAnalyzeFFT1024","data":{"defaults":{"name":{"value":"new"}},"shortName":"fft1024","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioAnalyzeToneDetect","data":{"defaults":{"name":{"value":"new"}},"shortName":"tone","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioAnalyzePrint","data":{"defaults":{"name":{"value":"new"}},"shortName":"print","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioControlSGTL5000","data":{"defaults":{"name":{"value":"new"}},"shortName":"sgtl5000","inputs":0,"outputs":0,"category":"control-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioControlWM8731","data":{"defaults":{"name":{"value":"new"}},"shortName":"wm8731","inputs":0,"outputs":0,"category":"control-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioControlWM8731master","data":{"defaults":{"name":{"value":"new"}},"shortName":"wm8731m","inputs":0,"outputs":0,"category":"control-function","color":"#E6E0F8","icon":"arrow-in.png"}}
]}
</script>

<script type="text/x-red" data-help-name="AudioInputI2S"> <script type="text/x-red" data-help-name="AudioInputI2S">
<h3>Summary</h3> <h3>Summary</h3>
<p>Receive 16 bit stereo audio from the <p>Receive 16 bit stereo audio from the
</p> </p>
<p>I2S master objects can be used together with non-I2S input and output <p>I2S master objects can be used together with non-I2S input and output
objects, for simultaneous audio streaming on different hardware.</p> objects, for simultaneous audio streaming on different hardware.</p>
</script>
</script><
<script type="text/x-red" data-template-name="AudioInputI2S"> <script type="text/x-red" data-template-name="AudioInputI2S">
<div class="form-row"> <div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>

+ 30
- 11
gui/red/main.js View File

// if the query string has ?info=className, populate info tab // if the query string has ?info=className, populate info tab
var info = getQueryVariable("info"); var info = getQueryVariable("info");
if (info) { if (info) {
RED.sidebar.info.setHelpContent('', info);
RED.sidebar.info.setHelpContent('', info);
} }
} }




$(function() { $(function() {
$(".palette-spinner").show(); $(".palette-spinner").show();
$.ajaxSetup({beforeSend: function(xhr){
if (xhr.overrideMimeType) {
xhr.overrideMimeType("application/json");
}
}});
$.getJSON( "resources/nodes_def.json", function( data ) {

// 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"]; var nodes = data["nodes"];
$.each(nodes, function(key, val) {
$.each(nodes, function (key, val) {
RED.nodes.registerType(val["type"], val["data"]); RED.nodes.registerType(val["type"], val["data"]);
}); });
RED.keyboard.add(/* ? */ 191,{shift:true},function(){showHelp();d3.event.preventDefault();});
loadNodes();
RED.keyboard.add(/* ? */ 191, {shift: true}, function () {
showHelp();
d3.event.preventDefault();
});
loadNodes();
$(".palette-spinner").hide(); $(".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 { return {

+ 62
- 50
gui/red/nodes.js View File

*/ */
function cppToJSON(newNodesStr) { function cppToJSON(newNodesStr) {


var nodes = [];
var newNodes = [];
var skipped = []; var skipped = [];
var cables = []; var cables = [];
var words = [];


const CODE_START = "// GUItool: begin automatically generated code";
const CODE_END = "// GUItool: end automatically generated code";
const NODE_COMMENT = "//"; const NODE_COMMENT = "//";
const NODE_AC = "AudioConnection"; const NODE_AC = "AudioConnection";


var parseLine = function(line) { var parseLine = function(line) {
var parts = line.match(/^(\S+)\s(.*)/).slice(1);
var parts = line.match(/^(\S+)\s(.*)/);
if (parts == null) {
return
}
parts = parts.slice(1);
if (parts == null || parts.length <= 1) {
return
}
var type = $.trim(parts[0]); var type = $.trim(parts[0]);
line = $.trim(parts[1]) + " "; line = $.trim(parts[1]) + " ";


var conn = []; var conn = [];


parts = line.match(/^([^;]{0,});(.*)/); parts = line.match(/^([^;]{0,});(.*)/);
if (parts) {
if (parts && parts.length >= 2) {
parts = parts.slice(1); parts = parts.slice(1);
description = $.trim(parts[0]);
coords = $.trim(parts[1]);
parts = coords.match(/^([^\/]{0,})\/\/xy=(.*)/);
if (parts) {
parts = parts.slice(1);
coords = $.trim(parts[1]).split(",");
if (parts && parts.length >= 1) {
description = $.trim(parts[0]);
coords = $.trim(parts[1]);
parts = coords.match(/^([^\/]{0,})\/\/xy=(.*)/);
if (parts) {
parts = parts.slice(1);
coords = $.trim(parts[1]).split(",");
}
} }
} }


switch (type) {
case NODE_AC:
parts = description.match(/^([^\(]*\()([^\)]*)(.*)/);
if (parts) {
conn = $.trim(parts[2]).split(",");
cables.push(conn);
}
break;
case NODE_COMMENT:
// do nothing ...
break;
default:
var node = new Object({
"id": description,
"type": type,
"x": parseInt(coords ? coords[0] : 0),
"y": parseInt(coords ? coords[1] : 0),
"z": 0,
"wires": []
});
// first solution: skip existing id
if (!RED.nodes.node(node.id)) {
nodes.push(node);
} else {
skipped.push(node.id);
}
break;
if (type == NODE_AC) {
parts = description.match(/^([^\(]*\()([^\)]*)(.*)/);
if (parts && parts.length > 1) {
conn = $.trim(parts[2]).split(",");
cables.push(conn);
}
} else if (type == NODE_COMMENT) {
// do nothing
} else {
var node = new Object({
"id": description,
"type": type,
"x": parseInt(coords ? coords[0] : 0),
"y": parseInt(coords ? coords[1] : 0),
"z": 0,
"wires": []
});
// first solution: skip existing id
if (RED.nodes.node(node.id) !== null) {
skipped.push(node.id);
} else {
newNodes.push(node);
}
} }
}; };


var findNode = function(name) { var findNode = function(name) {
var len = nodes.length;
var len = newNodes.length;
for (var key = 0; key < len; key++) { for (var key = 0; key < len; key++) {
if (nodes[key].id == name) {
return nodes[key];
if (newNodes[key].id == name) {
return newNodes[key];
} }
} }
}; };


var traverseLines = function(raw) { var traverseLines = function(raw) {
var lines = raw.split("\n"); var lines = raw.split("\n");
var useLine = 0;

for (var i = 0; i < lines.length; i++) { for (var i = 0; i < lines.length; i++) {
var line = lines[i]; var line = lines[i];
useLine += (line.indexOf(CODE_START) >= 0) ? (useLine ? 0 : 1) : 0;
if (useLine > 0) {
var parts = line.match(/^(\S+)\s(.*)/);
if (parts == null || parts.length == 1) {
continue;
}
var word = parts[1].trim();
if (words.indexOf(word) >= 0) {
parseLine(line); parseLine(line);
} }
useLine -= (line.indexOf(CODE_END) >= 0) ? (useLine ? 1 : 0) : 0;
} }
}; };


} }
}; };
*/ */
function startImport() {
words = Array(NODE_AC);
$.each(node_defs, function (key, obj) {
words.push(key);
});
traverseLines(newNodesStr);
linkCables(cables);
}


traverseLines(newNodesStr);
linkCables(cables);
startImport();


return { return {
count: nodes.length,
count: newNodes.length,
skipped: skipped.length, skipped: skipped.length,
data: nodes.length > 0 ? JSON.stringify(nodes) : ""
data: newNodes.length > 0 ? JSON.stringify(newNodes) : ""
}; };
} }



+ 45
- 41
gui/red/ui/view.js View File

moveTouchCenter = [], moveTouchCenter = [],
touchStartTime = 0; touchStartTime = 0;



var activeWorkspace = 0; var activeWorkspace = 0;
var workspaceScrollPositions = {}; var workspaceScrollPositions = {};


.attr('height', space_height) .attr('height', space_height)
.attr('fill','#fff'); .attr('fill','#fff');


//var gridScale = d3.scale.linear().range([0,2000]).domain([0,2000]);
//var grid = vis.append('g');
//
//grid.selectAll("line.horizontal").data(gridScale.ticks(100)).enter()
// .append("line")
// .attr(
// {
// "class":"horizontal",
// "x1" : 0,
// "x2" : 2000,
// "y1" : function(d){ return gridScale(d);},
// "y2" : function(d){ return gridScale(d);},
// "fill" : "none",
// "shape-rendering" : "crispEdges",
// "stroke" : "#eee",
// "stroke-width" : "1px"
// });
//grid.selectAll("line.vertical").data(gridScale.ticks(100)).enter()
// .append("line")
// .attr(
// {
// "class":"vertical",
// "y1" : 0,
// "y2" : 2000,
// "x1" : function(d){ return gridScale(d);},
// "x2" : function(d){ return gridScale(d);},
// "fill" : "none",
// "shape-rendering" : "crispEdges",
// "stroke" : "#eee",
// "stroke-width" : "1px"
// });

var gridScale = d3.scale.linear().range([0,2000]).domain([0,2000]);
/*
var grid = vis.append('g');

grid.selectAll("line.horizontal").data(gridScale.ticks(100)).enter()
.append("line")
.attr(
{
"class":"horizontal",
"x1" : 0,
"x2" : 2000,
"y1" : function(d){ return gridScale(d);},
"y2" : function(d){ return gridScale(d);},
"fill" : "none",
"shape-rendering" : "crispEdges",
"stroke" : "#eee",
"stroke-width" : "1px"
});
grid.selectAll("line.vertical").data(gridScale.ticks(100)).enter()
.append("line")
.attr(
{
"class":"vertical",
"y1" : 0,
"y2" : 2000,
"x1" : function(d){ return gridScale(d);},
"x2" : function(d){ return gridScale(d);},
"fill" : "none",
"shape-rendering" : "crispEdges",
"stroke" : "#eee",
"stroke-width" : "1px"
});
*/


var drag_line = vis.append("svg:path").attr("class", "drag_line"); var drag_line = vis.append("svg:path").attr("class", "drag_line");


} }
} }



function calculateTextWidth(str) { function calculateTextWidth(str) {
var sp = document.createElement("span"); var sp = document.createElement("span");
sp.className = "node_label"; sp.className = "node_label";
} }
} }


function arrangeAll() {
// TODO: arange all nodes optimized without collision
}

RED.keyboard.add(/* z */ 90,{ctrl:true},function(){RED.history.pop();}); RED.keyboard.add(/* z */ 90,{ctrl:true},function(){RED.history.pop();});
RED.keyboard.add(/* o */ 79,{ctrl:true},function(){arrangeAll();d3.event.preventDefault();});
RED.keyboard.add(/* a */ 65,{ctrl:true},function(){selectAll();d3.event.preventDefault();}); RED.keyboard.add(/* a */ 65,{ctrl:true},function(){selectAll();d3.event.preventDefault();});
RED.keyboard.add(/* = */ 187,{ctrl:true},function(){zoomIn();d3.event.preventDefault();}); RED.keyboard.add(/* = */ 187,{ctrl:true},function(){zoomIn();d3.event.preventDefault();});
RED.keyboard.add(/* - */ 189,{ctrl:true},function(){zoomOut();d3.event.preventDefault();}); RED.keyboard.add(/* - */ 189,{ctrl:true},function(){zoomOut();d3.event.preventDefault();});
var useStorage = false; var useStorage = false;


if ($("#node-input-arduino").prop('checked') === true) { if ($("#node-input-arduino").prop('checked') === true) {
nodesJSON = RED.nodes.cppToJSON(newNodesStr);
var nodesJSON = RED.nodes.cppToJSON(newNodesStr);
if (nodesJSON.count <= 0 || nodesJSON.skipped > 0) { if (nodesJSON.count <= 0 || nodesJSON.skipped > 0) {
var note = "No (or not all) nodes imported, because some IDs existed already!"; var note = "No (or not all) nodes imported, because some IDs existed already!";
RED.notify("<strong>Note</strong>: " + note, "warning"); RED.notify("<strong>Note</strong>: " + note, "warning");
createNewIds = false; createNewIds = false;


if (useStorage) { if (useStorage) {
RED.storage.clear();
localStorage.setItem("audio_library_guitool", newNodesStr);
RED.storage.load();
redraw();
return;
}
RED.storage.clear();
localStorage.setItem("audio_library_guitool", newNodesStr);
RED.storage.load();
redraw();
return;
}
} }


try { try {

Loading…
Cancel
Save