this version 10/17

Dependencies:   mbed

Fork of linearMirrorMotion by Alvaro Cassinelli

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers renderclass.cpp Source File

renderclass.cpp

00001 #include "renderclass.h"
00002 #include "mbed.h"
00003 #include "laserProjectorHardware.h"
00004 #include <vector>
00005 
00006 Ticker translationTimer;
00007 
00008 //for translating -----------------------------------------------------------------
00009 
00010 inline void render::shearing(point2dl& dataBefore)
00011 {
00012     dataBefore.x = dataBefore.x - speed * cos(angle+PI/2)*speedTimer.read_us()/400;
00013     dataBefore.y = dataBefore.y - speed * sin(angle+PI/2)*speedTimer.read_us()/400;
00014 }
00015 
00016 inline void render::rotation(point2dl& dataBefore)
00017 {
00018     int x=dataBefore.x;
00019     dataBefore.x = 1800 * cos(angle) + sin(angle)*x - cos(angle)*dataBefore.y;
00020     dataBefore.y = 1800 * sin(angle) - cos(angle)*x - sin(angle)*dataBefore.y;
00021 }
00022 //----------------------------------------------------------------------------------
00023 
00024 void render::startRender()
00025 {
00026     speedTimer.start();
00027     renderTimer.attach_us(this, &render::draw,RENDER_INTERVAL);
00028     pc.printf("render started!\n");
00029 }
00030 
00031 void render::stopRender()
00032 {
00033     renderTimer.detach();
00034     translated.clear();
00035     currentLetters=0;
00036     currentPoints=0;
00037 }
00038 
00039 void render::setRender(vector<letter> *p)
00040 {
00041     ptext = p;
00042     pc.printf("Size of text to render: %d/n", (*ptext).size() );
00043     //for(int i=0; i!=(*ptext).size(); i++){
00044     for(std::vector<letter>::iterator itr = (*ptext).begin(); itr != (*ptext).end(); ++itr) {
00045         translated.push_back(*itr);
00046     }                                            //copy the liblary to the buffer.
00047     
00048     
00049     currentLetters=0;
00050     currentPoints=0;
00051     shearingSwitch = 1;
00052 
00053 }
00054 
00055 
00056 void render::updateSpeed(float gspeed, float gangle){
00057     speed = gspeed;
00058     angle = gangle;
00059     
00060     //speed=sqrt(vx*vx+vy*vy);//*factorSpeed;
00061     //angle=atan2(vy,vx);
00062 }
00063 
00064 int stopcounter=100;
00065 
00066 void render::draw()
00067 {
00068     if(translated.size()>0){
00069     if(stopcounter == 99) speedTimer.reset();
00070     if(stopcounter==100){
00071     
00072     point2dl drawPoint=translated[currentLetters].letpoints[currentPoints];
00073     transform(drawPoint); // transform it with the current speed and angle
00074     //IO.setRedPower(drawPoint.laserSwitch);
00075     IO.writeOutXY(CENTER_AD_MIRROR_X + (int)drawPoint.x , CENTER_AD_MIRROR_Y + (int)drawPoint.y);
00076     
00077     
00078     if(currentPoints>0) IO.setRedPower(translated[currentLetters].letpoints[currentPoints-1].laserSwitch);
00079     else                IO.setRedPower(0);             
00080 
00081     currentPoints++;
00082     }
00083     else stopcounter++;
00084     
00085     if(currentPoints >= translated[currentLetters].letpoints.size() ) {
00086         if(stopcounter == 100) stopcounter = 0;
00087         else if(stopcounter == 0){
00088         renderTimer.detach();
00089         }
00090         //wait_us(RENDER_INTERVAL);
00091         else if(stopcounter == 1){
00092         IO.setRedPower(0);
00093         //wait_us(RENDER_INTERVAL);
00094         currentLetters++;
00095         currentPoints = 0;
00096         renderTimer.attach_us(this, &render::draw,RENDER_INTERVAL);
00097         speedTimer.reset();
00098         }
00099     }
00100     if(currentLetters >= translated.size()) {
00101         currentLetters = 0;
00102         currentPoints = 0;
00103         renderTimer.detach();
00104         //wait_us(RENDER_INTERVAL);
00105         IO.setRedPower(0);
00106         //wait_us(RENDER_INTERVAL*200);
00107         renderTimer.attach_us(this, &render::draw,RENDER_INTERVAL);
00108         speedTimer.reset();
00109         stopcounter = -200;
00110     }
00111     }
00112 }
00113 
00114 void render::transform(point2dl& mypoint)
00115 {
00116     rotation(mypoint);
00117     if(shearingSwitch == 1) shearing(mypoint);
00118 }
00119