ReGIS interprets commands that allow you to simply and efficiently control a video monitor screen and draw pictures on the screen with lines, curves, and circles using a serial interface (USART). Also, ReGIS provides commands to include scalable text characters in pictures. The ReGIS graphics language is designed for conciseness and easy transport of code from the host to the ReGIS device. The language consists of commands that are modified by options.
Read here for a full description on how to enable ReGIS for Windows 10 and Linux desktop machines.
There is a Programmer Reference Manual for VT330/VT340 Terminals describing how to use ReGIS, as well as the VT125 Primer document provided here.
Homogeneous coordinates are ubiquitous in computer graphics because they allow common vector operations such as translation, rotation, scaling and perspective projection to be represented as a matrix by which the vector is multiplied. By the chain rule, any sequence of such operations can be multiplied out into a single matrix, allowing simple and efficient processing.
Basic homogeneous coordinate vector and matrix operations are included in this library.
XTerm is the only known software solution supporting ReGIS commands (to be improved I'm sure). But it doesn't support ReGIS in the default build. You'll need to enable ReGIS yourself.
$ sudo apt install -y libxaw7-dev libncurses-dev libxft-dev
$ wget https://invisible-island.net/datafiles/release/xterm.tar.gz
$ tar xf xterm.tar.gz
$ cd xterm-392
$ ./configure --enable-regis-graphics
$ make
$ sudo make install
As XTerm has no serial interface itself, so you'll need to use one. A suggestion is to use picocom.
It is also useful for working with Arduino, and other embedded devices, generally. First test that your installation is working as per below.
$ sudo apt install -y picocom
$ picocom -b 115200 -f h /dev/ttyUSB0
And, finally XTerm using VT340 emulation together with picocom.
xterm +u8 -geometry 132x50 -ti 340 -tn 340 -e picocom -b 115200 -f h /dev/ttyUSB0
Another alternative is using XTerm VT125 emulation.
xterm +u8 -geometry 132x50 -ti 125 -tn 125 -e picocom -b 115200 -f h /dev/ttyUSB0
WSL1 supports connection of Serial Devices via USB. WSL2 has some issues with this, particuarly with Windows 10.
But, the supported picocom distribution for Ubuntu 22.04 Version 3.1 (for example), utilises some modern terminal capabilities that WSL does not support. So to avoid the use of these terminal system calls we have to use an older release of picocom. For example the Version 2.2.2 provided with Ubuntu 18.04 LTS. Be sure to use this older version of picocom if you are using WSL to run XTerm and picocom.
The tested method of accessing XTerm on WSL is MobaXTerm. This enhanced terminal for Windows includes an integrated Xserver. If MobaXTerm is used to access WSL XTerm, its window will automatically connect to the Windows desktop.
Read here for a full description on how to enable ReGIS for Windows 10 and Linux desktop machines.
There is a demonstration program, which should produce the below result (subject to improvement).
This is image generated from the below ReGIS code.
Expected output (where ^
is the ESC
character).
^P1pS(E)W(I(M))P[600,200]V[][-200,+200]V[][400,100]W(I(G))P[700,100]V(B)[+050,][,+050][-050,](E)V(W(S1))(B)[-100,][,-050][+100,](E)V(W(S1,E))(B)[-050,][,-025][+050,](E)W(I(C))P[200,100]C(A-180)[+100]C(A+180)[+050]W(I(B))P[200,300]C(W(S1))[+100]C(W(S1,E))[+050]W(I(W))T(S02)"hello world"^\
To try this out virtually, you can cross two local pseudo TTYs, connect to one
via picocom
or tio
in xterm
, and then send commands via the other PTY.
Use the helper script [ptys.sh
] for convenience.
You can also hook up two serial devices to your laptop and cross them. An SLogic combo8 will do. Connect its UART1 TX to its UART0 RX. So UART1 will be the sender and UART0 the receiver.
For convenience, use the script xterm.sh
to launch local xterm
and picocom
builds, run and regis.sh
to send the demo commands.
Both scripts take the TTY to use as an argument. Adjust them as needed.
Vector functions
/* Produce a unit vector */
void unit_v(vector_t * vect);
/* Scale a vector by m, but don't touch w dimension */
void scale_v(vector_t * vect, float scale);
/* Produce a dot product between vectors */
float dot_v(vector_t * vect1, vector_t * vect2);
/* Vector Matrix Multiplication */
void mult_v(vector_t * vect,matrix_t * multiplier);
Matrix 3D (Homogeneous Coordinate) functions
/* Produce an identity matrix */
void identity_m(matrix_t * matrix);
/* Produce a transformation (translation) */
void translate_m(matrix_t * matrix, float x, float y, float z);
/* Produce a transformation (scale) */
void scale_m(matrix_t * matrix, float x, float y, float z);
/* Produce a transformation (shear) */
void shear_m(matrix_t * matrix, float x, float y, float z);
/* Rotation in x dimension */
void rotx_m(matrix_t * matrix, float angle);
/* Rotation in y dimension */
void roty_m(matrix_t * matrix, float angle);
/* Rotation in z dimension */
void rotz_m(matrix_t * matrix, float angle);
/* Set up a projection matrix - OpenGL */
void projection_opengl_m(matrix_t * matrix, float fov, float aspect_ratio, float near, float far);
/* Set up a projection matrix - W3Woody */
void projection_w3woody_m(matrix_t * matrix, float fov, float aspect_ratio, float near, float far);
/* Matrix Multiplication */
void mult_m(matrix_t * multiplicand, matrix_t * multiplier);
For describing how to get XTerm working with ReGIS, thanks Rob Gowin.
For advising on how to get ReGIS fonts in XTerm working, thanks Thomas Dickey.
This library is licensed under The MIT License. Check the LICENSE file for more information.
Contributing to this software is warmly welcomed. You can do this by forking, committing modifications and then pull requests.