diff --git a/src/main.c b/src/main.c index 0a9a341..7b1bf53 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,20 @@ #include +#include #include +#include + +const int digit_bitmaps[10][5][3] = { + {{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}}, // 0 + {{0,1,0},{1,1,0},{0,1,0},{0,1,0},{1,1,1}}, // 1 + {{1,1,1},{0,0,1},{1,1,1},{1,0,0},{1,1,1}}, // 2 + {{1,1,1},{0,0,1},{1,1,1},{0,0,1},{1,1,1}}, // 3 + {{1,0,1},{1,0,1},{1,1,1},{0,0,1},{0,0,1}}, // 4 + {{1,1,1},{1,0,0},{1,1,1},{0,0,1},{1,1,1}}, // 5 + {{1,1,1},{1,0,0},{1,1,1},{1,0,1},{1,1,1}}, // 6 + {{1,1,1},{0,0,1},{0,1,0},{0,1,0},{0,1,0}}, // 7 + {{1,1,1},{1,0,1},{1,1,1},{1,0,1},{1,1,1}}, // 8 + {{1,1,1},{1,0,1},{1,1,1},{0,0,1},{1,1,1}} // 9 +}; void get_data(int *speed, int *power, int *bat, float *tq, int *rpm, int *eff, float *bat_temp, float *var_temp, float *mot_temp) { @@ -14,6 +29,57 @@ void get_data(int *speed, int *power, int *bat, float *tq, int *rpm, int *eff, f *mot_temp = (float)rand() / (float)RAND_MAX * 150.0f; } +void win_clear(WINDOW *lwin) { + int y, x; + getmaxyx(lwin, y, x); + for (int i = 1; i < y - 1; i++) { + mvwhline(lwin, i, 1, ' ', x - 2); + } +} + +int smaller_of(int a, int b) { + return (a < b) ? a : b; +} + +void wspeed(WINDOW *lwin, int speed){ + int lwiny, lwinx, len; + char buf[16]; + getmaxyx(lwin, lwiny, lwinx); + snprintf(buf , sizeof(buf), "%d", speed); + len = strlen(buf); + + int bh = 5; // bitmap height + int bw = 3; // bitmap width + + int size = smaller_of((lwiny - 2) / bh, (lwinx - 2 - (3 - 1)) / (bw * 3)); + + int total_width = 3 * (bw * size) + 2; + int startx = (lwinx - total_width) / 2; + int starty = (lwiny - bh * size) / 2; + + win_clear(lwin); + + for (int d = 0; d < len; d++) { + int digit = buf[d] - '0'; + int dx = startx + d * (bw * size + 1); + + for (int y = 0; y < bh; y++) { + for (int x = 0; x < bw; x++) { + if (digit_bitmaps[digit][y][x]) { + for (int yy = 0; yy < size; yy++) + for (int xx = 0; xx < size; xx++) + mvwaddch(lwin, + starty + y * size + yy, + dx + x * size + xx, + ACS_CKBOARD); + } + } + } + } + + wrefresh(lwin); +} + int main() { initscr(); @@ -25,6 +91,9 @@ int main() int y,x; getmaxyx(stdscr, y, x); + if (y < 42 || x < 100){ + return 1; + } WINDOW *win[10]; @@ -71,6 +140,7 @@ int main() while(ch == ERR) { get_data(&speed, &power, &bat, &tq, &rpm, &eff, &bat_temp, &var_temp, &mot_temp); + wspeed(win[0], speed); ch = getch(); };