github.com/jshiv/can-go@v0.2.1-0.20210224011015-069e90e90bdf/README.md (about) 1 # :electric_plug: CAN Go 2 3 [![PkgGoDev][pkg-badge]][pkg] 4 [![GoReportCard][report-badge]][report] 5 [![Codecov][codecov-badge]][codecov] 6 7 [pkg-badge]: https://pkg.go.dev/badge/go.einride.tech/can 8 [pkg]: https://pkg.go.dev/go.einride.tech/can 9 [report-badge]: https://goreportcard.com/badge/go.einride.tech/can 10 [report]: https://goreportcard.com/report/go.einride.tech/can 11 [codecov-badge]: https://codecov.io/gh/einride/can-go/branch/master/graph/badge.svg 12 [codecov]: https://codecov.io/gh/einride/can-go 13 14 CAN toolkit for Go programmers. 15 16 can-go makes use of the Linux SocketCAN abstraction for CAN communication. 17 (See the [SocketCAN][socketcan] documentation for more details). 18 19 [socketcan]: https://www.kernel.org/doc/Documentation/networking/can.txt 20 21 ## Examples 22 23 ### Receiving CAN frames 24 25 Receiving CAN frames from a socketcan interface. 26 27 ```go 28 func main() { 29 // Error handling omitted to keep example simple 30 conn, _ := socketcan.DialContext(context.Background(), "can", "can0") 31 32 recv := socketcan.NewReceiver(conn) 33 for recv.Receive() { 34 frame := recv.Frame() 35 fmt.Println(frame.String()) 36 } 37 } 38 ``` 39 40 ### Sending CAN frames/messages 41 42 Sending CAN frames to a socketcan interface. 43 44 ```go 45 func main() { 46 // Error handling omitted to keep example simple 47 48 conn, _ := socketcan.DialContext(context.Background(), "can", "can0") 49 50 frame := can.Frame{} 51 tx := socketcan.NewTransmitter(conn) 52 _ = tx.TransmitFrame(context.Background(), frame) 53 } 54 ``` 55 56 ### Generating Go code from a DBC file 57 58 It is possible to generate Go code from a `.dbc` file. 59 60 ``` 61 $ go run go.einride.tech/can/cmd/cantool generate <dbc file root folder> <output folder> 62 ``` 63 64 In order to generate Go code that makes sense, we currently perform some 65 validations when parsing the DBC file so there may need to be some changes 66 on the DBC file to make it work 67 68 After generating Go code we can marshal a message to a frame: 69 70 ```go 71 // import etruckcan "github.com/myproject/myrepo/gen" 72 73 auxMsg := etruckcan.NewAuxiliary().SetHeadLights(etruckcan.Auxiliary_HeadLights_LowBeam) 74 frame := auxMsg.Frame() 75 ``` 76 77 Or unmarshal a frame to a message: 78 79 ```go 80 // import etruckcan "github.com/myproject/myrepo/gen" 81 82 // Error handling omitted for simplicity 83 _ := recv.Receive() 84 frame := recv.Frame() 85 86 var auxMsg *etruckcan.Auxiliary 87 _ = auxMsg.UnmarshalFrame(frame) 88 89 ```