zzz
Noritake.cpp@0:530fa614d79a, 2020-08-26 (annotated)
- Committer:
- mauuuuul
- Date:
- Wed Aug 26 19:45:12 2020 +0000
- Revision:
- 0:530fa614d79a
zzzzzzzz
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mauuuuul | 0:530fa614d79a | 1 | #include "mbed.h" |
mauuuuul | 0:530fa614d79a | 2 | #include "Noritake.h" |
mauuuuul | 0:530fa614d79a | 3 | #include <string.h> |
mauuuuul | 0:530fa614d79a | 4 | |
mauuuuul | 0:530fa614d79a | 5 | Noritake::Noritake(PinName tx, PinName rx):VFDSerial(tx, rx) |
mauuuuul | 0:530fa614d79a | 6 | { |
mauuuuul | 0:530fa614d79a | 7 | VFDSerial.baud(NORITAKE_BAUD_DEF); |
mauuuuul | 0:530fa614d79a | 8 | } |
mauuuuul | 0:530fa614d79a | 9 | |
mauuuuul | 0:530fa614d79a | 10 | Noritake::~Noritake() |
mauuuuul | 0:530fa614d79a | 11 | { |
mauuuuul | 0:530fa614d79a | 12 | |
mauuuuul | 0:530fa614d79a | 13 | } |
mauuuuul | 0:530fa614d79a | 14 | |
mauuuuul | 0:530fa614d79a | 15 | void Noritake::writePort(uint8_t data) |
mauuuuul | 0:530fa614d79a | 16 | { |
mauuuuul | 0:530fa614d79a | 17 | VFDSerial.putc(data); |
mauuuuul | 0:530fa614d79a | 18 | } |
mauuuuul | 0:530fa614d79a | 19 | void Noritake::hardReset() |
mauuuuul | 0:530fa614d79a | 20 | { |
mauuuuul | 0:530fa614d79a | 21 | VFDSerial.putc(0x0c); |
mauuuuul | 0:530fa614d79a | 22 | wait_ms(200); |
mauuuuul | 0:530fa614d79a | 23 | VFDSerial.putc(0x1f); |
mauuuuul | 0:530fa614d79a | 24 | VFDSerial.putc(0x24); |
mauuuuul | 0:530fa614d79a | 25 | VFDSerial.putc(0x00); |
mauuuuul | 0:530fa614d79a | 26 | VFDSerial.putc(0x00); |
mauuuuul | 0:530fa614d79a | 27 | VFDSerial.putc(0x00); |
mauuuuul | 0:530fa614d79a | 28 | VFDSerial.putc(0x00); |
mauuuuul | 0:530fa614d79a | 29 | } |
mauuuuul | 0:530fa614d79a | 30 | |
mauuuuul | 0:530fa614d79a | 31 | void Noritake::GU7000_back() { |
mauuuuul | 0:530fa614d79a | 32 | command(0x08); |
mauuuuul | 0:530fa614d79a | 33 | } |
mauuuuul | 0:530fa614d79a | 34 | |
mauuuuul | 0:530fa614d79a | 35 | void Noritake::GU7000_forward() { |
mauuuuul | 0:530fa614d79a | 36 | command(0x09); |
mauuuuul | 0:530fa614d79a | 37 | } |
mauuuuul | 0:530fa614d79a | 38 | |
mauuuuul | 0:530fa614d79a | 39 | void Noritake::GU7000_lineFeed() { |
mauuuuul | 0:530fa614d79a | 40 | command(0x0a); |
mauuuuul | 0:530fa614d79a | 41 | } |
mauuuuul | 0:530fa614d79a | 42 | |
mauuuuul | 0:530fa614d79a | 43 | void Noritake::GU7000_home() { |
mauuuuul | 0:530fa614d79a | 44 | command(0x0b); |
mauuuuul | 0:530fa614d79a | 45 | } |
mauuuuul | 0:530fa614d79a | 46 | |
mauuuuul | 0:530fa614d79a | 47 | void Noritake::GU7000_carriageReturn() { |
mauuuuul | 0:530fa614d79a | 48 | command(0x0d); |
mauuuuul | 0:530fa614d79a | 49 | } |
mauuuuul | 0:530fa614d79a | 50 | |
mauuuuul | 0:530fa614d79a | 51 | void Noritake::GU7000_setCursor(unsigned x, unsigned y) { |
mauuuuul | 0:530fa614d79a | 52 | command(0x1f); |
mauuuuul | 0:530fa614d79a | 53 | command('$'); |
mauuuuul | 0:530fa614d79a | 54 | command_xy(x, y); |
mauuuuul | 0:530fa614d79a | 55 | } |
mauuuuul | 0:530fa614d79a | 56 | |
mauuuuul | 0:530fa614d79a | 57 | void Noritake::GU7000_clearScreen() { |
mauuuuul | 0:530fa614d79a | 58 | command(0x0c); |
mauuuuul | 0:530fa614d79a | 59 | } |
mauuuuul | 0:530fa614d79a | 60 | |
mauuuuul | 0:530fa614d79a | 61 | void Noritake::GU7000_cursorOn() { |
mauuuuul | 0:530fa614d79a | 62 | command(0x1f, 'C', 1); |
mauuuuul | 0:530fa614d79a | 63 | } |
mauuuuul | 0:530fa614d79a | 64 | |
mauuuuul | 0:530fa614d79a | 65 | void Noritake::GU7000_cursorOff() { |
mauuuuul | 0:530fa614d79a | 66 | command(0x1f, 'C', 0); |
mauuuuul | 0:530fa614d79a | 67 | } |
mauuuuul | 0:530fa614d79a | 68 | |
mauuuuul | 0:530fa614d79a | 69 | void Noritake::GU7000_init() { |
mauuuuul | 0:530fa614d79a | 70 | wait_us(NORITAKE_VFD_RESET_DELAY); |
mauuuuul | 0:530fa614d79a | 71 | command(0x1b); |
mauuuuul | 0:530fa614d79a | 72 | command('@'); |
mauuuuul | 0:530fa614d79a | 73 | } |
mauuuuul | 0:530fa614d79a | 74 | |
mauuuuul | 0:530fa614d79a | 75 | void Noritake::GU7000_reset() { |
mauuuuul | 0:530fa614d79a | 76 | hardReset(); |
mauuuuul | 0:530fa614d79a | 77 | } |
mauuuuul | 0:530fa614d79a | 78 | |
mauuuuul | 0:530fa614d79a | 79 | void Noritake::GU7000_useMultibyteChars(bool enable) { |
mauuuuul | 0:530fa614d79a | 80 | #if (NORITAKE_VFD_MODEL_CLASS-7000)/100==9 || (NORITAKE_VFD_MODEL_CLASS-7000)/100==1 |
mauuuuul | 0:530fa614d79a | 81 | us_command('g', 0x02); |
mauuuuul | 0:530fa614d79a | 82 | command(enable); |
mauuuuul | 0:530fa614d79a | 83 | #endif |
mauuuuul | 0:530fa614d79a | 84 | } |
mauuuuul | 0:530fa614d79a | 85 | |
mauuuuul | 0:530fa614d79a | 86 | void Noritake::GU7000_setMultibyteCharset(uint8_t code) { |
mauuuuul | 0:530fa614d79a | 87 | #if (NORITAKE_VFD_MODEL_CLASS-7000)/100==9 || (NORITAKE_VFD_MODEL_CLASS-7000)/100==1 |
mauuuuul | 0:530fa614d79a | 88 | us_command('g', 0x0f); |
mauuuuul | 0:530fa614d79a | 89 | command(code); |
mauuuuul | 0:530fa614d79a | 90 | #endif |
mauuuuul | 0:530fa614d79a | 91 | } |
mauuuuul | 0:530fa614d79a | 92 | |
mauuuuul | 0:530fa614d79a | 93 | void Noritake::GU7000_useCustomChars(bool enable) { |
mauuuuul | 0:530fa614d79a | 94 | command(0x1b, '%', enable); |
mauuuuul | 0:530fa614d79a | 95 | } |
mauuuuul | 0:530fa614d79a | 96 | |
mauuuuul | 0:530fa614d79a | 97 | static inline uint8_t getColumn(const uint8_t *src, int col) { |
mauuuuul | 0:530fa614d79a | 98 | uint8_t out = 0; |
mauuuuul | 0:530fa614d79a | 99 | for (int i=0; i<8; i++) |
mauuuuul | 0:530fa614d79a | 100 | if (src[i] & (1<<(4-col))) out += 1<<(7-i); |
mauuuuul | 0:530fa614d79a | 101 | return out; |
mauuuuul | 0:530fa614d79a | 102 | } |
mauuuuul | 0:530fa614d79a | 103 | |
mauuuuul | 0:530fa614d79a | 104 | void Noritake::GU7000_defineCustomChar(uint8_t code, FontFormat format, const uint8_t *data) { |
mauuuuul | 0:530fa614d79a | 105 | command(0x1b, '&', 0x01); |
mauuuuul | 0:530fa614d79a | 106 | command(code); |
mauuuuul | 0:530fa614d79a | 107 | command(code); |
mauuuuul | 0:530fa614d79a | 108 | |
mauuuuul | 0:530fa614d79a | 109 | switch (format) { |
mauuuuul | 0:530fa614d79a | 110 | case CUUFormat: |
mauuuuul | 0:530fa614d79a | 111 | command(5); |
mauuuuul | 0:530fa614d79a | 112 | for (uint8_t i=0; i<5; i++) |
mauuuuul | 0:530fa614d79a | 113 | command(getColumn(data, i)); |
mauuuuul | 0:530fa614d79a | 114 | break; |
mauuuuul | 0:530fa614d79a | 115 | |
mauuuuul | 0:530fa614d79a | 116 | case GU70005x7Format: |
mauuuuul | 0:530fa614d79a | 117 | command(5); |
mauuuuul | 0:530fa614d79a | 118 | print((const char*)data, 5); |
mauuuuul | 0:530fa614d79a | 119 | break; |
mauuuuul | 0:530fa614d79a | 120 | case GU70007x8Format: |
mauuuuul | 0:530fa614d79a | 121 | command(7); |
mauuuuul | 0:530fa614d79a | 122 | print((const char*)data, 7); |
mauuuuul | 0:530fa614d79a | 123 | break; |
mauuuuul | 0:530fa614d79a | 124 | } |
mauuuuul | 0:530fa614d79a | 125 | } |
mauuuuul | 0:530fa614d79a | 126 | |
mauuuuul | 0:530fa614d79a | 127 | void Noritake::GU7000_deleteCustomChar(uint8_t code) { |
mauuuuul | 0:530fa614d79a | 128 | command(0x01b, '?', 0x01); |
mauuuuul | 0:530fa614d79a | 129 | command(code); |
mauuuuul | 0:530fa614d79a | 130 | } |
mauuuuul | 0:530fa614d79a | 131 | |
mauuuuul | 0:530fa614d79a | 132 | void Noritake::GU7000_setAsciiVariant(AsciiVariant code) { |
mauuuuul | 0:530fa614d79a | 133 | command(0x1b, 'R', code); |
mauuuuul | 0:530fa614d79a | 134 | } |
mauuuuul | 0:530fa614d79a | 135 | |
mauuuuul | 0:530fa614d79a | 136 | void Noritake::GU7000_setCharset(Charset code) { |
mauuuuul | 0:530fa614d79a | 137 | command(0x1b, 't', code); |
mauuuuul | 0:530fa614d79a | 138 | } |
mauuuuul | 0:530fa614d79a | 139 | |
mauuuuul | 0:530fa614d79a | 140 | void Noritake::GU7000_setScrollMode(ScrollMode mode) { |
mauuuuul | 0:530fa614d79a | 141 | command(0x1f); |
mauuuuul | 0:530fa614d79a | 142 | command(mode); |
mauuuuul | 0:530fa614d79a | 143 | } |
mauuuuul | 0:530fa614d79a | 144 | |
mauuuuul | 0:530fa614d79a | 145 | void Noritake::GU7000_setHorizScrollSpeed(uint8_t speed) { |
mauuuuul | 0:530fa614d79a | 146 | command(0x1f, 's', speed); |
mauuuuul | 0:530fa614d79a | 147 | } |
mauuuuul | 0:530fa614d79a | 148 | |
mauuuuul | 0:530fa614d79a | 149 | void Noritake::GU7000_invertOff() { |
mauuuuul | 0:530fa614d79a | 150 | command(0x1f, 'r', 0); |
mauuuuul | 0:530fa614d79a | 151 | } |
mauuuuul | 0:530fa614d79a | 152 | |
mauuuuul | 0:530fa614d79a | 153 | void Noritake::GU7000_invertOn() { |
mauuuuul | 0:530fa614d79a | 154 | command(0x1f, 'r', 1); |
mauuuuul | 0:530fa614d79a | 155 | } |
mauuuuul | 0:530fa614d79a | 156 | |
mauuuuul | 0:530fa614d79a | 157 | void Noritake::GU7000_setCompositionMode(CompositionMode mode) { |
mauuuuul | 0:530fa614d79a | 158 | command(0x1f, 'w', mode); |
mauuuuul | 0:530fa614d79a | 159 | } |
mauuuuul | 0:530fa614d79a | 160 | |
mauuuuul | 0:530fa614d79a | 161 | void Noritake::GU7000_setScreenBrightness(unsigned level) { |
mauuuuul | 0:530fa614d79a | 162 | if (level == 0) |
mauuuuul | 0:530fa614d79a | 163 | GU7000_displayOff(); |
mauuuuul | 0:530fa614d79a | 164 | else if (level <= 100) { |
mauuuuul | 0:530fa614d79a | 165 | GU7000_displayOn(); |
mauuuuul | 0:530fa614d79a | 166 | command(0x1f, 'X', (level*10 + 120)/125); |
mauuuuul | 0:530fa614d79a | 167 | } |
mauuuuul | 0:530fa614d79a | 168 | } |
mauuuuul | 0:530fa614d79a | 169 | |
mauuuuul | 0:530fa614d79a | 170 | void Noritake::GU7000_wait(uint8_t time) { |
mauuuuul | 0:530fa614d79a | 171 | us_command('a', 0x01); |
mauuuuul | 0:530fa614d79a | 172 | command(time); |
mauuuuul | 0:530fa614d79a | 173 | } |
mauuuuul | 0:530fa614d79a | 174 | |
mauuuuul | 0:530fa614d79a | 175 | void Noritake::GU7000_scrollScreen(unsigned x, unsigned y, unsigned times, uint8_t speed) { |
mauuuuul | 0:530fa614d79a | 176 | unsigned pos = (x*NORITAKE_VFD_LINES)+(y/8); |
mauuuuul | 0:530fa614d79a | 177 | us_command('a', 0x10); |
mauuuuul | 0:530fa614d79a | 178 | command(pos); |
mauuuuul | 0:530fa614d79a | 179 | command(pos>>8); |
mauuuuul | 0:530fa614d79a | 180 | command(times); |
mauuuuul | 0:530fa614d79a | 181 | command(times>>8); |
mauuuuul | 0:530fa614d79a | 182 | command(speed); |
mauuuuul | 0:530fa614d79a | 183 | } |
mauuuuul | 0:530fa614d79a | 184 | |
mauuuuul | 0:530fa614d79a | 185 | void Noritake::GU7000_blinkScreen() { |
mauuuuul | 0:530fa614d79a | 186 | us_command('a', 0x11); |
mauuuuul | 0:530fa614d79a | 187 | command(0); |
mauuuuul | 0:530fa614d79a | 188 | command(0); |
mauuuuul | 0:530fa614d79a | 189 | command(0); |
mauuuuul | 0:530fa614d79a | 190 | command(0); |
mauuuuul | 0:530fa614d79a | 191 | } |
mauuuuul | 0:530fa614d79a | 192 | |
mauuuuul | 0:530fa614d79a | 193 | void Noritake::GU7000_blinkScreen(bool enable, bool reverse, uint8_t onTime, uint8_t offTime, uint8_t times) { |
mauuuuul | 0:530fa614d79a | 194 | us_command('a', 0x11); |
mauuuuul | 0:530fa614d79a | 195 | command(enable? (reverse? 2: 1): 0); |
mauuuuul | 0:530fa614d79a | 196 | command(onTime); |
mauuuuul | 0:530fa614d79a | 197 | command(offTime); |
mauuuuul | 0:530fa614d79a | 198 | command(times); |
mauuuuul | 0:530fa614d79a | 199 | } |
mauuuuul | 0:530fa614d79a | 200 | |
mauuuuul | 0:530fa614d79a | 201 | void Noritake::GU7000_displayOff() { |
mauuuuul | 0:530fa614d79a | 202 | us_command('a', 0x40); |
mauuuuul | 0:530fa614d79a | 203 | command(0); |
mauuuuul | 0:530fa614d79a | 204 | } |
mauuuuul | 0:530fa614d79a | 205 | |
mauuuuul | 0:530fa614d79a | 206 | void Noritake::GU7000_displayOn() { |
mauuuuul | 0:530fa614d79a | 207 | us_command('a', 0x40); |
mauuuuul | 0:530fa614d79a | 208 | command(0x01); |
mauuuuul | 0:530fa614d79a | 209 | } |
mauuuuul | 0:530fa614d79a | 210 | |
mauuuuul | 0:530fa614d79a | 211 | void Noritake::GU7000_screenSaver(ScreenSaver mode) { |
mauuuuul | 0:530fa614d79a | 212 | us_command('a', 0x40); |
mauuuuul | 0:530fa614d79a | 213 | command(mode); |
mauuuuul | 0:530fa614d79a | 214 | } |
mauuuuul | 0:530fa614d79a | 215 | |
mauuuuul | 0:530fa614d79a | 216 | void Noritake::GU7000_setFontStyle(bool proportional, bool evenSpacing) { |
mauuuuul | 0:530fa614d79a | 217 | us_command('g', 0x03); |
mauuuuul | 0:530fa614d79a | 218 | command(proportional*2 + evenSpacing); |
mauuuuul | 0:530fa614d79a | 219 | } |
mauuuuul | 0:530fa614d79a | 220 | |
mauuuuul | 0:530fa614d79a | 221 | void Noritake::GU7000_setFontSize(uint8_t x, uint8_t y, bool tall) { |
mauuuuul | 0:530fa614d79a | 222 | if (x<=4 && y<=4) { |
mauuuuul | 0:530fa614d79a | 223 | us_command('g', 0x40); |
mauuuuul | 0:530fa614d79a | 224 | command(x); |
mauuuuul | 0:530fa614d79a | 225 | command(y); |
mauuuuul | 0:530fa614d79a | 226 | #if (NORITAKE_VFD_MODEL_CLASS-7000)/100==9 || (NORITAKE_VFD_MODEL_CLASS-7000)/100==1 |
mauuuuul | 0:530fa614d79a | 227 | us_command('g', 0x01); |
mauuuuul | 0:530fa614d79a | 228 | command(tall+1); |
mauuuuul | 0:530fa614d79a | 229 | #endif |
mauuuuul | 0:530fa614d79a | 230 | } |
mauuuuul | 0:530fa614d79a | 231 | } |
mauuuuul | 0:530fa614d79a | 232 | |
mauuuuul | 0:530fa614d79a | 233 | void Noritake::GU7000_selectWindow(uint8_t window) { |
mauuuuul | 0:530fa614d79a | 234 | if (window <= 4) |
mauuuuul | 0:530fa614d79a | 235 | command(0x10 + window); |
mauuuuul | 0:530fa614d79a | 236 | } |
mauuuuul | 0:530fa614d79a | 237 | |
mauuuuul | 0:530fa614d79a | 238 | void Noritake::GU7000_defineWindow(uint8_t window, unsigned x, unsigned y, unsigned width, unsigned height) { |
mauuuuul | 0:530fa614d79a | 239 | us_command('w', 0x02); |
mauuuuul | 0:530fa614d79a | 240 | command(window); |
mauuuuul | 0:530fa614d79a | 241 | command(0x01); |
mauuuuul | 0:530fa614d79a | 242 | command_xy(x, y); |
mauuuuul | 0:530fa614d79a | 243 | command_xy(width, height); |
mauuuuul | 0:530fa614d79a | 244 | } |
mauuuuul | 0:530fa614d79a | 245 | |
mauuuuul | 0:530fa614d79a | 246 | void Noritake::GU7000_deleteWindow(uint8_t window) { |
mauuuuul | 0:530fa614d79a | 247 | us_command('w', 0x02); |
mauuuuul | 0:530fa614d79a | 248 | command(window); |
mauuuuul | 0:530fa614d79a | 249 | command(0); |
mauuuuul | 0:530fa614d79a | 250 | command_xy(0, 0); |
mauuuuul | 0:530fa614d79a | 251 | command_xy(0, 0); |
mauuuuul | 0:530fa614d79a | 252 | } |
mauuuuul | 0:530fa614d79a | 253 | |
mauuuuul | 0:530fa614d79a | 254 | void Noritake::GU7000_joinScreens() { |
mauuuuul | 0:530fa614d79a | 255 | us_command('w', 0x10); |
mauuuuul | 0:530fa614d79a | 256 | command(0x01); |
mauuuuul | 0:530fa614d79a | 257 | } |
mauuuuul | 0:530fa614d79a | 258 | |
mauuuuul | 0:530fa614d79a | 259 | void Noritake::GU7000_separateScreens() { |
mauuuuul | 0:530fa614d79a | 260 | us_command('w', 0x10); |
mauuuuul | 0:530fa614d79a | 261 | command(0); |
mauuuuul | 0:530fa614d79a | 262 | } |
mauuuuul | 0:530fa614d79a | 263 | |
mauuuuul | 0:530fa614d79a | 264 | void Noritake::print(char c) { |
mauuuuul | 0:530fa614d79a | 265 | command(c); |
mauuuuul | 0:530fa614d79a | 266 | } |
mauuuuul | 0:530fa614d79a | 267 | |
mauuuuul | 0:530fa614d79a | 268 | void Noritake::print(const char *str, ...) { |
mauuuuul | 0:530fa614d79a | 269 | while (*str) |
mauuuuul | 0:530fa614d79a | 270 | writePort(*str++); |
mauuuuul | 0:530fa614d79a | 271 | } |
mauuuuul | 0:530fa614d79a | 272 | |
mauuuuul | 0:530fa614d79a | 273 | void Noritake::print(const char *buffer, size_t size) { |
mauuuuul | 0:530fa614d79a | 274 | while (size--) |
mauuuuul | 0:530fa614d79a | 275 | print(*buffer++); |
mauuuuul | 0:530fa614d79a | 276 | } |
mauuuuul | 0:530fa614d79a | 277 | |
mauuuuul | 0:530fa614d79a | 278 | void Noritake::print(long number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 279 | if (number < 0) { |
mauuuuul | 0:530fa614d79a | 280 | print('-'); |
mauuuuul | 0:530fa614d79a | 281 | number = -number; |
mauuuuul | 0:530fa614d79a | 282 | } |
mauuuuul | 0:530fa614d79a | 283 | printNumber(number, base); |
mauuuuul | 0:530fa614d79a | 284 | } |
mauuuuul | 0:530fa614d79a | 285 | |
mauuuuul | 0:530fa614d79a | 286 | void Noritake::print(int number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 287 | print((long)number, base); |
mauuuuul | 0:530fa614d79a | 288 | } |
mauuuuul | 0:530fa614d79a | 289 | |
mauuuuul | 0:530fa614d79a | 290 | void Noritake::print(unsigned long number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 291 | printNumber(number, base); |
mauuuuul | 0:530fa614d79a | 292 | } |
mauuuuul | 0:530fa614d79a | 293 | |
mauuuuul | 0:530fa614d79a | 294 | void Noritake::print(unsigned number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 295 | print((unsigned long)number, base); |
mauuuuul | 0:530fa614d79a | 296 | } |
mauuuuul | 0:530fa614d79a | 297 | |
mauuuuul | 0:530fa614d79a | 298 | void Noritake::printat(unsigned x, uint8_t y, const char *str) |
mauuuuul | 0:530fa614d79a | 299 | { |
mauuuuul | 0:530fa614d79a | 300 | GU7000_setCursor(x, y); |
mauuuuul | 0:530fa614d79a | 301 | print(str); |
mauuuuul | 0:530fa614d79a | 302 | } |
mauuuuul | 0:530fa614d79a | 303 | |
mauuuuul | 0:530fa614d79a | 304 | void Noritake::crlf() { |
mauuuuul | 0:530fa614d79a | 305 | GU7000_carriageReturn(); |
mauuuuul | 0:530fa614d79a | 306 | GU7000_lineFeed(); |
mauuuuul | 0:530fa614d79a | 307 | } |
mauuuuul | 0:530fa614d79a | 308 | |
mauuuuul | 0:530fa614d79a | 309 | void Noritake::println(char c) { |
mauuuuul | 0:530fa614d79a | 310 | print(c); |
mauuuuul | 0:530fa614d79a | 311 | crlf(); |
mauuuuul | 0:530fa614d79a | 312 | } |
mauuuuul | 0:530fa614d79a | 313 | |
mauuuuul | 0:530fa614d79a | 314 | void Noritake::println(const char *str) { |
mauuuuul | 0:530fa614d79a | 315 | print(str); |
mauuuuul | 0:530fa614d79a | 316 | crlf(); |
mauuuuul | 0:530fa614d79a | 317 | } |
mauuuuul | 0:530fa614d79a | 318 | |
mauuuuul | 0:530fa614d79a | 319 | void Noritake::println(const char *buffer, size_t size) { |
mauuuuul | 0:530fa614d79a | 320 | print(buffer, size); |
mauuuuul | 0:530fa614d79a | 321 | crlf(); |
mauuuuul | 0:530fa614d79a | 322 | } |
mauuuuul | 0:530fa614d79a | 323 | |
mauuuuul | 0:530fa614d79a | 324 | void Noritake::println(long number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 325 | print(number, base); |
mauuuuul | 0:530fa614d79a | 326 | crlf(); |
mauuuuul | 0:530fa614d79a | 327 | } |
mauuuuul | 0:530fa614d79a | 328 | |
mauuuuul | 0:530fa614d79a | 329 | void Noritake::println(int number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 330 | println((long) number, base); |
mauuuuul | 0:530fa614d79a | 331 | } |
mauuuuul | 0:530fa614d79a | 332 | |
mauuuuul | 0:530fa614d79a | 333 | void Noritake::println(unsigned long number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 334 | print(number, base); |
mauuuuul | 0:530fa614d79a | 335 | crlf(); |
mauuuuul | 0:530fa614d79a | 336 | } |
mauuuuul | 0:530fa614d79a | 337 | |
mauuuuul | 0:530fa614d79a | 338 | void Noritake::println(unsigned number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 339 | println((unsigned long) number, base); |
mauuuuul | 0:530fa614d79a | 340 | } |
mauuuuul | 0:530fa614d79a | 341 | |
mauuuuul | 0:530fa614d79a | 342 | void Noritake::printNumber(unsigned long number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 343 | if (number/base) |
mauuuuul | 0:530fa614d79a | 344 | printNumber(number/base, base); |
mauuuuul | 0:530fa614d79a | 345 | number %= base; |
mauuuuul | 0:530fa614d79a | 346 | print(number + (number < 10? '0': 'A' - 10)); |
mauuuuul | 0:530fa614d79a | 347 | } |
mauuuuul | 0:530fa614d79a | 348 | |
mauuuuul | 0:530fa614d79a | 349 | void Noritake::GU7000_setBacklightColor(uint8_t r, uint8_t g, uint8_t b) { |
mauuuuul | 0:530fa614d79a | 350 | #if NORITAKE_VFD_MODEL_CLASS==7040 |
mauuuuul | 0:530fa614d79a | 351 | command(0x1f, 'L', 0x10); |
mauuuuul | 0:530fa614d79a | 352 | command(b & 0xf0); |
mauuuuul | 0:530fa614d79a | 353 | command(g & 0xf0); |
mauuuuul | 0:530fa614d79a | 354 | command(r & 0xf0); |
mauuuuul | 0:530fa614d79a | 355 | #endif |
mauuuuul | 0:530fa614d79a | 356 | } |
mauuuuul | 0:530fa614d79a | 357 | |
mauuuuul | 0:530fa614d79a | 358 | void Noritake::GU7000_setBacklightColor(unsigned rgb) { |
mauuuuul | 0:530fa614d79a | 359 | GU7000_setBacklightColor((rgb>>8 & 0x0f)*16, (rgb>>4 & 0x0f)*16, (rgb & 0x0f)*16); |
mauuuuul | 0:530fa614d79a | 360 | } |
mauuuuul | 0:530fa614d79a | 361 | |
mauuuuul | 0:530fa614d79a | 362 | void Noritake::GU7000_drawImage(unsigned width, uint8_t height, const uint8_t *data) { |
mauuuuul | 0:530fa614d79a | 363 | if (height > NORITAKE_VFD_HEIGHT) return; |
mauuuuul | 0:530fa614d79a | 364 | us_command('f', 0x11); |
mauuuuul | 0:530fa614d79a | 365 | command_xy(width, height); |
mauuuuul | 0:530fa614d79a | 366 | command((uint8_t) 1); |
mauuuuul | 0:530fa614d79a | 367 | for (unsigned i = 0; i<(height/8)*width; i++) |
mauuuuul | 0:530fa614d79a | 368 | command(data[i]); |
mauuuuul | 0:530fa614d79a | 369 | } |
mauuuuul | 0:530fa614d79a | 370 | |
mauuuuul | 0:530fa614d79a | 371 | void Noritake::GU7000_drawFROMImage(unsigned long address, uint8_t srcHeight, unsigned width, uint8_t height) { |
mauuuuul | 0:530fa614d79a | 372 | #if (NORITAKE_VFD_MODEL_CLASS-7000)/100==9 || (NORITAKE_VFD_MODEL_CLASS-7000)/100==1 |
mauuuuul | 0:530fa614d79a | 373 | if (height > NORITAKE_VFD_HEIGHT) return; |
mauuuuul | 0:530fa614d79a | 374 | us_command('f', 0x10); |
mauuuuul | 0:530fa614d79a | 375 | command(0x01); |
mauuuuul | 0:530fa614d79a | 376 | command(address); |
mauuuuul | 0:530fa614d79a | 377 | command(address>>8); |
mauuuuul | 0:530fa614d79a | 378 | command(address>>16); |
mauuuuul | 0:530fa614d79a | 379 | command(srcHeight/8); |
mauuuuul | 0:530fa614d79a | 380 | command((srcHeight/8)>>8); |
mauuuuul | 0:530fa614d79a | 381 | command_xy(width, height); |
mauuuuul | 0:530fa614d79a | 382 | command((uint8_t) 1); |
mauuuuul | 0:530fa614d79a | 383 | #endif |
mauuuuul | 0:530fa614d79a | 384 | } |
mauuuuul | 0:530fa614d79a | 385 | |
mauuuuul | 0:530fa614d79a | 386 | static unsigned min(unsigned x, unsigned y) { return x<y? x: y; } |
mauuuuul | 0:530fa614d79a | 387 | |
mauuuuul | 0:530fa614d79a | 388 | void Noritake::GU7000_fillRect(unsigned x0, unsigned y0, unsigned x1, unsigned y1, bool on) { |
mauuuuul | 0:530fa614d79a | 389 | x0 = min(NORITAKE_VFD_WIDTH, x0); |
mauuuuul | 0:530fa614d79a | 390 | x1 = min(NORITAKE_VFD_WIDTH, x1); |
mauuuuul | 0:530fa614d79a | 391 | y0 = min(NORITAKE_VFD_HEIGHT, y0); |
mauuuuul | 0:530fa614d79a | 392 | y1 = min(NORITAKE_VFD_HEIGHT, y1); |
mauuuuul | 0:530fa614d79a | 393 | if (y1<=y0 || x1<=x0) return; |
mauuuuul | 0:530fa614d79a | 394 | uint8_t bufw = 8, bufh = (y1-y0+7)/8*8; |
mauuuuul | 0:530fa614d79a | 395 | uint8_t *buf = (uint8_t*) malloc(bufh/8 * bufw); |
mauuuuul | 0:530fa614d79a | 396 | for (unsigned x = 0; x < x1-x0; x += bufw) { |
mauuuuul | 0:530fa614d79a | 397 | uint8_t part = (x + bufw < x1-x0)? bufw: (x1-x0) - x; |
mauuuuul | 0:530fa614d79a | 398 | memset(buf, 0, bufh/8 * bufw); |
mauuuuul | 0:530fa614d79a | 399 | if (on) |
mauuuuul | 0:530fa614d79a | 400 | for (uint8_t col = 0; col < part; col++) { |
mauuuuul | 0:530fa614d79a | 401 | for (uint8_t py = y0 % 8; py < y0 % 8 + min(y1-y0, 8); py++) |
mauuuuul | 0:530fa614d79a | 402 | buf[col*bufh/8] |= 1 << (7-py); |
mauuuuul | 0:530fa614d79a | 403 | for (uint8_t row = (y0+7)/8; row < y1/8; row++) |
mauuuuul | 0:530fa614d79a | 404 | buf[row - y0/8 + col*bufh/8] = 0xff; |
mauuuuul | 0:530fa614d79a | 405 | if (y0/8 != y1/8) |
mauuuuul | 0:530fa614d79a | 406 | for (uint8_t py = 0; py < y1 % 8; py++) |
mauuuuul | 0:530fa614d79a | 407 | buf[(y1-y0)/8 + col*bufh/8] |= 1 << (7-py); |
mauuuuul | 0:530fa614d79a | 408 | } |
mauuuuul | 0:530fa614d79a | 409 | GU7000_setCursor(x + x0, y0); |
mauuuuul | 0:530fa614d79a | 410 | GU7000_drawImage(bufw, bufh, buf); |
mauuuuul | 0:530fa614d79a | 411 | } |
mauuuuul | 0:530fa614d79a | 412 | } |
mauuuuul | 0:530fa614d79a | 413 | |
mauuuuul | 0:530fa614d79a | 414 | void Noritake::command(uint8_t data) { |
mauuuuul | 0:530fa614d79a | 415 | // writePort(data); |
mauuuuul | 0:530fa614d79a | 416 | VFDSerial.putc(data); |
mauuuuul | 0:530fa614d79a | 417 | } |
mauuuuul | 0:530fa614d79a | 418 | void Noritake::command_xy(unsigned x, unsigned y) { |
mauuuuul | 0:530fa614d79a | 419 | command(x); |
mauuuuul | 0:530fa614d79a | 420 | command(x>>8); |
mauuuuul | 0:530fa614d79a | 421 | y /= 8; |
mauuuuul | 0:530fa614d79a | 422 | command(y); |
mauuuuul | 0:530fa614d79a | 423 | command(y>>8); |
mauuuuul | 0:530fa614d79a | 424 | } |
mauuuuul | 0:530fa614d79a | 425 | void Noritake::command_xy1(unsigned x, unsigned y) { |
mauuuuul | 0:530fa614d79a | 426 | command(x); |
mauuuuul | 0:530fa614d79a | 427 | command(x>>8); |
mauuuuul | 0:530fa614d79a | 428 | command(y); |
mauuuuul | 0:530fa614d79a | 429 | command(y>>8); |
mauuuuul | 0:530fa614d79a | 430 | } |
mauuuuul | 0:530fa614d79a | 431 | |
mauuuuul | 0:530fa614d79a | 432 | void Noritake::us_command(uint8_t group, uint8_t cmd) { |
mauuuuul | 0:530fa614d79a | 433 | command(0x1f); |
mauuuuul | 0:530fa614d79a | 434 | command(0x28); |
mauuuuul | 0:530fa614d79a | 435 | command(group); |
mauuuuul | 0:530fa614d79a | 436 | command(cmd); |
mauuuuul | 0:530fa614d79a | 437 | } |
mauuuuul | 0:530fa614d79a | 438 | |
mauuuuul | 0:530fa614d79a | 439 | void Noritake::command(uint8_t prefix, uint8_t group, uint8_t cmd) { |
mauuuuul | 0:530fa614d79a | 440 | command(prefix); |
mauuuuul | 0:530fa614d79a | 441 | command(group); |
mauuuuul | 0:530fa614d79a | 442 | command(cmd); |
mauuuuul | 0:530fa614d79a | 443 | } |
mauuuuul | 0:530fa614d79a | 444 | |
mauuuuul | 0:530fa614d79a | 445 | void Noritake::print(unsigned x, uint8_t y, const char *buffer, uint8_t len) { |
mauuuuul | 0:530fa614d79a | 446 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 447 | us_command('d', 0x30); |
mauuuuul | 0:530fa614d79a | 448 | command_xy1(x, y); |
mauuuuul | 0:530fa614d79a | 449 | command(0); |
mauuuuul | 0:530fa614d79a | 450 | command(len); |
mauuuuul | 0:530fa614d79a | 451 | while (len--) |
mauuuuul | 0:530fa614d79a | 452 | command(*buffer++); |
mauuuuul | 0:530fa614d79a | 453 | #endif |
mauuuuul | 0:530fa614d79a | 454 | } |
mauuuuul | 0:530fa614d79a | 455 | |
mauuuuul | 0:530fa614d79a | 456 | void Noritake::print(unsigned x, uint8_t y, const char *str) { |
mauuuuul | 0:530fa614d79a | 457 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 458 | print(x, y, str, strlen(str)); |
mauuuuul | 0:530fa614d79a | 459 | #endif |
mauuuuul | 0:530fa614d79a | 460 | } |
mauuuuul | 0:530fa614d79a | 461 | void Noritake::print(unsigned x, uint8_t y, char c) { |
mauuuuul | 0:530fa614d79a | 462 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 463 | print(x, y, &c, 1); |
mauuuuul | 0:530fa614d79a | 464 | #endif |
mauuuuul | 0:530fa614d79a | 465 | } |
mauuuuul | 0:530fa614d79a | 466 | void Noritake::print(unsigned x, uint8_t y, int number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 467 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 468 | if (number < 0) { |
mauuuuul | 0:530fa614d79a | 469 | print(x, y, '-'); |
mauuuuul | 0:530fa614d79a | 470 | print(-1, y, (unsigned)-number, base); |
mauuuuul | 0:530fa614d79a | 471 | } else |
mauuuuul | 0:530fa614d79a | 472 | print(x, y, (unsigned)number, base); |
mauuuuul | 0:530fa614d79a | 473 | #endif |
mauuuuul | 0:530fa614d79a | 474 | } |
mauuuuul | 0:530fa614d79a | 475 | void Noritake::print(unsigned x, uint8_t y, unsigned number, uint8_t base) { |
mauuuuul | 0:530fa614d79a | 476 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 477 | char buf[16], *p = buf + sizeof buf; |
mauuuuul | 0:530fa614d79a | 478 | do |
mauuuuul | 0:530fa614d79a | 479 | *--p = number % base + (number % base < 10? '0': 'A' - 10); |
mauuuuul | 0:530fa614d79a | 480 | while (number /= base); |
mauuuuul | 0:530fa614d79a | 481 | print(x, y, p, buf + sizeof buf - p); |
mauuuuul | 0:530fa614d79a | 482 | #endif |
mauuuuul | 0:530fa614d79a | 483 | } |
mauuuuul | 0:530fa614d79a | 484 | void Noritake::GU7000_drawImage(unsigned x, uint8_t y, unsigned width, uint8_t height, const char *data) { |
mauuuuul | 0:530fa614d79a | 485 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 486 | us_command('d', 0x21); |
mauuuuul | 0:530fa614d79a | 487 | command_xy1(x, y); |
mauuuuul | 0:530fa614d79a | 488 | command_xy1(width, height); |
mauuuuul | 0:530fa614d79a | 489 | command(0x01); |
mauuuuul | 0:530fa614d79a | 490 | for (unsigned i = 0; i<(height/8)*width; i++) |
mauuuuul | 0:530fa614d79a | 491 | command(data[i]); |
mauuuuul | 0:530fa614d79a | 492 | #endif |
mauuuuul | 0:530fa614d79a | 493 | } |
mauuuuul | 0:530fa614d79a | 494 | void Noritake::GU7000_drawImage(unsigned x, uint8_t y, ImageMemoryArea area, unsigned long address, uint8_t srcHeight, unsigned width, uint8_t height, unsigned offsetx, unsigned offsety) { |
mauuuuul | 0:530fa614d79a | 495 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 496 | if (height > NORITAKE_VFD_HEIGHT) return; |
mauuuuul | 0:530fa614d79a | 497 | us_command('d', 0x20); |
mauuuuul | 0:530fa614d79a | 498 | command_xy1(x, y); |
mauuuuul | 0:530fa614d79a | 499 | command(area); |
mauuuuul | 0:530fa614d79a | 500 | command(address); |
mauuuuul | 0:530fa614d79a | 501 | command(address>>8); |
mauuuuul | 0:530fa614d79a | 502 | command(address>>16); |
mauuuuul | 0:530fa614d79a | 503 | command(srcHeight/8); |
mauuuuul | 0:530fa614d79a | 504 | command(srcHeight/8>>8); |
mauuuuul | 0:530fa614d79a | 505 | command_xy1(offsetx, offsety); |
mauuuuul | 0:530fa614d79a | 506 | command_xy1(width, height); |
mauuuuul | 0:530fa614d79a | 507 | command(0x01); |
mauuuuul | 0:530fa614d79a | 508 | #endif |
mauuuuul | 0:530fa614d79a | 509 | } |
mauuuuul | 0:530fa614d79a | 510 | |
mauuuuul | 0:530fa614d79a | 511 | void Noritake::GU7000_drawImage(unsigned x, uint8_t y, ImageMemoryArea area, unsigned long address, unsigned width, uint8_t height) { |
mauuuuul | 0:530fa614d79a | 512 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 513 | GU7000_drawImage(x, y, area, address, (height + 7) & ~7, width, height, 0, 0); |
mauuuuul | 0:530fa614d79a | 514 | #endif |
mauuuuul | 0:530fa614d79a | 515 | } |
mauuuuul | 0:530fa614d79a | 516 | |
mauuuuul | 0:530fa614d79a | 517 | void Noritake::print_p(const char *str) { |
mauuuuul | 0:530fa614d79a | 518 | while (pgm_read_byte(str)) |
mauuuuul | 0:530fa614d79a | 519 | writePort(pgm_read_byte(str++)); |
mauuuuul | 0:530fa614d79a | 520 | } |
mauuuuul | 0:530fa614d79a | 521 | void Noritake::print_p(unsigned x, uint8_t y, const char *buffer, uint8_t len) { |
mauuuuul | 0:530fa614d79a | 522 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 523 | us_command('d', 0x30); |
mauuuuul | 0:530fa614d79a | 524 | command_xy1(x, y); |
mauuuuul | 0:530fa614d79a | 525 | command(0); |
mauuuuul | 0:530fa614d79a | 526 | command(len); |
mauuuuul | 0:530fa614d79a | 527 | while (len--) |
mauuuuul | 0:530fa614d79a | 528 | command(pgm_read_byte(buffer++)); |
mauuuuul | 0:530fa614d79a | 529 | #endif |
mauuuuul | 0:530fa614d79a | 530 | } |
mauuuuul | 0:530fa614d79a | 531 | |
mauuuuul | 0:530fa614d79a | 532 | void Noritake::print_p(unsigned x, uint8_t y, const char *str) { |
mauuuuul | 0:530fa614d79a | 533 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 534 | const char *end = str; |
mauuuuul | 0:530fa614d79a | 535 | while (pgm_read_byte(end)) end++; |
mauuuuul | 0:530fa614d79a | 536 | print_p(x, y, str, end - str); |
mauuuuul | 0:530fa614d79a | 537 | #endif |
mauuuuul | 0:530fa614d79a | 538 | } |
mauuuuul | 0:530fa614d79a | 539 | |
mauuuuul | 0:530fa614d79a | 540 | void Noritake::GU7000_drawImage_p(unsigned width, uint8_t height, const uint8_t *data) { |
mauuuuul | 0:530fa614d79a | 541 | if (height > NORITAKE_VFD_HEIGHT) return; |
mauuuuul | 0:530fa614d79a | 542 | us_command('f', 0x11); |
mauuuuul | 0:530fa614d79a | 543 | command_xy(width, height); |
mauuuuul | 0:530fa614d79a | 544 | command((uint8_t) 1); |
mauuuuul | 0:530fa614d79a | 545 | for (unsigned i = 0; i<(height/8)*width; i++) |
mauuuuul | 0:530fa614d79a | 546 | command(pgm_read_byte(data+i)); |
mauuuuul | 0:530fa614d79a | 547 | } |
mauuuuul | 0:530fa614d79a | 548 | |
mauuuuul | 0:530fa614d79a | 549 | void Noritake::GU7000_drawImage_p(unsigned x, uint8_t y, unsigned width, uint8_t height, const uint8_t *data) { |
mauuuuul | 0:530fa614d79a | 550 | #if NORITAKE_VFD_GENERATION == 'B' |
mauuuuul | 0:530fa614d79a | 551 | us_command('d', 0x21); |
mauuuuul | 0:530fa614d79a | 552 | command_xy1(x, y); |
mauuuuul | 0:530fa614d79a | 553 | command_xy1(width, height); |
mauuuuul | 0:530fa614d79a | 554 | command(0x01); |
mauuuuul | 0:530fa614d79a | 555 | for (unsigned i = 0; i<(height/8)*width; i++) |
mauuuuul | 0:530fa614d79a | 556 | command(pgm_read_byte(data+i)); |
mauuuuul | 0:530fa614d79a | 557 | #endif |
mauuuuul | 0:530fa614d79a | 558 | } |