package service
|
|
import (
|
"bytes"
|
"context"
|
"decoder/valib/ipc"
|
"encoding/gob"
|
"fmt"
|
)
|
|
// Reciever recv from ipc
|
type Reciever struct {
|
ctxIPC *ContextIPC
|
ipcURL string
|
chImage chan<- ImageInfo
|
}
|
|
func unserilizeImageInfo(data <-chan []byte, img chan<- ImageInfo) {
|
for {
|
d := <-data
|
|
var buf bytes.Buffer
|
buf.Write(d)
|
|
dec := gob.NewDecoder(&buf)
|
|
var i ImageInfo
|
if err := dec.Decode(&i); err != nil {
|
fmt.Println("gob decode CameraImage error", err)
|
continue
|
}
|
img <- i
|
}
|
}
|
|
// NewReciever new recv
|
func NewReciever(url string, ch chan<- ImageInfo) *Reciever {
|
ctx, cancel := context.WithCancel(context.Background())
|
|
return &Reciever{
|
ctxIPC: &ContextIPC{ctx, cancel},
|
ipcURL: url,
|
chImage: ch,
|
}
|
}
|
|
// NewRecieverWithContext new recver with context
|
func NewRecieverWithContext(ctx context.Context, url string, ch chan<- ImageInfo) *Reciever {
|
return &Reciever{
|
ctxIPC: &ContextIPC{ctx, nil},
|
ipcURL: url,
|
chImage: ch,
|
}
|
}
|
|
// Run run task from ipc data
|
func (r *Reciever) Run() {
|
ipc := ipc.NewClient(r.ctxIPC.ctx, r.ipcURL)
|
|
dataChan := make(chan []byte)
|
go unserilizeImageInfo(dataChan, r.chImage)
|
|
ipc.RecvToChannel(dataChan)
|
}
|
|
// Stop stop reciever, run in goroutine
|
func (r *Reciever) Stop() {
|
if r.ctxIPC.cancel != nil {
|
r.ctxIPC.cancel()
|
}
|
}
|