package main

import (
	"github.com/tarm/serial"
	"log"
	"time"
)

// 初始化串口
func serial_run() {
	SERIAL_PORT := make(map[string]*serial.Port)
	ports_arr := make([]string, 0)
	port_arr := make([]string, 0)
	for _, i := range conf.DEVICES_LIST {
		ports_arr = append(ports_arr, i[1])
	}
	for i := 0; i < len(ports_arr); i++ {
		if (i > 0 && ports_arr[i-1] == ports_arr[i]) || len(ports_arr[i]) == 0 {
			continue
		}
		port_arr = append(port_arr, ports_arr[i])
	}
	// 解析串口配置
	if conf.OPENSERIAL {
		for _, i := range port_arr {
			var PARITY serial.Parity
			switch conf.SERIALPORTS_LIST[i].PARITY {
			case "N":
				PARITY = 'N'
			case "E":
				PARITY = 'E'
			}
			// 打开串口
			SERIAL_PORT[i], err = serial.OpenPort(&serial.Config{
				Name:        conf.SERIALPORTS_LIST[i].COM,
				Baud:        conf.SERIALPORTS_LIST[i].BAUDS,
				Parity:      PARITY,
				ReadTimeout: time.Millisecond * time.Duration(conf.SERIALPORTS_LIST[i].READTIMEOUT),

				// ReadTimeout: time.Second * time.Duration(conf.SERIALPORTS_LIST[i].READTIMEOUT),

			})
			check(err)
			defer SERIAL_PORT[i].Close()
		}
	}

	if conf.DEBUG {
		log.Println(SERIAL_PORT)
	}
	// 遍历设备对应的串口对应的端口,并放到相应的run_port_device方法
	for j, k := range SERIAL_PORT {
		var the_same_port_devices [][]string
		for _, i := range conf.DEVICES_LIST {
			if j == i[1] {
				the_same_port_devices = append(the_same_port_devices, i)
			}
		}
		go run_port_device(k, the_same_port_devices)
	}
	for i, k := range SERIAL_PORT {
		if conf.SERIALPORTS_LIST[i].NOTE == "lorawan" {
			yunhorn_lorawan_l_v1(k)
		}
	}
	select {}
}

// 轮询相同串口的设备,放到对应的worker
func run_port_device(port *serial.Port, the_same_port_devices [][]string) {
	for {
		for _, i := range the_same_port_devices {
			switch i[2] {
			case "yunhorn_sb_c_v1":
				yunhorn_sb_c_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_db_c_v1":
				yunhorn_db_c_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_kq_c_v1":
				yunhorn_kq_c_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_lhq_c_v1":
				yunhorn_lhq_c_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_aq_c_v1":
				yunhorn_aq_c_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_kgl_c8_v1":
				yunhorn_kgl_c8_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_kgl_c16_v1":
				yunhorn_kgl_c16_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			case "yunhorn_xsy_l_v1":
				yunhorn_xsy_l_v1(port, i[0], conf.RS485DEVICES[i[0]].COMMAND, conf.RS485DEVICES[i[0]].NUM)
			}
		}
		time.Sleep(time.Duration(1) * time.Millisecond)
	}
}