package main import ( "./lib" "encoding/json" "log" "os" ) type HmDTC struct { conf *lib.Config logger *log.Logger server *lib.Server camera *lib.Camera } func (hm *HmDTC) init() { hm.logger = log.New(os.Stderr, "[HM-DTC] ", log.Ldate | log.Ltime | log.Lshortfile | log.Lmsgprefix) hm.camera = &lib.Camera{} hm.server = &lib.Server{} hm.readConfig() hm.camera.Init(hm.conf.CameraHost, hm.conf.CameraPort, hm.conf.CKA, hm.logger) hm.server.Init(hm.conf.ServerHost, hm.conf.ServerPort, hm.conf.SKA, hm.logger, hm.conf.CameraID) } func (hm *HmDTC) readConfig() { defaultConfig := lib.Config{ SKA: 60, CKA: 60, CameraID: "undefined-device", CameraHost: "192.168.1.201", CameraPort: 554, ServerHost: "192.168.1.6", ServerPort: 6010, } file, err := os.Open(lib.ConfigFile) if err != nil { hm.logger.Print("File open error:", err) hm.conf = &defaultConfig return } defer func() { err = file.Close() if err != nil { hm.logger.Print("Fail to close __config file:", err) } }() decoder := json.NewDecoder(file) var config lib.Config err = decoder.Decode(&config) if err != nil { hm.logger.Print("Json decode error:", err) hm.conf = &defaultConfig return } hm.conf = &config } func (hm *HmDTC) run() { defer func() { hm.server.Stop() hm.camera.Stop() }() upload := make(chan bool) stream := make(chan []byte) //hm.camera.Run(stream) hm.server.Run(upload) uploading := false hm.logger.Print("HuiMv Data Transport Center is running...") for { select { case image := <-stream: if uploading { go hm.server.Emit("image", image) } case uploading = <-upload: if uploading { hm.camera.Run(stream) } else { hm.camera.Stop() } } } } func main() { hm := HmDTC{} defer func(hm *HmDTC) { hm.server.Stop() hm.camera.Stop() }(&hm) hm.init() // TODO: uart hm.run() select {} }