use std::error::Error;
use std::thread;
use std::time::Duration;

use rppal::i2c::I2c;
use rppal::gpio::Gpio;

const ADDR_ADS7830: u16 = 0x48;
const CMD_A0: u8 = 0x84;
const CMD_A1: u8 = 0xc4;
const CMD_A2: u8 = 0x94;

const PWM_R: u8 = 23;
const PWM_G: u8 = 24;
const PWM_B: u8 = 25;
const PWM_FRQ: f64 = 2000.0;

fn main() -> Result<(), Box<dyn Error>> {
    let mut i2c = I2c::new()?;
    let mut pin_r = Gpio::new()?.get(PWM_R)?.into_output();
    let mut pin_g = Gpio::new()?.get(PWM_G)?.into_output();
    let mut pin_b = Gpio::new()?.get(PWM_B)?.into_output();

    i2c.set_slave_address(ADDR_ADS7830)?;

    pin_r.set_pwm_frequency(PWM_FRQ, 0.0)?;
    pin_g.set_pwm_frequency(PWM_FRQ, 0.0)?;
    pin_b.set_pwm_frequency(PWM_FRQ, 0.0)?;

    let mut data = [0u8; 1];
    loop {
        i2c.block_read(CMD_A0, &mut data)?;
        pin_r.set_pwm_frequency(PWM_FRQ, data[0] as f64 / 255.0)?;

        i2c.block_read(CMD_A1, &mut data)?;
        pin_g.set_pwm_frequency(PWM_FRQ, data[0] as f64 / 255.0)?;

        i2c.block_read(CMD_A2, &mut data)?;
        pin_b.set_pwm_frequency(PWM_FRQ, data[0] as f64 / 255.0)?;

        thread::sleep(Duration::from_millis(10));
    }
}
