You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

505 lines
12 KiB
Go

4 weeks ago
package FLXCheckInController
import (
"encoding/hex"
"flx/Common"
FLXDevice "flx/Device"
"fmt"
"io"
"time"
log "github.com/sirupsen/logrus"
serial "github.com/tarm/goserial"
)
type FlxCheckInDeviceController struct {
FirstRun bool
IsRunning bool
IsOpen bool
IsOnline bool
OldSData string
SerialPort *io.ReadWriteCloser
Reader FlxCheckInCmdReader
Sender FlxCheckInCmdSender
ComPackets chan []byte
previousBuffer []byte
HasDataIsReturned bool
deviceGUID string
regsterEvent_SeatInfos []FLXDevice.SeatChangeEventArg
DataReciveSave []string
InvokeDeviceEventHandler func(FLXDevice.EventArgSource, FLXDevice.EventArgType, []FLXDevice.SeatChangeEventArg)
}
func (para *FlxCheckInDeviceController) FlxCheckInDeviceController() {
defer func() {
if r := recover(); r != nil {
log.Error("FlxCheckInDeviceController:", r)
}
}()
para.InitControllerBusnissInfo()
}
func (para *FlxCheckInDeviceController) InitControllerBusnissInfo() {
defer func() {
if r := recover(); r != nil {
log.Error("InitControllerBusnissInfo:", r)
}
}()
para.ComPackets = make(chan []byte, 600)
para.Sender.init(para.SerialPort)
// Sender.defualtDelayed = configKeys.OneTimeDataPackedDelayed;
// Sender.OnDataSendLogHandler += Sender_OnDataSendLogHandler;
para.Reader.InitPara(para.SerialPort)
para.Reader.InvokeOnBusinessDataReviceData = para.Reader_OnDataReciveEventHandler
para.Reader.OnConnectStatusHandler = para.Reader_OnConnectStatusHandler
}
func (para *FlxCheckInDeviceController) Reader_OnConnectStatusHandler(dtLastRecived time.Time) {
defer func() {
if r := recover(); r != nil {
log.Error("Reader_OnConnectStatusHandler:", r)
}
}()
ts := time.Now().Sub(dtLastRecived)
//判断报到机是否已达3秒没有向上位机发送数据
if ts.Seconds() >= 3 {
//尝试获取报到机系统信息,如果报到机无数据返回,视为离线,否则,作在线处理
para.Sender.SendHeartBeat()
revBuffer := para.Reader.ReadResponseData()
if revBuffer == nil {
if para.IsOnline {
para.IsOnline = false
}
} else {
para.Reader.dtLastRecivedDateTime = time.Now()
if !para.IsOnline {
if para.FirstRun {
para.FirstRun = false
} else {
//发送蜂鸣指令
para.Sender.SendBeep(1)
}
para.IsOnline = true
}
}
}
}
// / <summary>
// /D7-D6表示控制蜂鸣器操作模式
// /00表示不对蜂鸣器进行控制操作
// /01表示有人通过即提示
// /10表示有人无卡提示
// /11表示有人有卡提示
// /D5-D4表示控制灯的操作模式
// /00表示不对灯进行控制操作
// /01表示有人通过即提示
// /10表示有人无卡提示
// /11表示有人有卡提示
// /D3-D0表示时钟周期
// / </summary>
func (para *FlxCheckInDeviceController) InitEStatus() byte {
defer func() {
if r := recover(); r != nil {
log.Error("InitEStatus:", r)
}
}()
var eTmp byte = 0
eTmp += 0xC0
eTmp += 0x30
return eTmp
}
// func Sender_OnDataSendLogHandler(string logMessage) {
// RequestDebugMessage(this, logMessage);
// }
// func Reader_OnDataReciveLogHandler(string logMessage) {
// RequestDebugMessage(this, logMessage);
// }
func (para *FlxCheckInDeviceController) OpenDevice() bool {
defer func() {
if r := recover(); r != nil {
log.Error("OpenDevice:", r)
}
}()
// getCommlist2()
// c := &serial.Config{Name: "COM3", Baud: 19200}
// s, err := serial.OpenPort(c)
// if err != nil {
// fmt.Println(err)
// }
// n, err := s.Write([]byte("012345"))
// if err != nil {
// fmt.Println(err)
// }
// fmt.Printf("Read %d Bytes\r\n", n)
cfig := Common.LoadConfig()
c := &serial.Config{Name: cfig.CheckInDoor.PortName, Baud: cfig.CheckInDoor.BaudRate}
// var err error
fmt.Println("enterging OpenDevice ")
cport, err := serial.OpenPort(c)
if err != nil {
fmt.Println("打开串口驱动报错:")
fmt.Println(err)
return false
} else {
para.IsOpen = true
}
para.SerialPort = &cport
para.Sender.init(para.SerialPort)
para.Reader.InitPara(para.SerialPort)
para.Sender.InitDoor()
// para.Sender.SendBeep(1)
// if nil != para.Reader.ReadResponseData() {
para.Sender.DownLoadEStatus(para.InitEStatus())
para.Sender.SendBeep(1)
para.Reader.Start()
time.Sleep(500)
para.CreatEventHandleThread()
fmt.Println(OpenSerialPort_Success)
return true
// }
// fmt.Println(ReciveDataFromCOM_Error)
// return false
}
func (para *FlxCheckInDeviceController) CloseDevice() bool {
defer func() {
if r := recover(); r != nil {
log.Error("CloseDevice:", r)
}
}()
if para.IsOpen {
para.Sender.SendBeep(1)
para.Reader.Stop()
time.Sleep(20 * time.Millisecond)
para.KillEventHandleThread()
// (*para.SerialPort).Close()
if err := (*para.SerialPort).Close(); err != nil {
fmt.Println(CloseSerialPort_Faild, ":", err)
return false
}
}
para.IsOpen = false
if !para.IsOpen {
fmt.Println(CloseSerialPort_Success)
return true
} else {
fmt.Println(CloseSerialPort_Faild)
return false
}
}
func (para *FlxCheckInDeviceController) CheckInStartAll() {
defer func() {
if r := recover(); r != nil {
log.Error("CheckInStartAll:", r)
}
}()
if !para.IsOpen {
para.OpenDevice()
}
}
func (para *FlxCheckInDeviceController) CheckInStopAll() {
defer func() {
if r := recover(); r != nil {
log.Error("CheckInStopAll:", r)
}
}()
para.CloseDevice()
}
func (para *FlxCheckInDeviceController) StartCardReadIn() {
defer func() {
if r := recover(); r != nil {
log.Error("StartCardReadIn:", r)
}
}()
para.Reader.Start()
time.Sleep(5 * time.Microsecond)
para.CreatEventHandleThread()
}
func (para *FlxCheckInDeviceController) StopCardReadIn() {
defer func() {
if r := recover(); r != nil {
log.Error("StopCardReadIn:", r)
}
}()
para.Reader.Stop()
time.Sleep(500)
para.KillEventHandleThread()
}
func (para *FlxCheckInDeviceController) BeepOn(msec int) bool {
defer func() {
if r := recover(); r != nil {
log.Error("BeepOn:", r)
}
}()
var bRetValue bool = false
if para.IsOpen {
//Sender.SendAlarm(msec);
for index := 0; index < msec; index++ {
para.Sender.SendAlarm(1)
time.Sleep(1 * time.Microsecond)
}
bRetValue = true
}
return bRetValue
//return true;
}
func (para *FlxCheckInDeviceController) BeepOff() bool {
defer func() {
if r := recover(); r != nil {
log.Error("BeepOff:", r)
}
}()
return true
}
func (para *FlxCheckInDeviceController) LightOn() bool {
defer func() {
if r := recover(); r != nil {
log.Error("LightOn:", r)
}
}()
return true
}
func (para *FlxCheckInDeviceController) LightOff() bool {
defer func() {
if r := recover(); r != nil {
log.Error("LightOff:", r)
}
}()
return true
}
func (para *FlxCheckInDeviceController) Reader_OnDataReciveEventHandler(compacket []byte) {
defer func() {
if r := recover(); r != nil {
log.Error("Reader_OnDataReciveEventHandler:", r)
}
}()
fmt.Println(compacket)
for i := 0; i < len(para.DataReciveSave); i++ {
if para.DataReciveSave[i] == string(compacket) {
//避免返回相同卡号
return
}
}
para.DataReciveSave = append(para.DataReciveSave, string(compacket))
para.HasDataIsReturned = true
if compacket != nil && len(compacket) > 5 {
if compacket[0] == CMD_HEAD && compacket[len(compacket)-1] == CMD_Tail {
para.ComPackets <- compacket
}
}
go func() {
time.Sleep(time.Second * 5)
para.DataReciveSave = para.DataReciveSave[1:]
}()
}
// / <summary>消息队列</summary>
func (para *FlxCheckInDeviceController) TimerCallbackHandler() {
defer func() {
if r := recover(); r != nil {
log.Error("TimerCallbackHandler:", r)
}
}()
for para.IsRunning {
para.regsterEvent_SeatInfos = para.regsterEvent_SeatInfos[0:0]
comPacket := <-para.ComPackets
if para.OldSData == hex.EncodeToString(comPacket) {
continue
}
var seatInfo FLXDevice.SeatChangeEventArg
if len(comPacket) > 2 {
seatInfo.DeviceGUID = para.deviceGUID
switch comPacket[1] {
case Read_Reader_State:
seatInfo.EventValue = FLXDevice.EventArgValue_RegistrStatus
seatInfo.Value_ExtraInt = int(comPacket[2])
para.InvokeDeviceEventHandler(FLXDevice.EventArgSource_SivtChecker, FLXDevice.EventArgType_DeviceQueryEvent, []FLXDevice.SeatChangeEventArg{seatInfo})
case Read_SeriaNo:
if !EqualsByteArray(para.previousBuffer, comPacket) {
if comPacket[2] != 2 && comPacket[2] != 1 {
para.previousBuffer = comPacket
// Console.WriteLine("1赋值" + DeviceUtil.ByteArrayToString(previousBuffer, 0, previousBuffer.Length))
// Console.WriteLine("1 " + DeviceUtil.ByteArrayToString(comPacket, 0, comPacket.Length))
}
// var cardNo string
// for i := 3; i < len(comPacket)-1; i++ {
// cardNo += comPacket[i].ToString("X2")
// }
cardNo := hex.EncodeToString(comPacket[3:])
seatInfo.EventValue = FLXDevice.EventArgValue_Register //不论进出检测到卡即为报到。
switch comPacket[2] {
case 2:
seatInfo.Value_ExtraInt = CheckInDirection_Out
case 1:
seatInfo.Value_ExtraInt = CheckInDirection_In
default:
seatInfo.Value_ExtraInt = CheckInDirection_In
}
seatInfo.Value_ExtraStr = cardNo
var isExist bool = false
for _, arg := range para.regsterEvent_SeatInfos {
if arg.Value_ExtraStr == seatInfo.Value_ExtraStr {
isExist = true
break
}
}
if !isExist {
para.regsterEvent_SeatInfos = append(para.regsterEvent_SeatInfos, seatInfo)
}
fmt.Println(InvokeCaredNo_Processed)
}
case Read_In_State:
if !EqualsByteArray(para.previousBuffer, comPacket) {
seatInfo.EventValue = FLXDevice.EventArgValue_Register //不论进出检测到卡即为报到。
switch comPacket[2] {
case 2:
seatInfo.Value_ExtraInt = CheckInDirection_Out
case 1:
seatInfo.Value_ExtraInt = CheckInDirection_In
default:
seatInfo.Value_ExtraInt = CheckInDirection_Unkown
}
seatInfo.Value_ExtraStr = ""
para.regsterEvent_SeatInfos = append(para.regsterEvent_SeatInfos, seatInfo)
fmt.Println(InvokeCaredNo_Processed)
}
}
}
if seatInfo.Value_ExtraInt != 2 && seatInfo.Value_ExtraInt != 1 {
para.previousBuffer = comPacket
// Console.WriteLine("2赋值" + DeviceUtil.ByteArrayToString(previousBuffer, 0, previousBuffer.Length))
// Console.WriteLine("2 " + DeviceUtil.ByteArrayToString(comPacket, 0, comPacket.Length))
}
if len(para.regsterEvent_SeatInfos) > 0 {
// Console.WriteLine("触发事件" + regsterEvent_SeatInfos.Count + "个数据")
para.InvokeDeviceEventHandler(FLXDevice.EventArgSource_SivtChecker, FLXDevice.EventArgType_RegisterEvent, para.regsterEvent_SeatInfos)
}
}
}
func EqualsByteArray(sorBuf []byte, argBuf []byte) bool {
defer func() {
if r := recover(); r != nil {
log.Error("EqualsByteArray:", r)
}
}()
if len(sorBuf) != len(argBuf) {
return false
} else {
for i := 0; i < len(sorBuf); i++ {
if sorBuf[i] != argBuf[i] {
return false
}
}
}
return true
}
func (para *FlxCheckInDeviceController) CreatEventHandleThread() bool {
defer func() {
if r := recover(); r != nil {
log.Error("CreatEventHandleThread:", r)
}
}()
para.IsRunning = true
go para.TimerCallbackHandler()
fmt.Println("串口创建线程:" + CreateThread)
return true
}
func (para *FlxCheckInDeviceController) KillEventHandleThread() bool {
defer func() {
if r := recover(); r != nil {
log.Error("KillEventHandleThread:", r)
}
}()
para.IsRunning = false
fmt.Println("串口消毁线程:" + ClosedThread)
return true
}