Skip to content

Commit 721feba

Browse files
Merge branch 'main' into feature/lan8670
2 parents 9ecadf0 + 75051bf commit 721feba

5 files changed

Lines changed: 145 additions & 41 deletions

File tree

cangen/can-messages/bms.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,8 @@
11491149
}
11501150
},
11511151
{
1152-
"size": 16,
1152+
"size": 32,
1153+
"ieee754_f32": true,
11531154
"sim": {
11541155
"min": -100,
11551156
"max": 100,

cangen/can-messages/mpu.json

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"desc": "MPU Status",
55
"points": [
66
{
7-
"size": 8,
7+
"size": 4,
88
"sim": {
99
"options": [
1010
[0, 0.01],
@@ -16,7 +16,7 @@
1616
}
1717
},
1818
{
19-
"size": 8,
19+
"size": 4,
2020
"sim": {
2121
"options": [
2222
[0, 0.2],
@@ -30,8 +30,9 @@
3030
}
3131
},
3232
{
33-
"size": 8,
33+
"size": 16,
3434
"signed": true,
35+
"format": "divide10",
3536
"sim": {
3637
"min": 0,
3738
"max": 88,
@@ -40,7 +41,7 @@
4041
}
4142
},
4243
{
43-
"size": 8,
44+
"size": 1,
4445
"sim": {
4546
"options": [
4647
[0, 0.8],
@@ -49,7 +50,7 @@
4950
}
5051
},
5152
{
52-
"size": 8,
53+
"size": 7,
5354
"sim": {
5455
"min": 0,
5556
"max": 100,
@@ -58,7 +59,7 @@
5859
}
5960
},
6061
{
61-
"size": 8,
62+
"size": 1,
6263
"sim": {
6364
"options": [
6465
[0, 0.8],
@@ -67,7 +68,7 @@
6768
}
6869
},
6970
{
70-
"size": 8,
71+
"size": 10,
7172
"sim": {
7273
"min": 0,
7374
"max": 50,
@@ -76,13 +77,17 @@
7677
}
7778
},
7879
{
79-
"size": 8,
80+
"size": 1,
8081
"sim": {
8182
"options": [
8283
[0, 0.8],
8384
[1, 0.2]
8485
]
8586
}
87+
},
88+
{
89+
"size": 4,
90+
"parse": false
8691
}
8792
],
8893
"fields": [

cangen/can-messages/msb.json

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,39 @@
179179
"points": [
180180
{
181181
"size": 32,
182+
"ieee754_f32": true,
182183
"sim": {
183184
"min": 0,
184-
"max": 10,
185-
"inc_min": 0.001,
186-
"inc_max": 0.02
185+
"max": 3,
186+
"inc_min": 0.01,
187+
"inc_max": 0.5
188+
}
189+
},
190+
{
191+
"size": 16,
192+
"endianness": "little",
193+
"sim": {
194+
"min": 0,
195+
"max": 4095,
196+
"inc_min": 1,
197+
"inc_max": 20
187198
}
188199
}
189200
],
190201
"fields": [
191202
{
192203
"name": "MSB/FL/Shock",
193-
"unit": "",
204+
"unit": "in",
194205
"values": [
195206
1
196207
]
208+
},
209+
{
210+
"name": "MSB/FL/ShockRaw",
211+
"unit": "",
212+
"values": [
213+
2
214+
]
197215
}
198216
],
199217
"sim_freq": 500
@@ -475,21 +493,39 @@
475493
"points": [
476494
{
477495
"size": 32,
496+
"ieee754_f32": true,
478497
"sim": {
479498
"min": 0,
480-
"max": 10,
481-
"inc_min": 0.001,
482-
"inc_max": 0.02
499+
"max": 3,
500+
"inc_min": 0.01,
501+
"inc_max": 0.5
502+
}
503+
},
504+
{
505+
"size": 16,
506+
"endianness": "little",
507+
"sim": {
508+
"min": 0,
509+
"max": 4095,
510+
"inc_min": 1,
511+
"inc_max": 20
483512
}
484513
}
485514
],
486515
"fields": [
487516
{
488517
"name": "MSB/FR/Shock",
489-
"unit": "",
518+
"unit": "in",
490519
"values": [
491520
1
492521
]
522+
},
523+
{
524+
"name": "MSB/FR/ShockRaw",
525+
"unit": "",
526+
"values": [
527+
2
528+
]
493529
}
494530
],
495531
"sim_freq": 500
@@ -771,21 +807,39 @@
771807
"points": [
772808
{
773809
"size": 32,
810+
"ieee754_f32": true,
774811
"sim": {
775812
"min": 0,
776-
"max": 10,
777-
"inc_min": 0.001,
778-
"inc_max": 0.02
813+
"max": 3,
814+
"inc_min": 0.01,
815+
"inc_max": 0.5
816+
}
817+
},
818+
{
819+
"size": 16,
820+
"endianness": "little",
821+
"sim": {
822+
"min": 0,
823+
"max": 4095,
824+
"inc_min": 1,
825+
"inc_max": 20
779826
}
780827
}
781828
],
782829
"fields": [
783830
{
784831
"name": "MSB/BL/Shock",
785-
"unit": "",
832+
"unit": "in",
786833
"values": [
787834
1
788835
]
836+
},
837+
{
838+
"name": "MSB/BL/ShockRaw",
839+
"unit": "",
840+
"values": [
841+
2
842+
]
789843
}
790844
],
791845
"sim_freq": 500
@@ -1067,21 +1121,39 @@
10671121
"points": [
10681122
{
10691123
"size": 32,
1124+
"ieee754_f32": true,
10701125
"sim": {
10711126
"min": 0,
1072-
"max": 10,
1073-
"inc_min": 0.001,
1074-
"inc_max": 0.02
1127+
"max": 3,
1128+
"inc_min": 0.01,
1129+
"inc_max": 0.5
1130+
}
1131+
},
1132+
{
1133+
"size": 16,
1134+
"endianness": "little",
1135+
"sim": {
1136+
"min": 0,
1137+
"max": 4095,
1138+
"inc_min": 1,
1139+
"inc_max": 20
10751140
}
10761141
}
10771142
],
10781143
"fields": [
10791144
{
10801145
"name": "MSB/BR/Shock",
1081-
"unit": "",
1146+
"unit": "in",
10821147
"values": [
10831148
1
10841149
]
1150+
},
1151+
{
1152+
"name": "MSB/BR/ShockRaw",
1153+
"unit": "",
1154+
"values": [
1155+
2
1156+
]
10851157
}
10861158
],
10871159
"sim_freq": 500

middleware/include/bitstream.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ void bitstream_init(bitstream_t *bitstream, uint8_t *data, size_t bytes);
3232
int bitstream_add(bitstream_t *bitstream, uint32_t value, size_t num_bits);
3333

3434
/**
35-
* @brief Reads info from the bitstream.
36-
* @param *bitstream The bitstream to read from.
37-
* @param start_bit The bit to start reading from.
38-
* @param num_bits The amount of bits to read. The maximum is 32 bits, and (start_bit + num_bits) must be less than the total number of bits in the bitstream.
39-
* @return Returns 1 if failed, and 0 if successful.
35+
* @brief Adds a signed int to a bitstream. The data is added to the end of the bitstream.
36+
* @param *bitstream The bitstream to add data to.
37+
* @param value The data to add to the bitstream.
38+
* @param num_bits The length of the data in bits.
39+
* @return Returns 0 if successful, -1 if there is insufficient space in the bitstream, and 1 if overflow occurs.
4040
*/
41-
uint32_t bitstream_read(bitstream_t *bitstream, uint32_t start_bit,
42-
size_t num_bits);
41+
int bitstream_add_signed(bitstream_t *bitstream, int32_t value,
42+
size_t num_bits);
4343

4444
#endif // BITSTREAM_H

middleware/src/bitstream.c

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,47 @@ int bitstream_add(bitstream_t *bitstream, uint32_t value, size_t num_bits)
4040
return 0; // Success
4141
}
4242

43-
uint32_t bitstream_read(bitstream_t *bitstream, uint32_t start_bit,
44-
size_t num_bits)
43+
int bitstream_add_signed(bitstream_t *bitstream, int32_t value, size_t num_bits)
4544
{
46-
uint32_t result = 0;
45+
if (bitstream->total_bits + num_bits > (bitstream->bytes * 8)) {
46+
return -1; // Error: not enough space in the bitstream
47+
}
48+
49+
bool overflow = false;
50+
/* For a signed int, 'value' must be in between -2^(num_bits - 1) and 2^(num_bits-1) - 1. */
51+
/* For example, an 6-bit input value must be in-between -32 and 31. */
52+
int32_t max_value = (1LL << (num_bits - 1)) - 1;
53+
int32_t min_value = -(1LL << (num_bits - 1));
4754

48-
if (start_bit + num_bits > bitstream->total_bits) {
49-
return -1; // Error: trying to read beyond bit length
55+
if (value > max_value || value < min_value) {
56+
overflow = true; // Error: value is too large or too small
57+
58+
/* Cap value to maximum or minimum */
59+
if (value > max_value) {
60+
value = max_value;
61+
} else {
62+
value = min_value;
63+
}
5064
}
5165

66+
/* Create a mask for the num_bits we want to extract */
67+
uint32_t mask = (1u << num_bits) - 1;
68+
/* Extract the bits we want, including the sign bit */
69+
uint32_t bits = (uint32_t)value & mask;
70+
5271
for (int i = 0; i < num_bits; ++i) {
53-
if (bitstream->data[(start_bit + i) / 8] &
54-
(1 << (7 - ((start_bit + i) % 8)))) {
55-
result |= (1 << (num_bits - 1 - i));
72+
if (bits & (1u << (num_bits - 1 - i))) {
73+
bitstream->data[(bitstream->total_bits + i) / 8] |=
74+
(1 << (7 - ((bitstream->total_bits + i) % 8)));
5675
}
5776
}
5877

59-
return result;
78+
bitstream->total_bits += num_bits;
79+
80+
if (overflow) {
81+
bitstream->overflow = true;
82+
return 1; // Error: Overflow occurred
83+
}
84+
85+
return 0; // Success
6086
}

0 commit comments

Comments
 (0)