Files
cloud-services/pkg/common/car_data.go

77 lines
1.9 KiB
Go

package common
import (
"encoding/json"
"fiskerinc.com/modules/grpc/kafka_grpc"
"github.com/pkg/errors"
)
type CANBusFrame struct {
EpochUsec int64 `json:"epoch_usec"`
ID int `json:"id"`
Data string `json:"data"`
}
type CANBusMessageRaw struct {
EpochUsec int64 `json:"epoch_usec"`
Dropped int `json:"dropped"`
Filtered int `json:"filtered"`
Frames []CANBusFrame `json:"frames"`
}
type CarDataBatchPayloadRaw struct {
Handler string `json:"handler"`
Data CANBusMessageRaw `json:"data"`
Version string `json:"version"`
}
// CarDataBatchPayload is a payload received from T.Rex
//
// it contains batches of CANMessages (can.go)
type CarDataBatchPayload struct {
Handler string `json:"handler"`
Data CANBusMessage `json:"data"`
Version string `json:"version"`
}
func (c *CarDataBatchPayload) Marshal() ([]byte, error) {
data, err := json.Marshal(*c)
return data, errors.WithStack(err)
}
func (c *CarDataBatchPayload) Unmarshal(data []byte) error {
err := json.Unmarshal(data, c)
return errors.WithStack(err)
}
func (c *CarDataBatchPayload) ToGrpc(data MessageRawJSON, vin string) (*kafka_grpc.GRPC_BatchPayload, error) {
var payload CANBusMessageRaw
err := json.Unmarshal(data.Data, &payload)
if err != nil {
return nil, errors.WithStack(err)
}
frames := make([]*kafka_grpc.GRPC_CANFrame, len(payload.Frames))
msg := kafka_grpc.GRPC_CANData{
EpochUsec: payload.EpochUsec,
Dropped: int32(payload.Dropped),
Filtered: int32(payload.Filtered),
Frames: frames,
Vin: vin,
}
for i, frame := range payload.Frames {
msg.Frames[i] = &kafka_grpc.GRPC_CANFrame{
Epoch: frame.EpochUsec,
ID: int32(frame.ID),
Value: []byte(frame.Data),
}
}
batch_payload := kafka_grpc.GRPC_BatchPayload{
Handler: data.Handler,
Data: &msg,
Version: data.Version,
}
return &batch_payload, nil
}