diff --git a/go.mod b/go.mod index 46eb856..7cafdad 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,24 @@ module github.com/timmathews/argo -go 1.13 +// module github.com/asbjorn/argo + +go 1.15 require ( github.com/burntsushi/toml v0.2.0 github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 github.com/eclipse/paho.mqtt.golang v1.1.0 - github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b // indirect github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.4.0 github.com/gorilla/websocket v1.2.0 github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639 github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 github.com/satori/go.uuid v1.1.0 github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 - golang.org/x/net v0.0.0-20161229225711-8fd7f2595553 // indirect - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect - google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0 // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect + google.golang.org/appengine v1.6.7 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/vmihailenco/msgpack.v2 v2.9.1 gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect ) diff --git a/go.sum b/go.sum index 29c36da..40a2b67 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 h1:P2qhNT0y1A7 github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/eclipse/paho.mqtt.golang v1.1.0 h1:Em29HD1CwLHdRFnX7yfg+kBjHHw6DSDok9I+ia4znT4= github.com/eclipse/paho.mqtt.golang v1.1.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b h1:fE/yi9pibxGEc0gSJuEShcsBXE2d5FW3OudsjE9tKzQ= -github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.4.0 h1:N6R8isjoRv7IcVVlf0cTBbo0UDc9V6ZXWEm0HQoQmLo= @@ -16,27 +16,33 @@ github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639 h1:VMd01CgpBpmLpuERy github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e h1:qq9z2iYia+KDwHsFAdN8mjVQ1zY/YJLqdC0xG9lDUXU= github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e/go.mod h1:2RvX5ZjVtsznNZPEt4xwJXNJrM3VTZoQf7V6gk0ysvs= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 h1:J1QZwDXgZ4dJD2s19iqR9+U00OWM2kDzbf1O/fmvCWg= github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/satori/go.uuid v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo= github.com/satori/go.uuid v1.1.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/timmathews/argo v0.0.0-20181009003531-03c44b3fef04 h1:EkKkR9E53qyarD/+E9l/Q2vht9JSg3Q+cAxOvjB53JA= -github.com/timmathews/argo v0.0.0-20181009003531-03c44b3fef04/go.mod h1:iG3KBDcgVX5zqC11ks5tSORdW2gCXROP5S2crUH4J18= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= -golang.org/x/net v0.0.0-20161229225711-8fd7f2595553 h1:R1raIZjpvFR0iw8sqwNeyRumKrHFoend3L2d5xbadFI= -golang.org/x/net v0.0.0-20161229225711-8fd7f2595553/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0 h1:rYf3ZsXcmuxMqvit5i+rfstUzjzWLHe5cFsNXF+2IIA= -google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/vmihailenco/msgpack.v2 v2.9.1 h1:kb0VV7NuIojvRfzwslQeP3yArBqJHW9tOl4t38VS1jM= gopkg.in/vmihailenco/msgpack.v2 v2.9.1/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU= diff --git a/nmea2k/raw_message.go b/nmea2k/raw_message.go index c953b92..5c88bc3 100644 --- a/nmea2k/raw_message.go +++ b/nmea2k/raw_message.go @@ -187,9 +187,19 @@ func ParsePacket(cmsg *can.RawMessage) (pgnParsed *ParsedMessage) { break } else { i++ - pgnDefinition = PgnList[i] - fields = pgnDefinition.FieldList - field = fields[idx] + pgnListLen := len(PgnList) + if i < pgnListLen { + pgnDefinition = PgnList[i] + fields = pgnDefinition.FieldList + + if idx >= len(fields) { + break + } + + field = fields[idx] + } else { + break + } } } else { break @@ -440,23 +450,32 @@ func (msg *RawMessage) extractNumber(field *Field, start, end, offset, width uin return } - // var maxValue uint64 - // if width > 8 { - // maxValue = 1<<(width-1) - 1 - // } else if width == 1 { - // maxValue = 1 - // } else { - // maxValue = 1< 8 { + maxValue = 1<<(width-1) - 1 + } else if width == 1 { + maxValue = 1 + } else { + maxValue = 1< maxValue { - // e = &DecodeError{data, "Field not present"} - // return - // } + var reserved uint64 + if maxValue >= 15 { + reserved = 2 + } else if maxValue > 1 { + reserved = 1 + } else { + reserved = 0 + } + + if num > maxValue-reserved { + e = &DecodeError{data, "Field not present"} + return + } if res != 1 && res != RES_LOOKUP && res != RES_MANUFACTURER && res != RES_INTEGER { if field.Signed { diff --git a/nmea2k/raw_message_test.go b/nmea2k/raw_message_test.go index 79f8281..cf6ad81 100644 --- a/nmea2k/raw_message_test.go +++ b/nmea2k/raw_message_test.go @@ -211,3 +211,37 @@ func TestExtractNumber(t *testing.T) { } } } + +func TestPgn127489NumberExtraction(t *testing.T) { + var msg = RawMessage{new(can.RawMessage)} + msg.Data = []byte{0x00, 0xe8, 0x08, 0xff, 0xff, 0x73, 0x7d, 0x31, 0x0b, 0x0c, 0x00, 0x80, 0x99, 0x56, 0x04, 0xff, 0xff, 0x60, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03} + msg.Pgn = uint32(127489) + + pgnParsed := ParsePacket(msg.RawMessage) + _, ok := pgnParsed.Data[6].(uint64) + if !ok { + t.Errorf("unable to extract 'total engine hours' from valid RawMessage: %+v\n", pgnParsed.Data[6]) + } + + // This RawMessage is the 'BAD' one with invalid values. Field 6 should be 'nil' with the proper validation. + msg = RawMessage{new(can.RawMessage)} + msg.Data = []byte{0x00, 0xe8, 0x08, 0xff, 0xff, 0x73, 0x7d, 0x31, 0x0b, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x04} + msg.Pgn = uint32(127489) + + pgnParsed = ParsePacket(msg.RawMessage) + engineHours, ok := pgnParsed.Data[6].(uint64) + if ok { + t.Errorf("the value for the field 'total engine hours' is invalid: (%d). Need to check maximum value during extraction. RawMessage: %+v\n", engineHours, pgnParsed.Data[6]) + } + + // This RawMessage is the 'BAD' one with invalid values. Field 6 should be 'nil' with the proper validation. + msg = RawMessage{new(can.RawMessage)} + msg.Data = []byte{0x00, 0xb0, 0x09, 0xff, 0xff, 0xab, 0x7c, 0xff, 0x7f, 0x15, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x05} + msg.Pgn = uint32(127489) + + pgnParsed = ParsePacket(msg.RawMessage) + alternator, ok := pgnParsed.Data[4].(float64) + if ok { + t.Errorf("the value for the field 'alternator_potential' is invalid: (%f). Need to check maximum value during extraction. RawMessage: %+v\n", alternator, pgnParsed.Data[4]) + } +}