Add RecordSet field
This commit is contained in:
@ -1,29 +1,33 @@
|
||||
package part
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/cyrilix/robocar-base/service"
|
||||
"github.com/cyrilix/robocar-protobuf/go/events"
|
||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||
"github.com/golang/protobuf/proto"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
func NewRecorder(client mqtt.Client, recordTopic, cameraTopic, steeringTopic, switchRecordTopic string) *Recorder {
|
||||
return &Recorder{
|
||||
client: client,
|
||||
recordTopic: recordTopic,
|
||||
cameraTopic: cameraTopic,
|
||||
steeringTopic: steeringTopic,
|
||||
client: client,
|
||||
recordTopic: recordTopic,
|
||||
cameraTopic: cameraTopic,
|
||||
steeringTopic: steeringTopic,
|
||||
switchRecordTopic: switchRecordTopic,
|
||||
enabled: false,
|
||||
cancel: make(chan interface{}),
|
||||
enabled: false,
|
||||
idGenerator: NewDateBasedGenerator(),
|
||||
recordSet: "",
|
||||
cancel: make(chan interface{}),
|
||||
}
|
||||
}
|
||||
|
||||
type Recorder struct {
|
||||
client mqtt.Client
|
||||
recordTopic string
|
||||
client mqtt.Client
|
||||
recordTopic string
|
||||
cameraTopic, steeringTopic, switchRecordTopic string
|
||||
|
||||
muSteeringMsg sync.Mutex
|
||||
@ -32,6 +36,9 @@ type Recorder struct {
|
||||
muEnabled sync.RWMutex
|
||||
enabled bool
|
||||
|
||||
idGenerator IdGenerator
|
||||
recordSet string
|
||||
|
||||
cancel chan interface {
|
||||
}
|
||||
}
|
||||
@ -63,6 +70,11 @@ func (r *Recorder) onSwitchRecord(_ mqtt.Client, message mqtt.Message) {
|
||||
|
||||
r.muEnabled.Lock()
|
||||
defer r.muEnabled.Unlock()
|
||||
|
||||
if ! r.enabled && msg.GetEnabled() {
|
||||
r.recordSet = r.idGenerator.Next()
|
||||
}
|
||||
|
||||
r.enabled = msg.GetEnabled()
|
||||
}
|
||||
|
||||
@ -98,8 +110,9 @@ func (r *Recorder) onFrame(_ mqtt.Client, message mqtt.Message) {
|
||||
}
|
||||
|
||||
record := events.RecordMessage{
|
||||
Frame: &msg,
|
||||
Steering: steering,
|
||||
Frame: &msg,
|
||||
Steering: steering,
|
||||
RecordSet: r.recordSet,
|
||||
}
|
||||
|
||||
payload, err := proto.Marshal(&record)
|
||||
@ -143,3 +156,31 @@ var registerCallBacks = func(r *Recorder) {
|
||||
log.Panicf("unable to register callback to %v:%v", r.switchRecordTopic, err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
type IdGenerator interface {
|
||||
Next() string
|
||||
}
|
||||
|
||||
func NewDateBasedGenerator() *DateBasedGenerator {
|
||||
return &DateBasedGenerator{
|
||||
muCpt: sync.Mutex{},
|
||||
cpt: 0,
|
||||
idTemplate: "%s-%d",
|
||||
start: time.Now().Format("2006011504"),
|
||||
}
|
||||
}
|
||||
|
||||
type DateBasedGenerator struct {
|
||||
muCpt sync.Mutex
|
||||
cpt int
|
||||
idTemplate string
|
||||
start string
|
||||
}
|
||||
|
||||
func (d *DateBasedGenerator) Next() string {
|
||||
d.muCpt.Lock()
|
||||
defer d.muCpt.Unlock()
|
||||
d.cpt += 1
|
||||
return fmt.Sprintf(d.idTemplate, d.start, d.cpt)
|
||||
}
|
||||
|
@ -5,13 +5,16 @@ import (
|
||||
"github.com/cyrilix/robocar-protobuf/go/events"
|
||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||
"github.com/golang/protobuf/proto"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io/ioutil"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestRecorder_RecordOff(t *testing.T) {
|
||||
func TestRecorder_Record(t *testing.T) {
|
||||
oldRegister := registerCallBacks
|
||||
oldPublish := publish
|
||||
defer func() {
|
||||
@ -44,6 +47,13 @@ func TestRecorder_RecordOff(t *testing.T) {
|
||||
}
|
||||
|
||||
recorder := NewRecorder(nil, recordTopic, cameraTopic, steeringTopic, switchRecord)
|
||||
recorder.idGenerator = &DateBasedGenerator{
|
||||
muCpt: sync.Mutex{},
|
||||
cpt: 0,
|
||||
idTemplate: "%s-%d",
|
||||
start: "record",
|
||||
}
|
||||
|
||||
|
||||
go func() {
|
||||
if err := recorder.Start(); err == nil {
|
||||
@ -67,9 +77,12 @@ func TestRecorder_RecordOff(t *testing.T) {
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: nil, steeringMsg: nil, expectedRecordMsg: nil, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: frame1, steeringMsg: nil, expectedRecordMsg: nil, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: nil, steeringMsg: &steeringRight, expectedRecordMsg: nil, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: frame1, steeringMsg: &steeringRight, expectedRecordMsg: &events.RecordMessage{Frame: frame1, Steering: &steeringRight}, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: frame1, steeringMsg: &steeringRight, expectedRecordMsg: &events.RecordMessage{RecordSet: "record-1", Frame: frame1, Steering: &steeringRight}, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: nil, steeringMsg: &steeringLeft, expectedRecordMsg: nil, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: frame2, steeringMsg: &steeringLeft, expectedRecordMsg: &events.RecordMessage{Frame: frame2, Steering: &steeringLeft}, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: frame2, steeringMsg: &steeringLeft, expectedRecordMsg: &events.RecordMessage{RecordSet: "record-1", Frame: frame2, Steering: &steeringLeft}, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: false}, frameMsg: nil, steeringMsg: nil, expectedRecordMsg: nil, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: false}, frameMsg: nil, steeringMsg: nil, expectedRecordMsg: nil, wait: 5 * time.Millisecond},
|
||||
{recordMsg: &events.SwitchRecordMessage{Enabled: true}, frameMsg: frame1, steeringMsg: &steeringRight, expectedRecordMsg: &events.RecordMessage{RecordSet: "record-2", Frame: frame1, Steering: &steeringLeft}, wait: 5 * time.Millisecond},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
@ -113,3 +126,33 @@ func loadImage(t *testing.T, imgPath string, id string) *events.FrameMessage {
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
func TestDateBasedGenerator_Next(t *testing.T) {
|
||||
log.SetLevel(log.InfoLevel)
|
||||
|
||||
expectedFmt := "[0-9]{4}[01][0-9][0-2][0-9][0-5][0-9]-[0-9]+"
|
||||
r, err := regexp.Compile(expectedFmt)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to compile expected regex: %v", err)
|
||||
}
|
||||
d := NewDateBasedGenerator()
|
||||
id1 := d.Next()
|
||||
log.Debugf("first id: %v", id1)
|
||||
if !r.MatchString(id1) {
|
||||
t.Errorf("Unexpected id format: %v, wants: %s", id1, expectedFmt)
|
||||
}
|
||||
|
||||
id2 := d.Next()
|
||||
log.Debugf("2nd id: %v", id2)
|
||||
|
||||
if strings.Split(id1, "-")[0] != strings.Split(id2, "-")[0] {
|
||||
t.Errorf("ids are differentt prefixes: %v - %v", strings.Split(id1, "-")[0], strings.Split(id2, "-")[0])
|
||||
}
|
||||
|
||||
if strings.Split(id1, "-")[1] != "1" {
|
||||
t.Errorf("unexpected suffix: %v, wants %v", strings.Split(id1, "-")[1], "1")
|
||||
}
|
||||
if strings.Split(id2, "-")[1] != "2" {
|
||||
t.Errorf("unexpected suffix: %v, wants %v", strings.Split(id2, "-")[1], "2")
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user