this version 10/17

Dependencies:   mbed

Fork of linearMirrorMotion by Alvaro Cassinelli

Revision:
4:e00e709d7173
Parent:
2:0548c7bf9fba
Child:
5:e02cd57242c7
--- 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