Solar sensor peripheral
Used by the Boktai games
5use bincode::{Decode, Encode};
7pub struct SolarSensorWrite { 8 pub reset: bool, 9 pub clock: bool, 10} 11 12#[derive(Debug, Clone, Encode, Decode)] 13pub struct SolarSensor { 14 brightness: u8, 15 counter: u8, 16 prev_clock: bool, 17} 18 19impl SolarSensor { 20 pub fn new() -> Self { 21 Self { 22 brightness: gba_config::DEFAULT_SOLAR_MIN_BRIGHTNESS, 23 counter: 255, 24 prev_clock: false, 25 } 26 } 27 28 pub fn set_brightness(&mut self, brightness: u8) { 29 self.brightness = brightness; 30 } 31 32 pub fn read(&self) -> bool { 33 self.counter < self.brightness 34 } 35 36 pub fn write(&mut self, SolarSensorWrite { reset, clock }: SolarSensorWrite) { 37 if reset { 38 self.counter = 255; 39 self.prev_clock = clock; 40 return; 41 } 42 43 if !self.prev_clock && clock { 44 self.counter = self.counter.saturating_sub(1); 45 } 46 self.prev_clock = clock; 47 } 48}