Baby-Foot / Mbed 2 deprecated PanneauLED_2021

Dependencies:   mbed

Committer:
yanissk
Date:
Tue Jan 19 17:58:03 2021 +0000
Revision:
0:4c2681e58186
PanneauLED_2021

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yanissk 0:4c2681e58186 1 #include "LEDMatrix.h"
yanissk 0:4c2681e58186 2 #include "mbed.h"
yanissk 0:4c2681e58186 3
yanissk 0:4c2681e58186 4 LEDMatrix::LEDMatrix(PinName pinA, PinName pinB, PinName pinC, PinName pinD, PinName pinOE,
yanissk 0:4c2681e58186 5 PinName pinR1, PinName pinR2, PinName pinB1, PinName pinB2, PinName pinG1, PinName pinG2,
yanissk 0:4c2681e58186 6 PinName pinSTB, PinName pinCLK) :
yanissk 0:4c2681e58186 7 oe(pinOE), stb(pinSTB), clk(pinCLK),
yanissk 0:4c2681e58186 8 _row(pinA, pinB, pinC, pinD), _rgb1(pinR1, pinG1, pinB1), _rgb2(pinR2, pinG2, pinB2)
yanissk 0:4c2681e58186 9 {
yanissk 0:4c2681e58186 10 clk = 0;
yanissk 0:4c2681e58186 11 oe = 1;
yanissk 0:4c2681e58186 12 stb = 1;
yanissk 0:4c2681e58186 13 mask = 0xff;
yanissk 0:4c2681e58186 14 state = 0;
yanissk 0:4c2681e58186 15 bufferIndex = 0;
yanissk 0:4c2681e58186 16 flagSwap = 0;
yanissk 0:4c2681e58186 17 nbImages = 0;
yanissk 0:4c2681e58186 18 }
yanissk 0:4c2681e58186 19
yanissk 0:4c2681e58186 20 void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
yanissk 0:4c2681e58186 21 {
yanissk 0:4c2681e58186 22 this->displaybuf = displaybuf;
yanissk 0:4c2681e58186 23 memoBuf = displaybuf;
yanissk 0:4c2681e58186 24 drawBuf = memoBuf + width * height;
yanissk 0:4c2681e58186 25 this->width = width;
yanissk 0:4c2681e58186 26 this->height = height;
yanissk 0:4c2681e58186 27
yanissk 0:4c2681e58186 28 state = 1;
yanissk 0:4c2681e58186 29 }
yanissk 0:4c2681e58186 30
yanissk 0:4c2681e58186 31 void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel)
yanissk 0:4c2681e58186 32 {
yanissk 0:4c2681e58186 33 if (x>=width) return;
yanissk 0:4c2681e58186 34 if (y>=height) return;
yanissk 0:4c2681e58186 35 drawBuf[x+ width * y] = pixel & 0x07;
yanissk 0:4c2681e58186 36 }
yanissk 0:4c2681e58186 37
yanissk 0:4c2681e58186 38 void LEDMatrix::drawRect(int x1, int y1, int x2, int y2, uint8_t pixel)
yanissk 0:4c2681e58186 39 {
yanissk 0:4c2681e58186 40 for (int x = x1; x < x2; x++) {
yanissk 0:4c2681e58186 41 for (int y = y1; y < y2; y++) {
yanissk 0:4c2681e58186 42 drawPoint((uint16_t)x, (uint16_t)y, pixel);
yanissk 0:4c2681e58186 43 }
yanissk 0:4c2681e58186 44 }
yanissk 0:4c2681e58186 45 }
yanissk 0:4c2681e58186 46
yanissk 0:4c2681e58186 47 int LEDMatrix::drawChar(int x, int y, char c, uint8_t pixel, int font)
yanissk 0:4c2681e58186 48 {
yanissk 0:4c2681e58186 49 int i, j,k, col, max = 0;
yanissk 0:4c2681e58186 50 const Font *fptr = Font::getFont(font);
yanissk 0:4c2681e58186 51 for (i=0; i<fptr->hauteur(); i++) {
yanissk 0:4c2681e58186 52 for (k=0; k<fptr->largeur(); k++) {
yanissk 0:4c2681e58186 53 col = fptr->octet(c, i, k);
yanissk 0:4c2681e58186 54 for (j=8; j>=0; j--) {
yanissk 0:4c2681e58186 55 if (col & 0x01 != 0) {
yanissk 0:4c2681e58186 56 int dx = j+8*k;
yanissk 0:4c2681e58186 57 if (dx > max) max = dx;
yanissk 0:4c2681e58186 58 drawPoint((uint16_t)(x + dx), (uint16_t)(y+i), pixel);
yanissk 0:4c2681e58186 59 }
yanissk 0:4c2681e58186 60 col = col >> 1;
yanissk 0:4c2681e58186 61 }
yanissk 0:4c2681e58186 62 }
yanissk 0:4c2681e58186 63 }
yanissk 0:4c2681e58186 64 if (c==' ') {
yanissk 0:4c2681e58186 65 return 5*fptr->largeur();
yanissk 0:4c2681e58186 66 } else {
yanissk 0:4c2681e58186 67 return max + fptr->largeur();
yanissk 0:4c2681e58186 68 }
yanissk 0:4c2681e58186 69 }
yanissk 0:4c2681e58186 70
yanissk 0:4c2681e58186 71
yanissk 0:4c2681e58186 72 void LEDMatrix::drawCharString (int x, int y, char *c, uint8_t pixel, int font)
yanissk 0:4c2681e58186 73 {
yanissk 0:4c2681e58186 74 int i=0;
yanissk 0:4c2681e58186 75 while(c[i] != '\0') {
yanissk 0:4c2681e58186 76 int dx = drawChar(x,y,c[i],pixel,font);
yanissk 0:4c2681e58186 77 i++;
yanissk 0:4c2681e58186 78 x += dx;
yanissk 0:4c2681e58186 79 }
yanissk 0:4c2681e58186 80 }
yanissk 0:4c2681e58186 81
yanissk 0:4c2681e58186 82
yanissk 0:4c2681e58186 83 void LEDMatrix::drawImage(int x, int y, uint8_t w, uint8_t h, uint8_t *image)
yanissk 0:4c2681e58186 84 {
yanissk 0:4c2681e58186 85 for (int i = 0; i < h; i++) {
yanissk 0:4c2681e58186 86 for (int j = 0; j < w; j++) {
yanissk 0:4c2681e58186 87 drawPoint(x+j, y+i, *image);
yanissk 0:4c2681e58186 88 image++;
yanissk 0:4c2681e58186 89 }
yanissk 0:4c2681e58186 90 }
yanissk 0:4c2681e58186 91 }
yanissk 0:4c2681e58186 92
yanissk 0:4c2681e58186 93 void LEDMatrix::drawArt(artDisplay * art)
yanissk 0:4c2681e58186 94 {
yanissk 0:4c2681e58186 95 this->drawImage(art->offset_x,art->offset_y,art->width,art->height,(uint8_t *)art->art);
yanissk 0:4c2681e58186 96 }
yanissk 0:4c2681e58186 97
yanissk 0:4c2681e58186 98 void LEDMatrix::drawArtAnim(artAnim * anim)
yanissk 0:4c2681e58186 99 {
yanissk 0:4c2681e58186 100 for(int i=0; i < anim->steps; i++)
yanissk 0:4c2681e58186 101 {
yanissk 0:4c2681e58186 102 this->clear();
yanissk 0:4c2681e58186 103 this->drawArt(&anim->arts[i]);
yanissk 0:4c2681e58186 104 this->swap();
yanissk 0:4c2681e58186 105 while (!this->synchro());
yanissk 0:4c2681e58186 106 wait_ms(anim->arts[i].duration);
yanissk 0:4c2681e58186 107 }
yanissk 0:4c2681e58186 108 }
yanissk 0:4c2681e58186 109
yanissk 0:4c2681e58186 110 void LEDMatrix::drawShiftAnim(artDisplay * art){
yanissk 0:4c2681e58186 111
yanissk 0:4c2681e58186 112 for(int i=0; i < 33; i++)
yanissk 0:4c2681e58186 113 {
yanissk 0:4c2681e58186 114 this->clear();
yanissk 0:4c2681e58186 115 this->drawImage(32-i, art->offset_y, art->width, art->height, (uint8_t *)art->art);
yanissk 0:4c2681e58186 116 this->swap();
yanissk 0:4c2681e58186 117 while (!this->synchro());
yanissk 0:4c2681e58186 118 wait_ms(60);
yanissk 0:4c2681e58186 119 }
yanissk 0:4c2681e58186 120 wait_ms(500);
yanissk 0:4c2681e58186 121 this->clear();
yanissk 0:4c2681e58186 122 this->swap();
yanissk 0:4c2681e58186 123
yanissk 0:4c2681e58186 124 wait_ms(500);
yanissk 0:4c2681e58186 125 this->drawImage(32, art->offset_y, art->width, art->height, (uint8_t *)art->art);
yanissk 0:4c2681e58186 126 this->swap();
yanissk 0:4c2681e58186 127
yanissk 0:4c2681e58186 128 wait_ms(500);
yanissk 0:4c2681e58186 129 this->clear();
yanissk 0:4c2681e58186 130 this->swap();
yanissk 0:4c2681e58186 131
yanissk 0:4c2681e58186 132 wait_ms(500);
yanissk 0:4c2681e58186 133 this->drawImage(32, art->offset_y, art->width, art->height, (uint8_t *)art->art);
yanissk 0:4c2681e58186 134 this->swap();
yanissk 0:4c2681e58186 135
yanissk 0:4c2681e58186 136 }
yanissk 0:4c2681e58186 137
yanissk 0:4c2681e58186 138 void LEDMatrix::drawdoorAnim(uint8_t artToDraw[32][32]){
yanissk 0:4c2681e58186 139 this->clear();
yanissk 0:4c2681e58186 140
yanissk 0:4c2681e58186 141 for(unsigned char j = 0; j<16; j++){
yanissk 0:4c2681e58186 142
yanissk 0:4c2681e58186 143 for(int i=0; i < 33; i++){
yanissk 0:4c2681e58186 144
yanissk 0:4c2681e58186 145 if(artToDraw[i][j]){
yanissk 0:4c2681e58186 146
yanissk 0:4c2681e58186 147 this->drawPoint(j, i, artToDraw[i][j]);
yanissk 0:4c2681e58186 148 this->swap();
yanissk 0:4c2681e58186 149 while (!this->synchro());
yanissk 0:4c2681e58186 150 wait_ms(5);
yanissk 0:4c2681e58186 151
yanissk 0:4c2681e58186 152 }
yanissk 0:4c2681e58186 153
yanissk 0:4c2681e58186 154 if(artToDraw[i][32-j]){
yanissk 0:4c2681e58186 155
yanissk 0:4c2681e58186 156 this->drawPoint(31-j, i, artToDraw[i][32-j]);
yanissk 0:4c2681e58186 157 this->swap();
yanissk 0:4c2681e58186 158 while (!this->synchro());
yanissk 0:4c2681e58186 159 wait_ms(5);
yanissk 0:4c2681e58186 160 }
yanissk 0:4c2681e58186 161 }
yanissk 0:4c2681e58186 162 }
yanissk 0:4c2681e58186 163 this->clear();
yanissk 0:4c2681e58186 164 this->swap();
yanissk 0:4c2681e58186 165
yanissk 0:4c2681e58186 166 wait_ms(500);
yanissk 0:4c2681e58186 167 this->drawImage(0, 0, 32, 32, artToDraw[0]);
yanissk 0:4c2681e58186 168 this->swap();
yanissk 0:4c2681e58186 169
yanissk 0:4c2681e58186 170 wait_ms(500);
yanissk 0:4c2681e58186 171 this->clear();
yanissk 0:4c2681e58186 172 this->swap();
yanissk 0:4c2681e58186 173
yanissk 0:4c2681e58186 174 wait_ms(500);
yanissk 0:4c2681e58186 175 this->drawImage(0, 0, 32, 32, artToDraw[0]);
yanissk 0:4c2681e58186 176 this->swap();
yanissk 0:4c2681e58186 177 }
yanissk 0:4c2681e58186 178
yanissk 0:4c2681e58186 179 void LEDMatrix::drawSpiralAnim(uint8_t artToDraw[32][32]){
yanissk 0:4c2681e58186 180
yanissk 0:4c2681e58186 181 unsigned char x = 32, y = 32;
yanissk 0:4c2681e58186 182 this->clear();
yanissk 0:4c2681e58186 183 for(int i=0; i < x; i++)
yanissk 0:4c2681e58186 184 {
yanissk 0:4c2681e58186 185
yanissk 0:4c2681e58186 186 for(int j=0; j<y; j++){
yanissk 0:4c2681e58186 187 if(!artToDraw[i][j]) continue;
yanissk 0:4c2681e58186 188 this->drawPoint(j, i, artToDraw[i][j]);
yanissk 0:4c2681e58186 189 this->swap();
yanissk 0:4c2681e58186 190 wait_ms(5);
yanissk 0:4c2681e58186 191 }
yanissk 0:4c2681e58186 192
yanissk 0:4c2681e58186 193 for(int j=1; j<y; j++){
yanissk 0:4c2681e58186 194 if(!artToDraw[j][x-1]) continue;
yanissk 0:4c2681e58186 195 this->drawPoint(x-1, j, artToDraw[j][x-1]);
yanissk 0:4c2681e58186 196 this->swap();
yanissk 0:4c2681e58186 197 wait_ms(5);
yanissk 0:4c2681e58186 198 }
yanissk 0:4c2681e58186 199
yanissk 0:4c2681e58186 200 for(int j=1; j<y; j++){
yanissk 0:4c2681e58186 201 if(!artToDraw[y-1][y-j-1]) continue;
yanissk 0:4c2681e58186 202 this->drawPoint((y-j-1), y-1, artToDraw[y-1][y-j-1]);
yanissk 0:4c2681e58186 203 this->swap();
yanissk 0:4c2681e58186 204 wait_ms(5);
yanissk 0:4c2681e58186 205 }
yanissk 0:4c2681e58186 206
yanissk 0:4c2681e58186 207 for(int j=1; j<y; j++){
yanissk 0:4c2681e58186 208 if(!artToDraw[y-j-2][i]) continue;
yanissk 0:4c2681e58186 209 this->drawPoint(i, (y-j-2), artToDraw[y-j-2][i]);
yanissk 0:4c2681e58186 210 this->swap();
yanissk 0:4c2681e58186 211 wait_ms(5);
yanissk 0:4c2681e58186 212 }
yanissk 0:4c2681e58186 213
yanissk 0:4c2681e58186 214 x--;
yanissk 0:4c2681e58186 215 y--;
yanissk 0:4c2681e58186 216
yanissk 0:4c2681e58186 217 }
yanissk 0:4c2681e58186 218 this->clear();
yanissk 0:4c2681e58186 219 this->swap();
yanissk 0:4c2681e58186 220
yanissk 0:4c2681e58186 221 wait_ms(500);
yanissk 0:4c2681e58186 222 this->drawImage(0, 0, 32, 32, artToDraw[0]);
yanissk 0:4c2681e58186 223 this->swap();
yanissk 0:4c2681e58186 224
yanissk 0:4c2681e58186 225 wait_ms(500);
yanissk 0:4c2681e58186 226 this->clear();
yanissk 0:4c2681e58186 227 this->swap();
yanissk 0:4c2681e58186 228
yanissk 0:4c2681e58186 229 wait_ms(500);
yanissk 0:4c2681e58186 230 this->drawImage(0, 0, 32, 32, artToDraw[0]);
yanissk 0:4c2681e58186 231 this->swap();
yanissk 0:4c2681e58186 232 }
yanissk 0:4c2681e58186 233
yanissk 0:4c2681e58186 234
yanissk 0:4c2681e58186 235 void LEDMatrix::clear()
yanissk 0:4c2681e58186 236 {
yanissk 0:4c2681e58186 237 uint8_t *ptr = drawBuf;
yanissk 0:4c2681e58186 238 for (uint16_t i = 0; i < (width * height); i++) {
yanissk 0:4c2681e58186 239 *ptr = 0x00;
yanissk 0:4c2681e58186 240 ptr++;
yanissk 0:4c2681e58186 241 }
yanissk 0:4c2681e58186 242 }
yanissk 0:4c2681e58186 243
yanissk 0:4c2681e58186 244 void LEDMatrix::reverse()
yanissk 0:4c2681e58186 245 {
yanissk 0:4c2681e58186 246 mask = ~mask;
yanissk 0:4c2681e58186 247 }
yanissk 0:4c2681e58186 248
yanissk 0:4c2681e58186 249 uint8_t LEDMatrix::isReversed()
yanissk 0:4c2681e58186 250 {
yanissk 0:4c2681e58186 251 return mask;
yanissk 0:4c2681e58186 252 }
yanissk 0:4c2681e58186 253
yanissk 0:4c2681e58186 254 void LEDMatrix::scan()
yanissk 0:4c2681e58186 255 {
yanissk 0:4c2681e58186 256 if (!state) {
yanissk 0:4c2681e58186 257 return;
yanissk 0:4c2681e58186 258 }
yanissk 0:4c2681e58186 259
yanissk 0:4c2681e58186 260 static uint8_t row = 0;
yanissk 0:4c2681e58186 261
yanissk 0:4c2681e58186 262 int debut1 = 256 + (row) * width;
yanissk 0:4c2681e58186 263 int debut2 = 768 + (row) * width;
yanissk 0:4c2681e58186 264 for (uint8_t i = 0; i <32 ; i++)
yanissk 0:4c2681e58186 265 {
yanissk 0:4c2681e58186 266 _rgb1 = displaybuf[debut1+i];
yanissk 0:4c2681e58186 267 _rgb2 = displaybuf[debut2+i];
yanissk 0:4c2681e58186 268 clk = 0;
yanissk 0:4c2681e58186 269 clk = 1;
yanissk 0:4c2681e58186 270 }
yanissk 0:4c2681e58186 271 /* debut1 = 0 + (row+8) * width;
yanissk 0:4c2681e58186 272 debut2 = 512 + (row+8) * width;
yanissk 0:4c2681e58186 273
yanissk 0:4c2681e58186 274 for (uint8_t i = 0; i <32 ; i++) {
yanissk 0:4c2681e58186 275 _rgb1 = displaybuf[debut1+i];
yanissk 0:4c2681e58186 276 _rgb2 = displaybuf[debut2+i];
yanissk 0:4c2681e58186 277 clk = 0;
yanissk 0:4c2681e58186 278 clk = 1;
yanissk 0:4c2681e58186 279 }*/
yanissk 0:4c2681e58186 280 debut1 = 0 + row * width;
yanissk 0:4c2681e58186 281 debut2 = 512 + row * width;
yanissk 0:4c2681e58186 282 for (uint8_t i = 0; i <32 ; i++) {
yanissk 0:4c2681e58186 283 _rgb1 = displaybuf[debut1+i];
yanissk 0:4c2681e58186 284 _rgb2 = displaybuf[debut2+i];
yanissk 0:4c2681e58186 285 clk = 0;
yanissk 0:4c2681e58186 286 clk = 1;
yanissk 0:4c2681e58186 287 }
yanissk 0:4c2681e58186 288
yanissk 0:4c2681e58186 289 oe = 1;
yanissk 0:4c2681e58186 290 stb = 1;
yanissk 0:4c2681e58186 291
yanissk 0:4c2681e58186 292 _row = row;
yanissk 0:4c2681e58186 293
yanissk 0:4c2681e58186 294 oe = 0;
yanissk 0:4c2681e58186 295 stb = 0;
yanissk 0:4c2681e58186 296
yanissk 0:4c2681e58186 297 row=(row + 1) & 0x07;
yanissk 0:4c2681e58186 298 if (row==0) {
yanissk 0:4c2681e58186 299 nbImages++;
yanissk 0:4c2681e58186 300 if (flagSwap == 1) {
yanissk 0:4c2681e58186 301 if (bufferIndex==0) {
yanissk 0:4c2681e58186 302 bufferIndex = 1;
yanissk 0:4c2681e58186 303 displaybuf = memoBuf + width*height;
yanissk 0:4c2681e58186 304 drawBuf = memoBuf;
yanissk 0:4c2681e58186 305 } else {
yanissk 0:4c2681e58186 306 bufferIndex = 0;
yanissk 0:4c2681e58186 307 displaybuf = memoBuf;
yanissk 0:4c2681e58186 308 drawBuf = memoBuf + width*height;
yanissk 0:4c2681e58186 309 }
yanissk 0:4c2681e58186 310 flagSwap = 0;
yanissk 0:4c2681e58186 311 }
yanissk 0:4c2681e58186 312 }
yanissk 0:4c2681e58186 313 }
yanissk 0:4c2681e58186 314
yanissk 0:4c2681e58186 315 void LEDMatrix::on()
yanissk 0:4c2681e58186 316 {
yanissk 0:4c2681e58186 317 state = 1;
yanissk 0:4c2681e58186 318 }
yanissk 0:4c2681e58186 319
yanissk 0:4c2681e58186 320 void LEDMatrix::off()
yanissk 0:4c2681e58186 321 {
yanissk 0:4c2681e58186 322 state = 0;
yanissk 0:4c2681e58186 323 oe = 1;
yanissk 0:4c2681e58186 324 }
yanissk 0:4c2681e58186 325
yanissk 0:4c2681e58186 326 void LEDMatrix::swap()
yanissk 0:4c2681e58186 327 {
yanissk 0:4c2681e58186 328 flagSwap = 1;
yanissk 0:4c2681e58186 329 }
yanissk 0:4c2681e58186 330
yanissk 0:4c2681e58186 331 int LEDMatrix::synchro()
yanissk 0:4c2681e58186 332 {
yanissk 0:4c2681e58186 333 return !flagSwap;
yanissk 0:4c2681e58186 334 }
yanissk 0:4c2681e58186 335
yanissk 0:4c2681e58186 336 void LEDMatrix::waitImages(int nb)
yanissk 0:4c2681e58186 337 {
yanissk 0:4c2681e58186 338 while (nbImages < nb) wait_us(100);
yanissk 0:4c2681e58186 339 nbImages = 0;
yanissk 0:4c2681e58186 340 }
yanissk 0:4c2681e58186 341