parent
877df1a3ed
commit
d716190cc5
@ -1,6 +1,6 @@ |
|||||||
#pragma once |
#pragma once |
||||||
|
|
||||||
/** Weird constructs for the compiler */ |
// Weird constructs for the compiler
|
||||||
|
|
||||||
// general macros
|
// general macros
|
||||||
#define SECTION(pos) __attribute__((naked, used, section(pos))) |
#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