diff --git a/command.go b/command.go index a379525..5c992a3 100644 --- a/command.go +++ b/command.go @@ -8,8 +8,8 @@ type Command struct { commandTime time.Time } -// NewCommand 生成一个命令 -func NewCommand() *Command { +// CreateCommand 生成一个命令 +func CreateCommand() *Command { c := &Command{} return c } diff --git a/main.go b/main.go index 092e344..206fc28 100644 --- a/main.go +++ b/main.go @@ -7,10 +7,12 @@ import ( ) func main() { + engine := gin.Default() engine.GET("/status") engine.POST("/operate") log.Fatal(engine.Run(":15678")) + } diff --git a/test/com_test.go b/test/com_test.go new file mode 100644 index 0000000..1e13264 --- /dev/null +++ b/test/com_test.go @@ -0,0 +1,82 @@ +package test + +import ( + "log" + "os" + "sync" + "testing" + "time" + + serial "github.com/tarm/goserial" +) + +type OperatorFlag uint16 + +const ( + UltrasonicPower OperatorFlag = 0b1000000000000000 // bit15 超声波电源开关 1开,0关 + CirculatingIrrigation OperatorFlag = 0b0100000000000000 // bit14 循环灌洗水泵 1开,0关 + UFRecoil OperatorFlag = 0b0010000000000000 // bit13 UF 超滤膜反冲进水阀 1开,0关 + UFPositive OperatorFlag = 0b0001000000000000 // bit12 UF 超滤膜正冲进水阀 1开,0关 + UFTreatedWater OperatorFlag = 0b0000100000000000 // bit11 UF 超滤膜净水出水阀 1开,0关 + UFRawWater OperatorFlag = 0b0000010000000000 // bit10 UF超滤膜原水进水阀 1开,0关 + CirculatingTankWashWater OperatorFlag = 0b0000001000000000 // bit9 循环罐洗进水电动球阀 1开,0关 + UFPositiveFlushingWaterOutlet OperatorFlag = 0b0000000100000000 // bit8 UF超滤膜正冲浓水出口电磁阀 1开,0关 + CleaningTankExhaust OperatorFlag = 0b0000000010000000 // bit7 清洗罐排气电磁阀 1开,0关 + DPFCompactCylinderControlB OperatorFlag = 0b0000000001000000 // bit6 DPF压紧气缸控制电磁阀B 1开,0关 + DPFCompactCylinderControlA OperatorFlag = 0b0000000000100000 // bit5 DPF压紧气缸控制电磁阀A 1开,0关 + CleaningTankDrainingWater OperatorFlag = 0b0000000000010000 // bit4 清洗罐放水阀控制电磁阀 1开,0关 + GasExplosion OperatorFlag = 0b0000000000001000 // bit3 气爆阀控制电磁阀 1开,0关 + CleaningTankInflation OperatorFlag = 0b0000000000000100 // bit2 清洗罐充气电磁阀 1开,0关 + CleaningTankSealB OperatorFlag = 0b0000000000000010 // bit1 清洗罐密封圈充气电磁阀B 1开,0关 + CleaningTankSealA OperatorFlag = 0b0000000000000001 // bit0 清洗罐密封圈充气电磁阀A 1开,0关 +) + +func TestBit(t *testing.T) { + t.Error(CleaningTankSealA) +} + +func TestLinuxSerial(t *testing.T) { + + f, err := os.OpenFile("./log", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + panic(err) + } + log.SetOutput(f) + + port1, err := serial.OpenPort(&serial.Config{Name: "/dev/pts/13", Baud: 9600, ReadTimeout: 5}) + if err != nil { + t.Fatal(err) + } + + port2, err := serial.OpenPort(&serial.Config{Name: "/dev/pts/14", Baud: 9600, ReadTimeout: 5}) + if err != nil { + t.Fatal(err) + } + + wait := &sync.WaitGroup{} + wait.Add(1) + go func(w *sync.WaitGroup) { + defer w.Done() + for { + + var buf []byte + port1.Read(buf) + log.Println("read ...", buf) + time.Sleep(time.Millisecond * 500) + + } + }(wait) + + wait.Add(1) + go func(w *sync.WaitGroup) { + defer w.Done() + for i := 0; i < 100; i++ { + + port2.Write([]byte("write")) + log.Println("write ...", i) + time.Sleep(time.Millisecond * 500) + } + }(wait) + + wait.Wait() +} diff --git a/test/log b/test/log new file mode 100644 index 0000000..62f8662 --- /dev/null +++ b/test/log @@ -0,0 +1,120 @@ +2019/11/02 12:42:34 write ... 0 +2019/11/02 12:42:34 read ... [] +2019/11/02 12:42:34 write ... 1 +2019/11/02 12:42:34 read ... [] +2019/11/02 12:42:35 write ... 2 +2019/11/02 12:42:35 read ... [] +2019/11/02 12:42:35 write ... 3 +2019/11/02 12:42:35 read ... [] +2019/11/02 12:42:36 write ... 4 +2019/11/02 12:42:36 read ... [] +2019/11/02 12:42:36 write ... 5 +2019/11/02 12:42:36 read ... [] +2019/11/02 12:42:37 write ... 6 +2019/11/02 12:42:37 read ... [] +2019/11/02 12:42:37 read ... [] +2019/11/02 12:42:37 write ... 7 +2019/11/02 12:42:38 write ... 8 +2019/11/02 12:42:38 read ... [] +2019/11/02 12:42:38 read ... [] +2019/11/02 12:42:38 write ... 9 +2019/11/02 12:42:39 write ... 10 +2019/11/02 12:42:39 read ... [] +2019/11/02 12:42:39 write ... 11 +2019/11/02 12:42:39 read ... [] +2019/11/02 12:42:40 read ... [] +2019/11/02 12:42:40 write ... 12 +2019/11/02 12:42:40 write ... 13 +2019/11/02 12:42:40 read ... [] +2019/11/02 12:42:41 write ... 14 +2019/11/02 12:42:41 read ... [] +2019/11/02 12:42:41 read ... [] +2019/11/02 12:42:41 write ... 15 +2019/11/02 12:42:42 write ... 16 +2019/11/02 12:42:42 read ... [] +2019/11/02 12:42:42 write ... 17 +2019/11/02 12:42:42 read ... [] +2019/11/02 12:42:43 write ... 18 +2019/11/02 12:42:43 read ... [] +2019/11/02 12:42:43 write ... 19 +2019/11/02 12:42:43 read ... [] +2019/11/02 12:42:44 write ... 20 +2019/11/02 12:42:44 read ... [] +2019/11/02 12:42:44 read ... [] +2019/11/02 12:42:44 write ... 21 +2019/11/02 12:42:45 read ... [] +2019/11/02 12:42:45 write ... 22 +2019/11/02 12:42:45 write ... 23 +2019/11/02 12:42:45 read ... [] +2019/11/02 12:42:46 write ... 24 +2019/11/02 12:42:46 read ... [] +2019/11/02 12:42:46 write ... 25 +2019/11/02 12:42:46 read ... [] +2019/11/02 12:42:47 write ... 26 +2019/11/02 12:42:47 read ... [] +2019/11/02 12:42:47 read ... [] +2019/11/02 12:42:47 write ... 27 +2019/11/02 12:42:48 read ... [] +2019/11/02 12:42:48 write ... 28 +2019/11/02 12:42:48 read ... [] +2019/11/02 12:42:48 write ... 29 +2019/11/02 12:42:49 read ... [] +2019/11/02 12:42:49 write ... 30 +2019/11/02 12:42:49 read ... [] +2019/11/02 12:42:49 write ... 31 +2019/11/02 12:42:50 read ... [] +2019/11/02 12:42:50 write ... 32 +2019/11/02 12:42:50 read ... [] +2019/11/02 12:42:50 write ... 33 +2019/11/02 12:42:51 read ... [] +2019/11/02 12:42:51 write ... 34 +2019/11/02 12:42:51 read ... [] +2019/11/02 12:42:51 write ... 35 +2019/11/02 12:42:52 read ... [] +2019/11/02 12:42:52 write ... 36 +2019/11/02 12:42:52 read ... [] +2019/11/02 12:42:52 write ... 37 +2019/11/02 12:42:53 read ... [] +2019/11/02 12:42:53 write ... 38 +2019/11/02 12:42:53 write ... 39 +2019/11/02 12:42:53 read ... [] +2019/11/02 12:42:54 write ... 40 +2019/11/02 12:42:54 read ... [] +2019/11/02 12:42:54 write ... 41 +2019/11/02 12:42:54 read ... [] +2019/11/02 12:42:55 read ... [] +2019/11/02 12:42:55 write ... 42 +2019/11/02 12:42:55 read ... [] +2019/11/02 12:42:55 write ... 43 +2019/11/02 12:42:56 write ... 44 +2019/11/02 12:42:56 read ... [] +2019/11/02 12:42:56 write ... 45 +2019/11/02 12:42:56 read ... [] +2019/11/02 12:42:57 write ... 46 +2019/11/02 12:42:57 read ... [] +2019/11/02 12:42:57 read ... [] +2019/11/02 12:42:57 write ... 47 +2019/11/02 12:42:58 read ... [] +2019/11/02 12:42:58 write ... 48 +2019/11/02 12:42:46 write ... 49 +2019/11/02 12:42:46 read ... [] +2019/11/02 12:42:46 write ... 50 +2019/11/02 12:42:46 read ... [] +2019/11/02 12:42:47 write ... 51 +2019/11/02 12:42:47 read ... [] +2019/11/02 12:42:47 write ... 52 +2019/11/02 12:42:47 read ... [] +2019/11/02 12:42:48 write ... 53 +2019/11/02 12:42:48 read ... [] +2019/11/02 12:42:48 write ... 54 +2019/11/02 12:42:48 read ... [] +2019/11/02 12:42:49 write ... 55 +2019/11/02 12:42:49 read ... [] +2019/11/02 12:42:49 write ... 56 +2019/11/02 12:42:49 read ... [] +2019/11/02 12:42:50 write ... 57 +2019/11/02 12:42:50 read ... [] +2019/11/02 12:42:50 write ... 58 +2019/11/02 12:42:50 read ... [] +2019/11/02 12:42:51 write ... 59 +2019/11/02 12:42:51 read ... [] diff --git a/worker.go b/worker.go index 923ec12..2e6d6c1 100644 --- a/worker.go +++ b/worker.go @@ -1,11 +1,47 @@ package main import ( + "bytes" "log" "sync" "time" ) +// Register 操作注册表 +var Register map[string]func(worker *Worker) + +// OperatorFlag 训练 +type OperatorFlag uint16 + +const ( + // UltrasonicPower bit15 超声波电源开关 1开,0关 + UltrasonicPower OperatorFlag = 0b1000000000000000 + // CirculatingIrrigation bit14 循环灌洗水泵 1开,0关 + CirculatingIrrigation OperatorFlag = 0b0100000000000000 + UFRecoil OperatorFlag = 0b0010000000000000 // bit13 UF 超滤膜反冲进水阀 1开,0关 + UFPositive OperatorFlag = 0b0001000000000000 // bit12 UF 超滤膜正冲进水阀 1开,0关 + UFTreatedWater OperatorFlag = 0b0000100000000000 // bit11 UF 超滤膜净水出水阀 1开,0关 + UFRawWater OperatorFlag = 0b0000010000000000 // bit10 UF超滤膜原水进水阀 1开,0关 + CirculatingTankWashWater OperatorFlag = 0b0000001000000000 // bit9 循环罐洗进水电动球阀 1开,0关 + UFPositiveFlushingWaterOutlet OperatorFlag = 0b0000000100000000 // bit8 UF超滤膜正冲浓水出口电磁阀 1开,0关 + CleaningTankExhaust OperatorFlag = 0b0000000010000000 // bit7 清洗罐排气电磁阀 1开,0关 + DPFCompactCylinderControlB OperatorFlag = 0b0000000001000000 // bit6 DPF压紧气缸控制电磁阀B 1开,0关 + DPFCompactCylinderControlA OperatorFlag = 0b0000000000100000 // bit5 DPF压紧气缸控制电磁阀A 1开,0关 + CleaningTankDrainingWater OperatorFlag = 0b0000000000010000 // bit4 清洗罐放水阀控制电磁阀 1开,0关 + GasExplosion OperatorFlag = 0b0000000000001000 // bit3 气爆阀控制电磁阀 1开,0关 + CleaningTankInflation OperatorFlag = 0b0000000000000100 // bit2 清洗罐充气电磁阀 1开,0关 + CleaningTankSealB OperatorFlag = 0b0000000000000010 // bit1 清洗罐密封圈充气电磁阀B 1开,0关 + CleaningTankSealA OperatorFlag = 0b0000000000000001 // bit0 清洗罐密封圈充气电磁阀A 1开,0关 +) + +// init 初始化 +func init() { + Register["干洗"] = func(worker *Worker) { + buf := &bytes.Buffer{} + buf.Write([]byte(0xaa)) + } +} + // Worker 接收命令 type Worker struct { commandLock *sync.Mutex @@ -37,7 +73,7 @@ func NewWorker() *Worker { w.isStop = 0 w.waitGroup = &sync.WaitGroup{} - w.command = NewCommand() + w.command = CreateCommand() w.commandLock = new(sync.Mutex) w.readlogsLock = &sync.Mutex{} @@ -51,6 +87,7 @@ func NewWorker() *Worker { } func (worker *Worker) write(data []byte) { + worker.writelogsLock.Lock() worker.isOperating = true worker.writelogs = append(worker.writelogs, Log{data, time.Now()}) @@ -58,6 +95,7 @@ func (worker *Worker) write(data []byte) { worker.writelogs = worker.writelogs[500:1000] } worker.writelogsLock.Unlock() + } // read 如果没有读到数据为nil @@ -84,16 +122,20 @@ func (worker *Worker) operator(wait *sync.WaitGroup) { } now := time.Now() - worker.writelogsLock.Lock() + + worker.commandLock.Lock() if worker.isOperating { - l := worker.writelogs[len(worker.writelogs)-1] - if now.Sub(l.Time).Seconds() >= 5 { + + if now.Sub(worker.command.commandTime).Seconds() >= 5 { // TODO: 操作 + if operate, ok := Register[worker.command.commands]; ok { + operate(worker) + } worker.isOperating = false } } - worker.writelogsLock.Unlock() + worker.commandLock.Unlock() } } else { // Windows @@ -118,6 +160,7 @@ func (worker *Worker) status(wait *sync.WaitGroup) { if err != nil { log.Println(err) } else { + if n > 0 { worker.readlogsLock.Lock() @@ -126,31 +169,46 @@ func (worker *Worker) status(wait *sync.WaitGroup) { worker.readlogs = worker.readlogs[500:1000] } + log.Println("data size ", n) + log.Panicln("data: ", buf) + worker.readlogsLock.Unlock() + } + } + + time.Sleep(time.Millisecond * 50) + } + + } else { // windows + + for { + + if worker.isStop > 0 { + break + } + + var buf []byte + n, err := worker.port.windowsRWPort.Read(buf) + if err != nil { + log.Println(err) + } else { + + if n > 0 { + + log.Println("data size ", n) + log.Panicln("data: ", buf) + + worker.readlogsLock.Lock() + worker.readlogs = append(worker.readlogs, Log{buf, time.Now()}) + if len(worker.readlogs) >= 1000 { + worker.readlogs = worker.readlogs[500:1000] + } + log.Println("data size ", n) log.Panicln("data: ", buf) worker.readlogsLock.Unlock() } - } - time.Sleep(time.Millisecond * 50) - } - - } else { // windows - - for { - - var buf []byte - n, err := worker.port.windowsRWPort.Read(buf) - if err != nil { - log.Println(err) - } else { - if n > 0 { - - log.Println("data size ", n) - log.Panicln("data: ", buf) - - } } time.Sleep(time.Millisecond * 50)