work fine

Dependencies:   mbed

Committer:
lixianyu
Date:
Wed Jun 01 13:38:30 2016 +0000
Revision:
1:14b7c3a3ec60
Parent:
0:5ca227682ee7
Child:
2:487a727d6181
??????????0,0?????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 0:5ca227682ee7 1 // 本作品采用知识共享 署名-非商业性使用-相同方式共享 3.0 未本地化版本 许可协议进行许可
lixianyu 0:5ca227682ee7 2 // 访问 http://creativecommons.org/licenses/by-nc-sa/3.0/ 查看该许可协议
lixianyu 0:5ca227682ee7 3 // ==============
lixianyu 0:5ca227682ee7 4
lixianyu 0:5ca227682ee7 5 // 版权所有:
lixianyu 0:5ca227682ee7 6 // @老潘orz wasdpkj@hotmail.com
lixianyu 0:5ca227682ee7 7 // ==============
lixianyu 0:5ca227682ee7 8
lixianyu 0:5ca227682ee7 9 // Microduino-IDE
lixianyu 0:5ca227682ee7 10 // ==============
lixianyu 0:5ca227682ee7 11 // Microduino Getting start:
lixianyu 0:5ca227682ee7 12 // http://www.microduino.cc/download/
lixianyu 0:5ca227682ee7 13
lixianyu 0:5ca227682ee7 14 // Microduino IDE Support:
lixianyu 0:5ca227682ee7 15 // https://github.com/wasdpkj/Microduino-IDE-Support/
lixianyu 0:5ca227682ee7 16
lixianyu 0:5ca227682ee7 17 // ==============
lixianyu 0:5ca227682ee7 18 // Microduino wiki:
lixianyu 0:5ca227682ee7 19 // http://wiki.microduino.cc
lixianyu 0:5ca227682ee7 20
lixianyu 0:5ca227682ee7 21 // ==============
lixianyu 0:5ca227682ee7 22 // E-mail:
lixianyu 0:5ca227682ee7 23 // Kejia Pan
lixianyu 0:5ca227682ee7 24 // pankejia@microduino.cc
lixianyu 0:5ca227682ee7 25
lixianyu 0:5ca227682ee7 26 // ==============
lixianyu 0:5ca227682ee7 27 // Weibo:
lixianyu 0:5ca227682ee7 28 // @老潘orz
lixianyu 0:5ca227682ee7 29
lixianyu 0:5ca227682ee7 30 #include "Microduino_Matrix.h"
lixianyu 0:5ca227682ee7 31 #include "Fonts.h"
lixianyu 0:5ca227682ee7 32
lixianyu 0:5ca227682ee7 33 #define read16(Y,Z) (uint16_t)((uint8_t)pgm_read_byte((Y) + (Z++)) | ((uint8_t)pgm_read_byte((Y) + (Z++)) << 8))
lixianyu 0:5ca227682ee7 34 #define read32(Y,Z) (uint32_t)((uint8_t)pgm_read_byte((Y) + (Z++)) | ((uint8_t)pgm_read_byte((Y) + (Z++)) << 8) | ((uint8_t)pgm_read_byte((Y) + (Z++)) << 16) | ((uint8_t)pgm_read_byte((Y) + (Z++)) << 24))
lixianyu 0:5ca227682ee7 35 #define BUFFPIXEL (MatrixPix_X * 8 * 3)
lixianyu 0:5ca227682ee7 36
lixianyu 0:5ca227682ee7 37 Matrix::Matrix(uint8_t (*_addr)[8])
lixianyu 0:5ca227682ee7 38 {
lixianyu 0:5ca227682ee7 39 // uint8_t (*p)[10]=_addr;
lixianyu 0:5ca227682ee7 40 uint8_t _x = 0, _y = 0;
lixianyu 0:5ca227682ee7 41 for (uint8_t a = 0; a < 8; a++) { //判断第一层
lixianyu 0:5ca227682ee7 42 if (_addr[0][a] == 0) {
lixianyu 0:5ca227682ee7 43
lixianyu 0:5ca227682ee7 44 break; //NULL,结束当前层判断
lixianyu 0:5ca227682ee7 45 } else {
lixianyu 0:5ca227682ee7 46 _x = a + 1;
lixianyu 0:5ca227682ee7 47 for (uint8_t b = 0; b < 8; b++) { //判断第二层
lixianyu 0:5ca227682ee7 48 if (_addr[b][a] == 0) {
lixianyu 0:5ca227682ee7 49 break; //NULL,结束当前层判断
lixianyu 0:5ca227682ee7 50 } else {
lixianyu 0:5ca227682ee7 51 _y = b + 1;
lixianyu 0:5ca227682ee7 52 }
lixianyu 0:5ca227682ee7 53 }
lixianyu 0:5ca227682ee7 54 }
lixianyu 0:5ca227682ee7 55 }
lixianyu 0:5ca227682ee7 56
lixianyu 0:5ca227682ee7 57 this->_numX = _x;
lixianyu 0:5ca227682ee7 58 this->_numY = _y;
lixianyu 0:5ca227682ee7 59
lixianyu 0:5ca227682ee7 60 this->_matrixNum = this->_numX * this->_numY;
lixianyu 0:5ca227682ee7 61 led = new LedControl[this->_matrixNum];
lixianyu 0:5ca227682ee7 62
lixianyu 0:5ca227682ee7 63 this->cursor_y = 0;
lixianyu 0:5ca227682ee7 64 this->cursor_x = 0;
lixianyu 0:5ca227682ee7 65
lixianyu 0:5ca227682ee7 66 uint8_t _p[64];
lixianyu 0:5ca227682ee7 67 for (int a = 0; a < this->_numY; a++) {
lixianyu 0:5ca227682ee7 68 for (int b = 0; b < this->_numX ; b++) {
lixianyu 0:5ca227682ee7 69 uint8_t _s = b + a * this->_numX ;
lixianyu 0:5ca227682ee7 70 _p[_s] = _addr[a][b];
lixianyu 0:5ca227682ee7 71 }
lixianyu 0:5ca227682ee7 72 }
lixianyu 0:5ca227682ee7 73 setDeviceAddr(_p);
lixianyu 0:5ca227682ee7 74
lixianyu 0:5ca227682ee7 75 clearFastMode();
lixianyu 0:5ca227682ee7 76 clearColor();
lixianyu 0:5ca227682ee7 77 setFontMode(true);
lixianyu 0:5ca227682ee7 78 }
lixianyu 0:5ca227682ee7 79
lixianyu 0:5ca227682ee7 80 uint8_t Matrix::getDeviceAddr(uint8_t _a)
lixianyu 0:5ca227682ee7 81 {
lixianyu 0:5ca227682ee7 82 return led[_a].getDeviceAddr();
lixianyu 0:5ca227682ee7 83 }
lixianyu 0:5ca227682ee7 84
lixianyu 0:5ca227682ee7 85 void Matrix::setDeviceAddr(uint8_t* _addr)
lixianyu 0:5ca227682ee7 86 {
lixianyu 0:5ca227682ee7 87 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 88 led[a].setDeviceAddr(_addr[a]);
lixianyu 0:5ca227682ee7 89 }
lixianyu 0:5ca227682ee7 90
lixianyu 0:5ca227682ee7 91 void Matrix::clearDisplay()
lixianyu 0:5ca227682ee7 92 {
lixianyu 0:5ca227682ee7 93 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 94 led[a].clearDisplay();
lixianyu 0:5ca227682ee7 95 }
lixianyu 0:5ca227682ee7 96
lixianyu 0:5ca227682ee7 97 void Matrix::setLedColor(uint8_t _row, uint8_t _col, uint8_t _value_r, uint8_t _value_g, uint8_t _value_b)
lixianyu 0:5ca227682ee7 98 {
lixianyu 0:5ca227682ee7 99 if((_col > (getHeight() * 8 - 1)) || (_row > (getWidth() * 8 - 1)))
lixianyu 0:5ca227682ee7 100 return;
lixianyu 0:5ca227682ee7 101 int16_t _s = (_row / 8) + (_col / 8) * getWidth();
lixianyu 0:5ca227682ee7 102 led[_s].setLedColor(_row % 8, _col % 8, _value_r, _value_g, _value_b);
lixianyu 0:5ca227682ee7 103 }
lixianyu 0:5ca227682ee7 104
lixianyu 0:5ca227682ee7 105 void Matrix::setLedColorFast(uint8_t _row, uint8_t _col, uint8_t _value_r, uint8_t _value_g, uint8_t _value_b)
lixianyu 0:5ca227682ee7 106 {
lixianyu 0:5ca227682ee7 107 if((_col > (getHeight() * 8 - 1)) || (_row > (getWidth() * 8 - 1)))
lixianyu 0:5ca227682ee7 108 return;
lixianyu 0:5ca227682ee7 109 int16_t _s = (_row / 8) + (_col / 8) * getWidth();
lixianyu 0:5ca227682ee7 110 led[_s].setLedColorFast(_row % 8, _col % 8, _value_r, _value_g, _value_b);
lixianyu 0:5ca227682ee7 111 }
lixianyu 0:5ca227682ee7 112
lixianyu 0:5ca227682ee7 113 void Matrix::setLed(uint8_t _row, uint8_t _col, bool _state)
lixianyu 0:5ca227682ee7 114 {
lixianyu 0:5ca227682ee7 115 if((_col > (getHeight() * 8 - 1)) || (_row > (getWidth() * 8 - 1)))
lixianyu 0:5ca227682ee7 116 return;
lixianyu 0:5ca227682ee7 117 int16_t _s = (_row / 8) + (_col / 8) * getWidth();
lixianyu 0:5ca227682ee7 118 led[_s].setLed(_row % 8, _col % 8, _state);
lixianyu 0:5ca227682ee7 119 }
lixianyu 0:5ca227682ee7 120
lixianyu 0:5ca227682ee7 121 void Matrix::setCursor(int16_t _x, int16_t _y)
lixianyu 0:5ca227682ee7 122 {
lixianyu 0:5ca227682ee7 123 this->cursor_x = _x;
lixianyu 0:5ca227682ee7 124 this->cursor_y = _y;
lixianyu 0:5ca227682ee7 125
lixianyu 0:5ca227682ee7 126 for (int _y = 0; _y < getHeight(); _y++) {
lixianyu 0:5ca227682ee7 127 for (int _x = 0; _x < getWidth(); _x++) {
lixianyu 0:5ca227682ee7 128 uint8_t _s = _x + _y * getWidth();
lixianyu 0:5ca227682ee7 129 led[_s].setCursor(-(8 * _x) + this->cursor_x, -(8 * _y) + this->cursor_y);
lixianyu 0:5ca227682ee7 130 }
lixianyu 0:5ca227682ee7 131 }
lixianyu 0:5ca227682ee7 132 }
lixianyu 0:5ca227682ee7 133
lixianyu 0:5ca227682ee7 134 void Matrix::setFastMode()
lixianyu 0:5ca227682ee7 135 {
lixianyu 0:5ca227682ee7 136 // runFun(&setFastMode);
lixianyu 0:5ca227682ee7 137 // this->Fast_mode = true;
lixianyu 0:5ca227682ee7 138 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 139 led[a].setFastMode();
lixianyu 0:5ca227682ee7 140 }
lixianyu 0:5ca227682ee7 141
lixianyu 0:5ca227682ee7 142 void Matrix::clearFastMode()
lixianyu 0:5ca227682ee7 143 {
lixianyu 0:5ca227682ee7 144 // this->Fast_mode = false;
lixianyu 0:5ca227682ee7 145 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 146 led[a].clearFastMode();
lixianyu 0:5ca227682ee7 147 }
lixianyu 0:5ca227682ee7 148
lixianyu 0:5ca227682ee7 149 void Matrix::setFontMode(bool _Mode)
lixianyu 0:5ca227682ee7 150 {
lixianyu 0:5ca227682ee7 151 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 152 led[a].setFontMode(_Mode);
lixianyu 0:5ca227682ee7 153 }
lixianyu 0:5ca227682ee7 154
lixianyu 0:5ca227682ee7 155 void Matrix::setColor(uint8_t value_r, uint8_t value_g, uint8_t value_b)
lixianyu 0:5ca227682ee7 156 {
lixianyu 0:5ca227682ee7 157 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 158 led[a].setColor(value_r, value_g, value_b);
lixianyu 0:5ca227682ee7 159 }
lixianyu 0:5ca227682ee7 160
lixianyu 0:5ca227682ee7 161 void Matrix::clearColor()
lixianyu 0:5ca227682ee7 162 {
lixianyu 0:5ca227682ee7 163 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 164 led[a].clearColor();
lixianyu 0:5ca227682ee7 165 }
lixianyu 0:5ca227682ee7 166
lixianyu 0:5ca227682ee7 167 void Matrix::drawLine(int8_t x1, int8_t y1, int8_t x2, int8_t y2)
lixianyu 0:5ca227682ee7 168 {
lixianyu 0:5ca227682ee7 169 uint8_t tmp;
lixianyu 0:5ca227682ee7 170 uint8_t x, y;
lixianyu 0:5ca227682ee7 171 uint8_t dx, dy;
lixianyu 0:5ca227682ee7 172 int8_t err;
lixianyu 0:5ca227682ee7 173 int8_t ystep;
lixianyu 0:5ca227682ee7 174
lixianyu 0:5ca227682ee7 175 uint8_t swapxy = 0;
lixianyu 0:5ca227682ee7 176
lixianyu 0:5ca227682ee7 177 /* no BBX intersection check at the moment, should be added... */
lixianyu 0:5ca227682ee7 178
lixianyu 0:5ca227682ee7 179 if ( x1 > x2 ) dx = x1 - x2;
lixianyu 0:5ca227682ee7 180 else dx = x2 - x1;
lixianyu 0:5ca227682ee7 181 if ( y1 > y2 ) dy = y1 - y2;
lixianyu 0:5ca227682ee7 182 else dy = y2 - y1;
lixianyu 0:5ca227682ee7 183
lixianyu 0:5ca227682ee7 184 if ( dy > dx ) {
lixianyu 0:5ca227682ee7 185 swapxy = 1;
lixianyu 0:5ca227682ee7 186 tmp = dx;
lixianyu 0:5ca227682ee7 187 dx = dy;
lixianyu 0:5ca227682ee7 188 dy = tmp;
lixianyu 0:5ca227682ee7 189 tmp = x1;
lixianyu 0:5ca227682ee7 190 x1 = y1;
lixianyu 0:5ca227682ee7 191 y1 = tmp;
lixianyu 0:5ca227682ee7 192 tmp = x2;
lixianyu 0:5ca227682ee7 193 x2 = y2;
lixianyu 0:5ca227682ee7 194 y2 = tmp;
lixianyu 0:5ca227682ee7 195 }
lixianyu 0:5ca227682ee7 196 if ( x1 > x2 ) {
lixianyu 0:5ca227682ee7 197 tmp = x1;
lixianyu 0:5ca227682ee7 198 x1 = x2;
lixianyu 0:5ca227682ee7 199 x2 = tmp;
lixianyu 0:5ca227682ee7 200 tmp = y1;
lixianyu 0:5ca227682ee7 201 y1 = y2;
lixianyu 0:5ca227682ee7 202 y2 = tmp;
lixianyu 0:5ca227682ee7 203 }
lixianyu 0:5ca227682ee7 204 err = dx >> 1;
lixianyu 0:5ca227682ee7 205 if ( y2 > y1 ) ystep = 1;
lixianyu 0:5ca227682ee7 206 else ystep = -1;
lixianyu 0:5ca227682ee7 207 y = y1;
lixianyu 0:5ca227682ee7 208 for ( x = x1; x <= x2; x++ ) {
lixianyu 0:5ca227682ee7 209 if ( swapxy == 0 )
lixianyu 0:5ca227682ee7 210 setLed(x, y, 1);
lixianyu 0:5ca227682ee7 211 else
lixianyu 0:5ca227682ee7 212 setLed(y, x, 1);
lixianyu 0:5ca227682ee7 213 err -= (uint8_t)dy;
lixianyu 0:5ca227682ee7 214 if ( err < 0 ) {
lixianyu 0:5ca227682ee7 215 y += (uint8_t)ystep;
lixianyu 0:5ca227682ee7 216 err += (uint8_t)dx;
lixianyu 0:5ca227682ee7 217 }
lixianyu 0:5ca227682ee7 218 }
lixianyu 0:5ca227682ee7 219 }
lixianyu 0:5ca227682ee7 220
lixianyu 0:5ca227682ee7 221 void Matrix::drawCircle_section(int8_t x, int8_t y, int8_t x0, int8_t y0, uint8_t option)
lixianyu 0:5ca227682ee7 222 {
lixianyu 0:5ca227682ee7 223 /* upper right */
lixianyu 0:5ca227682ee7 224 if ( option & U8G_DRAW_UPPER_RIGHT ) {
lixianyu 0:5ca227682ee7 225 setLed(x0 + x, y0 - y, 1);
lixianyu 0:5ca227682ee7 226 setLed(x0 + y, y0 - x, 1);
lixianyu 0:5ca227682ee7 227 }
lixianyu 0:5ca227682ee7 228
lixianyu 0:5ca227682ee7 229 /* upper left */
lixianyu 0:5ca227682ee7 230 if ( option & U8G_DRAW_UPPER_LEFT ) {
lixianyu 0:5ca227682ee7 231 setLed(x0 - x, y0 - y, 1);
lixianyu 0:5ca227682ee7 232 setLed(x0 - y, y0 - x, 1);
lixianyu 0:5ca227682ee7 233 }
lixianyu 0:5ca227682ee7 234
lixianyu 0:5ca227682ee7 235 /* lower right */
lixianyu 0:5ca227682ee7 236 if ( option & U8G_DRAW_LOWER_RIGHT ) {
lixianyu 0:5ca227682ee7 237 setLed(x0 + x, y0 + y, 1);
lixianyu 0:5ca227682ee7 238 setLed(x0 + y, y0 + x, 1);
lixianyu 0:5ca227682ee7 239 }
lixianyu 0:5ca227682ee7 240
lixianyu 0:5ca227682ee7 241 /* lower left */
lixianyu 0:5ca227682ee7 242 if ( option & U8G_DRAW_LOWER_LEFT ) {
lixianyu 0:5ca227682ee7 243 setLed(x0 - x, y0 + y, 1);
lixianyu 0:5ca227682ee7 244 setLed(x0 - y, y0 + x, 1);
lixianyu 0:5ca227682ee7 245 }
lixianyu 0:5ca227682ee7 246 }
lixianyu 0:5ca227682ee7 247
lixianyu 0:5ca227682ee7 248 void Matrix::drawVLine(int8_t x, int8_t y, int8_t w)
lixianyu 0:5ca227682ee7 249 {
lixianyu 0:5ca227682ee7 250 if(w<=0)
lixianyu 0:5ca227682ee7 251 return;
lixianyu 0:5ca227682ee7 252
lixianyu 0:5ca227682ee7 253 while (w--) {
lixianyu 0:5ca227682ee7 254 setLed(x, y + w, 1);
lixianyu 0:5ca227682ee7 255 }
lixianyu 0:5ca227682ee7 256 }
lixianyu 0:5ca227682ee7 257
lixianyu 0:5ca227682ee7 258 void Matrix::drawHLine(int8_t x, int8_t y, int8_t h)
lixianyu 0:5ca227682ee7 259 {
lixianyu 0:5ca227682ee7 260 if(h<=0)
lixianyu 0:5ca227682ee7 261 return;
lixianyu 0:5ca227682ee7 262
lixianyu 0:5ca227682ee7 263 while (h--) {
lixianyu 0:5ca227682ee7 264 setLed(x + h, y, 1);
lixianyu 0:5ca227682ee7 265 }
lixianyu 0:5ca227682ee7 266 }
lixianyu 0:5ca227682ee7 267
lixianyu 0:5ca227682ee7 268 void Matrix::drawDisc_section(int8_t x, int8_t y, int8_t x0, int8_t y0, uint8_t option)
lixianyu 0:5ca227682ee7 269 {
lixianyu 0:5ca227682ee7 270 /* upper right */
lixianyu 0:5ca227682ee7 271 if ( option & U8G_DRAW_UPPER_RIGHT ) {
lixianyu 0:5ca227682ee7 272 drawVLine(x0 + x, y0 - y, y + 1);
lixianyu 0:5ca227682ee7 273 drawVLine(x0 + y, y0 - x, x + 1);
lixianyu 0:5ca227682ee7 274 }
lixianyu 0:5ca227682ee7 275
lixianyu 0:5ca227682ee7 276 /* upper left */
lixianyu 0:5ca227682ee7 277 if ( option & U8G_DRAW_UPPER_LEFT ) {
lixianyu 0:5ca227682ee7 278 drawVLine(x0 - x, y0 - y, y + 1);
lixianyu 0:5ca227682ee7 279 drawVLine(x0 - y, y0 - x, x + 1);
lixianyu 0:5ca227682ee7 280 }
lixianyu 0:5ca227682ee7 281
lixianyu 0:5ca227682ee7 282 /* lower right */
lixianyu 0:5ca227682ee7 283 if ( option & U8G_DRAW_LOWER_RIGHT ) {
lixianyu 0:5ca227682ee7 284 drawVLine(x0 + x, y0, y + 1);
lixianyu 0:5ca227682ee7 285 drawVLine(x0 + y, y0, x + 1);
lixianyu 0:5ca227682ee7 286 }
lixianyu 0:5ca227682ee7 287
lixianyu 0:5ca227682ee7 288 /* lower left */
lixianyu 0:5ca227682ee7 289 if ( option & U8G_DRAW_LOWER_LEFT ) {
lixianyu 0:5ca227682ee7 290 drawVLine(x0 - x, y0, y + 1);
lixianyu 0:5ca227682ee7 291 drawVLine(x0 - y, y0, x + 1);
lixianyu 0:5ca227682ee7 292 }
lixianyu 0:5ca227682ee7 293 }
lixianyu 0:5ca227682ee7 294
lixianyu 0:5ca227682ee7 295 void Matrix::drawCircle(int8_t x0, int8_t y0, int8_t rad, int8_t option)
lixianyu 0:5ca227682ee7 296 {
lixianyu 0:5ca227682ee7 297 if(rad<=0)
lixianyu 0:5ca227682ee7 298 return;
lixianyu 0:5ca227682ee7 299
lixianyu 0:5ca227682ee7 300 int8_t f;
lixianyu 0:5ca227682ee7 301 int8_t ddF_x;
lixianyu 0:5ca227682ee7 302 int8_t ddF_y;
lixianyu 0:5ca227682ee7 303 uint8_t x;
lixianyu 0:5ca227682ee7 304 uint8_t y;
lixianyu 0:5ca227682ee7 305
lixianyu 0:5ca227682ee7 306 f = 1;
lixianyu 0:5ca227682ee7 307 f -= rad;
lixianyu 0:5ca227682ee7 308 ddF_x = 1;
lixianyu 0:5ca227682ee7 309 ddF_y = 0;
lixianyu 0:5ca227682ee7 310 ddF_y -= rad;
lixianyu 0:5ca227682ee7 311 ddF_y *= 2;
lixianyu 0:5ca227682ee7 312 x = 0;
lixianyu 0:5ca227682ee7 313 y = rad;
lixianyu 0:5ca227682ee7 314
lixianyu 0:5ca227682ee7 315 drawCircle_section(x, y, x0, y0, option);
lixianyu 0:5ca227682ee7 316
lixianyu 0:5ca227682ee7 317 while ( x < y ) {
lixianyu 0:5ca227682ee7 318 if (f >= 0) {
lixianyu 0:5ca227682ee7 319 y--;
lixianyu 0:5ca227682ee7 320 ddF_y += 2;
lixianyu 0:5ca227682ee7 321 f += ddF_y;
lixianyu 0:5ca227682ee7 322 }
lixianyu 0:5ca227682ee7 323 x++;
lixianyu 0:5ca227682ee7 324 ddF_x += 2;
lixianyu 0:5ca227682ee7 325 f += ddF_x;
lixianyu 0:5ca227682ee7 326
lixianyu 0:5ca227682ee7 327 drawCircle_section(x, y, x0, y0, option);
lixianyu 0:5ca227682ee7 328 }
lixianyu 0:5ca227682ee7 329 }
lixianyu 0:5ca227682ee7 330
lixianyu 0:5ca227682ee7 331 void Matrix::drawDisc(int8_t x0, int8_t y0, int8_t rad, int8_t option)
lixianyu 0:5ca227682ee7 332 {
lixianyu 0:5ca227682ee7 333 if(rad<=0)
lixianyu 0:5ca227682ee7 334 return;
lixianyu 0:5ca227682ee7 335
lixianyu 0:5ca227682ee7 336 int8_t f;
lixianyu 0:5ca227682ee7 337 int8_t ddF_x;
lixianyu 0:5ca227682ee7 338 int8_t ddF_y;
lixianyu 0:5ca227682ee7 339 uint8_t x;
lixianyu 0:5ca227682ee7 340 uint8_t y;
lixianyu 0:5ca227682ee7 341
lixianyu 0:5ca227682ee7 342 f = 1;
lixianyu 0:5ca227682ee7 343 f -= rad;
lixianyu 0:5ca227682ee7 344 ddF_x = 1;
lixianyu 0:5ca227682ee7 345 ddF_y = 0;
lixianyu 0:5ca227682ee7 346 ddF_y -= rad;
lixianyu 0:5ca227682ee7 347 ddF_y *= 2;
lixianyu 0:5ca227682ee7 348 x = 0;
lixianyu 0:5ca227682ee7 349 y = rad;
lixianyu 0:5ca227682ee7 350
lixianyu 0:5ca227682ee7 351 drawDisc_section(x, y, x0, y0, option);
lixianyu 0:5ca227682ee7 352
lixianyu 0:5ca227682ee7 353 while ( x < y ) {
lixianyu 0:5ca227682ee7 354 if (f >= 0) {
lixianyu 0:5ca227682ee7 355 y--;
lixianyu 0:5ca227682ee7 356 ddF_y += 2;
lixianyu 0:5ca227682ee7 357 f += ddF_y;
lixianyu 0:5ca227682ee7 358 }
lixianyu 0:5ca227682ee7 359 x++;
lixianyu 0:5ca227682ee7 360 ddF_x += 2;
lixianyu 0:5ca227682ee7 361 f += ddF_x;
lixianyu 0:5ca227682ee7 362
lixianyu 0:5ca227682ee7 363 drawDisc_section(x, y, x0, y0, option);
lixianyu 0:5ca227682ee7 364 }
lixianyu 0:5ca227682ee7 365 }
lixianyu 0:5ca227682ee7 366
lixianyu 0:5ca227682ee7 367 void Matrix::drawFrame(int8_t x, int8_t y, int8_t w, int8_t h)
lixianyu 0:5ca227682ee7 368 {
lixianyu 0:5ca227682ee7 369 if(h<=0 || w<=0)
lixianyu 0:5ca227682ee7 370 return;
lixianyu 0:5ca227682ee7 371
lixianyu 0:5ca227682ee7 372 int8_t xtmp = x;
lixianyu 0:5ca227682ee7 373
lixianyu 0:5ca227682ee7 374 drawHLine(x, y, w);
lixianyu 0:5ca227682ee7 375 drawVLine(x, y, h);
lixianyu 0:5ca227682ee7 376 x+=w;
lixianyu 0:5ca227682ee7 377 x--;
lixianyu 0:5ca227682ee7 378 drawVLine(x, y, h);
lixianyu 0:5ca227682ee7 379 y+=h;
lixianyu 0:5ca227682ee7 380 y--;
lixianyu 0:5ca227682ee7 381 drawHLine(xtmp, y, w);
lixianyu 0:5ca227682ee7 382 }
lixianyu 0:5ca227682ee7 383
lixianyu 0:5ca227682ee7 384 void Matrix::drawRFrame(int8_t x, int8_t y, int8_t w, int8_t h, uint8_t r)
lixianyu 0:5ca227682ee7 385 {
lixianyu 0:5ca227682ee7 386 if(h<3 || w<3)
lixianyu 0:5ca227682ee7 387 return;
lixianyu 0:5ca227682ee7 388
lixianyu 0:5ca227682ee7 389 if(r>(w-2)/2 || r>(h-2)/2)
lixianyu 0:5ca227682ee7 390 r = min((h-2)/2,(w-2)/2);
lixianyu 0:5ca227682ee7 391
lixianyu 0:5ca227682ee7 392 int8_t xl, yu;
lixianyu 0:5ca227682ee7 393 xl = x;
lixianyu 0:5ca227682ee7 394 xl += r;
lixianyu 0:5ca227682ee7 395 yu = y;
lixianyu 0:5ca227682ee7 396 yu += r;
lixianyu 0:5ca227682ee7 397
lixianyu 0:5ca227682ee7 398 {
lixianyu 0:5ca227682ee7 399 int8_t yl, xr;
lixianyu 0:5ca227682ee7 400
lixianyu 0:5ca227682ee7 401 xr = x;
lixianyu 0:5ca227682ee7 402 xr += w;
lixianyu 0:5ca227682ee7 403 xr -= r;
lixianyu 0:5ca227682ee7 404 xr -= 1;
lixianyu 0:5ca227682ee7 405
lixianyu 0:5ca227682ee7 406 yl = y;
lixianyu 0:5ca227682ee7 407 yl += h;
lixianyu 0:5ca227682ee7 408 yl -= r;
lixianyu 0:5ca227682ee7 409 yl -= 1;
lixianyu 0:5ca227682ee7 410
lixianyu 0:5ca227682ee7 411 drawCircle(xl, yu, r, U8G_DRAW_UPPER_LEFT);
lixianyu 0:5ca227682ee7 412 drawCircle(xr, yu, r, U8G_DRAW_UPPER_RIGHT);
lixianyu 0:5ca227682ee7 413 drawCircle(xl, yl, r, U8G_DRAW_LOWER_LEFT);
lixianyu 0:5ca227682ee7 414 drawCircle(xr, yl, r, U8G_DRAW_LOWER_RIGHT);
lixianyu 0:5ca227682ee7 415 }
lixianyu 0:5ca227682ee7 416
lixianyu 0:5ca227682ee7 417 {
lixianyu 0:5ca227682ee7 418 int8_t ww, hh;
lixianyu 0:5ca227682ee7 419
lixianyu 0:5ca227682ee7 420 ww = w;
lixianyu 0:5ca227682ee7 421 ww -= r;
lixianyu 0:5ca227682ee7 422 ww -= r;
lixianyu 0:5ca227682ee7 423 ww -= 2;
lixianyu 0:5ca227682ee7 424 hh = h;
lixianyu 0:5ca227682ee7 425 hh -= r;
lixianyu 0:5ca227682ee7 426 hh -= r;
lixianyu 0:5ca227682ee7 427 hh -= 2;
lixianyu 0:5ca227682ee7 428
lixianyu 0:5ca227682ee7 429 xl++;
lixianyu 0:5ca227682ee7 430 yu++;
lixianyu 0:5ca227682ee7 431 h--;
lixianyu 0:5ca227682ee7 432 w--;
lixianyu 0:5ca227682ee7 433 drawHLine(xl, y, ww);
lixianyu 0:5ca227682ee7 434 drawHLine(xl, y+h, ww);
lixianyu 0:5ca227682ee7 435 drawVLine(x, yu, hh);
lixianyu 0:5ca227682ee7 436 drawVLine(x+w, yu, hh);
lixianyu 0:5ca227682ee7 437 }
lixianyu 0:5ca227682ee7 438 }
lixianyu 0:5ca227682ee7 439
lixianyu 0:5ca227682ee7 440 void Matrix::drawBox(int8_t x, int8_t y, int8_t w, int8_t h)
lixianyu 0:5ca227682ee7 441 {
lixianyu 0:5ca227682ee7 442 if(h<=0 || w<=0)
lixianyu 0:5ca227682ee7 443 return;
lixianyu 0:5ca227682ee7 444
lixianyu 0:5ca227682ee7 445 do {
lixianyu 0:5ca227682ee7 446 drawHLine(x, y, w);
lixianyu 0:5ca227682ee7 447 y++;
lixianyu 0:5ca227682ee7 448 h--;
lixianyu 0:5ca227682ee7 449 } while( h != 0 );
lixianyu 0:5ca227682ee7 450 }
lixianyu 0:5ca227682ee7 451
lixianyu 0:5ca227682ee7 452 void Matrix::drawRBox(int8_t x, int8_t y, int8_t w, int8_t h, uint8_t r)
lixianyu 0:5ca227682ee7 453 {
lixianyu 0:5ca227682ee7 454 if(h<3 || w<3)
lixianyu 0:5ca227682ee7 455 return;
lixianyu 0:5ca227682ee7 456
lixianyu 0:5ca227682ee7 457 if(r>(w-2)/2 || r>(h-2)/2)
lixianyu 0:5ca227682ee7 458 r=min((h-2)/2,(w-2)/2);
lixianyu 0:5ca227682ee7 459
lixianyu 0:5ca227682ee7 460 int8_t xl, yu;
lixianyu 0:5ca227682ee7 461 int8_t yl, xr;
lixianyu 0:5ca227682ee7 462
lixianyu 0:5ca227682ee7 463
lixianyu 0:5ca227682ee7 464 xl = x;
lixianyu 0:5ca227682ee7 465 xl += r;
lixianyu 0:5ca227682ee7 466 yu = y;
lixianyu 0:5ca227682ee7 467 yu += r;
lixianyu 0:5ca227682ee7 468
lixianyu 0:5ca227682ee7 469 xr = x;
lixianyu 0:5ca227682ee7 470 xr += w;
lixianyu 0:5ca227682ee7 471 xr -= r;
lixianyu 0:5ca227682ee7 472 xr -= 1;
lixianyu 0:5ca227682ee7 473
lixianyu 0:5ca227682ee7 474 yl = y;
lixianyu 0:5ca227682ee7 475 yl += h;
lixianyu 0:5ca227682ee7 476 yl -= r;
lixianyu 0:5ca227682ee7 477 yl -= 1;
lixianyu 0:5ca227682ee7 478
lixianyu 0:5ca227682ee7 479 drawDisc(xl, yu, r, U8G_DRAW_UPPER_LEFT);
lixianyu 0:5ca227682ee7 480 drawDisc(xr, yu, r, U8G_DRAW_UPPER_RIGHT);
lixianyu 0:5ca227682ee7 481 drawDisc(xl, yl, r, U8G_DRAW_LOWER_LEFT);
lixianyu 0:5ca227682ee7 482 drawDisc(xr, yl, r, U8G_DRAW_LOWER_RIGHT);
lixianyu 0:5ca227682ee7 483
lixianyu 0:5ca227682ee7 484 {
lixianyu 0:5ca227682ee7 485 int8_t ww, hh;
lixianyu 0:5ca227682ee7 486
lixianyu 0:5ca227682ee7 487 ww = w;
lixianyu 0:5ca227682ee7 488 ww -= r;
lixianyu 0:5ca227682ee7 489 ww -= r;
lixianyu 0:5ca227682ee7 490 ww -= 2;
lixianyu 0:5ca227682ee7 491 hh = h;
lixianyu 0:5ca227682ee7 492 hh -= r;
lixianyu 0:5ca227682ee7 493 hh -= r;
lixianyu 0:5ca227682ee7 494 hh -= 2;
lixianyu 0:5ca227682ee7 495
lixianyu 0:5ca227682ee7 496 xl++;
lixianyu 0:5ca227682ee7 497 yu++;
lixianyu 0:5ca227682ee7 498 h--;
lixianyu 0:5ca227682ee7 499 drawBox(xl, y, ww, r+1);
lixianyu 0:5ca227682ee7 500 drawBox(xl, yl, ww, r+1);
lixianyu 0:5ca227682ee7 501 // drawHLine(xl, y+h, ww);
lixianyu 0:5ca227682ee7 502 drawBox(x, yu, w, hh);
lixianyu 0:5ca227682ee7 503 // drawVLine(x+w, yu, hh);
lixianyu 0:5ca227682ee7 504 }
lixianyu 0:5ca227682ee7 505 }
lixianyu 0:5ca227682ee7 506
lixianyu 0:5ca227682ee7 507 void Matrix::drawBMP(int16_t x, int16_t y, int16_t w, int16_t h,const uint8_t *bitmap)
lixianyu 0:5ca227682ee7 508 {
lixianyu 0:5ca227682ee7 509 int16_t i, j, byteWidth = (w + 7) / 8;
lixianyu 0:5ca227682ee7 510
lixianyu 0:5ca227682ee7 511 for(j=0; j<h; j++) {
lixianyu 0:5ca227682ee7 512 for(i=0; i<w; i++ ) {
lixianyu 0:5ca227682ee7 513 #if 0
lixianyu 0:5ca227682ee7 514 if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> ((h-i-1) & 7))) {
lixianyu 0:5ca227682ee7 515 setLed(x+i, y+j, 1);
lixianyu 0:5ca227682ee7 516 }
lixianyu 0:5ca227682ee7 517 #else
lixianyu 0:5ca227682ee7 518 if (bitmap[j * byteWidth + i / 8] & (128 >> ((h-i-1) & 7))) {
lixianyu 0:5ca227682ee7 519 setLed(x+i, y+j, 1);
lixianyu 0:5ca227682ee7 520 }
lixianyu 0:5ca227682ee7 521 #endif
lixianyu 0:5ca227682ee7 522 }
lixianyu 0:5ca227682ee7 523 }
lixianyu 0:5ca227682ee7 524 }
lixianyu 0:5ca227682ee7 525
lixianyu 0:5ca227682ee7 526 bool Matrix::drawBMP(int16_t x, int16_t y, const uint8_t *bitmap)
lixianyu 0:5ca227682ee7 527 {
lixianyu 0:5ca227682ee7 528 uint32_t _dataNum = 0;
lixianyu 0:5ca227682ee7 529 uint8_t _dataBuffer[BUFFPIXEL]; //pixel buffer (R+G+B per pixel)
lixianyu 0:5ca227682ee7 530
lixianyu 0:5ca227682ee7 531 //Parse BMP header
lixianyu 0:5ca227682ee7 532 if (read16((uint8_t*)bitmap, _dataNum) == 0x4D42) { //BMP signature
lixianyu 0:5ca227682ee7 533 (void)read32((uint8_t*)bitmap, _dataNum); //File size
lixianyu 0:5ca227682ee7 534 (void)read32((uint8_t*)bitmap, _dataNum); //Read & ignore creator bytes
lixianyu 0:5ca227682ee7 535 uint32_t bmpImageoffset = read32((uint8_t*)bitmap, _dataNum); //Start of image data in file
lixianyu 0:5ca227682ee7 536 //Read DIB header
lixianyu 0:5ca227682ee7 537 (void)read32((uint8_t*)bitmap, _dataNum); //Header size
lixianyu 0:5ca227682ee7 538 int bmpWidth = read32((uint8_t*)bitmap, _dataNum),
lixianyu 0:5ca227682ee7 539 bmpHeight = read32((uint8_t*)bitmap, _dataNum);
lixianyu 0:5ca227682ee7 540
lixianyu 0:5ca227682ee7 541 bool flip = true; //BMP is stored bottom-to-top
lixianyu 0:5ca227682ee7 542 //If bmpHeight is negative, image is in top-down order.
lixianyu 0:5ca227682ee7 543 if (bmpHeight < 0) {
lixianyu 0:5ca227682ee7 544 bmpHeight = -bmpHeight;
lixianyu 0:5ca227682ee7 545 flip = false;
lixianyu 0:5ca227682ee7 546 }
lixianyu 0:5ca227682ee7 547
lixianyu 0:5ca227682ee7 548 if (read16((uint8_t*)bitmap, _dataNum) == 1) { //# planes -- must be '1'
lixianyu 0:5ca227682ee7 549 uint8_t bmpDepth = read16((uint8_t*)bitmap, _dataNum); //Bit depth (currently must be 24)
lixianyu 0:5ca227682ee7 550 if ((bmpDepth == 24) && (read32((uint8_t*)bitmap, _dataNum) == 0)) { //0 = uncompressed
lixianyu 0:5ca227682ee7 551 //BMP rows are padded (if needed) to 4-byte boundary
lixianyu 0:5ca227682ee7 552 uint32_t rowSize = (bmpWidth * 3 + 3) & ~3; //Not always = bmpWidth; may have padding
lixianyu 0:5ca227682ee7 553
lixianyu 0:5ca227682ee7 554 //Crop area to be loaded
lixianyu 0:5ca227682ee7 555 int w = bmpWidth,
lixianyu 0:5ca227682ee7 556 h = bmpHeight;
lixianyu 0:5ca227682ee7 557
lixianyu 0:5ca227682ee7 558 if ((x + w - 1) >= (getWidth() * 8)) w = (getWidth() * 8) - x;
lixianyu 0:5ca227682ee7 559 if ((y + h - 1) >= (getHeight() * 8)) h = (getHeight() * 8) - y;
lixianyu 0:5ca227682ee7 560
lixianyu 0:5ca227682ee7 561 for (int row = 0; row < h; row++) { //For each scanline...
lixianyu 0:5ca227682ee7 562 uint32_t pos = bmpImageoffset + (flip ? (bmpHeight - 1 - row) : row) * rowSize ;
lixianyu 0:5ca227682ee7 563 uint8_t buffidx = sizeof(_dataBuffer); //Current position in _dataBuffer
lixianyu 0:5ca227682ee7 564 for (int col = 0; col < w; col++) { //For each pixel...
lixianyu 0:5ca227682ee7 565 //Time to read more pixel data?
lixianyu 0:5ca227682ee7 566 if (buffidx >= sizeof(_dataBuffer)) { //Indeed
lixianyu 0:5ca227682ee7 567 buffidx = 0; //Set index to beginning
lixianyu 0:5ca227682ee7 568 for (int a = 0; a < BUFFPIXEL; a++) {
lixianyu 0:5ca227682ee7 569 _dataBuffer[a] = pgm_read_byte((uint8_t*)bitmap + (pos + a));
lixianyu 0:5ca227682ee7 570 }
lixianyu 0:5ca227682ee7 571 }
lixianyu 0:5ca227682ee7 572
lixianyu 0:5ca227682ee7 573 uint8_t _b = _dataBuffer[buffidx++],
lixianyu 0:5ca227682ee7 574 _g = _dataBuffer[buffidx++],
lixianyu 0:5ca227682ee7 575 _r = _dataBuffer[buffidx++];
lixianyu 0:5ca227682ee7 576 setLedColor(col + x, row + y, _r, _g, _b);
lixianyu 0:5ca227682ee7 577 } //end pixel
lixianyu 0:5ca227682ee7 578 } //end scanline
lixianyu 0:5ca227682ee7 579 } //end goodBmp
lixianyu 0:5ca227682ee7 580 else {
lixianyu 0:5ca227682ee7 581 return false;
lixianyu 0:5ca227682ee7 582 }
lixianyu 0:5ca227682ee7 583 }//end planes
lixianyu 0:5ca227682ee7 584 else {
lixianyu 0:5ca227682ee7 585 return false;
lixianyu 0:5ca227682ee7 586 }
lixianyu 0:5ca227682ee7 587 }//end sianatrue
lixianyu 0:5ca227682ee7 588 else {
lixianyu 0:5ca227682ee7 589 return false;
lixianyu 0:5ca227682ee7 590 }
lixianyu 0:5ca227682ee7 591 return true;
lixianyu 0:5ca227682ee7 592 }
lixianyu 0:5ca227682ee7 593
lixianyu 0:5ca227682ee7 594 void Matrix::writeString(char* _c, bool _m, uint16_t _t, int16_t _xy)
lixianyu 0:5ca227682ee7 595 {
lixianyu 0:5ca227682ee7 596 setFontMode(_m);
lixianyu 0:5ca227682ee7 597 int c1 = (_m ? getWidth() : getHeight()) * 8;
lixianyu 0:5ca227682ee7 598 int c2 = -(_m ? getStringWidth(_c) : getStringHeight(_c)) - c1;
lixianyu 0:5ca227682ee7 599 for (int a = c1; a > c2; a--) {
lixianyu 0:5ca227682ee7 600 setCursor((_m ? a : _xy), (_m ? _xy : a));
lixianyu 0:5ca227682ee7 601 print(_c);
lixianyu 0:5ca227682ee7 602 wait_ms(_t);
lixianyu 0:5ca227682ee7 603 #ifdef WDT
lixianyu 0:5ca227682ee7 604 //wdt_reset();
lixianyu 0:5ca227682ee7 605 #endif
lixianyu 0:5ca227682ee7 606 }
lixianyu 0:5ca227682ee7 607 }
lixianyu 0:5ca227682ee7 608
lixianyu 0:5ca227682ee7 609 size_t Matrix::write(uint8_t c)
lixianyu 0:5ca227682ee7 610 {
lixianyu 0:5ca227682ee7 611 if (CharToInt(c) > 94 || CharToInt(c) < 0)
lixianyu 0:5ca227682ee7 612 return 0;
lixianyu 0:5ca227682ee7 613
lixianyu 0:5ca227682ee7 614 for (int a = 0; a < getMatrixNum(); a++)
lixianyu 0:5ca227682ee7 615 led[a].write(c);
lixianyu 0:5ca227682ee7 616
lixianyu 0:5ca227682ee7 617 return 1;
lixianyu 0:5ca227682ee7 618 /* void Matrix::print(char* _c) {
lixianyu 0:5ca227682ee7 619 for (int a = 0; a < this->_matrixNum; a++)
lixianyu 0:5ca227682ee7 620 led[a].print(_c);
lixianyu 0:5ca227682ee7 621 } */
lixianyu 0:5ca227682ee7 622 }
lixianyu 0:5ca227682ee7 623
lixianyu 0:5ca227682ee7 624 int16_t Matrix::getStringWidth(char * _String)
lixianyu 0:5ca227682ee7 625 {
lixianyu 0:5ca227682ee7 626 // return (uint32_t)(offset + millis() / 1000);
lixianyu 0:5ca227682ee7 627 int _leng = 0;
lixianyu 0:5ca227682ee7 628 int _Width = 0;
lixianyu 0:5ca227682ee7 629 while (_String[_leng] != NULL) {
lixianyu 0:5ca227682ee7 630 #if 0
lixianyu 1:14b7c3a3ec60 631 _Width += 1 + pgm_read_byte(alphabetBitmap[(_String[_leng] - 32)] + FONE_SIZE_X);
lixianyu 0:5ca227682ee7 632 #else
lixianyu 0:5ca227682ee7 633 //_Width += (1 + alphabetBitmap[((int)_String[_leng] - 32)] + FONE_SIZE_X);
lixianyu 0:5ca227682ee7 634 _Width += 1 + FONE_SIZE_X;
lixianyu 0:5ca227682ee7 635 #endif
lixianyu 0:5ca227682ee7 636 _leng++;
lixianyu 0:5ca227682ee7 637 }
lixianyu 0:5ca227682ee7 638 return _Width;
lixianyu 0:5ca227682ee7 639 }
lixianyu 0:5ca227682ee7 640
lixianyu 0:5ca227682ee7 641 int16_t Matrix::getStringHeight(char* _String)
lixianyu 0:5ca227682ee7 642 {
lixianyu 0:5ca227682ee7 643 // return (uint32_t)(offset + millis() / 1000);
lixianyu 0:5ca227682ee7 644 int _leng = 0;
lixianyu 0:5ca227682ee7 645 int _Height = 0;
lixianyu 0:5ca227682ee7 646 while (_String[_leng] != NULL) {
lixianyu 0:5ca227682ee7 647 _Height += 1 + FONE_SIZE_Y;
lixianyu 0:5ca227682ee7 648 _leng++;
lixianyu 0:5ca227682ee7 649 }
lixianyu 0:5ca227682ee7 650 return _Height;
lixianyu 0:5ca227682ee7 651 }
lixianyu 0:5ca227682ee7 652
lixianyu 0:5ca227682ee7 653 int16_t Matrix::getMatrixNum()
lixianyu 0:5ca227682ee7 654 {
lixianyu 0:5ca227682ee7 655 return this->_matrixNum;
lixianyu 0:5ca227682ee7 656 }
lixianyu 0:5ca227682ee7 657
lixianyu 0:5ca227682ee7 658 int16_t Matrix::getWidth()
lixianyu 0:5ca227682ee7 659 {
lixianyu 0:5ca227682ee7 660 return this->_numX;
lixianyu 0:5ca227682ee7 661 }
lixianyu 0:5ca227682ee7 662
lixianyu 0:5ca227682ee7 663 int16_t Matrix::getHeight()
lixianyu 0:5ca227682ee7 664 {
lixianyu 0:5ca227682ee7 665 return this->_numY;
lixianyu 0:5ca227682ee7 666 }