Skip to content

Commit c8debf1

Browse files
committed
Update record_layout.go
1 parent 33ca955 commit c8debf1

File tree

1 file changed

+308
-25
lines changed

1 file changed

+308
-25
lines changed

a2l/record_layout.go

Lines changed: 308 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,8 @@ forLoop:
483483
getRecordLayoutRelativePositions determines in which order the individual fields of record layout are listed.
484484
it does so by storing the position in a map with uint16 as key and the name of the field as string value.
485485
this is mainly a helper function used to get the absolute positions.
486-
Could be implemented far more elegantly.
486+
could have been implemented far more elegantly, but avoids reflection for performance reasons.
487+
487488
e.g.
488489
/begin RECORD_LAYOUT DAMOS_KF
489490
//field //position //datatype
@@ -917,16 +918,18 @@ func (rl *RecordLayout) getRecordLayoutRelativePositions() (map[uint16]string, e
917918
}
918919

919920
// GetRecordLayoutAbsolutePositions retrieves the position of a record layout field
920-
// as an absolute value (in bits) including the offsets by its preceding fields
921-
func (rl *RecordLayout) GetRecordLayoutAbsolutePositions(relPos map[uint16]string) (map[string]uint16, error) {
921+
// as an absolute value (in bits) from the start of the characteristic
922+
// as defined in the ecu adress
923+
// plus the offsets by the preceding fields defined in the record layout
924+
func (rl *RecordLayout) GetRecordFncValuesPosition(relPos map[uint16]string) (map[string]uint16, error) {
922925
var err error
923-
orderAbs := make(map[string]uint16)
926+
absPos := make(map[string]uint16)
924927

925928
//get all relative positions as stated in the record layout
926929
orderRel, err := rl.getRecordLayoutRelativePositions()
927930
if err != nil {
928931
log.Err(err).Msg("recordLayout " + rl.Name + " absolute positions could not be determined")
929-
return orderAbs, err
932+
return absPos, err
930933
}
931934

932935
//put all position values in a slice
@@ -941,37 +944,317 @@ func (rl *RecordLayout) GetRecordLayoutAbsolutePositions(relPos map[uint16]strin
941944
})
942945

943946
//for each position within the orderRel we compute the offset due to the preceding datastructures and its own position
947+
var curPos uint16 = 0
948+
forLooP:
944949
for _, p := range positions {
945950
//get the field name:
946-
dt, err := rl.getDatatypeByFieldName(orderRel[p])
947-
if err != nil {
948-
log.Err(err).Msg("recordLayout " + rl.Name + " absolute positions could not be determined")
949-
return orderAbs, err
951+
if orderRel[p] != "FncValues" {
952+
dt, err := rl.getDatatypeByFieldName(orderRel[p])
953+
if err != nil {
954+
log.Err(err).Msg("recordLayout " + rl.Name + " absolute positions could not be determined")
955+
return absPos, err
956+
}
957+
//add the current field as key to the absolute position map
958+
//and use the last known position as value
959+
//(first value gets curPos=0 as value)
960+
absPos[orderRel[p]] = curPos
961+
//and its correpsonding length
962+
curPos += dt.GetDatatypeLength()
963+
} else {
964+
break forLooP
950965
}
951-
dt.GetDatatypeLength()
952966

953967
}
954-
return orderAbs, err
968+
return absPos, err
955969
}
956970

971+
// getDatatypeByFieldName retrieves the datatype of a given field within the record layout struct
972+
// just a big, hardcoded switch statement in order not to use slower reflection methods
957973
func (rl *RecordLayout) getDatatypeByFieldName(name string) (DataTypeEnum, error) {
958974
switch name {
959-
/*
960-
AxisPtsX axisPtsX
961-
AxisPtsY axisPtsY
962-
AxisPtsZ axisPtsZ
963-
AxisPts4 axisPts4
964-
AxisPts5 axisPts5
965-
AxisRescaleX axisRescaleX
966-
DistOpX distOpX
967-
DistOpY distOpY
968-
DistOpZ distOpZ
969-
DistOp4 distOp4
970-
DistOp5 distOp5
971-
*/
975+
case "AxisPtsX":
976+
if !rl.AxisPtsX.datatypeSet {
977+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
978+
log.Err(err).Msg("could not get datatype")
979+
return undefinedDatatype, err
980+
}
981+
return rl.AxisPtsX.datatype, nil
982+
case "AxisPtsY":
983+
if !rl.AxisPtsY.datatypeSet {
984+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
985+
log.Err(err).Msg("could not get datatype")
986+
return undefinedDatatype, err
987+
}
988+
return rl.AxisPtsY.datatype, nil
989+
case "AxisPtsZ":
990+
if !rl.AxisPtsZ.datatypeSet {
991+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
992+
log.Err(err).Msg("could not get datatype")
993+
return undefinedDatatype, err
994+
}
995+
return rl.AxisPtsZ.datatype, nil
996+
case "AxisPts4":
997+
if !rl.AxisPts4.datatypeSet {
998+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
999+
log.Err(err).Msg("could not get datatype")
1000+
return undefinedDatatype, err
1001+
}
1002+
return rl.AxisPts4.datatype, nil
1003+
case "AxisPts5":
1004+
if !rl.AxisPts5.datatypeSet {
1005+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1006+
log.Err(err).Msg("could not get datatype")
1007+
return undefinedDatatype, err
1008+
}
1009+
return rl.AxisPts5.datatype, nil
1010+
case "AxisRescaleX":
1011+
if !rl.AxisRescaleX.datatypeSet {
1012+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1013+
log.Err(err).Msg("could not get datatype")
1014+
return undefinedDatatype, err
1015+
}
1016+
return rl.AxisRescaleX.datatype, nil
1017+
case "DistOpX":
1018+
if !rl.DistOpX.datatypeSet {
1019+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1020+
log.Err(err).Msg("could not get datatype")
1021+
return undefinedDatatype, err
1022+
}
1023+
return rl.DistOpX.datatype, nil
1024+
case "DistOpY":
1025+
if !rl.DistOpY.datatypeSet {
1026+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1027+
log.Err(err).Msg("could not get datatype")
1028+
return undefinedDatatype, err
1029+
}
1030+
return rl.DistOpY.datatype, nil
1031+
case "DistOpZ":
1032+
if !rl.DistOpZ.datatypeSet {
1033+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1034+
log.Err(err).Msg("could not get datatype")
1035+
return undefinedDatatype, err
1036+
}
1037+
return rl.DistOpZ.datatype, nil
1038+
case "DistOp4":
1039+
if !rl.DistOp4.datatypeSet {
1040+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1041+
log.Err(err).Msg("could not get datatype")
1042+
return undefinedDatatype, err
1043+
}
1044+
return rl.DistOp4.datatype, nil
1045+
case "DistOp5":
1046+
if !rl.DistOp5.datatypeSet {
1047+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1048+
log.Err(err).Msg("could not get datatype")
1049+
return undefinedDatatype, err
1050+
}
1051+
return rl.DistOp5.datatype, nil
1052+
case "FncValues":
1053+
if !rl.FncValues.datatypeSet {
1054+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1055+
log.Err(err).Msg("could not get datatype")
1056+
return undefinedDatatype, err
1057+
}
1058+
return rl.FncValues.datatype, nil
1059+
case "Identification":
1060+
if !rl.Identification.datatypeSet {
1061+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1062+
log.Err(err).Msg("could not get datatype")
1063+
return undefinedDatatype, err
1064+
}
1065+
return rl.Identification.datatype, nil
1066+
case "NoAxisPtsX":
1067+
if !rl.NoAxisPtsX.datatypeSet {
1068+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1069+
log.Err(err).Msg("could not get datatype")
1070+
return undefinedDatatype, err
1071+
}
1072+
return rl.NoAxisPtsX.datatype, nil
1073+
case "NoAxisPtsY":
1074+
if !rl.NoAxisPtsY.datatypeSet {
1075+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1076+
log.Err(err).Msg("could not get datatype")
1077+
return undefinedDatatype, err
1078+
}
1079+
return rl.NoAxisPtsY.datatype, nil
1080+
case "NoAxisPtsZ":
1081+
if !rl.NoAxisPtsZ.datatypeSet {
1082+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1083+
log.Err(err).Msg("could not get datatype")
1084+
return undefinedDatatype, err
1085+
}
1086+
return rl.NoAxisPtsZ.datatype, nil
1087+
case "NoAxisPts4":
1088+
if !rl.NoAxisPts4.datatypeSet {
1089+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1090+
log.Err(err).Msg("could not get datatype")
1091+
return undefinedDatatype, err
1092+
}
1093+
return rl.NoAxisPts4.datatype, nil
1094+
case "NoAxisPts5":
1095+
if !rl.NoAxisPts5.datatypeSet {
1096+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1097+
log.Err(err).Msg("could not get datatype")
1098+
return undefinedDatatype, err
1099+
}
1100+
return rl.NoAxisPts5.datatype, nil
1101+
case "NoRescaleX":
1102+
if !rl.NoRescaleX.datatypeSet {
1103+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1104+
log.Err(err).Msg("could not get datatype")
1105+
return undefinedDatatype, err
1106+
}
1107+
return rl.NoRescaleX.datatype, nil
1108+
case "OffsetX":
1109+
if !rl.OffsetX.datatypeSet {
1110+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1111+
log.Err(err).Msg("could not get datatype")
1112+
return undefinedDatatype, err
1113+
}
1114+
return rl.OffsetX.datatype, nil
1115+
case "OffsetY":
1116+
if !rl.OffsetY.datatypeSet {
1117+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1118+
log.Err(err).Msg("could not get datatype")
1119+
return undefinedDatatype, err
1120+
}
1121+
return rl.OffsetY.datatype, nil
1122+
case "OffsetZ":
1123+
if !rl.OffsetZ.datatypeSet {
1124+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1125+
log.Err(err).Msg("could not get datatype")
1126+
return undefinedDatatype, err
1127+
}
1128+
return rl.OffsetZ.datatype, nil
1129+
case "Offset4":
1130+
if !rl.Offset4.datatypeSet {
1131+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1132+
log.Err(err).Msg("could not get datatype")
1133+
return undefinedDatatype, err
1134+
}
1135+
return rl.Offset4.datatype, nil
1136+
case "Offset5":
1137+
if !rl.Offset5.datatypeSet {
1138+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1139+
log.Err(err).Msg("could not get datatype")
1140+
return undefinedDatatype, err
1141+
}
1142+
return rl.Offset5.datatype, nil
1143+
case "RipAddrW":
1144+
if !rl.RipAddrW.datatypeSet {
1145+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1146+
log.Err(err).Msg("could not get datatype")
1147+
return undefinedDatatype, err
1148+
}
1149+
return rl.RipAddrW.datatype, nil
1150+
case "RipAddrX":
1151+
if !rl.RipAddrX.datatypeSet {
1152+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1153+
log.Err(err).Msg("could not get datatype")
1154+
return undefinedDatatype, err
1155+
}
1156+
return rl.RipAddrX.datatype, nil
1157+
case "RipAddrY":
1158+
if !rl.RipAddrY.datatypeSet {
1159+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1160+
log.Err(err).Msg("could not get datatype")
1161+
return undefinedDatatype, err
1162+
}
1163+
return rl.RipAddrY.datatype, nil
1164+
case "RipAddrZ":
1165+
if !rl.RipAddrZ.datatypeSet {
1166+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1167+
log.Err(err).Msg("could not get datatype")
1168+
return undefinedDatatype, err
1169+
}
1170+
return rl.RipAddrZ.datatype, nil
1171+
case "RipAddr4":
1172+
if !rl.RipAddr4.datatypeSet {
1173+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1174+
log.Err(err).Msg("could not get datatype")
1175+
return undefinedDatatype, err
1176+
}
1177+
return rl.RipAddr4.datatype, nil
1178+
case "RipAddr5":
1179+
if !rl.RipAddr5.datatypeSet {
1180+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1181+
log.Err(err).Msg("could not get datatype")
1182+
return undefinedDatatype, err
1183+
}
1184+
return rl.RipAddr5.datatype, nil
1185+
case "SrcAddrX":
1186+
if !rl.SrcAddrX.datatypeSet {
1187+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1188+
log.Err(err).Msg("could not get datatype")
1189+
return undefinedDatatype, err
1190+
}
1191+
return rl.SrcAddrX.datatype, nil
1192+
case "SrcAddrY":
1193+
if !rl.SrcAddrY.datatypeSet {
1194+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1195+
log.Err(err).Msg("could not get datatype")
1196+
return undefinedDatatype, err
1197+
}
1198+
return rl.SrcAddrY.datatype, nil
1199+
case "SrcAddrZ":
1200+
if !rl.SrcAddrZ.datatypeSet {
1201+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1202+
log.Err(err).Msg("could not get datatype")
1203+
return undefinedDatatype, err
1204+
}
1205+
return rl.SrcAddrZ.datatype, nil
1206+
case "SrcAddr4":
1207+
if !rl.SrcAddr4.datatypeSet {
1208+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1209+
log.Err(err).Msg("could not get datatype")
1210+
return undefinedDatatype, err
1211+
}
1212+
return rl.SrcAddr4.datatype, nil
1213+
case "SrcAddr5":
1214+
if !rl.SrcAddr5.datatypeSet {
1215+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1216+
log.Err(err).Msg("could not get datatype")
1217+
return undefinedDatatype, err
1218+
}
1219+
return rl.SrcAddr5.datatype, nil
1220+
case "ShiftOpX":
1221+
if !rl.ShiftOpX.datatypeSet {
1222+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1223+
log.Err(err).Msg("could not get datatype")
1224+
return undefinedDatatype, err
1225+
}
1226+
return rl.ShiftOpX.datatype, nil
1227+
case "ShiftOpY":
1228+
if !rl.ShiftOpY.datatypeSet {
1229+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1230+
log.Err(err).Msg("could not get datatype")
1231+
return undefinedDatatype, err
1232+
}
1233+
return rl.ShiftOpY.datatype, nil
1234+
case "ShiftOpZ":
1235+
if !rl.ShiftOpZ.datatypeSet {
1236+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1237+
log.Err(err).Msg("could not get datatype")
1238+
return undefinedDatatype, err
1239+
}
1240+
return rl.ShiftOpZ.datatype, nil
1241+
case "ShiftOp4":
1242+
if !rl.ShiftOp4.datatypeSet {
1243+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1244+
log.Err(err).Msg("could not get datatype")
1245+
return undefinedDatatype, err
1246+
}
1247+
return rl.ShiftOp4.datatype, nil
1248+
case "ShiftOp5":
1249+
if !rl.ShiftOp5.datatypeSet {
1250+
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
1251+
log.Err(err).Msg("could not get datatype")
1252+
return undefinedDatatype, err
1253+
}
1254+
return rl.ShiftOp5.datatype, nil
9721255
default:
9731256
err := errors.New("no datatype set for " + name + " in record layout " + rl.Name)
9741257
log.Err(err).Msg("could not get datatype")
1258+
return undefinedDatatype, err
9751259
}
976-
return undefinedDatatype, nil
9771260
}

0 commit comments

Comments
 (0)