#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <time.h>

#define BUF_SIZE 256
#define SERIAL_PORT "/dev/ttyUSB0"

int serial_fd = -1;

// 初始化串口
int init_serial(const char *port, int baudrate) {
    serial_fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
    if (serial_fd == -1) {
        perror("Unable to open serial port");
        return -1;
    }
    
    struct termios options;
    tcgetattr(serial_fd, &options);
    
    // 设置波特率
    cfsetispeed(&options, baudrate);
    cfsetospeed(&options, baudrate);
    
    // 设置8位数据，无校验，1位停止位
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag |= (CLOCAL | CREAD);
    
    // 禁用软件流控
    options.c_iflag &= ~(IXON | IXOFF | IXANY);
    
    // 原始输入
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    
    // 原始输出
    options.c_oflag &= ~OPOST;
    
    // 设置超时
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 10;
    
    tcsetattr(serial_fd, TCSANOW, &options);
    
    printf("Connected to %s\n", port);
    return 0;
}

// 发送命令
void send_command(const char *command) {
    char buffer[BUF_SIZE];
    
    printf("Sending: %s\n", command);
    
    // 发送命令
    write(serial_fd, command, strlen(command));
    write(serial_fd, "\r\n", 2);
    
    // 等待响应
    usleep(500000);
    
    // 读取响应
    ssize_t bytes_read = read(serial_fd, buffer, BUF_SIZE - 1);
    if (bytes_read > 0) {
        buffer[bytes_read] = '\0';
        printf("Response: %s", buffer);
    } else {
        printf("No response\n");
    }
    
    printf("----------------------------------------\n");
}

int main() {
    // 初始化串口（根据实际情况修改）
    if (init_serial(SERIAL_PORT, B9600) < 0) {
        return 1;
    }
    
    printf("Starting basic tests...\n");
    
    // 运行测试
    send_command("HELP");
    send_command("STATUS");
    send_command("POWER 1");
    send_command("STATUS");
    send_command("POWER 2");
    send_command("STATUS");
    send_command("PC");
    send_command("STATUS");
    send_command("VERSATILE 1");
    send_command("STATUS");
    send_command("OFF");
    send_command("STATUS");
    send_command("help");
    send_command("power 1");
    
    printf("Tests completed\n");
    
    // 清理
    close(serial_fd);
    return 0;
}