package main

import (
	"log"
	"net"
	//"os"
	// "strconv"
	// "log"
	//"strings"
	"time"
	// "go-study/socket/config"
)

func handleConn(conn net.Conn) {

	log.Println("begin handleConn,cliendAddr:", conn.RemoteAddr())

	defer conn.Close()

	readChan := make(chan []byte)
	//writeChan := make(chan string)
	stopChan := make(chan bool)

	go readConn(conn, readChan, stopChan)
	// go writeConn(conn, writeChan, stopChan)

	var heartbeat []byte = []byte{0x01}

	for {
		select {
		case readStr := <-readChan:
			//log.Println("readStr:",readStr)
			//upper := strings.ToUpper(readStr)
			//writeChan <- upper

			// go yunhorn_ys_l_v1(readStr)
			go yunhorn_wireless(readStr)
		case stop := <-stopChan:
			if stop {
				log.Println("stop channel")
				break
			}
		case <-time.After(5000 * time.Millisecond):
			_, err := conn.Write(heartbeat)
			if err != nil {
				log.Println("write msg error!", err)
				stopChan <- true
			} else {
				log.Println("write msg success!", conn.RemoteAddr())
			}
		}
	}
}
func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) {
	data_buf := make(chan []byte)
	Rdata := make([]byte, 0)
	data := make([]byte, 256)

	go func() {
		for {
			select {
			case kkdata := <-data_buf: //如果有数据,下面打印。但是有可能ch一直没数据
				Rdata = append(Rdata, kkdata...)
				//log.Println("kkdata:",kkdata)
			case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时
				// log.Println("超时")
				if len(Rdata) > 4 {
					readChan <- Rdata
					Rdata = make([]byte, 0)
				}
				//strData := string(Rdata)
				//Rdata = make([]byte,0)
				//log.Println("Received:", strData)

				//readChan <- Rdata
				//Rdata = make([]byte,0)
			}
		}
	}()

	for {
		// data := make([]byte, config.SERVER_RECV_LEN)
		//data2 := make([]byte,256)
		_, err := conn.Read(data)
		if err != nil {
			log.Println(err)
			break
		}
		// log.Println(DEVICEDATAS)
		log.Println("read.data:%d,%s", Bytes2Bits(data[3:4])[0],conn.RemoteAddr())

		data_buf <- data
	}

	stopChan <- true
}

func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) {
	for {
		strData := <-writeChan
		_, err := conn.Write([]byte(strData))
		if err != nil {
			log.Println(err)
			break
		}

		log.Println("Send:", strData)
	}

	stopChan <- true
}