#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "bsp/board.h"
#include "tusb.h"
#include "hardware/adc.h"

// SS49E Data pin connected to GP26 (ADC0)
#define ADC_PIN 26
#define ADC_NUM 0

int main(void) {
    board_init();
    tusb_init();

    adc_init();
    // Make sure GPIO is high-impedance, no pullups etc
    adc_gpio_init(ADC_PIN);
    adc_select_input(ADC_NUM);

    uint32_t last_report = 0;

    while (1) {
        tud_task(); // tinyusb device task
        
        uint32_t now = board_millis();
        // Send a report every 10ms (100 Hz)
        if (now - last_report > 10) {
            if (tud_hid_ready()) {
                // Read SS49E (12-bit ADC value: 0 - 4095)
                uint16_t adc_val = adc_read();
                
                // Send as 2 bytes
                uint8_t report[2];
                report[0] = adc_val & 0xFF;
                report[1] = (adc_val >> 8) & 0xFF;

                tud_hid_report(0, report, sizeof(report));
                last_report = now;
            }
        }
    }
    return 0;
}

//--------------------------------------------------------------------
// Device callbacks
//--------------------------------------------------------------------

// Invoked when device is mounted
void tud_mount_cb(void) { }

// Invoked when device is unmounted
void tud_umount_cb(void) { }

// Invoked when usb bus is suspended
void tud_suspend_cb(bool remote_wakeup_en) { }

// Invoked when usb bus is resumed
void tud_resume_cb(void) { }

//--------------------------------------------------------------------
// HID Report callbacks
//--------------------------------------------------------------------

// Invoked when received GET_REPORT control request
uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) {
    return 0;
}

// Invoked when received SET_REPORT control request
void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) {
}
