/* Copyright 2022, Savanni D'Gerinel This file is part of Savanni's AVR library. This AVR library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This AVR library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this AVR library. If not, see . */ #ifndef __BASE_H__ #define __BASE_H__ #include #include #include #define LINE_OUT 1 #define LINE_IN 0 typedef struct DIO { volatile uint8_t *ddr; volatile uint8_t *port; volatile uint8_t *pin; uint8_t addr; } dio_t; /* #define DIO(addr) (dio_t){ .ddr = &DDRA, .port = &PORTA, .addr = addr } #define DIO(addr) (dio_t){ .ddr = &DDRB, .port = &PORTB, .addr = addr } #define DIO(addr) (dio_t){ .ddr = &DDRC, .port = &PORTC, .addr = addr } #define DIO(addr) (dio_t){ .ddr = &DDRD, .port = &PORTD, .addr = addr } */ inline void dio_set_direction(dio_t *line, int direction) { if (direction == LINE_OUT) { *(line->ddr) |= _BV(line->addr); } else { *(line->ddr) &= ~(_BV(line->addr)); } } inline void dio_set(dio_t *line, bool value) { if (value) { *(line->port) |= _BV(line->addr); } else { *(line->port) &= ~(_BV(line->addr)); } } inline uint8_t dio_read(dio_t *line) { return (*(line->pin) & _BV(line->addr)) > 0; } #endif