Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature/length-padding #20

Merged
merged 14 commits into from
Dec 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@

Dockerfile
docker-compose.yml
Makefile
Makefile
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@

^decoder$
dist/
.vscode/
13 changes: 10 additions & 3 deletions cmd/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,18 @@ var httpCmd = &cobra.Command{
"tagxl/v1",
tagxl.NewTagXLv1Decoder(
loracloud.NewLoracloudMiddleware(accessToken),
tagxl.WithAutoPadding(AutoPadding),
),
},
{"tagsl/v1", tagsl.NewTagSLv1Decoder()},
{"nomadxs/v1", nomadxs.NewNomadXSv1Decoder()},
{"nomadxl/v1", nomadxl.NewNomadXLv1Decoder()},
{"tagsl/v1", tagsl.NewTagSLv1Decoder(
tagsl.WithAutoPadding(AutoPadding),
)},
{"nomadxs/v1", nomadxs.NewNomadXSv1Decoder(
nomadxs.WithAutoPadding(AutoPadding),
)},
{"nomadxl/v1", nomadxl.NewNomadXLv1Decoder(
nomadxl.WithAutoPadding(AutoPadding),
)},
}

// add the decoders
Expand Down
4 changes: 3 additions & 1 deletion cmd/nomadxl.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ var nomadxlCmd = &cobra.Command{
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
slog.Debug("initializing nomadxs decoder")
d := nomadxl.NewNomadXLv1Decoder()
d := nomadxl.NewNomadXLv1Decoder(
nomadxl.WithAutoPadding(AutoPadding),
)

port, err := strconv.Atoi(args[0])
if err != nil {
Expand Down
4 changes: 3 additions & 1 deletion cmd/nomadxs.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ var nomadxsCmd = &cobra.Command{
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
slog.Debug("initializing nomadxs decoder")
d := nomadxs.NewNomadXSv1Decoder()
d := nomadxs.NewNomadXSv1Decoder(
nomadxs.WithAutoPadding(AutoPadding),
)

port, err := strconv.Atoi(args[0])
if err != nil {
Expand Down
7 changes: 7 additions & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ var banner = []string{
var Debug bool
var Verbose bool
var Json bool
var AutoPadding bool

func init() {
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "Display more verbose output in console output. (default: false)")
Expand All @@ -40,6 +41,12 @@ func init() {
if err != nil {
slog.Error("error while binding json flag", slog.Any("error", err))
}

rootCmd.PersistentFlags().BoolVarP(&AutoPadding, "auto-padding", "", false, "Enable automatic padding of payload. (default: false)\nWarning: this may lead to corrupted data.")
err = viper.BindPFlag("auto-padding", rootCmd.PersistentFlags().Lookup("auto-padding"))
if err != nil {
slog.Error("error while binding auto-padding flag", slog.Any("error", err))
}
}

var rootCmd = &cobra.Command{
Expand Down
4 changes: 3 additions & 1 deletion cmd/tagsl.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ var tagslCmd = &cobra.Command{
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
slog.Debug("initializing tagsl decoder")
d := tagsl.NewTagSLv1Decoder()
d := tagsl.NewTagSLv1Decoder(
tagsl.WithAutoPadding(AutoPadding),
)

port, err := strconv.Atoi(args[0])
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions cmd/tagxl.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ var tagxlCmd = &cobra.Command{
slog.Debug("initializing tagxl decoder")
d := tagxl.NewTagXLv1Decoder(
loracloud.NewLoracloudMiddleware(accessToken),
tagxl.WithAutoPadding(AutoPadding),
)

port, err := strconv.Atoi(args[0])
Expand Down
19 changes: 19 additions & 0 deletions pkg/decoder/helpers/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package helpers
import (
h "encoding/hex"
"fmt"
"log/slog"
"reflect"
"strings"
"time"

"github.com/truvami/decoder/pkg/decoder"
Expand Down Expand Up @@ -155,3 +157,20 @@ func UintToBinaryArray(value uint64, length int) []byte {
func ToIntPointer(value int) *int {
return &value
}

func HexNullPad(payload *string, config *decoder.PayloadConfig) string {
var requiredBits = 0
for _, field := range config.Fields {
if !field.Optional {
requiredBits = (field.Start + field.Length) * 8
}
}
var providedBits = len(*payload) * 4

if providedBits < requiredBits {
var paddingBits = (requiredBits - providedBits) / 4
slog.Debug("padding payload with bits\n", slog.Int("bits", paddingBits))
*payload = strings.Repeat("0", paddingBits) + *payload
}
return *payload
}
26 changes: 23 additions & 3 deletions pkg/decoder/nomadxl/v1/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,26 @@ import (
"github.com/truvami/decoder/pkg/decoder/helpers"
)

type NomadXLv1Decoder struct{}
type Option func(*NomadXLv1Decoder)

func NewNomadXLv1Decoder() decoder.Decoder {
return NomadXLv1Decoder{}
type NomadXLv1Decoder struct {
autoPadding bool
}

func NewNomadXLv1Decoder(options ...Option) decoder.Decoder {
nomadXLv1Decoder := &NomadXLv1Decoder{}

for _, option := range options {
option(nomadXLv1Decoder)
}

return nomadXLv1Decoder
}

func WithAutoPadding(autoPadding bool) Option {
return func(t *NomadXLv1Decoder) {
t.autoPadding = autoPadding
}
}

// https://docs.truvami.com/docs/payloads/nomad-XL
Expand Down Expand Up @@ -74,6 +90,10 @@ func (t NomadXLv1Decoder) Decode(data string, port int16, devEui string) (interf
return nil, nil, err
}

if t.autoPadding {
data = helpers.HexNullPad(&data, &config)
}

decodedData, err := helpers.Parse(data, config)
if err != nil {
return nil, nil, err
Expand Down
49 changes: 41 additions & 8 deletions pkg/decoder/nomadxl/v1/decoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ import (

func TestDecode(t *testing.T) {
tests := []struct {
payload string
port int16
expected interface{}
payload string
port int16
autoPadding bool
expected interface{}
}{
{
payload: "00000001fdd5c693000079300001b45d000000000000000000f600000000000000000b3fd7249f4a00420000000000001501",
port: 101,
payload: "00000001fdd5c693000079300001b45d000000000000000000f600000000000000000b3fd724",
port: 101,
autoPadding: false,
expected: Port101Payload{
SystemTime: 8553612947,
UTCDate: 31024,
Expand All @@ -29,8 +31,39 @@ func TestDecode(t *testing.T) {
},
},
{
payload: "0000793000020152004B6076000C838C00003994",
port: 103,
payload: "1fdd5c693000079300001b45d000000000000000000f600000000000000000b3fd724",
port: 101,
autoPadding: true,
expected: Port101Payload{
SystemTime: 8553612947,
UTCDate: 31024,
UTCTime: 111709,
Temperature: 24.6,
Pressure: 0,
TimeToFix: 36,
AccelerometerXAxis: 0,
AccelerometerYAxis: 0,
AccelerometerZAxis: 0,
Battery: 2.879,
BatteryLorawan: 215,
},
},
{
payload: "0000793000020152004B6076000C838C00003994",
port: 103,
autoPadding: false,
expected: Port103Payload{
UTCDate: 31024,
UTCTime: 131410,
Latitude: 49.39894,
Longitude: 8.20108,
Altitude: 147.4,
},
},
{
payload: "793000020152004B6076000C838C00003994",
port: 103,
autoPadding: true,
expected: Port103Payload{
UTCDate: 31024,
UTCTime: 131410,
Expand All @@ -43,7 +76,7 @@ func TestDecode(t *testing.T) {

for _, test := range tests {
t.Run(fmt.Sprintf("TestPort%vWith%v", test.port, test.payload), func(t *testing.T) {
decoder := NewNomadXLv1Decoder()
decoder := NewNomadXLv1Decoder(WithAutoPadding(test.autoPadding))
got, _, err := decoder.Decode(test.payload, test.port, "")
if err != nil {
t.Fatalf("unexpected error: %v", err)
Expand Down
26 changes: 23 additions & 3 deletions pkg/decoder/nomadxs/v1/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,26 @@ import (
"github.com/truvami/decoder/pkg/decoder/helpers"
)

type NomadXSv1Decoder struct{}
type Option func(*NomadXSv1Decoder)

func NewNomadXSv1Decoder() decoder.Decoder {
return NomadXSv1Decoder{}
type NomadXSv1Decoder struct {
autoPadding bool
}

func NewNomadXSv1Decoder(options ...Option) decoder.Decoder {
nomadXSv1Decoder := &NomadXSv1Decoder{}

for _, option := range options {
option(nomadXSv1Decoder)
}

return nomadXSv1Decoder
}

func WithAutoPadding(autoPadding bool) Option {
return func(t *NomadXSv1Decoder) {
t.autoPadding = autoPadding
}
}

// https://docs.truvami.com/docs/payloads/nomad-xs
Expand Down Expand Up @@ -111,6 +127,10 @@ func (t NomadXSv1Decoder) Decode(data string, port int16, devEui string) (interf
return nil, nil, err
}

if t.autoPadding {
data = helpers.HexNullPad(&data, &config)
}

decodedData, err := helpers.Parse(data, config)
if err != nil {
return nil, nil, err
Expand Down
Loading
Loading