Skip to content

Commit

Permalink
Merge branch 'main' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
samsamfire committed Jan 16, 2025
2 parents 7e3b46c + b08c01b commit 8125696
Show file tree
Hide file tree
Showing 18 changed files with 827 additions and 255 deletions.
42 changes: 42 additions & 0 deletions docs/network.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,46 @@ A node can be created with the following commands:
node,err := network.CreateLocalNode(0x10,od.Default())
```

# Custom OD parsing

The network can be configured to use a different OD parser
when creating local nodes.

```golang
// Change default OD parser
network.SetParsev2(od.ParserV2)
```

# Custom node processing

Nodes can also be added to network and controlled locally
with a **NodeProcessor**. e.g.


```golang

// Create a local node
node, err := network.NewLocalNode(
network.BusManager,
slog.Default(),
odNode, // OD object ==> Should be created
nil, // Use definition from OD
nil, // Use definition from OD
nodeId,
nmt.StartupToOperational,
500,
sdo.DefaultClientTimeout,
sdo.DefaultServerTimeout,
true,
nil,
)


// Add a custom node to network and control it independently
proc,err := network.AddNode(node)

// Start node processing
err = proc.Start(context.Background())
```

More information on local nodes [here](local.md)
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ module github.com/samsamfire/gocanopen
go 1.22

require (
github.com/stretchr/testify v1.8.4
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8
github.com/stretchr/testify v1.9.0
golang.org/x/sys v0.21.0
gopkg.in/ini.v1 v1.67.0
)

Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
Expand Down
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
site_name: Gocanopen

repo_url: https://github.com/samsamfire/gocanopen
nav:
- Getting started: index.md
- CAN driver: can.md
Expand Down
12 changes: 4 additions & 8 deletions pkg/can/socketcanv2/socketcanv2.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ import (
)

const (
SocketCANFrameSize = 16
DefaultRcvTimeoutUs = 100000
SocketCANFrameSize = 16
)

func init() {
Expand Down Expand Up @@ -52,15 +51,12 @@ func NewBus(channel string) (canopen.Bus, error) {
return nil, err
}

fd, err := syscall.Socket(syscall.AF_CAN, syscall.SOCK_RAW, unix.CAN_RAW)
fd, err := unix.Socket(unix.AF_CAN, unix.SOCK_RAW, unix.CAN_RAW)
//fd, err := syscall.Socket(syscall.AF_CAN, syscall.SOCK_RAW, unix.CAN_RAW)
if err != nil {
return nil, fmt.Errorf("failed to create CAN socket : %v", err)
}
tv := syscall.Timeval{
Sec: 0,
Usec: int64(DefaultRcvTimeoutUs),
}
err = syscall.SetsockoptTimeval(fd, syscall.SOL_SOCKET, syscall.SO_RCVTIMEO, &tv)
err = unix.SetsockoptTimeval(fd, unix.SOL_SOCKET, unix.SO_RCVTIMEO, &DefaultTimeVal)
if err != nil {
return nil, fmt.Errorf("failed to set read timeout %v", err)
}
Expand Down
12 changes: 12 additions & 0 deletions pkg/can/socketcanv2/socketcanv2_amd64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//go:build !arm

package socketcanv2

import (
"golang.org/x/sys/unix"
)

var DefaultTimeVal = unix.Timeval{
Sec: int64(0),
Usec: int64(100_000),
}
12 changes: 12 additions & 0 deletions pkg/can/socketcanv2/socketcanv2_arm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//go:build arm

package socketcanv2

import (
"golang.org/x/sys/unix"
)

var DefaultTimeVal = unix.Timeval{
Sec: int32(0),
Usec: int32(100_000),
}
14 changes: 10 additions & 4 deletions pkg/network/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ type Network struct {
*sdo.SDOClient
controllers map[uint8]*n.NodeProcessor
// Network has an its own SDOClient
odMap map[uint8]*ObjectDictionaryInformation
logger *slog.Logger
odMap map[uint8]*ObjectDictionaryInformation
odParser od.Parser
logger *slog.Logger
}

type ObjectDictionaryInformation struct {
Expand Down Expand Up @@ -71,6 +72,7 @@ func NewNetwork(bus canopen.Bus) Network {
controllers: map[uint8]*n.NodeProcessor{},
BusManager: canopen.NewBusManager(bus),
odMap: map[uint8]*ObjectDictionaryInformation{},
odParser: od.Parse,
logger: slog.Default(),
}
}
Expand Down Expand Up @@ -210,7 +212,7 @@ func (network *Network) CreateLocalNode(nodeId uint8, odict any) (*n.LocalNode,

switch odType := odict.(type) {
case string:
odNode, err = od.Parse(odType, nodeId)
odNode, err = network.odParser(odType, nodeId)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -268,7 +270,7 @@ func (network *Network) AddRemoteNode(nodeId uint8, odict any) (*n.RemoteNode, e

switch odType := odict.(type) {
case string:
odNode, err = od.Parse(odType, nodeId)
odNode, err = network.odParser(odType, nodeId)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -419,3 +421,7 @@ func (network *Network) Scan(timeoutMs uint32) (map[uint8]NodeInformation, error
func (network *Network) SetLogger(logger *slog.Logger) {
network.logger = logger
}

func (network *Network) SetParser(parser od.Parser) {
network.odParser = parser
}
8 changes: 6 additions & 2 deletions pkg/node/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -335,10 +335,10 @@ func NewLocalNode(
switch format {
case od.FormatEDSAscii:
node.logger.Info("EDS is downloadable via object 0x1021 in ASCII format")
odict.AddReader(edsStore.Index, edsStore.Name, odict.Reader)
odict.AddReader(edsStore.Index, edsStore.Name, odict.NewReaderSeeker())
case od.FormatEDSZipped:
node.logger.Info("EDS is downloadable via object 0x1021 in Zipped format")
compressed, err := createInMemoryZip("compressed.eds", odict.Reader)
compressed, err := createInMemoryZip("compressed.eds", odict.NewReaderSeeker())
if err != nil {
node.logger.Error("failed to compress EDS", "error", err)
return nil, err
Expand All @@ -357,6 +357,10 @@ func NewLocalNode(
// for example.
func createInMemoryZip(filename string, r io.ReadSeeker) ([]byte, error) {

if r == nil {
return nil, fmt.Errorf("expecting a reader %v", r)
}

buffer := new(bytes.Buffer)
zipWriter := zip.NewWriter(buffer)
// Create a file inside the zip
Expand Down
15 changes: 15 additions & 0 deletions pkg/od/base.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package od

import _ "embed"

//go:embed base.eds
var rawDefaultOd []byte

// Return embeded default object dictionary
func Default() *ObjectDictionary {
defaultOd, err := ParseV2(rawDefaultOd, 0)
if err != nil {
panic(err)
}
return defaultOd
}
12 changes: 11 additions & 1 deletion pkg/od/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package od

import (
"fmt"
"io"
"sort"
"strconv"

Expand All @@ -15,7 +16,16 @@ import (
// work for this library.
func ExportEDS(odict *ObjectDictionary, defaultValues bool, filename string) error {
if defaultValues {
return odict.iniFile.SaveTo(filename)
r := odict.NewReaderSeeker()
buffer, err := io.ReadAll(r)
if err != nil {
return fmt.Errorf("failed to read OD raw data %v", err)
}
i, err := ini.Load(buffer)
if err != nil {
return fmt.Errorf("failed to load .INI %v", err)
}
return i.SaveTo(filename)
}
eds := ini.Empty()

Expand Down
Loading

0 comments on commit 8125696

Please sign in to comment.