#include <stdio.h>
#include <pico/stdlib.h>
#include "pico/time.h"
#include "hardware/gpio.h"
#include "hardware/pwm.h"

// Define pins
const uint8_t button = 21;
const uint8_t clutch = 20;
const uint8_t accPin = 5;
const uint8_t ignPin = 4;
const uint8_t staPin = 3;
const uint8_t engPin = 2;
const uint hold_time = 1000;

uint button_state = 0;
bool button_held = false;
absolute_time_t press_start_time = 0;

bool accessories = false;
bool ignition = false;
bool started = false;

void Starter() {
  gpio_put(staPin, 1);
  sleep_ms(500);
  gpio_put(staPin, 0);
  started = true;
}

void button_down(uint gpio, uint32_t events) {
  press_start_time = get_absolute_time();
  printf("'%i'", press_start_time);
}

void button_up(uint gpio, uint32_t events) {
  press_start_time = 0;
}

void check_hold_timer() {
  absolute_time_t current_time = get_absolute_time();
  if (button_state == 1 && absolute_time_diff_us(press_start_time, current_time) >= hold_time * 1000) {
    Starter();
  }
}

int main() {
  stdio_init_all();

  // Initialize GPIO pins
  gpio_init(button);
  gpio_init(clutch);
  gpio_init(accPin);
  gpio_init(ignPin);
  gpio_init(staPin);
  gpio_init(engPin);

  // Set GPIO pin directions
  gpio_set_dir(button, GPIO_IN);
  gpio_set_dir(clutch, GPIO_IN);
  gpio_set_dir(accPin, GPIO_OUT);
  gpio_set_dir(ignPin, GPIO_OUT);
  gpio_set_dir(staPin, GPIO_OUT);
  gpio_set_dir(engPin, GPIO_OUT);

  // disable pulls?
  gpio_disable_pulls(accPin);
  gpio_disable_pulls(ignPin);
  gpio_disable_pulls(staPin);
  gpio_disable_pulls(engPin);

  // GPIO irq
  gpio_set_irq_enabled_with_callback(button, GPIO_IRQ_EDGE_RISE, true, &button_down);
  gpio_set_irq_enabled_with_callback(button, GPIO_IRQ_EDGE_FALL, true, &button_up);

  // Emulate Central locking system signal
  pwm_config cfg = pwm_get_default_config();
  pwm_init(16, &cfg, false);
  pwm_set_clkdiv(16, 16.0f);                // Set PWM frequency (Hz) and duty cycle (0.0 to 1.0). Adjust as needed for your application
  pwm_set_wrap(16, 1000);                   // PWM frequency of 1 kHz is 1000
  pwm_set_chan_level(16, PWM_CHAN_A, 0.5);  // 50% duty cycle
  pwm_set_enabled(16, true);                // Enable PWM channel





    // INITIALIZE THE READ UNLOCK CODE
    gpio_set_function(15, GPIO_FUNC_PWM);
    uint slice_num_read = pwm_gpio_to_slice_num(15);

    // Set an initial wrap value for reading (adjust as needed)
    uint32_t initial_wrap_value = 65535;
    pwm_set_wrap(slice_num_read, initial_wrap_value);

    while (true) {
        // READ THE PWM SIGNAL
        uint32_t sys_clk = clock_get_hz(clk_sys);  // Get system clock frequency

        // Calculate the effective clkdiv (taking into account fractional part)
        uint32_t pwm_clkdiv = pwm_get_clkdiv(slice_num_read);
        uint32_t pwm_clkdiv_int = pwm_clkdiv >> 16;
        uint32_t pwm_clkdiv_frac = pwm_clkdiv & 0xFFFF;

      printf("Frequency: %d Hz\n", sys_clk / (pwm_get_wrap(slice_num_read) * (pwm_clkdiv_int + 1)));
      printf("Duty Cycle: %.2f%%\n", static_cast<float>(pwm_get_chan_level(slice_num_read, PWM_CHAN_A)) / pwm_get_wrap(slice_num_read) * 100);

        sleep_ms(1000);
    }

    return 0;
D0D1D2D3D4D5D6D7GNDLOGIC