RNDMC
Reconfigurable Numeric Dataflow Machine Controller
aka project 'consistent-sandbox'
This is a piece of software that is designed to help you assemble high level controllers from dataflow software elements. It serves a graphical programming interface, and is meant to live with dataflow hardware elements from this project 'automatakit'.
It's in the early stages, so bear with us. Everything is going to be great.
Usage
Installing Node.js, WebSocket and SerialPort
To Run DMC, you'll need to install node.js, and then the packages serialport and ws (websocket).
Install Node.js
Node.js is a runtime environment for javascript, so you can write and run js locally. Download and install it here.
To check that node is installed, you can use
node -v
In Windows check that in Environment Variables, System Variables, Path there is a path for C:\Users\yourusername\npm folder. If the folder does not exist, create it and set the path.
Install Serialport
Node comes with a package controller called 'npm' - node package manager. You can use this to install dependencies for node programs.
Serialport is a package for node that allows it to interact with a hardware serial port.
Navigate to the directory where you'll be running from (atkapi). Do
npm install serialport
Install WS (WebSocket)
WebSockets are very simple web connections. We use them to chat between the 'server' / heap (node) and the 'view' (your browser).
To install ws, do
npm install ws
Running DMC
To run the program, we launch the main.js file with node, from the command line. One of the things this does is run a tiny HTTP server that we can use to access the UI.
cd to the rndmc folder and run:
node main
It's handy to keep a terminal window open beside a browser when running the software - it's not perfect yet - I do this:
This way I can watch for errors, and restart it when it crashes. Hopefully not a lot of this will happen.
Open a Browser
The program is now running a tiny HTTP server, where it will deliver an interface. It's set to show up at your local address on port 8080.
In a browser open localhost:8080 you will see the mods and this msg in the terminal SEND PROGRAMS TO UI
Using the Browser Interface
-
those GIFs tho
-
steppers gotta step
-
load a program
-
drag around
-
zoom in and out
-
add a module
-
hook events up
-
rm events
-
rm modules
-
change settings
Writing New Modules
- whenever a menu is requested, the system searches
modules/ *
for anything. include your .js of a new module there - anything goes: you can run whatever code will run in node.js ... just follow these simple rules
- TODO: put example here, with comments
Writing Hardware Modules
- TODO: same, also including links / explanation to atk
Development Notes
For MW
-
title is still 'xperiment'
-
do hw if you can, and gifs / demo at the same time?
-
some example program
-
example modules
-
add reset button to hardware
-
add router for reset, test
Documentation
- GIFS
Questionable Moves
- module deletion seems unclean
- input / output objects should be able to unhook themselves:
- keep references of what-is-attached ?
WRT Representations
OK, should write this out properly at some point.
Module have Inputs Outputs State (initial states are settings)
Hardware Modules have routes connected to links
Also Names, IDs Paths-to-source
To assemble a representation of these, we want to have a kind of 'netlist' that, for convenience, we'll treat like a JSON object. We want heirarchy, so consider the representation having 'top-level' outputs / inputs / state as well ?
Programming Notes
15 Minute Tasks
- @ views.js, uiRequestModuleMenu and uiRequestProgramMenu don't properly build trees from folder structure. similarly, reciprical fn's in client.js do the same
- @ these load / save functions could also reach into the modules' source to retrieve their proper names, as spec'd in description ...
- 's' for save program uses hack-asf DOM alert to ask for path
Desires
- heirarchy zoom
- architectural clarity betwixt UI and Heap
- states / uis / etc - one off / one-at-a-time for updates
- i.e. all f'n update calls are to single module-global state update
- !
- states / getters / setters not applicable to sub-elements in an object within state
- i.e. array access
- consistent dereferencing, type checking implementation?
UI Desires
- modules have visual ways to throw errors - i.e. flashing red, popping up...
- off-screen divs get pointers-to so that we don't get lost
- 'h' or something to zoom-to-extents
- better module menu
- hover for alt descriptions
Planner Bugs
- trapezoid linking doesn't account for speed changes properly, i.e. doesn't ramp down into next move if next move's cruise speed is less than our exit speed
- should have some stronger ideas about flow control, allowable segment size (based on time)
Want
- log() for logs-from-module tagged
Demo Desires
- want to show immediacy of hardware: software representation
- want to show physical reconfigurability and software reconfigurability
- i.e. mill, add rotary tool, pull normal vector from planner moves and route to r motor
- want to have UI elements
- button, terminal,
- live motor torque display, vector from accelerometer
Network Desires
- c improvements / dma etc, would be very cool
- flow control probably desired ... what can we model with uart and implement with fpga?
- proper speed tests
- DMA not possible / not enough channels for router implementation / not portable enough ...
- lights displaying activity
Bugs
- cannot connect input to output w/o backwards bezier
- when source has changed, opening programs that have references to that source should be carefully done ...
The RPI
One of the desires here is to run programs headlessly on small embedded computers like the Raspberry Pi. The router has pogo-pins for this, so that when it's mounted beneath a Raspberry Pi the USB and Power lines are automatically hooked up - the 2A Buck Converter on the Router can also be used to power the RPI, so it can all run on one DC power bus. Nice!
However:
need to figure out how to get the RPI serialport to talk