{"modules":{"0.12585972203177254":{"definition":"//\n// Urumbu module\n//\n// Neil Gershenfeld \n// (c) Massachusetts Institute of Technology 2016\n// Modified by Fran Sanchez and Jani Ylioja 14 Jan 2023\n// Modified by Jani Ylioja 23 March 2023\n// \n// This work may be reproduced, modified, distributed, performed, and \n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is \n// provided as is; no warranty is provided, and users accept all \n// liability.\n// this module receives a step array 114 for r and 102 for f\n//\n// closure\n//\n(function() {\n //\n // module globals\n //\n var mod = {}\n //\n // name\n //\n var name = 'Urumbu'\n //\n // initialization\n //\n var init = function() {\n mod.baud.value = '9600'\n mod.flow_rtscts.checked = true\n\n }\n //\n // inputs\n //\n var inputs = {\n step: {type: 'character',\n event: function(evt) {\n ascii_input(evt.detail)\n }\n },\n }\n //\n // outputs\n //\n var outputs = {\n receive: {\n type: 'object',\n event: function(data) {\n mods.output(mod, 'receive', data)\n }\n }\n }\n //\n // interface\n //\n var interface = function(div) {\n mod.div = div\n div.appendChild(document.createTextNode('WebSerial:'))\n div.appendChild(document.createElement('br'))\n \n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('Get Device'))\n btn.addEventListener('click', function() {\n webserial_getdevices()\n })\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('Forget'))\n btn.addEventListener('click', function() {\n webserial_forget()\n })\n div.appendChild(btn)\n\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('r'))\n btn.addEventListener('click', function() {\n const bytes = new Uint8Array([114]);\n console.log(port, bytes);\n data_send(bytes);\n\n })\n div.appendChild(btn)\n\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('f'))\n btn.addEventListener('click', function() {\n const bytes = new Uint8Array([102]);\n console.log(port, bytes);\n data_send(bytes);\n\n })\n div.appendChild(btn)\n\n div.appendChild(document.createElement('hr'))\n\n //\n // baud rate\n //\n div.appendChild(document.createTextNode('baud rate: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 7\n div.appendChild(input)\n mod.baud = input\n div.appendChild(document.createTextNode(' (bps)'))\n div.appendChild(document.createElement('br'))\n\n //\n // flow control\n //\n div.appendChild(document.createTextNode('flow control:'))\n div.appendChild(document.createElement('br'))\n var input = document.createElement('input')\n input.type = 'radio'\n input.name = mod.div.id + 'flow'\n input.id = mod.div.id + 'flow_none'\n div.appendChild(input)\n mod.flow_none = input\n div.appendChild(document.createTextNode('none\\u00a0\\u00a0\\u00a0'))\n div.appendChild(document.createElement('br'))\n var input = document.createElement('input')\n input.type = 'radio'\n input.name = mod.div.id + 'flow'\n input.id = mod.div.id + 'flow_rtscts'\n div.appendChild(input)\n mod.flow_rtscts = input\n mod.flow_rtscts.checked = true\n div.appendChild(document.createTextNode('RTSCTS\\u00a0'))\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createElement('br'))\n\n\n }\n //\n // local functions\n //\n\n function ascii_input(arg) {\n var value = arg.charCodeAt(0)\n const bytes = new Uint8Array([value]);\n data_send(bytes); \n }\n\n async function readPort(port) {\n\n console.log(\"trying to read port\");\n try {\n console.log(\"port is readable\", port.readable);\n\n while (port.readable) {\n console.log(\"reading port\", port.readable);\n const reader = port.readable.getReader();\n\n while (true) {\n const { value, done } = await reader.read();\n if (value) {\n const data = new Uint8Array(value.length);\n for (let i = 0; i < value.length; i++) {\n data[i] = value[i];\n }\n \n const str = new TextDecoder().decode(data); \n\n // do something with data here\n console.log(str);\n }\n\n if (done) {\n reader.releaseLock();\n break;\n }\n }\n }\n\n console.log(\"port not readable\");\n\n } catch (err) {\n console.error(err);\n } finally {\n await port.close();\n console.log(\"port closed\");\n }\n }\n\n\n\n // disconnect webserial device\n async function webserial_forget() {\n await port.close();\n console.log(\"Port closed\");\n }\n\n // connect webserial device\n let port;\n async function webserial_getdevices() {\n port = await navigator.serial.requestPort();\n await port.open({ baudRate: parseInt(mod.baud.value) });\n console.log(\"Port opened\");\n\n readPort(port);\n\n }\n\n \n\n async function data_send(msg) {\n console.log(\"sending message\", msg);\n const writer = port.writable.getWriter();\n await writer.write(msg);\n writer.releaseLock();\n }\n //\n // return values\n //\n return ({\n mod: mod,\n name: name,\n init: init,\n inputs: inputs,\n outputs: outputs,\n interface: interface\n })\n}())\n","top":"102","left":"834","filename":"modules/webserial/Urumbu.js","inputs":{},"outputs":{}},"0.12675193528261586":{"definition":"//\n// Urumbu module\n//\n// Neil Gershenfeld \n// (c) Massachusetts Institute of Technology 2016\n// Modified by Fran Sanchez and Jani Ylioja 14 Jan 2023\n// Modified by Jani Ylioja 23 March 2023\n// \n// This work may be reproduced, modified, distributed, performed, and \n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is \n// provided as is; no warranty is provided, and users accept all \n// liability.\n// this module receives a step array 114 for r and 102 for f\n//\n// closure\n//\n(function() {\n //\n // module globals\n //\n var mod = {}\n //\n // name\n //\n var name = 'Urumbu'\n //\n // initialization\n //\n var init = function() {\n mod.baud.value = '9600'\n mod.flow_rtscts.checked = true\n\n }\n //\n // inputs\n //\n var inputs = {\n step: {type: 'character',\n event: function(evt) {\n ascii_input(evt.detail)\n }\n },\n }\n //\n // outputs\n //\n var outputs = {\n receive: {\n type: 'object',\n event: function(data) {\n mods.output(mod, 'receive', data)\n }\n }\n }\n //\n // interface\n //\n var interface = function(div) {\n mod.div = div\n div.appendChild(document.createTextNode('WebSerial:'))\n div.appendChild(document.createElement('br'))\n \n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('Get Device'))\n btn.addEventListener('click', function() {\n webserial_getdevices()\n })\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('Forget'))\n btn.addEventListener('click', function() {\n webserial_forget()\n })\n div.appendChild(btn)\n\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('r'))\n btn.addEventListener('click', function() {\n const bytes = new Uint8Array([114]);\n console.log(port, bytes);\n data_send(bytes);\n\n })\n div.appendChild(btn)\n\n div.appendChild(btn)\n var btn = document.createElement('button')\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('f'))\n btn.addEventListener('click', function() {\n const bytes = new Uint8Array([102]);\n console.log(port, bytes);\n data_send(bytes);\n\n })\n div.appendChild(btn)\n\n div.appendChild(document.createElement('hr'))\n\n //\n // baud rate\n //\n div.appendChild(document.createTextNode('baud rate: '))\n var input = document.createElement('input')\n input.type = 'text'\n input.size = 7\n div.appendChild(input)\n mod.baud = input\n div.appendChild(document.createTextNode(' (bps)'))\n div.appendChild(document.createElement('br'))\n\n //\n // flow control\n //\n div.appendChild(document.createTextNode('flow control:'))\n div.appendChild(document.createElement('br'))\n var input = document.createElement('input')\n input.type = 'radio'\n input.name = mod.div.id + 'flow'\n input.id = mod.div.id + 'flow_none'\n div.appendChild(input)\n mod.flow_none = input\n div.appendChild(document.createTextNode('none\\u00a0\\u00a0\\u00a0'))\n div.appendChild(document.createElement('br'))\n var input = document.createElement('input')\n input.type = 'radio'\n input.name = mod.div.id + 'flow'\n input.id = mod.div.id + 'flow_rtscts'\n div.appendChild(input)\n mod.flow_rtscts = input\n mod.flow_rtscts.checked = true\n div.appendChild(document.createTextNode('RTSCTS\\u00a0'))\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createElement('br'))\n\n\n }\n //\n // local functions\n //\n\n function ascii_input(arg) {\n var value = arg.charCodeAt(0)\n const bytes = new Uint8Array([value]);\n data_send(bytes); \n }\n\n async function readPort(port) {\n\n console.log(\"trying to read port\");\n try {\n console.log(\"port is readable\", port.readable);\n\n while (port.readable) {\n console.log(\"reading port\", port.readable);\n const reader = port.readable.getReader();\n\n while (true) {\n const { value, done } = await reader.read();\n if (value) {\n const data = new Uint8Array(value.length);\n for (let i = 0; i < value.length; i++) {\n data[i] = value[i];\n }\n \n const str = new TextDecoder().decode(data); \n\n // do something with data here\n console.log(str);\n }\n\n if (done) {\n reader.releaseLock();\n break;\n }\n }\n }\n\n console.log(\"port not readable\");\n\n } catch (err) {\n console.error(err);\n } finally {\n await port.close();\n console.log(\"port closed\");\n }\n }\n\n\n\n // disconnect webserial device\n async function webserial_forget() {\n await port.close();\n console.log(\"Port closed\");\n }\n\n // connect webserial device\n let port;\n async function webserial_getdevices() {\n port = await navigator.serial.requestPort();\n await port.open({ baudRate: parseInt(mod.baud.value) });\n console.log(\"Port opened\");\n\n readPort(port);\n\n }\n\n \n\n async function data_send(msg) {\n console.log(\"sending message\", msg);\n const writer = port.writable.getWriter();\n await writer.write(msg);\n writer.releaseLock();\n }\n //\n // return values\n //\n return ({\n mod: mod,\n name: name,\n init: init,\n inputs: inputs,\n outputs: outputs,\n interface: interface\n })\n}())\n","top":"428","left":"827","filename":"modules/webserial/Urumbu.js","inputs":{},"outputs":{}},"0.530868999180091":{"definition":"//\n// character input output\n//\n// Neil Gershenfeld \n// (c) Massachusetts Institute of Technology 2016\n// \n// This work may be reproduced, modified, distributed, performed, and \n// displayed for any purpose, but must acknowledge the mods\n// project. Copyright is retained and must be preserved. The work is \n// provided as is; no warranty is provided, and users accept all \n// liability.\n//\n// closure\n//\n(function() {\n //\n // module globals\n //\n var mod = {}\n //\n // name\n //\n var name = 'character in out'\n //\n // initialization\n //\n var init = function() {}\n //\n // inputs\n //\n var inputs = { in: {\n type: 'character',\n event: function(evt) {\n mod.in.value += evt.detail\n }\n }\n }\n //\n // outputs\n //\n var outputs = {\n out: {\n type: 'character',\n event: function(chr) {\n mods.output(mod, 'out', chr)\n }\n }\n }\n //\n // interface\n //\n var interface = function(div) {\n mod.div = div\n div.appendChild(document.createTextNode('in:'))\n div.appendChild(document.createElement('br'))\n var text = document.createElement('textarea')\n text.setAttribute('rows', mods.ui.rows)\n text.setAttribute('cols', mods.ui.cols)\n div.appendChild(text)\n mod.in = text\n div.appendChild(document.createElement('br'))\n div.appendChild(document.createTextNode('out:'))\n div.appendChild(document.createElement('br'))\n var text = document.createElement('textarea')\n text.setAttribute('rows', mods.ui.rows)\n text.setAttribute('cols', mods.ui.cols)\n text.addEventListener('input', function(evt) {\n outputs.out.event(mod.out.value.slice(-1))\n })\n div.appendChild(text)\n mod.out = text\n div.appendChild(document.createElement('br'))\n var btn = document.createElement('button')\n btn.style.padding = mods.ui.padding\n btn.style.margin = 1\n btn.appendChild(document.createTextNode('clear'))\n btn.addEventListener('click', function() {\n mod.in.value = \"\"\n mod.out.value = \"\"\n })\n div.appendChild(btn)\n }\n //\n // local functions\n //\n function format_string() {\n mod.value.value = eval(mod.expression.value)\n outputs.output.event()\n }\n //\n // return values\n //\n return ({\n mod: mod,\n name: name,\n init: init,\n inputs: inputs,\n outputs: outputs,\n interface: interface\n })\n}())\n","top":"208","left":"187","filename":"modules/character/in%20out.js","inputs":{},"outputs":{}}},"links":["{\"source\":\"{\\\"id\\\":\\\"0.530868999180091\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"out\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.12585972203177254\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"step\\\"}\"}","{\"source\":\"{\\\"id\\\":\\\"0.530868999180091\\\",\\\"type\\\":\\\"outputs\\\",\\\"name\\\":\\\"out\\\"}\",\"dest\":\"{\\\"id\\\":\\\"0.12675193528261586\\\",\\\"type\\\":\\\"inputs\\\",\\\"name\\\":\\\"step\\\"}\"}"]}