Committer:
daan
Date:
Mon Oct 31 02:34:13 2011 +0000
Revision:
0:01be2d5eaf72
Child:
1:578d6bbe9f09
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daan 0:01be2d5eaf72 1 #include "PlayerBase.h"
daan 0:01be2d5eaf72 2
daan 0:01be2d5eaf72 3 #include "assert.h"
daan 0:01be2d5eaf72 4 #include "VectorFormat.h"
daan 0:01be2d5eaf72 5
daan 0:01be2d5eaf72 6 //#include <iostream>
daan 0:01be2d5eaf72 7
daan 0:01be2d5eaf72 8 olc::PlayerBase::PlayerBase() :
daan 0:01be2d5eaf72 9 mData(0),
daan 0:01be2d5eaf72 10 mSize(0),
daan 0:01be2d5eaf72 11 mPlayHead(0),
daan 0:01be2d5eaf72 12 mPenDown(false),
daan 0:01be2d5eaf72 13 mLaserPower(0xFFFF),
daan 0:01be2d5eaf72 14 mGalvoX(0),
daan 0:01be2d5eaf72 15 mGalvoY(0),
daan 0:01be2d5eaf72 16 mDelay(0),
daan 0:01be2d5eaf72 17 mStepSize(1)
daan 0:01be2d5eaf72 18 {
daan 0:01be2d5eaf72 19 }
daan 0:01be2d5eaf72 20
daan 0:01be2d5eaf72 21 void olc::PlayerBase::setGalvo(uint16_t x, uint16_t y) {
daan 0:01be2d5eaf72 22 }
daan 0:01be2d5eaf72 23
daan 0:01be2d5eaf72 24 void olc::PlayerBase::setLaserPower(uint16_t power) {
daan 0:01be2d5eaf72 25 // std::cout << "laser power " << power << std::endl;
daan 0:01be2d5eaf72 26 }
daan 0:01be2d5eaf72 27
daan 0:01be2d5eaf72 28 void olc::PlayerBase::wait(uint16_t ms) {
daan 0:01be2d5eaf72 29 }
daan 0:01be2d5eaf72 30
daan 0:01be2d5eaf72 31 void olc::PlayerBase::setData(uint8_t *aData, int aSize) {
daan 0:01be2d5eaf72 32 reset();
daan 0:01be2d5eaf72 33 assert(aSize > 0);
daan 0:01be2d5eaf72 34 assert(aData != 0);
daan 0:01be2d5eaf72 35 mSize = aSize;
daan 0:01be2d5eaf72 36 mData = aData;
daan 0:01be2d5eaf72 37 }
daan 0:01be2d5eaf72 38
daan 0:01be2d5eaf72 39 void olc::PlayerBase::reset() {
daan 0:01be2d5eaf72 40 mPlayHead = 0;
daan 0:01be2d5eaf72 41 setLaserPower(0);
daan 0:01be2d5eaf72 42 }
daan 0:01be2d5eaf72 43
daan 0:01be2d5eaf72 44 bool olc::PlayerBase::hasNext() {
daan 0:01be2d5eaf72 45 // std::cout << "bytes left " << bytesLeft() << std::endl;
daan 0:01be2d5eaf72 46 if ( bytesLeft() > 0 ) return true;
daan 0:01be2d5eaf72 47 return false;
daan 0:01be2d5eaf72 48 }
daan 0:01be2d5eaf72 49
daan 0:01be2d5eaf72 50 bool olc::PlayerBase::playOne() {
daan 0:01be2d5eaf72 51 if ( bytesLeft() == 0 ) return true;
daan 0:01be2d5eaf72 52
daan 0:01be2d5eaf72 53 uint16_t x;
daan 0:01be2d5eaf72 54 uint16_t y;
daan 0:01be2d5eaf72 55 uint8_t header = get();
daan 0:01be2d5eaf72 56 uint8_t size;
daan 0:01be2d5eaf72 57 uint16_t power;
daan 0:01be2d5eaf72 58
daan 0:01be2d5eaf72 59 switch (header) {
daan 0:01be2d5eaf72 60 case olc::MOVE_TO:
daan 0:01be2d5eaf72 61 // if pen was down, make it go up.
daan 0:01be2d5eaf72 62 if (mPenDown) {
daan 0:01be2d5eaf72 63 penUp();
daan 0:01be2d5eaf72 64 }
daan 0:01be2d5eaf72 65 mGalvoX = decodeU16();
daan 0:01be2d5eaf72 66 mGalvoY = decodeU16();
daan 0:01be2d5eaf72 67 setGalvo(mGalvoX,mGalvoY);
daan 0:01be2d5eaf72 68 //std::cout << "move to [" << mGalvoX << "," << mGalvoY << "]" << std::endl;
daan 0:01be2d5eaf72 69 break;
daan 0:01be2d5eaf72 70 case olc::LINE_TO:
daan 0:01be2d5eaf72 71 // if pen was up, make it go down.
daan 0:01be2d5eaf72 72 if (!mPenDown) {
daan 0:01be2d5eaf72 73 penDown();
daan 0:01be2d5eaf72 74 // setLaserPower(mLaserPower);
daan 0:01be2d5eaf72 75 // mPenDown = true;
daan 0:01be2d5eaf72 76 }
daan 0:01be2d5eaf72 77 x = decodeU16();
daan 0:01be2d5eaf72 78 y = decodeU16();
daan 0:01be2d5eaf72 79 rasterLine(mGalvoX, mGalvoY, x, y, mStepSize);
daan 0:01be2d5eaf72 80 mGalvoX = x;
daan 0:01be2d5eaf72 81 mGalvoY = y;
daan 0:01be2d5eaf72 82 // setGalvo(mGalvoX,mGalvoY);
daan 0:01be2d5eaf72 83 //std::cout << "line to [" << mGalvoX << "," << mGalvoY << "]" << std::endl;
daan 0:01be2d5eaf72 84 break;
daan 0:01be2d5eaf72 85 case olc::STEP_SIZE:
daan 0:01be2d5eaf72 86 // std::cout << "step size" << std::endl;
daan 0:01be2d5eaf72 87 mStepSize = decodeU16();
daan 0:01be2d5eaf72 88 break;
daan 0:01be2d5eaf72 89 case olc::STEP_DELAY:
daan 0:01be2d5eaf72 90 mDelay = decodeU16();
daan 0:01be2d5eaf72 91 break;
daan 0:01be2d5eaf72 92 case olc::LASER_POWER:
daan 0:01be2d5eaf72 93 //std::cout << "laser power" << std::endl;
daan 0:01be2d5eaf72 94 mLaserPower = decodeU16();
daan 0:01be2d5eaf72 95 setLaserPower(mLaserPower);
daan 0:01be2d5eaf72 96 break;
daan 0:01be2d5eaf72 97 case olc::PEN_DOWN:
daan 0:01be2d5eaf72 98 penDown();
daan 0:01be2d5eaf72 99 break;
daan 0:01be2d5eaf72 100 case olc::PEN_UP:
daan 0:01be2d5eaf72 101 penUp();
daan 0:01be2d5eaf72 102 break;
daan 0:01be2d5eaf72 103 case olc::WAIT:
daan 0:01be2d5eaf72 104 wait( decodeU16() );
daan 0:01be2d5eaf72 105 break;
daan 0:01be2d5eaf72 106 case olc::BITMAPU8:
daan 0:01be2d5eaf72 107 //std::cout << "bitmapU8" << std::endl;
daan 0:01be2d5eaf72 108 penDown();
daan 0:01be2d5eaf72 109 size = get();
daan 0:01be2d5eaf72 110 for( int i = 0; i < (int)size; i++ ) {
daan 0:01be2d5eaf72 111 uint16_t delay = ((uint16_t) get() ) << 4;
daan 0:01be2d5eaf72 112 wait(delay);
daan 0:01be2d5eaf72 113 // setLaserPower( power );
daan 0:01be2d5eaf72 114 mGalvoX += mStepSize;
daan 0:01be2d5eaf72 115 setGalvo(mGalvoX, mGalvoY);
daan 0:01be2d5eaf72 116 //std::cout << "power " << (int)power << std::endl;
daan 0:01be2d5eaf72 117 }
daan 0:01be2d5eaf72 118
daan 0:01be2d5eaf72 119 break;
daan 0:01be2d5eaf72 120 default:
daan 0:01be2d5eaf72 121 //std::cout << "found unknown code " << (int)header << std::endl;
daan 0:01be2d5eaf72 122 assert(0);
daan 0:01be2d5eaf72 123 }
daan 0:01be2d5eaf72 124 if (mPlayHead >= mSize) return false;
daan 0:01be2d5eaf72 125 return true;
daan 0:01be2d5eaf72 126 }
daan 0:01be2d5eaf72 127
daan 0:01be2d5eaf72 128 // a simple bresenheim line integer algorithm
daan 0:01be2d5eaf72 129 void olc::PlayerBase::rasterLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, int step)
daan 0:01be2d5eaf72 130 {
daan 0:01be2d5eaf72 131
daan 0:01be2d5eaf72 132 int dy = y1 - y0;
daan 0:01be2d5eaf72 133 int dx = x1 - x0;
daan 0:01be2d5eaf72 134 int stepx, stepy;
daan 0:01be2d5eaf72 135 if (dy < 0) { dy = -dy; stepy = -step; } else { stepy = step; }
daan 0:01be2d5eaf72 136 if (dx < 0) { dx = -dx; stepx = -step; } else { stepx = step; }
daan 0:01be2d5eaf72 137 dy <<= 2; // dy is now 2*dy
daan 0:01be2d5eaf72 138 dx <<= 2; // dx is now 2*dx
daan 0:01be2d5eaf72 139
daan 0:01be2d5eaf72 140 if ( (dx == 0) && (dy == 0) ) return; // nothing to move.
daan 0:01be2d5eaf72 141
daan 0:01be2d5eaf72 142 if (dx > dy) {
daan 0:01be2d5eaf72 143 int fraction = dy - (dx >> 1); // same as 2*dy - dx
daan 0:01be2d5eaf72 144 if ( stepx > 0) {
daan 0:01be2d5eaf72 145 while (x0 < x1) {
daan 0:01be2d5eaf72 146 if (fraction >= 0) { y0 += stepy; fraction -= dx; }
daan 0:01be2d5eaf72 147 x0 += stepx; fraction += dy;
daan 0:01be2d5eaf72 148 setGalvo(x0, y0);
daan 0:01be2d5eaf72 149 wait(mDelay);
daan 0:01be2d5eaf72 150 }
daan 0:01be2d5eaf72 151 } else {
daan 0:01be2d5eaf72 152 while (x0 > x1) {
daan 0:01be2d5eaf72 153 if (fraction >= 0) { y0 += stepy; fraction -= dx; }
daan 0:01be2d5eaf72 154 x0 += stepx; fraction += dy;
daan 0:01be2d5eaf72 155 setGalvo(x0, y0);
daan 0:01be2d5eaf72 156 wait(mDelay);
daan 0:01be2d5eaf72 157 }
daan 0:01be2d5eaf72 158 }
daan 0:01be2d5eaf72 159 } else {
daan 0:01be2d5eaf72 160 int fraction = dx - (dy >> 1);
daan 0:01be2d5eaf72 161 if ( stepy > 0) {
daan 0:01be2d5eaf72 162 while (y0 < y1) {
daan 0:01be2d5eaf72 163 if (fraction >= 0) { x0 += stepx; fraction -= dy; }
daan 0:01be2d5eaf72 164 y0 += stepy;
daan 0:01be2d5eaf72 165 fraction += dx;
daan 0:01be2d5eaf72 166 setGalvo(x0, y0);
daan 0:01be2d5eaf72 167 wait(mDelay);
daan 0:01be2d5eaf72 168 }
daan 0:01be2d5eaf72 169 } else {
daan 0:01be2d5eaf72 170 while (y0 > y1) {
daan 0:01be2d5eaf72 171 if (fraction >= 0) { x0 += stepx; fraction -= dy; }
daan 0:01be2d5eaf72 172 y0 += stepy;
daan 0:01be2d5eaf72 173 fraction += dx;
daan 0:01be2d5eaf72 174 setGalvo(x0, y0);
daan 0:01be2d5eaf72 175 wait(mDelay);
daan 0:01be2d5eaf72 176 }
daan 0:01be2d5eaf72 177 }
daan 0:01be2d5eaf72 178 }
daan 0:01be2d5eaf72 179 }
daan 0:01be2d5eaf72 180