use crate::atmega328p::hal::pin::*;
use core::ptr::{read_volatile, write_volatile};
impl DigitalPin {
pub fn toggle(&mut self) {
unsafe { write_volatile(&mut (*self.pin.port).pin, 0x1 << self.pin.pin) }
}
pub fn high(&mut self) {
if self.pin.pin >= 8 {
return;
}
let mut p = unsafe { read_volatile(&mut (*self.pin.port).port) }; p = p & (1 << self.pin.pin);
let ddr_value = unsafe { read_volatile(&mut (*self.pin.port).ddr) }; if p == 0 && ddr_value == (0x1 << self.pin.pin) {
self.toggle();
}
}
pub fn low(&mut self) {
if self.pin.pin >= 8 {
return;
}
let mut p = unsafe { read_volatile(&mut (*self.pin.port).port) }; p = p & (1 << self.pin.pin);
let ddr_value = unsafe { read_volatile(&mut (*self.pin.port).ddr) }; if p != 0 && ddr_value == (0x1 << self.pin.pin) {
self.toggle();
}
}
}