changed comments & added basic VT100 support
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/*
|
//
|
||||||
Utilities for build-in A/D converter
|
// Utilities for build-in A/D converter
|
||||||
*/
|
//
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
Pin definitions for Arduino (Pro Mini with ATmega328P)
|
// Pin definitions for Arduino (Pro Mini with ATmega328P)
|
||||||
*/
|
//
|
||||||
|
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
Bit and byte manipulation utilities
|
// Bit and byte manipulation utilities
|
||||||
*/
|
//
|
||||||
|
|
||||||
|
|
||||||
// --- Increment in range ---
|
// --- Increment in range ---
|
||||||
|
|||||||
+10
-10
@@ -1,15 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/*
|
//
|
||||||
Some useful utilities for RGB color manipulation
|
// Some useful utilities for RGB color manipulation
|
||||||
|
//
|
||||||
The XXXc macros don't use cast, so they can be used in array initializers.
|
// The XXXc macros don't use cast, so they can be used in array initializers.
|
||||||
|
//
|
||||||
xrgb ... 3-byte true-color RGB (8 bits per component)
|
// xrgb ... 3-byte true-color RGB (8 bits per component)
|
||||||
rgbXX ... XX-bit color value, with equal nr of bits per component
|
// rgbXX ... XX-bit color value, with equal nr of bits per component
|
||||||
|
//
|
||||||
XX_r (_g, _b) ... extract component from the color, and convert it to 0..255
|
// XX_r (_g, _b) ... extract component from the color, and convert it to 0..255
|
||||||
*/
|
//
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
+32
-31
@@ -1,37 +1,38 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
An implementation of button debouncer.
|
// An implementation of button debouncer.
|
||||||
|
//
|
||||||
|
// ----
|
||||||
|
//
|
||||||
|
// You must provide a config file debo_config.h (next to your main.c)
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// #pragma once
|
||||||
|
// #define DEBO_CHANNELS 2
|
||||||
|
// #define DDEBO_TICKS 5
|
||||||
|
//
|
||||||
|
// ----
|
||||||
|
//
|
||||||
|
// A pin is registered like this:
|
||||||
|
//
|
||||||
|
// #define BTN1 B,0
|
||||||
|
// #define BTN2 B,1
|
||||||
|
//
|
||||||
|
// debo_add(BTN0); // The function returns number assigned to the pin (0, 1, ...)
|
||||||
|
// debo_add_rev(BTN1); // active low
|
||||||
|
// debo_register(&PINB, PB2, 0); // direct access - register, pin & invert
|
||||||
|
//
|
||||||
|
// Then periodically call the tick function (perhaps in a timer interrupt):
|
||||||
|
//
|
||||||
|
// debo_tick();
|
||||||
|
//
|
||||||
|
// To check if input is active, use
|
||||||
|
//
|
||||||
|
// debo_get_pin(0); // state of input #0 (registered first)
|
||||||
|
// debo_get_pin(1); // state of input #1 (registered second)
|
||||||
|
//
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
You must provide a config file debo_config.h (next to your main.c)
|
|
||||||
|
|
||||||
Example:
|
|
||||||
#pragma once
|
|
||||||
#define DEBO_CHANNELS 2
|
|
||||||
#define DDEBO_TICKS 5
|
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
A pin is registered like this:
|
|
||||||
|
|
||||||
#define BTN1 B,0
|
|
||||||
#define BTN2 B,1
|
|
||||||
|
|
||||||
debo_add(BTN0); // The function returns number assigned to the pin (0, 1, ...)
|
|
||||||
debo_add_rev(BTN1); // active low
|
|
||||||
debo_register(&PINB, PB2, 0); // direct access - register, pin & invert
|
|
||||||
|
|
||||||
Then periodically call the tick function (perhaps in a timer interrupt):
|
|
||||||
|
|
||||||
debo_tick();
|
|
||||||
|
|
||||||
To check if input is active, use
|
|
||||||
|
|
||||||
debo_get_pin(0); // state of input #0 (registered first)
|
|
||||||
debo_get_pin(1); // state of input #1 (registered second)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/*
|
//
|
||||||
HSL support (addition to colors.h)
|
// HSL support (addition to colors.h)
|
||||||
*/
|
//
|
||||||
|
|
||||||
#include "colors.h"
|
#include "colors.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,22 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/*
|
// HD44780 LCD display driver - 4-bit mode
|
||||||
HD44780 LCD display driver - 4-bit mode
|
//
|
||||||
|
// LCD pins are configured using a file lcd_config.h, which you
|
||||||
LCD pins are configured using a file lcd_config.h, which you
|
// have to add next to your main.c file.
|
||||||
have to add next to your main.c file.
|
//
|
||||||
|
// Content can be something like this:
|
||||||
Content can be something like this:
|
//
|
||||||
|
// #pragma once
|
||||||
#pragma once
|
// #include "lib/arduino_pins.h"
|
||||||
#include "lib/arduino_pins.h"
|
// #define LCD_RS D10
|
||||||
#define LCD_RS D10
|
// #define LCD_RW D11
|
||||||
#define LCD_RW D11
|
// #define LCD_E D12
|
||||||
#define LCD_E D12
|
// #define LCD_D4 D13
|
||||||
#define LCD_D4 D13
|
// #define LCD_D5 D14
|
||||||
#define LCD_D5 D14
|
// #define LCD_D6 D15
|
||||||
#define LCD_D6 D15
|
// #define LCD_D7 D16
|
||||||
#define LCD_D7 D16
|
//
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "lcd_config.h"
|
#include "lcd_config.h"
|
||||||
|
|||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
Custom loops
|
// Custom loops
|
||||||
*/
|
//
|
||||||
|
|
||||||
// Repeat code n times (uint8_t counter)
|
// Repeat code n times (uint8_t counter)
|
||||||
#define repeat(count) repeat_aux(count, _repeat_##__COUNTER__)
|
#define repeat(count) repeat_aux(count, _repeat_##__COUNTER__)
|
||||||
|
|||||||
+1
-1
@@ -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)))
|
||||||
|
|||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
Functions for precise delays (nanoseconds / cycles)
|
// Functions for precise delays (nanoseconds / cycles)
|
||||||
*/
|
//
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <util/delay_basic.h>
|
#include <util/delay_basic.h>
|
||||||
|
|||||||
+25
-25
@@ -1,30 +1,30 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
This file provides macros for pin manipulation.
|
// This file provides macros for pin manipulation.
|
||||||
|
//
|
||||||
You can define your application pins like so:
|
// You can define your application pins like so:
|
||||||
|
//
|
||||||
// Led at PORTB, pin 1
|
// // Led at PORTB, pin 1
|
||||||
#define LED B,1
|
// #define LED B,1
|
||||||
|
//
|
||||||
// Switch at PORTD, pin 7
|
// // Switch at PORTD, pin 7
|
||||||
#define SW1 D,7
|
// #define SW1 D,7
|
||||||
|
//
|
||||||
Now you can use macros from this file to wirh with the pins, eg:
|
// Now you can use macros from this file to wirh with the pins, eg:
|
||||||
|
//
|
||||||
as_output(LED);
|
// as_output(LED);
|
||||||
as_input(SW1);
|
// as_input(SW1);
|
||||||
pullup_on(SW1);
|
// pullup_on(SW1);
|
||||||
|
//
|
||||||
toggle_pin(LED);
|
// toggle_pin(LED);
|
||||||
while (pin_is_low(SW1));
|
// while (pin_is_low(SW1));
|
||||||
|
//
|
||||||
- The macros io2XXX() can be used to get literal name of register associated with the pin.
|
// - The macros io2XXX() can be used to get literal name of register associated with the pin.
|
||||||
- io2n() provides pin number.
|
// - io2n() provides pin number.
|
||||||
- The XXX_aux() macros are internal and should not be used elsewhere.
|
// - The XXX_aux() macros are internal and should not be used elsewhere.
|
||||||
- The io_pack() macro is used to pass pin (io) to other macro without expanding it.
|
// - The io_pack() macro is used to pass pin (io) to other macro without expanding it.
|
||||||
*/
|
//
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include "calc.h"
|
#include "calc.h"
|
||||||
|
|||||||
+6
-6
@@ -1,11 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/*
|
//
|
||||||
Utilities for UART communication.
|
// Utilities for UART communication.
|
||||||
|
//
|
||||||
First, init uart with desired baud rate using uart_init().
|
// First, init uart with desired baud rate using uart_init().
|
||||||
Then, enable interrupts you want, and that's it.
|
// Then, enable interrupts you want, and that's it.
|
||||||
*/
|
//
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|||||||
+166
@@ -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();
|
||||||
+15
-16
@@ -1,21 +1,20 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
//
|
||||||
Utils for driving a WS28xx (tested on WS2812B) RGB LED strips.
|
// Utils for driving a WS28xx (tested on WS2812B) RGB LED strips.
|
||||||
|
//
|
||||||
It's implemented as macros to avoid overhead when passing values, and to
|
// It's implemented as macros to avoid overhead when passing values, and to
|
||||||
enable driving multiple strips at once.
|
// enable driving multiple strips at once.
|
||||||
|
//
|
||||||
To avoid bloating your code, try to reduce the number of invocations -
|
// To avoid bloating your code, try to reduce the number of invocations -
|
||||||
compute color and then send it.
|
// compute color and then send it.
|
||||||
|
//
|
||||||
[IMPORTANT]
|
// [IMPORTANT]
|
||||||
|
//
|
||||||
Some seemingly random influences can ruin the communication.
|
// Some seemingly random influences can ruin the communication.
|
||||||
If you have enough memory, consider preparing the colors in array,
|
// If you have enough memory, consider preparing the colors in array,
|
||||||
and sending this array using one of the "ws_send_XXX_array" macros.
|
// and sending this array using one of the "ws_send_XXX_array" macros.
|
||||||
|
//
|
||||||
*/
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user