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  ```