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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}