misc fixes and JSON stuff
This commit is contained in:
parent
6646dcdcb6
commit
553469230b
|
@ -169,7 +169,7 @@ func (d *DataField) MakeUnmarshal(offset int) string {
|
||||||
return fmt.Sprintf("p.%s = float32FromBytes(b[%d:], false)", fieldName, offset)
|
return fmt.Sprintf("p.%s = float32FromBytes(b[%d:], false)", fieldName, offset)
|
||||||
|
|
||||||
} else if t ,ok := typeMap[d.Type]; ok {
|
} else if t ,ok := typeMap[d.Type]; ok {
|
||||||
// it's uint or int of some kind, use endian to write it.
|
// it's uint or int of some kind, use endian to read it.
|
||||||
// FIXME: support big endian
|
// FIXME: support big endian
|
||||||
return fmt.Sprintf("p.%s = binary.LittleEndian.%s(b[%d:])", fieldName, toCamelInitCase(t, true), offset)
|
return fmt.Sprintf("p.%s = binary.LittleEndian.%s(b[%d:])", fieldName, toCamelInitCase(t, true), offset)
|
||||||
}
|
}
|
||||||
|
@ -310,6 +310,7 @@ package skylab
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"encoding/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SkylabId uint32
|
type SkylabId uint32
|
||||||
|
@ -343,7 +344,7 @@ func FromCanFrame(id uint32, data []byte) (Packet, error) {
|
||||||
case {{ Nx (int $p.Id) $p.Repeat $p.Offset | mapf "0x%X" | strJoin ", " -}}:
|
case {{ Nx (int $p.Id) $p.Repeat $p.Offset | mapf "0x%X" | strJoin ", " -}}:
|
||||||
var res *{{camelCase $p.Name true}}
|
var res *{{camelCase $p.Name true}}
|
||||||
res.UnmarshalPacket(data)
|
res.UnmarshalPacket(data)
|
||||||
res.Idx = id - uint32({{camelCase $p.Name true}}Id)
|
res.Idx = id - {{$p.Id | printf "0x%X" }}
|
||||||
return res, nil
|
return res, nil
|
||||||
{{- else }}
|
{{- else }}
|
||||||
case {{ $p.Id | printf "0x%X" }}:
|
case {{ $p.Id | printf "0x%X" }}:
|
||||||
|
@ -356,6 +357,34 @@ func FromCanFrame(id uint32, data []byte) (Packet, error) {
|
||||||
|
|
||||||
return nil, errors.New("failed to match Id, something is really wrong!")
|
return nil, errors.New("failed to match Id, something is really wrong!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FromJson (raw []byte) (Packet, error) {
|
||||||
|
// attempt to parse the JSON to a JSONPacket
|
||||||
|
jp := &JSONPacket{}
|
||||||
|
err := json.Unmarshal(raw, jp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
switch jp.Id {
|
||||||
|
{{- range $p := .Packets }}
|
||||||
|
{{- if $p.Repeat }}
|
||||||
|
case {{ Nx (int $p.Id) $p.Repeat $p.Offset | mapf "0x%X" | strJoin ", " -}}:
|
||||||
|
var res *{{camelCase $p.Name true}}
|
||||||
|
err := json.Unmarshal(jp.Data, res)
|
||||||
|
res.Idx = jp.Id - {{ $p.Id | printf "0x%X" }}
|
||||||
|
return res, err
|
||||||
|
{{- else }}
|
||||||
|
case {{ $p.Id | printf "0x%X" }}:
|
||||||
|
var res *{{camelCase $p.Name true}}
|
||||||
|
err := json.Unmarshal(jp.Data, res)
|
||||||
|
return res, err
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New("aaa")
|
||||||
|
|
||||||
|
}
|
||||||
{{range .Packets -}}
|
{{range .Packets -}}
|
||||||
{{template "packet" .}}
|
{{template "packet" .}}
|
||||||
{{- end}}
|
{{- end}}
|
||||||
|
@ -432,7 +461,8 @@ func uint32ToInt(i uint32) (o int) {
|
||||||
|
|
||||||
|
|
||||||
// strJoin is a remapping of strings.Join so that we can use
|
// strJoin is a remapping of strings.Join so that we can use
|
||||||
// it in a pipeline more easily.
|
// it in a pipeline.
|
||||||
|
// {{.Names | strJoin ", " }}
|
||||||
func strJoin(delim string, elems []string) string {
|
func strJoin(delim string, elems []string) string {
|
||||||
return strings.Join(elems, delim)
|
return strings.Join(elems, delim)
|
||||||
}
|
}
|
||||||
|
@ -447,6 +477,7 @@ func mapf(format string, els []int) []string {
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// read path as the first arg, glob it for yamls, read each yaml into a skylabFile.
|
// read path as the first arg, glob it for yamls, read each yaml into a skylabFile.
|
||||||
// then take each skylab file, put all the packets into one big array.
|
// then take each skylab file, put all the packets into one big array.
|
||||||
|
@ -458,6 +489,7 @@ func main() {
|
||||||
fmt.Printf("err %v", err)
|
fmt.Printf("err %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we add any functions mapping we need here.
|
||||||
fnMap := template.FuncMap{
|
fnMap := template.FuncMap{
|
||||||
"camelCase": toCamelInitCase,
|
"camelCase": toCamelInitCase,
|
||||||
"Time": time.Now,
|
"Time": time.Now,
|
||||||
|
|
|
@ -2,6 +2,7 @@ package skylab
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"encoding/json"
|
||||||
"math"
|
"math"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -10,7 +11,7 @@ This file provides helpers used for serializing and deserializing skylab packets
|
||||||
It contains common code and interfaces.
|
It contains common code and interfaces.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// float32ToBytes is an internal function used to encode a float value to bytes
|
||||||
func float32ToBytes(b []byte, f float32, bigEndian bool) {
|
func float32ToBytes(b []byte, f float32, bigEndian bool) {
|
||||||
bits := math.Float32bits(f)
|
bits := math.Float32bits(f)
|
||||||
if bigEndian {
|
if bigEndian {
|
||||||
|
@ -20,6 +21,7 @@ func float32ToBytes(b []byte, f float32, bigEndian bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// float32FromBytes is an internal function used to decode float value from bytes
|
||||||
func float32FromBytes(b []byte, bigEndian bool) (f float32) {
|
func float32FromBytes(b []byte, bigEndian bool) (f float32) {
|
||||||
var bits uint32
|
var bits uint32
|
||||||
if bigEndian {
|
if bigEndian {
|
||||||
|
@ -36,20 +38,24 @@ type Packet interface {
|
||||||
UnmarshalPacket(p []byte) error
|
UnmarshalPacket(p []byte) error
|
||||||
Id() uint32
|
Id() uint32
|
||||||
Size() uint
|
Size() uint
|
||||||
String() string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Marshaler is a packet that can be marshalled into bytes.
|
||||||
type Marshaler interface {
|
type Marshaler interface {
|
||||||
MarshalPacket() ([]byte, error)
|
MarshalPacket() ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unmarshaler is a packet that can be unmarshalled from bytes.
|
||||||
type Unmarshaler interface {
|
type Unmarshaler interface {
|
||||||
UnmarshalPacket(p []byte) error
|
UnmarshalPacket(p []byte) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ider is a packet that can get its ID, based on the index of the packet, if any.
|
||||||
type Ider interface {
|
type Ider interface {
|
||||||
Id() uint32
|
Id() uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sizer allows for fast allocation.
|
||||||
type Sizer interface {
|
type Sizer interface {
|
||||||
Size() uint
|
Size() uint
|
||||||
}
|
}
|
||||||
|
@ -59,3 +65,31 @@ func CanSend(p Packet) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ---- JSON encoding business ----
|
||||||
|
|
||||||
|
|
||||||
|
type JSONPacket struct {
|
||||||
|
Id uint32
|
||||||
|
Data json.RawMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToJson(p Packet) (*JSONPacket, error) {
|
||||||
|
|
||||||
|
d, err := json.Marshal(p)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
jp := &JSONPacket{
|
||||||
|
Id: p.Id(),
|
||||||
|
Data: d,
|
||||||
|
}
|
||||||
|
return jp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// we need to be able to parse the JSON as well.
|
||||||
|
// this is done using the generator since we can use the switch/case thing.
|
||||||
|
|
Loading…
Reference in a new issue