User | Revision | Line number | New 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
|
|