@@ -26,42 +26,51 @@ const (
26
26
canOutputCfgCANDataIDMask = ^ byte (1 << 7 ) // Masks reserved bit in canOutputCfg Block 1 MSB
27
27
28
28
// CANIDLengthFlag.
29
- canOutputCfgOffsetBlock2 = canOutputCfgLengthBlock1
29
+ canOutputCfgOffsetBlock2 = canOutputCfgOffsetBlock1 + canOutputCfgLengthBlock1
30
30
canOutputCfgLengthBlock2 = 1
31
31
canOutputCfgIDLengthFlagMask = byte (0b1 ) // Masks reserved bit in canOutputCfg Block 2 MSB
32
32
33
33
// IDMask.
34
- canOutputCfgOffsetBlock3 = canOutputCfgLengthBlock2
34
+ canOutputCfgOffsetBlock3 = canOutputCfgOffsetBlock2 + canOutputCfgLengthBlock2
35
35
canOutputCfgLengthBlock3 = 4
36
36
canOutputCfgIDMaskMask = ^ byte (0b111 << 5 ) // Masks reserved bit in canOutputCfg Block 3 MSB
37
37
38
38
// OutputFrequency.
39
- canOutputCfgOffsetBlock4 = canOutputCfgLengthBlock3
39
+ canOutputCfgOffsetBlock4 = canOutputCfgOffsetBlock3 + canOutputCfgLengthBlock3
40
40
canOutputCfgLengthBlock4 = 2
41
41
canOutputCfgOutputFreqMask = byte (0b111 ) // Masks reserved bit in canOutputCfg Block 4 MSB
42
42
)
43
43
44
44
// CANOutputConfigurationSetting is the output configuration for a single CAN measurement data type.
45
45
type CANOutputConfigurationSetting struct {
46
46
// DataIdentifier is the data identifier of the data.
47
- CANDataIdentifier
47
+ CANDataIdentifier CANDataIdentifier
48
48
49
- CANIDLengthFlag
49
+ // CANIDLengthFlag specifies whether the CAN address is 11 (CANIDLengthFlag11bits)
50
+ // or 29 bits (CANIDLengthFlag29bits).
51
+ CANIDLengthFlag CANIDLengthFlag
50
52
51
- // TODO: Double check mask over interface
53
+ // IDMask is a uint32 version of CANDataIdentifier.
54
+ //
55
+ // Only used for reading. DefaultIDMask is used for writing.
52
56
IDMask IDMask
53
57
54
58
// OutputFrequency is the output frequency of the data.
55
59
//
56
60
// Selecting an Output OutputFrequency of either 0x0000 or 0xFFFF, makes the device select the
57
61
// maximum frequency for the given data identifier. The device reports the resulting effective
58
62
// frequencies in its response message.
59
- OutputFrequency
63
+ OutputFrequency OutputFrequency
64
+ }
65
+
66
+ // DefaultIDMask returns the default CAN ID Mask.
67
+ func (o * CANOutputConfigurationSetting ) DefaultIDMask () IDMask {
68
+ return uint32 (o .CANDataIdentifier )
60
69
}
61
70
62
71
// MarshalBinary returns the wire representation of the CAN output configuration.
63
72
func (o * CANOutputConfiguration ) MarshalBinary () ([]byte , error ) {
64
- buf := make ([]byte , len (* o )* 4 )
73
+ buf := make ([]byte , len (* o )* canOutputCfgSettingSize )
65
74
var b []byte
66
75
// Push each setting to the buffer
67
76
for i , setting := range * o {
@@ -80,7 +89,7 @@ func (o *CANOutputConfiguration) MarshalBinary() ([]byte, error) {
80
89
81
90
// push IDMask
82
91
b = extractBytes (w , canOutputCfgOffsetBlock3 , canOutputCfgLengthBlock3 )
83
- binary .BigEndian .PutUint32 (b , setting .IDMask )
92
+ binary .BigEndian .PutUint32 (b , setting .DefaultIDMask () )
84
93
b [0 ] &= canOutputCfgIDMaskMask // mask last byte
85
94
86
95
// push OutputFrequency
@@ -152,30 +161,9 @@ func (o *CANOutputConfiguration) UnmarshalBinary(data []byte) error {
152
161
return nil
153
162
}
154
163
155
- // IDMask returns the ID mask expected.
156
- func (f CANIDLengthFlag ) IDMask () IDMask {
157
- b := make ([]byte , 0 , 4 )
158
- // bits 1-8
159
- b [0 ] = ^ byte (0 )
160
-
161
- // bits 9-11(or 16)
162
- if f == CANIDLengthFlag11bits {
163
- b [1 ] = 0b111
164
- return binary .LittleEndian .Uint32 (b )
165
- }
166
- b [1 ] = ^ byte (0 )
167
-
168
- // bits 17-24
169
- b [2 ] = ^ byte (0 )
170
-
171
- // bits 25-29
172
- b [3 ] = 0b11111
173
- return binary .LittleEndian .Uint32 (b )
174
- }
175
-
176
164
// copyBytes returns a copy of the sub-slice of the byte array.
177
165
func copyBytes (w []byte , offset , length int ) []byte {
178
- b := make ([]byte , 0 , length )
166
+ b := make ([]byte , length )
179
167
copy (b , w [offset :offset + length ])
180
168
return b
181
169
}
0 commit comments