#ifndef AVRLIB_PIN_HPP #define AVRLIB_PIN_HPP #include <avr/io.h> namespace avrlib { template <typename Port, uint8_t Pin> struct pin { static void set(bool value = true) { if (value) Port::port(Port::port() | (1<<Pin)); else Port::port(Port::port() & ~(1<<Pin)); } static void clear() { set(false); } static void toggle() { Port::port(Port::port() ^ (1<<Pin)); } static bool get() { return (Port::port() & (1<<Pin)) != 0; } static bool value() { return (Port::pin() & (1<<Pin)) != 0; } static void output(bool value) { if (value) Port::dir(Port::dir() | (1<<Pin)); else Port::dir(Port::dir() & ~(1<<Pin)); } static bool output() { return (Port::dir() & (1<<Pin)) != 0; } static void make_output() { output(true); } static void make_input() { output(false); clear(); } static void make_low() { clear(); output(true); } static void make_high() { set(); output(true); } static void set_value(bool value) { set(value); } static void set_high() { set(true); } static void set_low() { set(false); } static bool read() { return value(); } static void pullup() { set_high(); } }; } #endif