Committer:
daan
Date:
Fri Dec 16 07:14:05 2011 +0000
Revision:
1:578d6bbe9f09
Parent:
0:01be2d5eaf72
Child:
2:ce4c7e5ab241

        

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 1:578d6bbe9f09 53 // definition of variables neccesairy due to the switch statement. maybe
daan 1:578d6bbe9f09 54 // use the if else if construction.
daan 1:578d6bbe9f09 55
daan 0:01be2d5eaf72 56 uint16_t x;
daan 0:01be2d5eaf72 57 uint16_t y;
daan 0:01be2d5eaf72 58 uint8_t header = get();
daan 1:578d6bbe9f09 59
daan 1:578d6bbe9f09 60 // this cannot be a byte because we overflow with 255 packets.
daan 1:578d6bbe9f09 61 int size;
daan 0:01be2d5eaf72 62 uint16_t power;
daan 1:578d6bbe9f09 63 char messageString[256];
daan 1:578d6bbe9f09 64 char *mesgPtr;
daan 1:578d6bbe9f09 65 uint8_t messageLength;
daan 1:578d6bbe9f09 66 uint8_t messageLevel;
daan 1:578d6bbe9f09 67 uint16_t delay;
daan 1:578d6bbe9f09 68 uint8_t r,g,b;
daan 0:01be2d5eaf72 69
daan 0:01be2d5eaf72 70 switch (header) {
daan 0:01be2d5eaf72 71 case olc::MOVE_TO:
daan 0:01be2d5eaf72 72 // if pen was down, make it go up.
daan 0:01be2d5eaf72 73 if (mPenDown) {
daan 0:01be2d5eaf72 74 penUp();
daan 0:01be2d5eaf72 75 }
daan 0:01be2d5eaf72 76 mGalvoX = decodeU16();
daan 0:01be2d5eaf72 77 mGalvoY = decodeU16();
daan 0:01be2d5eaf72 78 setGalvo(mGalvoX,mGalvoY);
daan 0:01be2d5eaf72 79 //std::cout << "move to [" << mGalvoX << "," << mGalvoY << "]" << std::endl;
daan 0:01be2d5eaf72 80 break;
daan 1:578d6bbe9f09 81
daan 0:01be2d5eaf72 82 case olc::LINE_TO:
daan 0:01be2d5eaf72 83 // if pen was up, make it go down.
daan 0:01be2d5eaf72 84 if (!mPenDown) {
daan 0:01be2d5eaf72 85 penDown();
daan 0:01be2d5eaf72 86 // setLaserPower(mLaserPower);
daan 0:01be2d5eaf72 87 // mPenDown = true;
daan 0:01be2d5eaf72 88 }
daan 0:01be2d5eaf72 89 x = decodeU16();
daan 0:01be2d5eaf72 90 y = decodeU16();
daan 0:01be2d5eaf72 91 rasterLine(mGalvoX, mGalvoY, x, y, mStepSize);
daan 0:01be2d5eaf72 92 mGalvoX = x;
daan 0:01be2d5eaf72 93 mGalvoY = y;
daan 0:01be2d5eaf72 94 // setGalvo(mGalvoX,mGalvoY);
daan 0:01be2d5eaf72 95 //std::cout << "line to [" << mGalvoX << "," << mGalvoY << "]" << std::endl;
daan 0:01be2d5eaf72 96 break;
daan 0:01be2d5eaf72 97 case olc::STEP_DELAY:
daan 0:01be2d5eaf72 98 mDelay = decodeU16();
daan 0:01be2d5eaf72 99 break;
daan 0:01be2d5eaf72 100 case olc::PEN_DOWN:
daan 0:01be2d5eaf72 101 penDown();
daan 0:01be2d5eaf72 102 break;
daan 0:01be2d5eaf72 103 case olc::PEN_UP:
daan 0:01be2d5eaf72 104 penUp();
daan 0:01be2d5eaf72 105 break;
daan 1:578d6bbe9f09 106 case olc::STEP_SIZE:
daan 1:578d6bbe9f09 107 // std::cout << "step size" << std::endl;
daan 1:578d6bbe9f09 108 mStepSize = decodeU16();
daan 1:578d6bbe9f09 109 break;
daan 1:578d6bbe9f09 110 // sending a message. length is as strlen: number of characters
daan 1:578d6bbe9f09 111 // preceeding the terminating /0 character
daan 1:578d6bbe9f09 112
daan 0:01be2d5eaf72 113 case olc::WAIT:
daan 1:578d6bbe9f09 114 delay = decodeU16();
daan 1:578d6bbe9f09 115 wait(delay);
daan 1:578d6bbe9f09 116 break;
daan 1:578d6bbe9f09 117 case olc::MESSAGE:
daan 1:578d6bbe9f09 118 messageLevel = get();
daan 1:578d6bbe9f09 119 messageLength = get();
daan 1:578d6bbe9f09 120 assert(messageLength < 255);
daan 1:578d6bbe9f09 121 // now skip x bytes
daan 1:578d6bbe9f09 122 mesgPtr = &(messageString[0]);
daan 1:578d6bbe9f09 123 while(1) {
daan 1:578d6bbe9f09 124 *mesgPtr = get();
daan 1:578d6bbe9f09 125 if (*mesgPtr == '\0') break;
daan 1:578d6bbe9f09 126 mesgPtr++;
daan 1:578d6bbe9f09 127 // check for buffer overflow.
daan 1:578d6bbe9f09 128 if ( mesgPtr - &(messageString[0]) == 256 ) break;
daan 1:578d6bbe9f09 129 }
daan 1:578d6bbe9f09 130 message(messageLevel, messageLength, &(messageString[0]));
daan 1:578d6bbe9f09 131 break;
daan 1:578d6bbe9f09 132
daan 1:578d6bbe9f09 133 case olc::CALIBRATION_SCAN:
daan 1:578d6bbe9f09 134 calibrationScan();
daan 1:578d6bbe9f09 135 break;
daan 1:578d6bbe9f09 136 case olc::POINT:
daan 1:578d6bbe9f09 137 x = decodeU16();
daan 1:578d6bbe9f09 138 y = decodeU16();
daan 1:578d6bbe9f09 139 point(x,y);
daan 1:578d6bbe9f09 140 break;
daan 1:578d6bbe9f09 141 case olc::READ_RGB:
daan 1:578d6bbe9f09 142 readRgb();
daan 0:01be2d5eaf72 143 break;
daan 1:578d6bbe9f09 144 case olc::AYT:
daan 1:578d6bbe9f09 145 areYouThere();
daan 1:578d6bbe9f09 146 break;
daan 1:578d6bbe9f09 147 case olc::READY:
daan 1:578d6bbe9f09 148 ready();
daan 1:578d6bbe9f09 149 break;
daan 1:578d6bbe9f09 150
daan 1:578d6bbe9f09 151 case olc::LASER_POWER_RGB:
daan 1:578d6bbe9f09 152 r = get();
daan 1:578d6bbe9f09 153 g = get();
daan 1:578d6bbe9f09 154 b = get();
daan 1:578d6bbe9f09 155 setLaserPowerRgb(r,g,b);
daan 1:578d6bbe9f09 156
daan 1:578d6bbe9f09 157 case olc::LASER_POWER:
daan 1:578d6bbe9f09 158 //std::cout << "laser power" << std::endl;
daan 1:578d6bbe9f09 159 mLaserPower = decodeU16();
daan 1:578d6bbe9f09 160 //setLaserPower(mLaserPower);
daan 1:578d6bbe9f09 161 break;
daan 0:01be2d5eaf72 162 case olc::BITMAPU8:
daan 0:01be2d5eaf72 163 //std::cout << "bitmapU8" << std::endl;
daan 0:01be2d5eaf72 164 penDown();
daan 1:578d6bbe9f09 165 size = (int)get();
daan 1:578d6bbe9f09 166 for( int i = 0; i < size; i++ ) {
daan 0:01be2d5eaf72 167 uint16_t delay = ((uint16_t) get() ) << 4;
daan 0:01be2d5eaf72 168 wait(delay);
daan 0:01be2d5eaf72 169 // setLaserPower( power );
daan 0:01be2d5eaf72 170 mGalvoX += mStepSize;
daan 0:01be2d5eaf72 171 setGalvo(mGalvoX, mGalvoY);
daan 0:01be2d5eaf72 172 //std::cout << "power " << (int)power << std::endl;
daan 1:578d6bbe9f09 173 }
daan 0:01be2d5eaf72 174 break;
daan 0:01be2d5eaf72 175 default:
daan 0:01be2d5eaf72 176 //std::cout << "found unknown code " << (int)header << std::endl;
daan 1:578d6bbe9f09 177 return false;
daan 0:01be2d5eaf72 178 }
daan 1:578d6bbe9f09 179 // if (mPlayHead >= mSize) return false;
daan 0:01be2d5eaf72 180 return true;
daan 0:01be2d5eaf72 181 }
daan 0:01be2d5eaf72 182
daan 0:01be2d5eaf72 183 // a simple bresenheim line integer algorithm
daan 0:01be2d5eaf72 184 void olc::PlayerBase::rasterLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, int step)
daan 0:01be2d5eaf72 185 {
daan 0:01be2d5eaf72 186
daan 0:01be2d5eaf72 187 int dy = y1 - y0;
daan 0:01be2d5eaf72 188 int dx = x1 - x0;
daan 0:01be2d5eaf72 189 int stepx, stepy;
daan 0:01be2d5eaf72 190 if (dy < 0) { dy = -dy; stepy = -step; } else { stepy = step; }
daan 0:01be2d5eaf72 191 if (dx < 0) { dx = -dx; stepx = -step; } else { stepx = step; }
daan 0:01be2d5eaf72 192 dy <<= 2; // dy is now 2*dy
daan 0:01be2d5eaf72 193 dx <<= 2; // dx is now 2*dx
daan 0:01be2d5eaf72 194
daan 0:01be2d5eaf72 195 if ( (dx == 0) && (dy == 0) ) return; // nothing to move.
daan 0:01be2d5eaf72 196
daan 0:01be2d5eaf72 197 if (dx > dy) {
daan 0:01be2d5eaf72 198 int fraction = dy - (dx >> 1); // same as 2*dy - dx
daan 0:01be2d5eaf72 199 if ( stepx > 0) {
daan 0:01be2d5eaf72 200 while (x0 < x1) {
daan 0:01be2d5eaf72 201 if (fraction >= 0) { y0 += stepy; fraction -= dx; }
daan 0:01be2d5eaf72 202 x0 += stepx; fraction += dy;
daan 0:01be2d5eaf72 203 setGalvo(x0, y0);
daan 0:01be2d5eaf72 204 wait(mDelay);
daan 0:01be2d5eaf72 205 }
daan 0:01be2d5eaf72 206 } else {
daan 0:01be2d5eaf72 207 while (x0 > x1) {
daan 0:01be2d5eaf72 208 if (fraction >= 0) { y0 += stepy; fraction -= dx; }
daan 0:01be2d5eaf72 209 x0 += stepx; fraction += dy;
daan 0:01be2d5eaf72 210 setGalvo(x0, y0);
daan 0:01be2d5eaf72 211 wait(mDelay);
daan 0:01be2d5eaf72 212 }
daan 0:01be2d5eaf72 213 }
daan 0:01be2d5eaf72 214 } else {
daan 0:01be2d5eaf72 215 int fraction = dx - (dy >> 1);
daan 0:01be2d5eaf72 216 if ( stepy > 0) {
daan 0:01be2d5eaf72 217 while (y0 < y1) {
daan 0:01be2d5eaf72 218 if (fraction >= 0) { x0 += stepx; fraction -= dy; }
daan 0:01be2d5eaf72 219 y0 += stepy;
daan 0:01be2d5eaf72 220 fraction += dx;
daan 0:01be2d5eaf72 221 setGalvo(x0, y0);
daan 0:01be2d5eaf72 222 wait(mDelay);
daan 0:01be2d5eaf72 223 }
daan 0:01be2d5eaf72 224 } else {
daan 0:01be2d5eaf72 225 while (y0 > y1) {
daan 0:01be2d5eaf72 226 if (fraction >= 0) { x0 += stepx; fraction -= dy; }
daan 0:01be2d5eaf72 227 y0 += stepy;
daan 0:01be2d5eaf72 228 fraction += dx;
daan 0:01be2d5eaf72 229 setGalvo(x0, y0);
daan 0:01be2d5eaf72 230 wait(mDelay);
daan 0:01be2d5eaf72 231 }
daan 0:01be2d5eaf72 232 }
daan 0:01be2d5eaf72 233 }
daan 0:01be2d5eaf72 234 }
daan 0:01be2d5eaf72 235