g13gui/g13d/lcd.cc
June Tate-Gans a05dcb04c8 g13d: More symbol relocations and cleanups
Lots of cross-translation unit messes in here cleaned up finally. This should be
the last change necessary to clean up these refs between translation units.
2021-04-25 17:09:19 -05:00

161 lines
3.8 KiB
C++

/*
pixels are mapped rather strangely for G13 buffer...
byte 0 contains column 0 / row 0 - 7
byte 1 contains column 1 / row 0 - 7
so the masks for each pixel are laid out as below
(ByteOffset.PixelMask)
00.01 01.01 02.01 ...
00.02 01.02 02.02 ...
00.04 01.04 02.04 ...
00.08 01.08 02.08 ...
00.10 01.10 02.10 ...
00.20 01.20 02.20 ...
00.40 01.40 02.40 ...
00.80 01.80 02.80 ...
A0.01 A1.01 A2.01 ...
*/
#include <iostream>
#include <fstream>
#include "lcd.h"
#include "device.h"
namespace G13 {
void G13_LCD::image(unsigned char *data, int size) {
_keypad.write_lcd(data, size);
}
G13_LCD::G13_LCD(G13_Device &keypad) : _keypad(keypad) {
cursor_col = 0;
cursor_row = 0;
text_mode = 0;
}
void G13_LCD::image_setpixel(unsigned row, unsigned col) {
unsigned offset =
image_byte_offset(row, col); // col + (row /8 ) * BYTES_PER_ROW * 8;
unsigned char mask = 1 << ((row)&7);
if (offset >= G13_LCD_BUF_SIZE) {
G13_LOG(error,
"bad offset " << offset << " for " << (row) << " x " << (col));
return;
}
image_buf[offset] |= mask;
}
void G13_LCD::image_clearpixel(unsigned row, unsigned col) {
unsigned offset =
image_byte_offset(row, col); // col + (row /8 ) * BYTES_PER_ROW * 8;
unsigned char mask = 1 << ((row)&7);
if (offset >= G13_LCD_BUF_SIZE) {
G13_LOG(error,
"bad offset " << offset << " for " << (row) << " x " << (col));
return;
}
image_buf[offset] &= ~mask;
}
void G13_LCD::write_pos(int row, int col) {
cursor_row = row;
cursor_col = col;
if (cursor_col >= G13_LCD_COLUMNS) {
cursor_col = 0;
}
if (cursor_row >= G13_LCD_TEXT_ROWS) {
cursor_row = 0;
}
}
void G13_LCD::write_char(char c, int row, int col) {
if (row == -1) {
row = cursor_row;
col = cursor_col;
cursor_col += _keypad.current_font().width();
if (cursor_col >= G13_LCD_COLUMNS) {
cursor_col = 0;
if (++cursor_row >= G13_LCD_TEXT_ROWS) {
cursor_row = 0;
}
}
}
unsigned offset = image_byte_offset(row * G13_LCD_TEXT_CHEIGHT,
col); //*_keypad._current_font->_width );
if (text_mode) {
memcpy(&image_buf[offset],
&_keypad.current_font().char_data(c).bits_inverted,
_keypad.current_font().width());
} else {
memcpy(&image_buf[offset],
&_keypad.current_font().char_data(c).bits_regular,
_keypad.current_font().width());
}
}
void G13_LCD::write_string(const char *str) {
G13_LOG(info, "writing \"" << str << "\"");
while (*str) {
if (*str == '\n') {
cursor_col = 0;
if (++cursor_row >= G13_LCD_TEXT_ROWS) {
cursor_row = 0;
}
} else if (*str == '\t') {
cursor_col += 4 - (cursor_col % 4);
if (++cursor_col >= G13_LCD_COLUMNS) {
cursor_col = 0;
if (++cursor_row >= G13_LCD_TEXT_ROWS) {
cursor_row = 0;
}
}
} else {
write_char(*str);
}
++str;
}
image_send();
}
void G13_LCD::image_test(int x, int y) {
unsigned int row = 0, col = 0;
if (y >= 0) {
image_setpixel(x, y);
} else {
image_clear();
switch (x) {
case 1:
for (row = 0; row < G13_LCD_ROWS; ++row) {
col = row;
image_setpixel(row, col);
image_setpixel(row, G13_LCD_COLUMNS - col);
}
break;
case 2:
default:
for (row = 0; row < G13_LCD_ROWS; ++row) {
col = row;
image_setpixel(row, 8);
image_setpixel(row, G13_LCD_COLUMNS - 8);
image_setpixel(row, G13_LCD_COLUMNS / 2);
image_setpixel(row, col);
image_setpixel(row, G13_LCD_COLUMNS - col);
}
break;
}
}
image_send();
}
} // namespace G13