etri-smartfarm-poc-controll.../manager.go

95 lines
1.9 KiB
Go

package manager
import (
"bufio"
"encoding/json"
"fmt"
"log"
"github.com/jacobsa/go-serial/serial"
)
type _manager struct {
devicesWithUUID map[string]*_device
devicesWithIface map[interface{}]*_device
SyncListener EventHandler
RecvListener EventHandler
}
func (m *_manager) onRegistered(dev *_device) {
go recv(dev.Iface, m)
log.Println("> End onRegistered")
}
func (m *_manager) onAdded(iface string) {
err := ChangePermission(iface)
if err != nil {
panic(err)
}
// Set up options.
options := serial.OpenOptions{
PortName: iface,
BaudRate: 9600,
DataBits: 8,
StopBits: 1,
MinimumReadSize: 16,
}
// Open the port.
go func() {
port, err := serial.Open(options)
if err != nil {
log.Printf("serial.Open: %v", err)
return
}
reader := bufio.NewReader(port)
encoder := json.NewEncoder(port)
sndMsg := map[string]interface{}{}
sndMsg["code"] = 100
for {
b, _, _ := reader.ReadLine()
rcvMsg := map[string]interface{}{}
err := json.Unmarshal(b, &rcvMsg)
if err != nil {
continue
}
code, ok := rcvMsg["code"].(float64)
if ok && code == 100 {
newDevice := &_device{
UUID: rcvMsg["uuid"].(string),
IfaceName: iface,
Iface: port,
states: map[string]interface{}{},
}
m.devicesWithUUID[rcvMsg["uuid"].(string)] = newDevice
m.devicesWithIface[port] = newDevice
m.onRegistered(newDevice)
fmt.Println("onAdded sub-routine is died")
return
}
encoder.Encode(sndMsg)
}
}()
fmt.Println("onAdded main-routine is died")
}
func (m *_manager) onSync(key interface{}, params map[string]interface{}) {
if m.SyncListener != nil {
m.SyncListener.Handle(&EventStruct{key: key, params: params})
}
}
func (m *_manager) onRecv(key interface{}, params map[string]interface{}) {
if m.RecvListener != nil {
m.RecvListener.Handle(&EventStruct{key: key, params: params})
}
}