diff --git a/go.mod b/go.mod index 5acbfe7..23b99e3 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,6 @@ module git.godopu.net/lab/etri-smartfarm-poc-controller-serial go 1.17 -require ( - github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 - github.com/rjeczalik/notify v0.9.2 -) +require github.com/rjeczalik/notify v0.9.2 require golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7 // indirect diff --git a/go.sum b/go.sum index b252394..aedd95f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 h1:G2ztCwXov8mRvP0ZfjE6nAlaCX2XbykaeHdbT6KwDz0= -github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4/go.mod h1:2RvX5ZjVtsznNZPEt4xwJXNJrM3VTZoQf7V6gk0ysvs= github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7 h1:bit1t3mgdR35yN0cX0G8orgLtOuyL9Wqxa1mccLB0ig= diff --git a/main.go b/main.go index 4ef8c0a..6bf4fa5 100644 --- a/main.go +++ b/main.go @@ -1,177 +1,27 @@ -package main +package manager import ( - "bufio" - "encoding/json" - "errors" + "context" "fmt" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" "time" - "github.com/jacobsa/go-serial/serial" + "git.godopu.net/lab/etri-smartfarm-poc-controller-serial/puserial" "github.com/rjeczalik/notify" ) -func readJsonFromSerial(obj map[string]interface{}, decoder *json.Decoder) error { - err := decoder.Decode(&obj) - if err != nil { - return err - } +func Run() { + fmt.Println("Hello world") - return nil -} + ctx, _ := context.WithTimeout(context.Background(), time.Second*10) + ch_discover := make(chan notify.EventInfo) + go puserial.WatchNewDevice(ctx, ch_discover) -func msgSender(did string) { - -} - -func initUSB() (string, error) { - fs, err := ioutil.ReadDir("/dev") - if err != nil { - return "", err - } - - for _, f := range fs { - if strings.Contains(f.Name(), "ttyACM") { - return filepath.Join("/dev", f.Name()), nil - } - } - - return "", errors.New("USB Not found") -} - -func discoverUSB() string { - fmt.Println("Waiting USB") - ch := make(chan notify.EventInfo, 1) - if err := notify.Watch("/dev", ch, notify.Create, notify.Remove); err != nil { - log.Fatalln(err) - } - defer notify.Stop(ch) - - for e := range ch { - if strings.Contains(e.Path(), "/dev/ttyACM") { - if e.Event() == notify.Create { - log.Println("Got event:", e.Path()) - return e.Path() - } - } - } - - return "" -} - -func main() { - dev, err := initUSB() - if err != nil { - if err.Error() == "USB Not found" { - dev = discoverUSB() - } else { - log.Fatalln(err.Error()) - } - } - - fmt.Println("discover: ", dev) - time.Sleep(time.Second) - - log.Println("changing the mod of file") - cmd := exec.Command("chmod", "a+rw", dev) - b, _ := cmd.CombinedOutput() - fmt.Println(string(b)) - - // Set up options. - options := serial.OpenOptions{ - PortName: dev, - BaudRate: 9600, - DataBits: 8, - StopBits: 1, - MinimumReadSize: 16, - } - - // Open the port. - port, err := serial.Open(options) - if err != nil { - log.Fatalf("serial.Open: %v", err) - } - - // Make sure to close it later. - defer port.Close() - - // Write 4 bytes to the port. - // b := []byte{0x00, 0x01, 0x02, 0x03} - // n, err := port.Write(b) - // if err != nil { - // log.Fatalf("port.Write: %v", err) - // } - - // fmt.Println("Wrote", n, "bytes.") - // var tokenByte string - - reader := bufio.NewReader(port) - // decoder := json.NewDecoder(port) - encoder := json.NewEncoder(port) - command := map[string]interface{}{} - command["code"] = 1 - command["light"] = 0 - - var data string - go func() { - for { - b, _, _ := reader.ReadLine() - recvObj := map[string]interface{}{} - err := json.Unmarshal(b, &recvObj) - // err = readJsonFromSerial(recvObj, decoder) - if err != nil { - if err.Error() == "EOF" { - return - } - - fmt.Println("error: ", string(b)) - } - - data = string(b) - // fmt.Println("line : ", recvObj) - } - }() - - cmdReader := bufio.NewReader(os.Stdin) for { - fmt.Print("> ") - cmd, _, _ := cmdReader.ReadLine() - cmdTkns := strings.Split(string(cmd), " ") - - if cmdTkns[0] == "light" { - command["code"] = 1 - if cmdTkns[1] == "on" { - command["light"] = 100 - } else { - command["light"] = 0 - } - } else if cmdTkns[0] == "fan" { - command["code"] = 2 - if cmdTkns[1] == "on" { - command["status"] = 1 - } else { - command["status"] = 0 - } - } else if cmdTkns[0] == "servo" { - command["code"] = 3 - angle, err := strconv.Atoi(cmdTkns[1]) - if err != nil { - continue - } - command["angle"] = angle - } else if cmdTkns[0] == "print" { - fmt.Println(data) - } - err := encoder.Encode(command) - if err != nil { - panic(err) + e, ok := <-ch_discover + if !ok { + fmt.Println("byebye~!") + return } + fmt.Println(e) } } diff --git a/puserial/serial.go b/puserial/serial.go index d959f92..30abaf5 100644 --- a/puserial/serial.go +++ b/puserial/serial.go @@ -1,164 +1,157 @@ -package serial +package puserial import ( - "bufio" - "encoding/json" - "errors" + "context" "fmt" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "strconv" "strings" - "time" - "github.com/jacobsa/go-serial/serial" "github.com/rjeczalik/notify" ) -func DiscoverUSB() string { - fmt.Println("Waiting USB") - ch := make(chan notify.EventInfo, 1) - if err := notify.Watch("/dev", ch, notify.Create, notify.Remove); err != nil { - log.Fatalln(err) +func WatchNewDevice(ctx context.Context, ch_discover chan<- notify.EventInfo) error { + defer close(ch_discover) + + filter := make(chan notify.EventInfo, 1) + if err := notify.Watch("/dev", filter, notify.Create, notify.Remove); err != nil { + return err } - defer notify.Stop(ch) + defer notify.Stop(filter) - for e := range ch { - if strings.Contains(e.Path(), "/dev/ttyACM") { - if e.Event() == notify.Create { - log.Println("Got event:", e.Path()) - return e.Path() - } - } - } - - return "" -} - -func InitUSB() (string, error) { - fs, err := ioutil.ReadDir("/dev") - if err != nil { - return "", err - } - - for _, f := range fs { - if strings.Contains(f.Name(), "ttyACM") { - return filepath.Join("/dev", f.Name()), nil - } - } - - return "", errors.New("USB Not found") -} - -func Run() { - dev, err := InitUSB() - if err != nil { - if err.Error() == "USB Not found" { - dev = DiscoverUSB() - } else { - log.Fatalln(err.Error()) - } - } - - fmt.Println("discover: ", dev) - time.Sleep(time.Second) - - log.Println("changing the mod of file") - cmd := exec.Command("chmod", "a+rw", dev) - b, _ := cmd.CombinedOutput() - fmt.Println(string(b)) - - // Set up options. - options := serial.OpenOptions{ - PortName: dev, - BaudRate: 9600, - DataBits: 8, - StopBits: 1, - MinimumReadSize: 16, - } - - // Open the port. - port, err := serial.Open(options) - if err != nil { - log.Fatalf("serial.Open: %v", err) - } - - // Make sure to close it later. - defer port.Close() - - // Write 4 bytes to the port. - // b := []byte{0x00, 0x01, 0x02, 0x03} - // n, err := port.Write(b) - // if err != nil { - // log.Fatalf("port.Write: %v", err) - // } - - // fmt.Println("Wrote", n, "bytes.") - // var tokenByte string - - reader := bufio.NewReader(port) - // decoder := json.NewDecoder(port) - encoder := json.NewEncoder(port) - command := map[string]interface{}{} - command["code"] = 1 - command["light"] = 0 - - var data string - go func() { - for { - b, _, _ := reader.ReadLine() - recvObj := map[string]interface{}{} - err := json.Unmarshal(b, &recvObj) - // err = readJsonFromSerial(recvObj, decoder) - if err != nil { - if err.Error() == "EOF" { - return - } - - fmt.Println("error: ", string(b)) - } - - data = string(b) - // fmt.Println("line : ", recvObj) - } - }() - - cmdReader := bufio.NewReader(os.Stdin) for { - fmt.Print("> ") - cmd, _, _ := cmdReader.ReadLine() - cmdTkns := strings.Split(string(cmd), " ") - - if cmdTkns[0] == "light" { - command["code"] = 1 - if cmdTkns[1] == "on" { - command["light"] = 100 - } else { - command["light"] = 0 + select { + case <-ctx.Done(): + fmt.Println("routine bye") + return nil + case e := <-filter: + if strings.Contains(e.Path(), "/dev/ttyACM") { + fmt.Println(e.Path()) + ch_discover <- e } - } else if cmdTkns[0] == "fan" { - command["code"] = 2 - if cmdTkns[1] == "on" { - command["status"] = 1 - } else { - command["status"] = 0 - } - } else if cmdTkns[0] == "servo" { - command["code"] = 3 - angle, err := strconv.Atoi(cmdTkns[1]) - if err != nil { - continue - } - command["angle"] = angle - } else if cmdTkns[0] == "print" { - fmt.Println(data) - } - err := encoder.Encode(command) - if err != nil { - panic(err) } } } + +// func InitUSB() (string, error) { +// fs, err := ioutil.ReadDir("/dev") +// if err != nil { +// return "", err +// } + +// for _, f := range fs { +// if strings.Contains(f.Name(), "ttyACM") { +// return filepath.Join("/dev", f.Name()), nil +// } +// } + +// return "", errors.New("USB Not found") +// } + +// func Run() { +// dev, err := InitUSB() +// if err != nil { +// if err.Error() == "USB Not found" { +// dev = DiscoverUSB() +// } else { +// log.Fatalln(err.Error()) +// } +// } + +// fmt.Println("discover: ", dev) +// time.Sleep(time.Second) + +// log.Println("changing the mod of file") +// cmd := exec.Command("chmod", "a+rw", dev) +// b, _ := cmd.CombinedOutput() +// fmt.Println(string(b)) + +// // Set up options. +// options := serial.OpenOptions{ +// PortName: dev, +// BaudRate: 9600, +// DataBits: 8, +// StopBits: 1, +// MinimumReadSize: 16, +// } + +// // Open the port. +// port, err := serial.Open(options) +// if err != nil { +// log.Fatalf("serial.Open: %v", err) +// } + +// // Make sure to close it later. +// defer port.Close() + +// // Write 4 bytes to the port. +// // b := []byte{0x00, 0x01, 0x02, 0x03} +// // n, err := port.Write(b) +// // if err != nil { +// // log.Fatalf("port.Write: %v", err) +// // } + +// // fmt.Println("Wrote", n, "bytes.") +// // var tokenByte string + +// reader := bufio.NewReader(port) +// // decoder := json.NewDecoder(port) +// encoder := json.NewEncoder(port) +// command := map[string]interface{}{} +// command["code"] = 1 +// command["light"] = 0 + +// var data string +// go func() { +// for { +// b, _, _ := reader.ReadLine() +// recvObj := map[string]interface{}{} +// err := json.Unmarshal(b, &recvObj) +// // err = readJsonFromSerial(recvObj, decoder) +// if err != nil { +// if err.Error() == "EOF" { +// return +// } + +// fmt.Println("error: ", string(b)) +// } + +// data = string(b) +// // fmt.Println("line : ", recvObj) +// } +// }() + +// cmdReader := bufio.NewReader(os.Stdin) +// for { +// fmt.Print("> ") +// cmd, _, _ := cmdReader.ReadLine() +// cmdTkns := strings.Split(string(cmd), " ") + +// if cmdTkns[0] == "light" { +// command["code"] = 1 +// if cmdTkns[1] == "on" { +// command["light"] = 100 +// } else { +// command["light"] = 0 +// } +// } else if cmdTkns[0] == "fan" { +// command["code"] = 2 +// if cmdTkns[1] == "on" { +// command["status"] = 1 +// } else { +// command["status"] = 0 +// } +// } else if cmdTkns[0] == "servo" { +// command["code"] = 3 +// angle, err := strconv.Atoi(cmdTkns[1]) +// if err != nil { +// continue +// } +// command["angle"] = angle +// } else if cmdTkns[0] == "print" { +// fmt.Println(data) +// } +// err := encoder.Encode(command) +// if err != nil { +// panic(err) +// } +// } +// }