#include "sensor_handler.h"

void sensor_setup() {
    // 超声波传感器引脚设置
    pinMode(ULTRASONIC_FRONT_TRIG_PIN, OUTPUT);
    pinMode(ULTRASONIC_FRONT_ECHO_PIN, INPUT);
    pinMode(ULTRASONIC_SIDE_TRIG_PIN, OUTPUT);
    pinMode(ULTRASONIC_SIDE_ECHO_PIN, INPUT);
    Serial.println("超声波传感器引脚已初始化。");

    // TCRT5000 循迹传感器引脚设置
    // 如果TCRT5000模块的DOUT引脚直接给出高低电平，则设为INPUT
    // 如果是AOUT引脚，需要用analogRead()，引脚模式通常不需要显式设置，但INPUT也可以
    pinMode(TCRT5000_LEFT_PIN, INPUT);
    pinMode(TCRT5000_RIGHT_PIN, INPUT);
    Serial.println("TCRT5000循迹传感器引脚已初始化。");
}

// --- 超声波传感器函数 ---
long get_ultrasonic_distance_cm(int trig_pin, int echo_pin) {
    digitalWrite(trig_pin, LOW);
    delayMicroseconds(2);
    digitalWrite(trig_pin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig_pin, LOW);
    long duration = pulseIn(echo_pin, HIGH, 30000); // 等待脉冲返回，超时时间30ms (约5米)
    // 声速为 340m/s 或 29.412 µs/cm (1 / (34000 / 1000000 / 2))
    // (duration / 2) * 0.034 = duration * 0.017
    // More precise: duration / 58.8 (for cm)
    if (duration == 0) { // 超时或检测失败
        return -1; // 返回-1表示无效读数或超出范围
    }
    return duration / 58; // Convert duration to cm
}

long get_front_obstacle_distance() {
    return get_ultrasonic_distance_cm(ULTRASONIC_FRONT_TRIG_PIN, ULTRASONIC_FRONT_ECHO_PIN);
}

long get_side_spot_distance() {
    return get_ultrasonic_distance_cm(ULTRASONIC_SIDE_TRIG_PIN, ULTRASONIC_SIDE_ECHO_PIN);
}

// --- TCRT5000 循迹传感器函数 ---

// 辅助函数：根据模拟值判断是否在线上
// 注意: TCRT5000输出特性可能不同，白色反射强->低电压/低模拟值，黑色吸收->高电压/高模拟值
// 或者相反，取决于模块设计。这里的THRESHOLD假设的是：检测到黑线时读数高于阈值。
// 您需要根据实际情况校准和调整逻辑。
bool is_on_line(int sensor_pin, int threshold) {
    int sensor_value = analogRead(sensor_pin);
    // Serial.print("Sensor pin "); Serial.print(sensor_pin); 
    // Serial.print(" value: "); Serial.println(sensor_value);
    return sensor_value > threshold; // 示例：高于阈值是在黑线上
    // 如果您的传感器是检测到黑线时值变小，则应为: return sensor_value < threshold;
}

LineFollowValues get_line_follow_values() {
    LineFollowValues values;
    
    // 如果TCRT5000的DOUT引脚直接连接到数字引脚，则使用digitalRead()
    // values.left_on_line = digitalRead(TCRT5000_LEFT_PIN) == HIGH; // 假设HIGH表示在黑线上
    // values.right_on_line = digitalRead(TCRT5000_RIGHT_PIN) == HIGH;

    // 如果使用AOUT引脚并进行模拟比较：
    values.left_on_line = is_on_line(TCRT5000_LEFT_PIN, TCRT5000_THRESHOLD);
    values.right_on_line = is_on_line(TCRT5000_RIGHT_PIN, TCRT5000_THRESHOLD);
    
    // 调试输出
    // Serial.print("Line Follow: Left OnLine="); Serial.print(values.left_on_line);
    // Serial.print(", Right OnLine="); Serial.println(values.right_on_line);

    return values;
} 