github.com/jordan-bonecutter/can-go@v0.0.0-20230901155856-d83995b18e50/pkg/dbc/messageid.go (about)

     1  package dbc
     2  
     3  import "fmt"
     4  
     5  // MessageID represents a message ID.
     6  type MessageID uint32
     7  
     8  // ID constants.
     9  const (
    10  	// maxID is the largest valid standard CAN ID.
    11  	maxID = 0x7ff
    12  	// maxExtendedID is the largest valid extended CAN ID.
    13  	maxExtendedID = 0x1fffffff
    14  )
    15  
    16  // messageIDExtendedFlag is a bit flag that is set for extended message IDs.
    17  const messageIDExtendedFlag MessageID = 0x80000000
    18  
    19  // messageIDIndependentSignals is a special message ID used for the "independent signals" message.
    20  const messageIDIndependentSignals MessageID = 0xc0000000
    21  
    22  // IsExtended returns true if the message ID is an extended CAN ID.
    23  func (m MessageID) IsExtended() bool {
    24  	return m != messageIDIndependentSignals && m&messageIDExtendedFlag > 0
    25  }
    26  
    27  // ToCAN returns the CAN id value of the message ID (i.e. with bit flags removed).
    28  func (m MessageID) ToCAN() uint32 {
    29  	return uint32(m &^ messageIDExtendedFlag)
    30  }
    31  
    32  // Validate returns an error for invalid message IDs.
    33  func (m MessageID) Validate() error {
    34  	if m == messageIDIndependentSignals {
    35  		return nil
    36  	}
    37  	if m.IsExtended() && m.ToCAN() > maxExtendedID {
    38  		return fmt.Errorf("invalid extended ID: %v", m)
    39  	}
    40  	if !m.IsExtended() && m.ToCAN() > maxID {
    41  		return fmt.Errorf("invalid standard ID: %v", m)
    42  	}
    43  	return nil
    44  }