1//! Solar sensor peripheral
2//!
3//! Used by the Boktai games
4
5use bincode::{Decode, Encode};
6
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}