#include "ad7606.h"

namespace ad7606 {

static inline void pinWriteOpt(int pin, int level) {
    if (pin >= 0) digitalWrite(pin, level);
}
static inline void pinModeOpt(int pin, uint8_t mode) {
    if (pin >= 0) pinMode(pin, mode);
}

static void resetPulse() {
    pinWriteOpt(PIN_AD_RESET, LOW);
    delayMicroseconds(2);
    pinWriteOpt(PIN_AD_RESET, HIGH);
    delayMicroseconds(2);
    pinWriteOpt(PIN_AD_RESET, LOW);
}

static void startConvst() {
    pinWriteOpt(PIN_AD_CONVST, LOW);
    delayMicroseconds(1);
    pinWriteOpt(PIN_AD_CONVST, HIGH);
    delayMicroseconds(1);
}

void init() {
    // 仅配置 GPIO；SPI 总线由外部统一 SPI.begin(...) 完成（与 TFT 共用）
    pinMode(PIN_AD_CS, OUTPUT);
    pinMode(PIN_AD_BUSY, INPUT);
    pinMode(PIN_AD_RESET, OUTPUT);
    pinMode(PIN_AD_CONVST, OUTPUT);

    pinModeOpt(PIN_AD_OS0, OUTPUT);
    pinModeOpt(PIN_AD_OS1, OUTPUT);
    pinModeOpt(PIN_AD_OS2, OUTPUT);
    pinModeOpt(PIN_AD_SER, OUTPUT);
    pinModeOpt(PIN_AD_STBY, OUTPUT);

    digitalWrite(PIN_AD_CS, HIGH);
    digitalWrite(PIN_AD_CONVST, HIGH);

    // 若引脚未硬件固定，软件拉到默认工作状态
    pinWriteOpt(PIN_AD_SER, HIGH);   // 串行模式
    pinWriteOpt(PIN_AD_STBY, HIGH);  // 正常工作

    // 不过采样 OS[2:0] = 000（若 OS 引脚未连，可忽略）
    pinWriteOpt(PIN_AD_OS0, LOW);
    pinWriteOpt(PIN_AD_OS1, LOW);
    pinWriteOpt(PIN_AD_OS2, LOW);

    resetPulse();
    delay(1);

    // 做一次假触发，确保内部状态正常
    startConvst();
}

void readAll(int16_t* data8) {
    // 触发转换
    startConvst();

    // 等 BUSY 低（高=转换进行中）
    while (digitalRead(PIN_AD_BUSY) == HIGH) {
        // 可根据需要加入超时
    }

    // 读取8个16位（RD/SC 由 SPI SCLK 提供）
    // 提升串行读取速率以缩短读出时间（与 TFT 共用 SPI，使用事务隔离）
    SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));
    digitalWrite(PIN_AD_CS, LOW);
    for (int i = 0; i < 8; ++i) {
        uint16_t raw = SPI.transfer16(0x0000);
        data8[i] = static_cast<int16_t>(raw);
    }
    digitalWrite(PIN_AD_CS, HIGH);
    SPI.endTransaction();
}

}  // namespace ad7606
