commit 6c8586171e5f913e3dd1d451d20c7f8a7465a40a
Author: glenda <glenda@9front.local>
Date: Wed, 25 Nov 2020 02:31:49 +0000
initial commit
Diffstat:
A | mkfile | | | 8 | ++++++++ |
A | scope.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;
+ }
+ }
+}