parent
877df1a3ed
commit
d716190cc5
@ -1,6 +1,6 @@ |
||||
#pragma once |
||||
|
||||
/** Weird constructs for the compiler */ |
||||
// Weird constructs for the compiler
|
||||
|
||||
// general macros
|
||||
#define SECTION(pos) __attribute__((naked, used, section(pos))) |
||||
|
@ -0,0 +1,166 @@ |
||||
#include <avr/io.h> |
||||
#include <stdbool.h> |
||||
#include <stdint.h> |
||||
|
||||
#include "uart.h" |
||||
#include "uart_ansi.h" |
||||
|
||||
|
||||
void vt_goto(uint16_t x, uint16_t y) |
||||
{ |
||||
uart_putc(27); |
||||
uart_putc('['); |
||||
uart_putu(x); |
||||
uart_putc(';'); |
||||
uart_putu(y); |
||||
uart_putc('H'); |
||||
} |
||||
|
||||
|
||||
void vt_move(int16_t x, int16_t y) |
||||
{ |
||||
vt_move_x(x); |
||||
vt_move_y(y); |
||||
} |
||||
|
||||
|
||||
void vt_move_x(int16_t x) |
||||
{ |
||||
if (x < 0) { |
||||
vt_left(-x); |
||||
} else { |
||||
vt_right(x); |
||||
} |
||||
} |
||||
|
||||
|
||||
void vt_move_y(int16_t y) |
||||
{ |
||||
if (y < 0) { |
||||
vt_up(-y); |
||||
} else { |
||||
vt_down(y); |
||||
} |
||||
} |
||||
|
||||
|
||||
void vt_up(uint16_t y) |
||||
{ |
||||
if (y == 0) return; |
||||
uart_putc(27); |
||||
uart_putc('['); |
||||
uart_putu(y); |
||||
uart_putc('A'); |
||||
} |
||||
|
||||
|
||||
void vt_down(uint16_t y) |
||||
{ |
||||
if (y == 0) return; |
||||
uart_putc(27); |
||||
uart_putc('['); |
||||
uart_putu(y); |
||||
uart_putc('B'); |
||||
} |
||||
|
||||
|
||||
void vt_left(uint16_t x) |
||||
{ |
||||
if (x == 0) return; |
||||
uart_putc(27); |
||||
uart_putc('['); |
||||
uart_putu(x); |
||||
uart_putc('D'); |
||||
} |
||||
|
||||
|
||||
void vt_right(uint16_t x) |
||||
{ |
||||
if (x == 0) return; |
||||
uart_putc(27); |
||||
uart_putc('['); |
||||
uart_putu(x); |
||||
uart_putc('C'); |
||||
} |
||||
|
||||
|
||||
void vt_scroll(int16_t y) |
||||
{ |
||||
while (y < 0) { |
||||
uart_putc(27); |
||||
uart_putc('D'); // up
|
||||
y++; |
||||
} |
||||
|
||||
while (y > 0) { |
||||
uart_putc(27); |
||||
uart_putc('M'); // down
|
||||
y--; |
||||
} |
||||
} |
||||
|
||||
|
||||
void vt_save() |
||||
{ |
||||
uart_putc(27); |
||||
uart_putc(7); |
||||
} |
||||
|
||||
|
||||
void vt_restore() |
||||
{ |
||||
uart_putc(27); |
||||
uart_putc(8); |
||||
} |
||||
|
||||
|
||||
void vt_style(uint8_t flags) |
||||
{ |
||||
if (flags == VT_NORMAL) { |
||||
uart_puts("\x1B[m"); // reset
|
||||
return; |
||||
} |
||||
|
||||
if (flags & VT_BOLD) { |
||||
uart_puts("\x1B[1m"); |
||||
} |
||||
|
||||
if (flags & VT_UNDERLINE) { |
||||
uart_puts("\x1B[4m"); |
||||
} |
||||
|
||||
if (flags & VT_BLINK) { |
||||
uart_puts("\x1B[5m"); |
||||
} |
||||
|
||||
if (flags & VT_REVERSE) { |
||||
uart_puts("\x1B[7m"); |
||||
} |
||||
|
||||
if (flags & VT_HIDDEN) { |
||||
uart_puts("\x1B[8m"); |
||||
} |
||||
} |
||||
|
||||
|
||||
void vt_color(uint8_t fg, uint8_t bg) |
||||
{ |
||||
uart_putc(27); |
||||
uart_putc('['); |
||||
uart_putu(fg); |
||||
uart_putc(';'); |
||||
uart_putu(bg); |
||||
uart_putc('m'); |
||||
} |
||||
|
||||
|
||||
void vt_clear() |
||||
{ |
||||
uart_puts("\x1B[2J"); |
||||
} |
||||
|
||||
|
||||
void vt_home() |
||||
{ |
||||
uart_puts("\x1B[H"); |
||||
} |
@ -0,0 +1,62 @@ |
||||
#pragma once |
||||
|
||||
//
|
||||
// ANSI / VT100 utilities for UART
|
||||
//
|
||||
|
||||
#include <avr/io.h> |
||||
#include <stdbool.h> |
||||
#include <stdint.h> |
||||
#include "uart.h" |
||||
|
||||
#define VT_NORMAL 0 |
||||
#define VT_BOLD 1 |
||||
#define VT_UNDERLINE 2 |
||||
#define VT_BLINK 4 |
||||
#define VT_REVERSE 8 |
||||
#define VT_HIDDEN 16 |
||||
|
||||
/** Jump to a location on the screen */ |
||||
void vt_goto(uint16_t x, uint16_t y); |
||||
|
||||
/** Move cursor relative to current location */ |
||||
void vt_move(int16_t x, int16_t y); |
||||
|
||||
/** Move cursor horizontally */ |
||||
void vt_move_x(int16_t x); |
||||
|
||||
/** Move cursor vertically */ |
||||
void vt_move_y(int16_t y); |
||||
|
||||
/** Move cursor up y cells */ |
||||
void vt_up(uint16_t y); |
||||
|
||||
/** Move cursor down y cells */ |
||||
void vt_down(uint16_t y); |
||||
|
||||
/** Move cursor left x cells */ |
||||
void vt_left(uint16_t x); |
||||
|
||||
/** Move cursor right x cells */ |
||||
void vt_right(uint16_t x); |
||||
|
||||
/** Scroll y lines down (like up/down, but moves window if needed) */ |
||||
void vt_scroll(int16_t down); |
||||
|
||||
/** Set font style */ |
||||
void vt_style(uint8_t flags); |
||||
|
||||
/** Set color */ |
||||
void vt_color(uint8_t fg, uint8_t bg); |
||||
|
||||
/** Save cursor position & text attributes */ |
||||
void vt_save(); |
||||
|
||||
/** Restore cursor to saved values */ |
||||
void vt_restore(); |
||||
|
||||
/** Clear the screen */ |
||||
void vt_clear(); |
||||
|
||||
/** Move cursor to top left corner */ |
||||
void vt_home(); |
Loading…
Reference in new issue