diff options
author | James <james@bromium.com> | 2016-08-07 14:36:42 +0100 |
---|---|---|
committer | James <james@bromium.com> | 2016-08-07 14:36:42 +0100 |
commit | 61664260220f4a2726a9dcbd0e0f98a65abb39bf (patch) | |
tree | 12a4a50afb1f2cbe0e2ec0c6dc504c67d8182188 /code/hpgl.c | |
parent | 666d7880fb56268b84e5dc282077ab1205be567f (diff) | |
download | laser_projector-61664260220f4a2726a9dcbd0e0f98a65abb39bf.tar.gz laser_projector-61664260220f4a2726a9dcbd0e0f98a65abb39bf.tar.bz2 laser_projector-61664260220f4a2726a9dcbd0e0f98a65abb39bf.zip |
Diffstat (limited to 'code/hpgl.c')
-rw-r--r-- | code/hpgl.c | 211 |
1 files changed, 181 insertions, 30 deletions
diff --git a/code/hpgl.c b/code/hpgl.c index f9436b4..83ae6d2 100644 --- a/code/hpgl.c +++ b/code/hpgl.c @@ -1,44 +1,209 @@ #include <stdio.h> #include <stdlib.h> #include <stdint.h> +#include <math.h> +#include <string.h> +#include <strings.h> +FILE *debug; + void -pos (int x, int y, int b) +emit (int *lr, int b) { - int16_t lr[2]; - int i; + int16_t ilr[2]; - lr[0] = 3 * y + 10000; - lr[1] = 15000 - x * 3; + if (!b) fprintf(debug,"\n"); + fprintf(debug,"%d %d\n",lr[0],lr[1]); - lr[0] &= ~1; - lr[1] &= ~1; + ilr[0] = lr[0]; + ilr[1] = lr[1]; + + ilr[0] &= ~1; + ilr[1] &= ~1; + +#if 1 if (!b) - lr[1] |= 1; + ilr[1] |= 1; +#endif + + fwrite (ilr, sizeof (ilr), 1, stdout); + + + + //fprintf(stderr," %d %d %d\n",lr[0],lr[1],b); + +} + +int +fast_steps (int *olr, int *lr) +{ + uint64_t d, c; + int ret = 0; + int i; + + + d = 0; + for (i = 0; i < 2; ++i) + { + c = ((int64_t) lr[i]) - ((int64_t) olr[i]); + d += c * c; + } + + while (d > 5000) + { + ret++; + d = d / 2; + } + + return ret; +} + +void +move_fast (int *olr, int *lr) +{ + int s = fast_steps (olr, lr); + while (s--) + emit (lr, 0); +} - fprintf (stderr, "%6d %6d %d\n", x, y, b); +void +move_linear (int *olr, int *lr ,int b) +{ + float d, c, s[2]; + int elr[2]; + float nlr[2]; + int ns; + int i; - for (i = 0; i < 15; ++i) + d = 0; + for (i = 0; i < 2; ++i) { - fwrite (lr, sizeof (lr), 1, stdout); + c = ((int64_t) lr[i]) - ((int64_t) olr[i]); + d += c * c; + } + + d = sqrt (d); + +// if (d<10) return; + + ns = (int) d/60 ; + + + if (!ns) ns=1; + + for (i = 0; i < 2; ++i) + { + s[i] = ((float) (lr[i] - olr[i])) / (float) ns; + nlr[i] = (float) olr[i]; + } + + while (ns--) + { + for (i = 0; i < 2; ++i) + { + nlr[i] += s[i]; + elr[i] = (int) (nlr[i] + .5); + } + + emit (elr, b); + } } + +void +place (int *lr, int b) +{ + static int olr[2], ob,q[2]; + + //fprintf(stderr,"%d %d %d %d\n",lr[0],lr[1],ob,b); + //fprintf(stderr,"@ %d %d %d (%d)\n",lr[0],lr[1],b,ob); + + if (ob && !b) + { + //maybe_emit olr with beam off here? + emit (olr, 1); + emit (olr, 0); + move_fast (olr, lr); +// move_linear (olr, lr,0); + } + + if (ob && b) { + + move_linear (olr, lr,1); +// emit(lr,b); + } + + if (!ob && b) + { + move_fast (olr, lr); +// move_linear (olr, lr,0); + emit(lr,1); + } + + if (b || ob) { + memcpy (olr, lr, sizeof (olr)); + ob = b; + } + +} + +void +pos (int x, int y, int b) +{ + int lr[2]; + + +// lr[0] = 20000 - 3 * y ; + lr[0] = 3 * y +10000; + lr[1] = x * 3; + + + place (lr, b); + +// emit(lr,b); +} + + +static int beam=0; +static int ox,oy; + +void pu(void) +{ +beam=0; +} + +void pd(void) +{ +beam=1; +pos(ox,oy,1); +} + +void pa(int x,int y) +{ +ox=x; +oy=y; +pos(ox,oy,beam); +} + + + int main (int argc, char *argv[]) { char c; - char buf[1024]; + char buf[10240]; int ic, len; int commas; - int beam = 0, oldbeam = 0; int x, y; + debug=fopen("debug.dat","w"); + buf[0] = 0; len = 0; commas = 0; @@ -52,7 +217,6 @@ main (int argc, char *argv[]) buf[len++] = c; buf[len] = 0; -// fprintf(stderr,"A>%s<A\n",buf); if (!strcmp (buf, "PA")) { @@ -65,7 +229,7 @@ main (int argc, char *argv[]) { len = 0; commas = 0; - beam = 0; + pu(); continue; } @@ -73,7 +237,7 @@ main (int argc, char *argv[]) { len = 0; commas = 0; - beam = 1; + pd(); continue; } @@ -92,22 +256,9 @@ main (int argc, char *argv[]) if (((commas) && ((c == ';') || (c == '\n'))) || (commas == 2)) { - if (sscanf (buf, "%d,%d", &x, &y) == 2) { - if (beam) - { - if (!oldbeam) - { - - pos (x, y, 0); - - } - pos (x, y, beam); - - - } - oldbeam = beam; + pa(x,y); } |