Hiromasa Oku
/
linearMirrorMotion1017
this version 10/17
Fork of linearMirrorMotion by
Diff: main.cpp
- Revision:
- 4:e00e709d7173
- Parent:
- 2:0548c7bf9fba
- Child:
- 5:e02cd57242c7
diff -r 3fe7d6b5cf24 -r e00e709d7173 main.cpp --- a/main.cpp Thu Oct 04 05:16:25 2012 +0000 +++ b/main.cpp Wed Oct 24 07:17:26 2012 +0000 @@ -1,75 +1,203 @@ #include "mbed.h" #include "laserProjectorHardware.h" - -DigitalOut myled(LED1); +#include <vector> +/*yarukoto +~vx,vy,theta,scale : parameta de kaeru. +~letters.txt tsukuru. +~realistic na kanji ni suru omega,dist toka. +*/ void processSerial(); +Timer timer; +LocalFileSystem local("local"); -unsigned int X, Y; // position of the mirror (note: in fact it is an ANGLE) +unsigned int X, Y; +int startX = CENTER_AD_MIRROR_X; +int startY = CENTER_AD_MIRROR_Y; + +float vx = 0, vy=0, omegaX=0, omegaY=0, dist=1000; // these data may be from saccade mirror... +float theta=0,scale=2000; +unsigned int dt=30; + bool newPositionReady=false; - unsigned int counter=0; -int main() { +struct point{ + int x,y; +}; + +struct letter{ + int pointnum; + vector<struct point> letpoints; +}; + +//int points[200][2] = {}; +vector<struct letter> points; // drawing points + +vector<int> buf; //buffer vector + +void recomputeBuffer() +{ + float sint = sin(theta); + float cost = cos(theta); + + startX = CENTER_AD_MIRROR_X; + startY = CENTER_AD_MIRROR_Y; + + buf.clear(); +//conversion points to buf before writing; + for(int j=0; j<3; j++) { + int x = scale/(dist+tan(omegaX/360*2*3.1415)*points[0].letpoints[j].x)*points[0].letpoints[j].x - vx*dt/1000*j; + int y = scale/(dist+tan(omegaY/360*2*3.1415)*points[0].letpoints[j].y)*points[0].letpoints[j].y - vy*dt/1000*j; + buf.push_back(startX+cost*x + sint*y); + buf.push_back(startY-sint*x + cost*y); + } +} + + +int main() +{ + FILE *fp = fopen("/local/test.txt", "r"); + if(!fp) {IO.setGreenPower(1); exit(1);} + int letternum; + fscanf(fp, "%d", &letternum); + for(int i=0;i<letternum;i++){ + struct letter bufl; + fscanf(fp, "%d", &bufl.pointnum); + for(int j=0;j<bufl.pointnum;j++){ + struct point bufp; + fscanf(fp, "%d", &bufp.x); + fscanf(fp, "%d", &bufp.y); + bufl.letpoints.push_back(bufp); + } + } + + + + /*for(int i=0 ; i<200 ; i++) { + points[i][0] = 200*cos(1.0*i/200*2*3.1415); + points[i][1] = 200*sin(1.0*i/200*2*3.1415); + }*/ + recomputeBuffer(); // SETUP: -------------------------------------------------------------------------------------------- IO.init(); // note: serial speed can be changed by checking in the hardwareIO.cpp initialization - - // Set displaying laser powers: + + // Set displaying laser powers: IO.setRedPower(0); IO.setGreenPower(0);//turn on the green (displaying) laser wait_ms(100); + X = CENTER_AD_MIRROR_X; Y = CENTER_AD_MIRROR_Y; - IO.writeOutY(Y); - + IO.writeOutXY(X,Y); + // MAIN LOOP: -------------------------------------------------------------------------------------------- while(1) { - processSerial(); - if (newPositionReady) { - IO.writeOutY(Y); - newPositionReady=false; + if (pc.readable()>0) processSerial(); + + for(int j=0; j<buf.size(); j++) { + timer.start(); + IO.writeOutXY(buf[j*2],buf[j*2+1]); + wait_us(dt); + IO.setRGBPower(0); //on + timer.stop(); + //dt=timer.read(); } - - Y=int(0.5*4095.0*(1.0+cos(1.0*counter/100000))); - IO.writeOutY(Y); - counter++; - + + IO.setRGBPower(1); //off + wait(0.02); + } } + // -------------------------------------------------------------------------------------------- -// String to store ALPHANUMERIC DATA (i.e., integers, floating point numbers, unsigned ints, etc represented as DEC) sent wirelessly: +// String to store ALPHANUMERIC DATA (i.e., integers, floating point numbers, unsigned ints, etc represented as DEC) sent wirelessly: char stringData[24]; // note: an integer is two bytes long, represented with a maximum of 5 digits, but we may send floats or unsigned int... int indexStringData=0;//position of the byte in the string -void processSerial() { +void processSerial() +{ + + while(pc.readable()>0) { + + char val =pc.getc(); + + // Save ASCII numeric characters (ASCII 0 - 9) on stringData: + if ((val >= '0') && (val <= '9')) { // this is 45 to 57 (included) + stringData[indexStringData] = val; + indexStringData++; + } - while(pc.readable()>0){ - - char val =pc.getc(); - - // Save ASCII numeric characters (ASCII 0 - 9) on stringData: - if ((val >= '0') && (val <= '9')){ // this is 45 to 57 (included) - stringData[indexStringData] = val; - indexStringData++; - } + else if (val == 'X') { + stringData[indexStringData] = 0; + vx = atoi(stringData); + indexStringData=0; + //newSpeedReady = true; + } + + else if (val == 'Y') { + stringData[indexStringData] = 0; + vy = atoi(stringData); + indexStringData=0; + //newSpeedReady = true; + theta=atan2(vy,vx); + recomputeBuffer(); + } - // X value? - else if (val=='X') { - stringData[indexStringData] = 0 ; - X=atoi(stringData); - indexStringData=0; - //newPositionReady=true; - } - // Y value? - else if (val=='Y') { - stringData[indexStringData] = 0 ; - Y=atoi(stringData); - indexStringData=0; - newPositionReady=true; - } - - } + else if (val == 'T') { + stringData[indexStringData] = 0; + dt = atoi(stringData); + indexStringData=0; + recomputeBuffer(); + } + else if (val == 'S') { + stringData[indexStringData] = 0; + scale = atoi(stringData); + indexStringData=0; + recomputeBuffer(); + } + else if (val == 'D') { + stringData[indexStringData] = 0; + dist = atoi(stringData); + indexStringData=0; + recomputeBuffer(); + } + // X value? + else if (val=='x') { + stringData[indexStringData] = 0 ; + omegaX=atoi(stringData); + indexStringData=0; + //newPositionReady=true; + } + // Y value? + else if (val=='y') { + stringData[indexStringData] = 0 ; + omegaY=atoi(stringData); + indexStringData=0; + recomputeBuffer(); + newPositionReady=true; + } + + else if (val=='g') { + stringData[indexStringData] = 0 ; + int power=atoi(stringData); + indexStringData=0; + IO.setGreenPower(power); + } else if (val=='r') { + stringData[indexStringData] = 0 ; + int power=atoi(stringData); + indexStringData=0; + IO.setRedPower(power); + } else if (val=='c') { + stringData[indexStringData] = 0 ; + int power=atoi(stringData); + indexStringData=0; + IO.setRGBPower(power); + } + + + } } \ No newline at end of file