package FLXCheckInController
import (
	"fmt"
	"io"
	"time"
	log "github.com/sirupsen/logrus"
)
type FlxCheckInCmdSender struct {
	ReadDLock  bool
	SerialPort *io.ReadWriteCloser
}
func (para *FlxCheckInCmdSender) init(serialPortt *io.ReadWriteCloser) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("init:", r)
		}
	}()
	fmt.Println("初始化串口驱动 ")
	para.SerialPort = serialPortt
}
// / 发送串口命令
// / 命令内容
func (para *FlxCheckInCmdSender) WritePort(buf []byte) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("WritePort:", r)
		}
	}()
	para.ReadDLock = true
	if para.SerialPort != nil {
		(*(para.SerialPort)).Write(buf)
		time.Sleep(10 * time.Millisecond)
	}
	para.ReadDLock = false
}
func (para *FlxCheckInCmdSender) InitDoor() {
	defer func() {
		if r := recover(); r != nil {
			log.Error("InitDoor:", r)
		}
	}()
	fmt.Println("初始化签到门 ")
	var ary = make([]byte, 6)
	ary[0] = CMD_HEAD
	ary[5] = CMD_Tail
	para.WritePort(ary)
}
func (para *FlxCheckInCmdSender) InvokeOnDataSendLogHandler(logMessage string) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("InvokeOnDataSendLogHandler:", r)
		}
	}()
	fmt.Println(logMessage)
}
// / 打开或关闭报到天线
// / (State=1 表示开启天线的工作状态;State = 0 表示关闭天线的工作状态)
func (para *FlxCheckInCmdSender) OpenOrCloseReadPower(isOpen bool) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("OpenOrCloseReadPower:", r)
		}
	}()
	var ary = make([]byte, 6)
	ary[0] = CMD_HEAD
	ary[1] = Open_Close_ReaderPower
	if isOpen {
		ary[2] = 0x01
	} else {
		ary[2] = 0x00
	}
	ary[5] = CMD_Tail
	para.WritePort(ary)
}
// / 下载控制状态指令
func (para *FlxCheckInCmdSender) DownLoadEStatus(eStatus byte) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("DownLoadEStatus:", r)
		}
	}()
	var ary = make([]byte, 6)
	ary[0] = CMD_HEAD
	ary[1] = DownLoad_EState
	ary[2] = eStatus
	ary[5] = CMD_Tail
	para.WritePort(ary)
}
// / (对于原装TI读卡器)读读卡器检测状态
func (para *FlxCheckInCmdSender) GetReader_State() {
	defer func() {
		if r := recover(); r != nil {
			log.Error("GetReader_State:", r)
		}
	}()
	var ary = make([]byte, 6)
	ary[0] = CMD_HEAD
	ary[1] = Read_Reader_State
	ary[5] = CMD_Tail
	para.WritePort(ary)
}
// / 控制继电器及开关量输出(State:0:关;1:开)
func (para *FlxCheckInCmdSender) SetOutputState(isOpen bool) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("SetOutputState:", r)
		}
	}()
	var ary = make([]byte, 6)
	ary[0] = CMD_HEAD
	ary[1] = Set_Output_State
	if isOpen {
		ary[2] = 0x01
	} else {
		ary[2] = 0x00
	}
	ary[5] = CMD_Tail
	para.WritePort(ary)
}
// / 
// / 发送告警指令
// / 
// / 
func (para *FlxCheckInCmdSender) SendAlarm(msec byte) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("SendAlarm:", r)
		}
	}()
	var ary = make([]byte, 6)
	ary[0] = CMD_HEAD
	ary[1] = BeepOn
	ary[2] = msec
	ary[3] = Clear_SaveArea
	ary[4] = Clear_SaveArea
	ary[5] = CMD_Tail
	para.WritePort(ary)
}
// / 
// / 向通道机发送心跳指令
// / 
func (para *FlxCheckInCmdSender) SendHeartBeat() {
	defer func() {
		if r := recover(); r != nil {
			log.Error("SendHeartBeat:", r)
		}
	}()
	var ary = make([]byte, 10)
	ary[0] = 0x1B
	ary[1] = 0x00
	ary[2] = 0x05
	ary[3] = 0xFF
	ary[4] = 0xFF
	ary[5] = 0x00
	ary[6] = 0x00
	ary[7] = 0x01
	ary[8] = 0xCA
	ary[9] = 0x79
	para.WritePort(ary)
}
// / 
// / 蜂鸣器控制协议
// / 
// / 表示蜂鸣时长
func (para *FlxCheckInCmdSender) SendBeep(bBeeps byte) {
	defer func() {
		if r := recover(); r != nil {
			log.Error("SendBeep:", r)
		}
	}()
	var ary = make([]byte, 6)
	ary[0] = 0x7E
	ary[1] = 0x09
	ary[2] = bBeeps
	ary[3] = 0x00
	ary[4] = 0x00
	ary[5] = 0x7E
	para.WritePort(ary)
}