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 | |
parent | 666d7880fb56268b84e5dc282077ab1205be567f (diff) | |
download | laser_projector-master.tar.gz laser_projector-master.tar.bz2 laser_projector-master.zip |
-rw-r--r-- | code/Makefile | 31 | ||||
-rw-r--r-- | code/hpgl.c | 211 |
2 files changed, 204 insertions, 38 deletions
diff --git a/code/Makefile b/code/Makefile index e5170e7..5c9f55a 100644 --- a/code/Makefile +++ b/code/Makefile @@ -1,3 +1,5 @@ +default: test.wav + scp test.wav laser64: test.wav: test.s16 sox -r 44100 -c 2 -t s16 $< -r 44100 -t wav $@ @@ -26,7 +28,7 @@ test.s16:part.s16 cat $< $< $< $< $< $< $< $< $< $< $< $< $< $< $< $< $< $< $< $< >> $@ part.s16: in.hpgl hpgl - hpgl < in.hpgl > part.s16 || /bin/rm -f $@ + ./hpgl < in.hpgl > part.s16 || /bin/rm -f $@ #part.s16:square # square > $@ || /bin/rm -f $@ @@ -35,7 +37,7 @@ part.s16: in.hpgl hpgl # cc -o lp lp.c hpgl: hpgl.c - cc -o hpgl hpgl.c + cc -o hpgl hpgl.c -lm #in.svg: @@ -46,17 +48,30 @@ hpgl: hpgl.c -google.dat:google.csv - awk -F, '(NR % 10 == 0 ) {print $2}' < $< | tac > $@ || /bin/rm -f $@ +#google.dat:google.csv +# awk -F, '(NR % 10 == 0 ) {print $$7}' < $< | tail -n +2 | tac > $@ || /bin/rm -f $@ in.hpgl: google.dat - echo "set term hpgl ; set output 'in.hpgl'; unset xtics; unset ytics; plot 'google.dat' with lines notitle " | gnuplot || /bin/rm -f $@ +# echo "set term hpgl ; set output 'in.hpgl'; unset xtics; unset ytics; plot 'google.dat' with lines notitle " | gnuplot || /bin/rm -f $@ + echo "set term hpgl ; set output 'in.hpgl'; unset xtics; unset ytics; unset border; plot 'google.dat' with lines notitle " | gnuplot || /bin/rm -f $@ +# echo "set term hpgl ; set output 'in.hpgl'; plot 'google.dat' with lines notitle " | gnuplot || /bin/rm -f $@ +# echo "set term hpgl ; set output 'in.hpgl'; set grid ytics xtics linestyle 1; plot 'google.dat' with lines notitle " | gnuplot || /bin/rm -f $@ +#set grid ytics xtics linestyle 1 + + +#in.hpgl: drawing.hpgl +# cp $< $@ #in.hpgl: -# echo "set term hpgl ; set output 'in.hpgl'; plot 2 with lines notitle " | gnuplot +# echo "set term hpgl ; set output 'in.hpgl'; set grid ytics; plot 2 with lines notitle " | gnuplot + +in.hpgl:in.ps + pstoedit -f plot-hpgl -penplotter in.ps in.hpgl + +in.ps:in.svg + inkscape --export-ps=$@ $< -#in.hpgl:in.ps -# pstoedit -f plot-hpgl -penplotter in.ps in.hpgl +#pstoedit -f plot-hpgl -penplotter in.svg in.hpgl play: test.wav aplay test.wav 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); } |