#ifdef __cplusplus
extern "C"{
#endif
#include"dist_dev/ks104.hpp"

static int uart_send(const char *port, int baud, const u8 *tx_data, int tx_len,u8 *rx_buf, int rx_size, int timeout) {
    // 1. 打开串口（非阻塞模式）
    int fd = open(port, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd < 0) {
        printf("open com:%s error\n",port);
        return -1;
    }
   /// printf("now config:%s\n",port);
    // 2. 配置串口参数（8N1）
    struct termios options;
    tcgetattr(fd, &options);
    cfmakeraw(&options);  // 原始模式（等效于8N1）
    cfsetspeed(&options, baud);
    options.c_cc[VTIME] = timeout / 100;  // 超时（单位：0.1秒）
    options.c_cc[VMIN] = 0;               // 非阻塞
    if (tcsetattr(fd, TCSANOW, &options) != 0) {
        perror("configure port failed");
        close(fd);
        return -2;
    }
    // 3. 发送数据
    if (tx_len > 0) {
        int sent = write(fd, tx_data, tx_len);
        if (sent < 0) {
            perror("send failed");
            close(fd);
            return -3;
        }
    }

    // 4. 接收数据（带超时）
    int total_read = 0;
    fd_set read_fds;
    struct timeval tv;
    tv.tv_sec = timeout / 1000;
    tv.tv_usec = (timeout % 1000) * 1000;
    FD_ZERO(&read_fds);
    FD_SET(fd, &read_fds);
    while (total_read < rx_size) {
        int ret = select(fd + 1, &read_fds, NULL, NULL, &tv);
        if (ret <= 0) break;  // 超时或错误

        int n = read(fd, rx_buf + total_read, rx_size - total_read);
        if (n <= 0) break;
        total_read += n;
    }

    // 5. 关闭串口
    close(fd);
    return total_read;
}
static int ks104_send(const u8 *tx,u8* rx){
    int ret=uart_send("/dev/ttyS0",115200,tx,3,rx,128,100);
    return ret;
}
int ks104_dist(u8 addr){
    int dist=-1;
    u8 tx[3] = {0xd0,0x02,0xb0};
    u8 rx[16];
    tx[0]=addr;
    tx[1]=0x02;
    tx[2]=0xb0;
    int ret=ks104_send(tx,rx);
    if(ret==2){
        dist=rx[0]*256+rx[1];
        if(dist>5000)
            dist=5000;
        printf("%02hhx dist:%dmm\n",addr,dist);

        return dist;
    }
    return dist;
}
#ifdef __cplusplus
}
#endif
