parent
4793687c34
commit
35b7546f22
Binary file not shown.
|
@ -287,13 +287,16 @@ public class ReaderState {
|
|||
ConfigStructure structure = state.stack.peek();
|
||||
|
||||
Integer getPrimitiveSize = TypesHelper.getPrimitiveSize(cf.getType());
|
||||
Integer customTypeSize = state.tsCustomSize.get(cf.getType());
|
||||
if (getPrimitiveSize != null && getPrimitiveSize > 1) {
|
||||
if (log.debugEnabled())
|
||||
log.debug("Need to align before " + cf.getName());
|
||||
structure.addAlignmentFill(state, getPrimitiveSize);
|
||||
} else if (getPrimitiveSize == null) {
|
||||
} else if (state.structures.containsKey(cf.getType())) {
|
||||
// we are here for struct members
|
||||
structure.addAlignmentFill(state, 4);
|
||||
} else if (customTypeSize != null) {
|
||||
structure.addAlignmentFill(state, customTypeSize % 8);
|
||||
}
|
||||
|
||||
if (cf.isIterate()) {
|
||||
|
|
|
@ -55,6 +55,8 @@ public class ConfigStructure {
|
|||
}
|
||||
|
||||
public void addAlignmentFill(ReaderState state, int alignment) {
|
||||
if (alignment == 0)
|
||||
return;
|
||||
/**
|
||||
* we make alignment decision based on C fields since we expect iteration and non-iteration fields
|
||||
* to match in size
|
||||
|
@ -70,6 +72,8 @@ public class ConfigStructure {
|
|||
|
||||
totalSize = iterator.currentOffset;
|
||||
int fillSize = totalSize % alignment == 0 ? 0 : alignment - (totalSize % alignment);
|
||||
if (fillSize > 3)
|
||||
throw new IllegalStateException("Fill size does not look right: " + fillSize);
|
||||
|
||||
if (fillSize != 0) {
|
||||
int[] fillSizeArray;
|
||||
|
|
|
@ -79,7 +79,7 @@ public class ConfigFieldParserTest {
|
|||
public void testCustomEnum() throws IOException {
|
||||
String test = "struct pid_s\n" +
|
||||
"#define ego_sensor_e_enum \"BPSX\", \"Innovate\", \"14Point7\"\n" +
|
||||
"custom ego_sensor_e 1 bits, S32, @OFFSET@, [0:1], @@ego_sensor_e_enum@@\n" +
|
||||
"custom ego_sensor_e 1 bits, S08, @OFFSET@, [0:1], @@ego_sensor_e_enum@@\n" +
|
||||
"ego_sensor_e afr_type1;\n" +
|
||||
"ego_sensor_e afr_type2;\n" +
|
||||
"int8_t int\n" +
|
||||
|
@ -88,14 +88,52 @@ public class ConfigFieldParserTest {
|
|||
|
||||
TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state);
|
||||
state.readBufferedReader(test, (tsProjectConsumer));
|
||||
assertEquals("afr_type1 = bits, S32, 0, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"alignmentFill_at_1 = array, U08, 1, [3], \"units\", 1, 0, -20, 100, 0\n" +
|
||||
"afr_type2 = bits, S32, 4, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"int = scalar, S08, 5, \"\", 1, 0, 0, 100, 0\n" +
|
||||
assertEquals("afr_type1 = bits, S08, 0, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"afr_type2 = bits, S08, 1, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"int = scalar, S08, 2, \"\", 1, 0, 0, 100, 0\n" +
|
||||
"alignmentFill_at_3 = scalar, U08, 3, \"units\", 1, 0, -20, 100, 0\n" +
|
||||
"; total TS size = 4\n", tsProjectConsumer.getContent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test2byteCustomEnum() throws IOException {
|
||||
String test = "struct pid_s\n" +
|
||||
"#define ego_sensor_e_enum \"BPSX\", \"Innovate\", \"14Point7\"\n" +
|
||||
"custom ego_sensor_e2 2 bits, S16, @OFFSET@, [0:1], @@ego_sensor_e_enum@@\n" +
|
||||
"int8_t int\n" +
|
||||
"ego_sensor_e2 afr_type1;\n" +
|
||||
"ego_sensor_e2 afr_type2;\n" +
|
||||
"end_struct\n";
|
||||
ReaderState state = new ReaderState();
|
||||
|
||||
TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state);
|
||||
state.readBufferedReader(test, (tsProjectConsumer));
|
||||
assertEquals("int = scalar, S08, 0, \"\", 1, 0, 0, 100, 0\n" +
|
||||
"alignmentFill_at_1 = scalar, U08, 1, \"units\", 1, 0, -20, 100, 0\n" +
|
||||
"afr_type1 = bits, S16, 2, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"afr_type2 = bits, S16, 4, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"alignmentFill_at_6 = array, U08, 6, [2], \"units\", 1, 0, -20, 100, 0\n" +
|
||||
"; total TS size = 8\n", tsProjectConsumer.getContent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test4byteCustomEnum() throws IOException {
|
||||
String test = "struct pid_s\n" +
|
||||
"#define ego_sensor_e_enum \"BPSX\", \"Innovate\", \"14Point7\"\n" +
|
||||
"custom ego_sensor_e4 4 bits, S32, @OFFSET@, [0:1], @@ego_sensor_e_enum@@\n" +
|
||||
"int8_t int2\n" +
|
||||
"ego_sensor_e4 afr_type3;\n" +
|
||||
"end_struct\n";
|
||||
ReaderState state = new ReaderState();
|
||||
|
||||
TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state);
|
||||
state.readBufferedReader(test, (tsProjectConsumer));
|
||||
assertEquals("int2 = scalar, S08, 0, \"\", 1, 0, 0, 100, 0\n" +
|
||||
"alignmentFill_at_1 = array, U08, 1, [3], \"units\", 1, 0, -20, 100, 0\n" +
|
||||
"afr_type3 = bits, S32, 4, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" +
|
||||
"; total TS size = 8\n", tsProjectConsumer.getContent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void alignFourByteTypes() throws IOException {
|
||||
// we expect padding before each 4 byte field
|
||||
|
|
Loading…
Reference in New Issue