scope

signal visualizer for plan9
git clone git://nsmpr.xyz/scope.git
Log | Files | Refs

commit 6c8586171e5f913e3dd1d451d20c7f8a7465a40a
Author: glenda <glenda@9front.local>
Date:   Wed, 25 Nov 2020 02:31:49 +0000

initial commit

Diffstat:
Amkfile | 8++++++++
Ascope.c | 234+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 242 insertions(+), 0 deletions(-)

diff --git a/mkfile b/mkfile @@ -0,0 +1,7 @@ +</$objtype/mkfile + +TARG=scope +OFILES=scope.$O +BIN=/$objtype/bin + +</sys/src/cmd/mkone +\ No newline at end of file diff --git a/scope.c b/scope.c @@ -0,0 +1,234 @@ +#include <u.h> +#include <libc.h> +#include <thread.h> +#include <draw.h> +#include <mouse.h> +#include <cursor.h> +// #include <keyboard.h> + +#define LMAX 1024 +#define RBUF 1024 +#define DFPS 60 + +enum { + C_BG = 0xffffffff, + C_GG = 0x000000ff, + C_FG = 0x000000ff, +}; + +Point P[LMAX]; + +typedef struct Readctl Readctl; + +struct Readctl { + Channel *c; +}; + +Image *Im, *Ibg, *Igg, *Ifg; +Rectangle R; +int rh; + +void (*dlines)(void); + +void +usage(void) +{ + fprint(2, "usage: %s [-lrs2]\n", argv0); + threadexitsall("usage"); +} + +void +dclear(void) +{ + draw(screen, screen->r, Ibg, 0, ZP); + //draw(screen, R, Ibg, 0, ZP); +} + +void +dfade(void) +{ + draw(screen, R, Ibg, Im, ZP); +} + +void +dXY(void) +{ + int i; + Point p; + for (i = 0; i < LMAX; i++){ + p = addpt(P[i], addpt(R.min, Pt(rh/2, rh/2))); + draw(screen, Rpt(p, addpt(p, Pt(1,1))), Ifg, 0, ZP); + } + //poly(screen, P, LMAX, 0, 0, 0, Ifg, ZP); +} + +void +dboth(void) +{ + int i; + Point p0, p1; + for (i = 0; i < LMAX; i++){ + p0.x = R.min.x + i * rh / LMAX; + p0.y = R.min.y + rh/4 + P[i].x/2; + p1.x = p0.x; + p1.y = R.min.y + (3 * rh)/4 + P[i].y/2; + draw(screen, Rpt(p0, addpt(p0, Pt(1,1))), Ifg, 0, ZP); + draw(screen, Rpt(p1, addpt(p1, Pt(1,1))), Ifg, 0, ZP); + } +} + +void +dmono(int c) +{ + int i; + Point p; + for (i = 0; i < LMAX; i++){ + p.x = R.min.x + i * rh / LMAX; + p.y = R.min.y + rh/2; + p.y += c ? P[i].x : P[i].y; + draw(screen, Rpt(p, addpt(p, Pt(1,1))), Ifg, 0, ZP); + } +} + +void +dleft(void) +{ + dmono(0); +} + +void +dright(void) +{ + dmono(1); +} + + + +void +threadupdate(void *v) +{ + vlong ot, ct; + Channel *c; + c = v; + threadsetname("threadupdate"); + ot = 0; + for (;;) { + ct = nsec(); + if ((ct - ot) > (1000000000/DFPS)) { + send(c, 0); + ot = nsec(); + } + yield(); + }; +} + +void +procread(void *v) +{ + s16int buf[RBUF]; + s16int *bp; + long n; + Readctl *rctl; + rctl = v; + threadsetname("procread"); + while((n = read(0, buf, sizeof(s16int) * RBUF)) > 0) { + for (bp = buf; bp < buf + (n / sizeof(s16int)); bp+=2) { + send(rctl->c, bp); + } + } + chanclose(rctl->c); +} + +Rectangle +getdrawrect(void) +{ + Rectangle R; + R.max = Pt(Dx(screen->r), Dy(screen->r)); + R.min = Pt(0, 0); + R.max.x = (R.max.x < R.max.y) ? R.max.x : R.max.y; + rh = R.max.y = R.max.x; + R = rectaddpt(R, addpt(screen->r.min, + Pt((Dx(screen->r)-rh)/2,(Dy(screen->r)-rh)/2))); + return R; +} + +void +threadmain(int argc, char **argv) +{ + Mousectl *mctl; + Mouse mv; + int rv[2]; + Channel *supc; + int sv; + Readctl *rctl; + s16int prv[2]; + + dlines = dXY; + + ARGBEGIN { + case 'l': + dlines = dleft; + break; + case 'r': + dlines = dright; + break; + case 's': + dlines = dboth; + break; + case '2': + dlines = dXY; + break; + default: + usage(); + } ARGEND + if (argc > 0) usage(); + if (initdraw(nil, nil, "scope") < 0) sysfatal("initdraw failed: %r"); + if ((mctl = initmouse(0, 0)) == nil) sysfatal("initmouse failed: %r"); + + supc = chancreate(sizeof(int), 0); + + Ibg = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_BG); + Igg = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_GG); + Ifg = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_FG); + Im = allocimage(display, Rect(0,0,1,1), RGBA32, 1, 0xffffff1f); + rctl = malloc(sizeof(Readctl)); + rctl->c = chancreate(sizeof(s16int) * 2, LMAX); + + threadcreate(threadupdate, supc, 8 * 1024); + proccreate(procread, rctl, 64*1024); + + R = getdrawrect(); + dclear(); + + Alt alts[5] = { + //{0, 0, CHANNOP}, + //{0, 0, CHANNOP}, + {mctl->c, &mv, CHANRCV}, + {mctl->resizec, rv, CHANRCV}, + {supc, &sv, CHANRCV}, + {rctl->c, prv, CHANRCV}, + {0, 0, CHANEND}, + }; + for(;;){ + switch(alt(alts)){ + case 0: /* mouse */ + break; + case 1: /* resize */ + if(getwindow(display, Refnone) < 0) + sysfatal("resize failed: %r"); + R = getdrawrect(); + dclear(); + case 2: /* update screen */ + dclear(); + dlines(); + flushimage(display, 1); + break; + case 3: /* read input */ + memmove(P+1, P, sizeof(Point) * (LMAX - 1)); + P[0] = //addpt( + //addpt(Pt(rh/2, rh/2), R.min), + (Pt(prv[0] * rh / 0xffff, prv[1] * rh / 0xffff)); + break; + } + } +}