Mathematica-like environment on the mbed using USB keyboard input, VGA output, and a thermal printer.
Dependencies: mbed Thermal 4DGL-uLCD-SE USBHost_Modified uVGAIII
main.cpp@0:824466ffa6da, 2018-12-10 (annotated)
- Committer:
- zrussell3
- Date:
- Mon Dec 10 17:59:48 2018 +0000
- Revision:
- 0:824466ffa6da
- Child:
- 2:d97e71edb2b3
Initial commit; - display setup; - cursor tracking; - keyboard input; - dummy plotting
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zrussell3 | 0:824466ffa6da | 1 | #include "mbed.h" |
zrussell3 | 0:824466ffa6da | 2 | #include "Thermal.h" |
zrussell3 | 0:824466ffa6da | 3 | #include "USBHostKeyboard.h" |
zrussell3 | 0:824466ffa6da | 4 | #include "uVGAIII.h" |
zrussell3 | 0:824466ffa6da | 5 | |
zrussell3 | 0:824466ffa6da | 6 | #define SIZE_X 480 |
zrussell3 | 0:824466ffa6da | 7 | #define SIZE_Y 800 |
zrussell3 | 0:824466ffa6da | 8 | |
zrussell3 | 0:824466ffa6da | 9 | using namespace std; |
zrussell3 | 0:824466ffa6da | 10 | |
zrussell3 | 0:824466ffa6da | 11 | // Debugging LEDs |
zrussell3 | 0:824466ffa6da | 12 | DigitalOut led(LED1); |
zrussell3 | 0:824466ffa6da | 13 | DigitalOut led2(LED2); |
zrussell3 | 0:824466ffa6da | 14 | DigitalOut led3(LED3); |
zrussell3 | 0:824466ffa6da | 15 | DigitalOut led4(LED4); |
zrussell3 | 0:824466ffa6da | 16 | |
zrussell3 | 0:824466ffa6da | 17 | uVGAIII ecran(p9,p10,p11); // serial tx, serial rx, reset pin; |
zrussell3 | 0:824466ffa6da | 18 | Thermal printer(p28, p27, 19200); |
zrussell3 | 0:824466ffa6da | 19 | |
zrussell3 | 0:824466ffa6da | 20 | int verticalCursor = 2; |
zrussell3 | 0:824466ffa6da | 21 | int horizontalCursor = 0; |
zrussell3 | 0:824466ffa6da | 22 | |
zrussell3 | 0:824466ffa6da | 23 | char currentLine[48]; |
zrussell3 | 0:824466ffa6da | 24 | int currentLineIndex = 0; |
zrussell3 | 0:824466ffa6da | 25 | |
zrussell3 | 0:824466ffa6da | 26 | // hardcode plot x^2 |
zrussell3 | 0:824466ffa6da | 27 | void plot(void const *) |
zrussell3 | 0:824466ffa6da | 28 | { |
zrussell3 | 0:824466ffa6da | 29 | int xOffset = 600; |
zrussell3 | 0:824466ffa6da | 30 | int yOffset = 260; |
zrussell3 | 0:824466ffa6da | 31 | int pastX = 0; |
zrussell3 | 0:824466ffa6da | 32 | int pastY = 0; |
zrussell3 | 0:824466ffa6da | 33 | int currentX = 0; |
zrussell3 | 0:824466ffa6da | 34 | int currentY = 0; |
zrussell3 | 0:824466ffa6da | 35 | |
zrussell3 | 0:824466ffa6da | 36 | for(double i = -20; i < 20; i++) { |
zrussell3 | 0:824466ffa6da | 37 | //evaluate(); |
zrussell3 | 0:824466ffa6da | 38 | currentX = i*3 + xOffset; |
zrussell3 | 0:824466ffa6da | 39 | currentY = yOffset-(i*i); |
zrussell3 | 0:824466ffa6da | 40 | if(pastX == 0){ |
zrussell3 | 0:824466ffa6da | 41 | pastX = currentX; |
zrussell3 | 0:824466ffa6da | 42 | pastY = currentY; |
zrussell3 | 0:824466ffa6da | 43 | continue; |
zrussell3 | 0:824466ffa6da | 44 | } |
zrussell3 | 0:824466ffa6da | 45 | //ecran.line(pastX, pastY, currentX, currentY, RED); |
zrussell3 | 0:824466ffa6da | 46 | //ecran.put_pixel(i*2 + xOffset, yOffset-(i*i),RED); |
zrussell3 | 0:824466ffa6da | 47 | pastX = currentX; |
zrussell3 | 0:824466ffa6da | 48 | pastY = currentY; |
zrussell3 | 0:824466ffa6da | 49 | } |
zrussell3 | 0:824466ffa6da | 50 | while(1) { |
zrussell3 | 0:824466ffa6da | 51 | Thread::wait(200); |
zrussell3 | 0:824466ffa6da | 52 | } |
zrussell3 | 0:824466ffa6da | 53 | } |
zrussell3 | 0:824466ffa6da | 54 | |
zrussell3 | 0:824466ffa6da | 55 | void onKeyCode(uint8_t key, uint8_t modifier) { |
zrussell3 | 0:824466ffa6da | 56 | |
zrussell3 | 0:824466ffa6da | 57 | led3 = 1; |
zrussell3 | 0:824466ffa6da | 58 | |
zrussell3 | 0:824466ffa6da | 59 | if(key == 0) { |
zrussell3 | 0:824466ffa6da | 60 | led3 = 0; |
zrussell3 | 0:824466ffa6da | 61 | return; |
zrussell3 | 0:824466ffa6da | 62 | } |
zrussell3 | 0:824466ffa6da | 63 | |
zrussell3 | 0:824466ffa6da | 64 | // Handle newline |
zrussell3 | 0:824466ffa6da | 65 | if(key == 0x0A) { |
zrussell3 | 0:824466ffa6da | 66 | |
zrussell3 | 0:824466ffa6da | 67 | // Check if going off end of screen |
zrussell3 | 0:824466ffa6da | 68 | if(verticalCursor > 37) { |
zrussell3 | 0:824466ffa6da | 69 | ecran.filled_rectangle(0, 0 , 399, 480, DGREY); |
zrussell3 | 0:824466ffa6da | 70 | verticalCursor = 0; |
zrussell3 | 0:824466ffa6da | 71 | } else { |
zrussell3 | 0:824466ffa6da | 72 | // Move cursor to newline |
zrussell3 | 0:824466ffa6da | 73 | verticalCursor+=2; |
zrussell3 | 0:824466ffa6da | 74 | } |
zrussell3 | 0:824466ffa6da | 75 | |
zrussell3 | 0:824466ffa6da | 76 | horizontalCursor = 0; |
zrussell3 | 0:824466ffa6da | 77 | |
zrussell3 | 0:824466ffa6da | 78 | ecran.move_cursor(verticalCursor, horizontalCursor); |
zrussell3 | 0:824466ffa6da | 79 | |
zrussell3 | 0:824466ffa6da | 80 | ecran.puts(currentLine); |
zrussell3 | 0:824466ffa6da | 81 | printer.printf(currentLine); |
zrussell3 | 0:824466ffa6da | 82 | printer.feed(2); |
zrussell3 | 0:824466ffa6da | 83 | |
zrussell3 | 0:824466ffa6da | 84 | for(size_t i = 0; i < 48; i++) { |
zrussell3 | 0:824466ffa6da | 85 | currentLine[i] = NULL; |
zrussell3 | 0:824466ffa6da | 86 | } |
zrussell3 | 0:824466ffa6da | 87 | |
zrussell3 | 0:824466ffa6da | 88 | currentLineIndex = 0; |
zrussell3 | 0:824466ffa6da | 89 | |
zrussell3 | 0:824466ffa6da | 90 | led3 = 0; |
zrussell3 | 0:824466ffa6da | 91 | return; |
zrussell3 | 0:824466ffa6da | 92 | } |
zrussell3 | 0:824466ffa6da | 93 | |
zrussell3 | 0:824466ffa6da | 94 | if(key == 0x08) |
zrussell3 | 0:824466ffa6da | 95 | { |
zrussell3 | 0:824466ffa6da | 96 | if(currentLineIndex != 0) |
zrussell3 | 0:824466ffa6da | 97 | { |
zrussell3 | 0:824466ffa6da | 98 | currentLineIndex--; |
zrussell3 | 0:824466ffa6da | 99 | currentLine[currentLineIndex] = NULL; |
zrussell3 | 0:824466ffa6da | 100 | } |
zrussell3 | 0:824466ffa6da | 101 | led3 = 0; |
zrussell3 | 0:824466ffa6da | 102 | return; |
zrussell3 | 0:824466ffa6da | 103 | } |
zrussell3 | 0:824466ffa6da | 104 | |
zrussell3 | 0:824466ffa6da | 105 | // Move the cursor 1 character over |
zrussell3 | 0:824466ffa6da | 106 | //ecran.move_cursor(verticalCursor, horizontalCursor++); |
zrussell3 | 0:824466ffa6da | 107 | |
zrussell3 | 0:824466ffa6da | 108 | // Append character to curret line string |
zrussell3 | 0:824466ffa6da | 109 | currentLine[currentLineIndex] = (char)key; |
zrussell3 | 0:824466ffa6da | 110 | |
zrussell3 | 0:824466ffa6da | 111 | if(currentLineIndex < 47) { |
zrussell3 | 0:824466ffa6da | 112 | currentLineIndex++; |
zrussell3 | 0:824466ffa6da | 113 | } |
zrussell3 | 0:824466ffa6da | 114 | |
zrussell3 | 0:824466ffa6da | 115 | led3 = 0; |
zrussell3 | 0:824466ffa6da | 116 | } |
zrussell3 | 0:824466ffa6da | 117 | |
zrussell3 | 0:824466ffa6da | 118 | void keyboard_task(void const *) { |
zrussell3 | 0:824466ffa6da | 119 | |
zrussell3 | 0:824466ffa6da | 120 | USBHostKeyboard keyboard; |
zrussell3 | 0:824466ffa6da | 121 | |
zrussell3 | 0:824466ffa6da | 122 | while(1) { |
zrussell3 | 0:824466ffa6da | 123 | // try to connect a USB keyboard |
zrussell3 | 0:824466ffa6da | 124 | while(!keyboard.connect()) { |
zrussell3 | 0:824466ffa6da | 125 | Thread::wait(1); |
zrussell3 | 0:824466ffa6da | 126 | } |
zrussell3 | 0:824466ffa6da | 127 | |
zrussell3 | 0:824466ffa6da | 128 | if(keyboard.connected()) led2 = 1; |
zrussell3 | 0:824466ffa6da | 129 | |
zrussell3 | 0:824466ffa6da | 130 | // When connected, attach handler called on keyboard event |
zrussell3 | 0:824466ffa6da | 131 | keyboard.attach(onKeyCode); |
zrussell3 | 0:824466ffa6da | 132 | |
zrussell3 | 0:824466ffa6da | 133 | // Wait until the keyboard is disconnected |
zrussell3 | 0:824466ffa6da | 134 | while(keyboard.connected()) |
zrussell3 | 0:824466ffa6da | 135 | Thread::wait(1); |
zrussell3 | 0:824466ffa6da | 136 | |
zrussell3 | 0:824466ffa6da | 137 | led2 = 0; |
zrussell3 | 0:824466ffa6da | 138 | } |
zrussell3 | 0:824466ffa6da | 139 | } |
zrussell3 | 0:824466ffa6da | 140 | |
zrussell3 | 0:824466ffa6da | 141 | int main() { |
zrussell3 | 0:824466ffa6da | 142 | // Set up display |
zrussell3 | 0:824466ffa6da | 143 | ecran.baudrate(300000); |
zrussell3 | 0:824466ffa6da | 144 | ecran.screen_mode(LANDSCAPE); |
zrussell3 | 0:824466ffa6da | 145 | ecran.graphics_parameters(RESOLUTION, 2); |
zrussell3 | 0:824466ffa6da | 146 | ecran.touch_status(); |
zrussell3 | 0:824466ffa6da | 147 | //ecran.background_color(DGREY); |
zrussell3 | 0:824466ffa6da | 148 | ecran.background_color(WHITE); |
zrussell3 | 0:824466ffa6da | 149 | ecran.cls(); |
zrussell3 | 0:824466ffa6da | 150 | |
zrussell3 | 0:824466ffa6da | 151 | ecran.move_cursor(0, 0); |
zrussell3 | 0:824466ffa6da | 152 | ecran.char_width('d'); |
zrussell3 | 0:824466ffa6da | 153 | ecran.char_height('d'); |
zrussell3 | 0:824466ffa6da | 154 | ecran.text_fgd_color(WHITE); |
zrussell3 | 0:824466ffa6da | 155 | ecran.text_bgd_color(DGREY); |
zrussell3 | 0:824466ffa6da | 156 | ecran.puts("Booting up..."); |
zrussell3 | 0:824466ffa6da | 157 | |
zrussell3 | 0:824466ffa6da | 158 | ecran.line(400, 0 , 400, 480, RED); |
zrussell3 | 0:824466ffa6da | 159 | |
zrussell3 | 0:824466ffa6da | 160 | // Use old style threading |
zrussell3 | 0:824466ffa6da | 161 | Thread keyboardTask(keyboard_task, NULL, osPriorityNormal, 256 * 4); |
zrussell3 | 0:824466ffa6da | 162 | |
zrussell3 | 0:824466ffa6da | 163 | ecran.move_cursor(2, 0); |
zrussell3 | 0:824466ffa6da | 164 | ecran.puts("Ready!"); |
zrussell3 | 0:824466ffa6da | 165 | |
zrussell3 | 0:824466ffa6da | 166 | //printer.printf("Printing from main"); |
zrussell3 | 0:824466ffa6da | 167 | //printer.feed(2); |
zrussell3 | 0:824466ffa6da | 168 | //printer.test(); |
zrussell3 | 0:824466ffa6da | 169 | |
zrussell3 | 0:824466ffa6da | 170 | // Clear currentLine array before using |
zrussell3 | 0:824466ffa6da | 171 | for(size_t i = 0; i < 48; i++) { |
zrussell3 | 0:824466ffa6da | 172 | currentLine[i] = NULL; |
zrussell3 | 0:824466ffa6da | 173 | } |
zrussell3 | 0:824466ffa6da | 174 | |
zrussell3 | 0:824466ffa6da | 175 | //Thread drawPlot(plot, NULL, osPriorityNormal, 256*4); |
zrussell3 | 0:824466ffa6da | 176 | |
zrussell3 | 0:824466ffa6da | 177 | while(1) { |
zrussell3 | 0:824466ffa6da | 178 | led=!led; |
zrussell3 | 0:824466ffa6da | 179 | Thread::wait(500); // Wait .5s in main thread |
zrussell3 | 0:824466ffa6da | 180 | } |
zrussell3 | 0:824466ffa6da | 181 | } |