Add RecordSet field

This commit is contained in:
2020-02-02 23:42:43 +01:00
parent 496471e61d
commit 03e18cd9db
8 changed files with 163 additions and 67 deletions

View File

@ -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)
}

View File

@ -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")
}
}