#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;