zzz

Committer:
mauuuuul
Date:
Wed Aug 26 19:45:12 2020 +0000
Revision:
0:530fa614d79a
zzzzzzzz

Who changed what in which revision?

UserRevisionLine numberNew 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 }