A demo for Adafruit 64x32 demo with PWM
Dependencies: mbed-rtos BufferedSerial Adafruit_GFX_MBED LedMatrix-PWM FastIO mbed-dev
main.cpp@4:3e25a10c202c, 2017-10-24 (annotated)
- Committer:
- davidr99
- Date:
- Tue Oct 24 03:02:51 2017 +0000
- Revision:
- 4:3e25a10c202c
- Parent:
- 2:6bfb86f8c9d3
Changed to be a faster interrupt and use less time to update display
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
davidr99 | 0:9f43f6e0d6ad | 1 | /* |
davidr99 | 1:442e873e4f52 | 2 | Based on http://os.mbed.com/users/RRacer/code/Adafruit-16x32-basic-demo/ |
davidr99 | 0:9f43f6e0d6ad | 3 | |
davidr99 | 0:9f43f6e0d6ad | 4 | */ |
davidr99 | 0:9f43f6e0d6ad | 5 | |
davidr99 | 0:9f43f6e0d6ad | 6 | #include "mbed.h" |
davidr99 | 0:9f43f6e0d6ad | 7 | #include "rtos.h" |
davidr99 | 2:6bfb86f8c9d3 | 8 | #include "LedMatrix.h" |
davidr99 | 4:3e25a10c202c | 9 | #include "BufferedSerial.h" |
davidr99 | 4:3e25a10c202c | 10 | |
davidr99 | 4:3e25a10c202c | 11 | BufferedSerial pc(USBTX, USBRX, 1024); // tx, rx |
davidr99 | 0:9f43f6e0d6ad | 12 | |
davidr99 | 2:6bfb86f8c9d3 | 13 | LedMatrix matrix; |
davidr99 | 0:9f43f6e0d6ad | 14 | |
davidr99 | 0:9f43f6e0d6ad | 15 | void PaintThread() |
davidr99 | 0:9f43f6e0d6ad | 16 | { |
davidr99 | 2:6bfb86f8c9d3 | 17 | matrix.Paint(); |
davidr99 | 0:9f43f6e0d6ad | 18 | } |
davidr99 | 0:9f43f6e0d6ad | 19 | |
davidr99 | 4:3e25a10c202c | 20 | int getNextByte() |
davidr99 | 4:3e25a10c202c | 21 | { |
davidr99 | 4:3e25a10c202c | 22 | char value = 0; |
davidr99 | 4:3e25a10c202c | 23 | |
davidr99 | 4:3e25a10c202c | 24 | while(pc.readable() == 0); |
davidr99 | 4:3e25a10c202c | 25 | value = pc.getc(); |
davidr99 | 4:3e25a10c202c | 26 | return value; |
davidr99 | 4:3e25a10c202c | 27 | } |
davidr99 | 4:3e25a10c202c | 28 | |
davidr99 | 0:9f43f6e0d6ad | 29 | int main() |
davidr99 | 0:9f43f6e0d6ad | 30 | { |
davidr99 | 0:9f43f6e0d6ad | 31 | Ticker ticker; |
davidr99 | 4:3e25a10c202c | 32 | matrix.Init(); |
davidr99 | 4:3e25a10c202c | 33 | |
davidr99 | 4:3e25a10c202c | 34 | pc.baud(460800); |
davidr99 | 4:3e25a10c202c | 35 | |
davidr99 | 4:3e25a10c202c | 36 | #if defined(TARGET_STM32F767ZI) |
davidr99 | 4:3e25a10c202c | 37 | ticker.attach_us(PaintThread, 15); |
davidr99 | 4:3e25a10c202c | 38 | #elif defined(TARGET_STM32F303K8) |
davidr99 | 4:3e25a10c202c | 39 | ticker.attach_us(PaintThread, 25); |
davidr99 | 4:3e25a10c202c | 40 | #endif |
davidr99 | 4:3e25a10c202c | 41 | |
davidr99 | 4:3e25a10c202c | 42 | uint16_t currentX = 0, currentY = 0; |
davidr99 | 0:9f43f6e0d6ad | 43 | |
davidr99 | 2:6bfb86f8c9d3 | 44 | while(1) { |
davidr99 | 4:3e25a10c202c | 45 | |
davidr99 | 4:3e25a10c202c | 46 | /* |
davidr99 | 4:3e25a10c202c | 47 | int c = getNextByte(); // Read byte from master |
davidr99 | 4:3e25a10c202c | 48 | |
davidr99 | 4:3e25a10c202c | 49 | switch (c) |
davidr99 | 4:3e25a10c202c | 50 | { |
davidr99 | 4:3e25a10c202c | 51 | case 'L': // Location |
davidr99 | 4:3e25a10c202c | 52 | currentX = (getNextByte() << 8) + getNextByte(); |
davidr99 | 4:3e25a10c202c | 53 | currentY = (getNextByte() << 8) + getNextByte(); |
davidr99 | 4:3e25a10c202c | 54 | pc.printf("X: %d, Y: %d\n", currentX, currentY); |
davidr99 | 4:3e25a10c202c | 55 | break; |
davidr99 | 4:3e25a10c202c | 56 | |
davidr99 | 4:3e25a10c202c | 57 | case 'G': // Set background |
davidr99 | 4:3e25a10c202c | 58 | { |
davidr99 | 4:3e25a10c202c | 59 | uint16_t c = getNextByte() | (getNextByte() << 8); |
davidr99 | 4:3e25a10c202c | 60 | |
davidr99 | 4:3e25a10c202c | 61 | for(int y=0;y<HEIGHT;y++) |
davidr99 | 4:3e25a10c202c | 62 | { |
davidr99 | 4:3e25a10c202c | 63 | for(int x=0;x<WIDTH;x++) |
davidr99 | 4:3e25a10c202c | 64 | { |
davidr99 | 4:3e25a10c202c | 65 | matrix.drawPixel(x, y, c); |
davidr99 | 4:3e25a10c202c | 66 | } |
davidr99 | 4:3e25a10c202c | 67 | } |
davidr99 | 4:3e25a10c202c | 68 | } |
davidr99 | 4:3e25a10c202c | 69 | break; |
davidr99 | 4:3e25a10c202c | 70 | |
davidr99 | 4:3e25a10c202c | 71 | case 'B': // Load buffer |
davidr99 | 4:3e25a10c202c | 72 | for(int y=0;y<HEIGHT;y++) |
davidr99 | 4:3e25a10c202c | 73 | { |
davidr99 | 4:3e25a10c202c | 74 | for(int x=0;x<WIDTH;x++) |
davidr99 | 4:3e25a10c202c | 75 | { |
davidr99 | 4:3e25a10c202c | 76 | uint16_t c = getNextByte() | (getNextByte() << 8); |
davidr99 | 4:3e25a10c202c | 77 | matrix.drawPixel(x, y, c); |
davidr99 | 4:3e25a10c202c | 78 | } |
davidr99 | 4:3e25a10c202c | 79 | } |
davidr99 | 4:3e25a10c202c | 80 | break; |
davidr99 | 4:3e25a10c202c | 81 | |
davidr99 | 4:3e25a10c202c | 82 | case 'C': // Color |
davidr99 | 4:3e25a10c202c | 83 | { |
davidr99 | 4:3e25a10c202c | 84 | uint16_t c = getNextByte() | (getNextByte() << 8); |
davidr99 | 4:3e25a10c202c | 85 | matrix.drawPixel(currentX, currentY, c); |
davidr99 | 4:3e25a10c202c | 86 | |
davidr99 | 4:3e25a10c202c | 87 | currentX++; |
davidr99 | 4:3e25a10c202c | 88 | if (currentX >= WIDTH) |
davidr99 | 4:3e25a10c202c | 89 | { |
davidr99 | 4:3e25a10c202c | 90 | currentX = 0; |
davidr99 | 4:3e25a10c202c | 91 | currentY++; |
davidr99 | 4:3e25a10c202c | 92 | } |
davidr99 | 4:3e25a10c202c | 93 | |
davidr99 | 4:3e25a10c202c | 94 | if (currentY >= HEIGHT) |
davidr99 | 4:3e25a10c202c | 95 | { |
davidr99 | 4:3e25a10c202c | 96 | currentY = 0; |
davidr99 | 4:3e25a10c202c | 97 | } |
davidr99 | 4:3e25a10c202c | 98 | } |
davidr99 | 4:3e25a10c202c | 99 | break; |
davidr99 | 4:3e25a10c202c | 100 | |
davidr99 | 4:3e25a10c202c | 101 | case 'D': // Double Buffer |
davidr99 | 4:3e25a10c202c | 102 | { |
davidr99 | 4:3e25a10c202c | 103 | bool dBuffer = getNextByte() == 1; |
davidr99 | 4:3e25a10c202c | 104 | matrix.SetDoubleBuffer(dBuffer); |
davidr99 | 4:3e25a10c202c | 105 | } |
davidr99 | 4:3e25a10c202c | 106 | break; |
davidr99 | 4:3e25a10c202c | 107 | |
davidr99 | 4:3e25a10c202c | 108 | case 'S': // Swap Buffers |
davidr99 | 4:3e25a10c202c | 109 | { |
davidr99 | 4:3e25a10c202c | 110 | bool copyBuffer = getNextByte() == 1; |
davidr99 | 4:3e25a10c202c | 111 | matrix.Swap(copyBuffer); |
davidr99 | 4:3e25a10c202c | 112 | } |
davidr99 | 4:3e25a10c202c | 113 | break; |
davidr99 | 4:3e25a10c202c | 114 | |
davidr99 | 4:3e25a10c202c | 115 | case 'T': // Text |
davidr99 | 4:3e25a10c202c | 116 | { |
davidr99 | 4:3e25a10c202c | 117 | int16_t x = getNextByte() | (getNextByte() << 8); |
davidr99 | 4:3e25a10c202c | 118 | int16_t y = getNextByte() | (getNextByte() << 8); |
davidr99 | 4:3e25a10c202c | 119 | int size = getNextByte(); |
davidr99 | 4:3e25a10c202c | 120 | uint16_t color = getNextByte() | (getNextByte() << 8); |
davidr99 | 4:3e25a10c202c | 121 | |
davidr99 | 4:3e25a10c202c | 122 | matrix.setCursor(x, y); |
davidr99 | 4:3e25a10c202c | 123 | matrix.setTextColor(color); |
davidr99 | 4:3e25a10c202c | 124 | matrix.setTextSize(size); |
davidr99 | 4:3e25a10c202c | 125 | |
davidr99 | 4:3e25a10c202c | 126 | int length = getNextByte(); |
davidr99 | 4:3e25a10c202c | 127 | for(int c = 0; c< length;c++) |
davidr99 | 4:3e25a10c202c | 128 | { |
davidr99 | 4:3e25a10c202c | 129 | matrix.print((char) getNextByte()); |
davidr99 | 4:3e25a10c202c | 130 | } |
davidr99 | 4:3e25a10c202c | 131 | } |
davidr99 | 4:3e25a10c202c | 132 | break; |
davidr99 | 4:3e25a10c202c | 133 | } |
davidr99 | 4:3e25a10c202c | 134 | */ |
davidr99 | 2:6bfb86f8c9d3 | 135 | |
davidr99 | 4:3e25a10c202c | 136 | /* |
davidr99 | 2:6bfb86f8c9d3 | 137 | for(int c=0;c<64;c++) |
davidr99 | 2:6bfb86f8c9d3 | 138 | { |
davidr99 | 2:6bfb86f8c9d3 | 139 | matrix.setCursor(20, 12); |
davidr99 | 2:6bfb86f8c9d3 | 140 | matrix.setTextColor(matrix.ColorHSV(c * 22, 255, 255, true)); |
davidr99 | 2:6bfb86f8c9d3 | 141 | matrix.setTextSize(1); |
davidr99 | 2:6bfb86f8c9d3 | 142 | matrix.println("Test!"); |
davidr99 | 2:6bfb86f8c9d3 | 143 | Thread::wait(200); |
davidr99 | 2:6bfb86f8c9d3 | 144 | } |
davidr99 | 0:9f43f6e0d6ad | 145 | |
davidr99 | 4:3e25a10c202c | 146 | */ |
davidr99 | 4:3e25a10c202c | 147 | for(int x=0;x<WIDTH;x++) |
davidr99 | 0:9f43f6e0d6ad | 148 | { |
davidr99 | 0:9f43f6e0d6ad | 149 | for(int y=0;y<32;y++) |
davidr99 | 0:9f43f6e0d6ad | 150 | { |
davidr99 | 2:6bfb86f8c9d3 | 151 | matrix.drawPixel(x, y, matrix.ColorHSV(x * 22, 255, 255, true)); |
davidr99 | 0:9f43f6e0d6ad | 152 | } |
davidr99 | 0:9f43f6e0d6ad | 153 | } |
davidr99 | 0:9f43f6e0d6ad | 154 | |
davidr99 | 2:6bfb86f8c9d3 | 155 | Thread::wait(5000); |
davidr99 | 0:9f43f6e0d6ad | 156 | |
davidr99 | 0:9f43f6e0d6ad | 157 | for(int c=0; c<16; c++) { |
davidr99 | 4:3e25a10c202c | 158 | for(int x=c; x<((WIDTH-1)-c); x++) {// Top side |
davidr99 | 2:6bfb86f8c9d3 | 159 | matrix.drawPixel(x,c,matrix.Color444(c, 0, 0)); |
davidr99 | 0:9f43f6e0d6ad | 160 | Thread::wait(10); |
davidr99 | 0:9f43f6e0d6ad | 161 | } |
davidr99 | 4:3e25a10c202c | 162 | for(int y=c; y<((HEIGHT-1)-c); y++) {// Right side |
davidr99 | 4:3e25a10c202c | 163 | matrix.drawPixel((WIDTH-1)-c,y, matrix.Color444(0, c, 0)); |
davidr99 | 0:9f43f6e0d6ad | 164 | Thread::wait(10); |
davidr99 | 0:9f43f6e0d6ad | 165 | } |
davidr99 | 4:3e25a10c202c | 166 | for(int x=((WIDTH-1)-c); x>=c; x--) {// Bottom side |
davidr99 | 4:3e25a10c202c | 167 | matrix.drawPixel(x,((HEIGHT-1)-c), matrix.Color444(0, 0, c)); |
davidr99 | 0:9f43f6e0d6ad | 168 | Thread::wait(10); |
davidr99 | 0:9f43f6e0d6ad | 169 | } |
davidr99 | 4:3e25a10c202c | 170 | for(int y=((HEIGHT-1)-c); y>=c; y--) { // Left side |
davidr99 | 2:6bfb86f8c9d3 | 171 | matrix.drawPixel(c,y, matrix.Color444(0, c, 0)); |
davidr99 | 0:9f43f6e0d6ad | 172 | Thread::wait(10); |
davidr99 | 0:9f43f6e0d6ad | 173 | } |
davidr99 | 0:9f43f6e0d6ad | 174 | } |
davidr99 | 0:9f43f6e0d6ad | 175 | |
davidr99 | 0:9f43f6e0d6ad | 176 | Thread::wait(1000); |
davidr99 | 0:9f43f6e0d6ad | 177 | } |
davidr99 | 0:9f43f6e0d6ad | 178 | } |