@@ -483,7 +483,8 @@ forLoop:
483
483
getRecordLayoutRelativePositions determines in which order the individual fields of record layout are listed.
484
484
it does so by storing the position in a map with uint16 as key and the name of the field as string value.
485
485
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
+
487
488
e.g.
488
489
/begin RECORD_LAYOUT DAMOS_KF
489
490
//field //position //datatype
@@ -917,16 +918,18 @@ func (rl *RecordLayout) getRecordLayoutRelativePositions() (map[uint16]string, e
917
918
}
918
919
919
920
// 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 ) {
922
925
var err error
923
- orderAbs := make (map [string ]uint16 )
926
+ absPos := make (map [string ]uint16 )
924
927
925
928
//get all relative positions as stated in the record layout
926
929
orderRel , err := rl .getRecordLayoutRelativePositions ()
927
930
if err != nil {
928
931
log .Err (err ).Msg ("recordLayout " + rl .Name + " absolute positions could not be determined" )
929
- return orderAbs , err
932
+ return absPos , err
930
933
}
931
934
932
935
//put all position values in a slice
@@ -941,37 +944,317 @@ func (rl *RecordLayout) GetRecordLayoutAbsolutePositions(relPos map[uint16]strin
941
944
})
942
945
943
946
//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:
944
949
for _ , p := range positions {
945
950
//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
950
965
}
951
- dt .GetDatatypeLength ()
952
966
953
967
}
954
- return orderAbs , err
968
+ return absPos , err
955
969
}
956
970
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
957
973
func (rl * RecordLayout ) getDatatypeByFieldName (name string ) (DataTypeEnum , error ) {
958
974
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
972
1255
default :
973
1256
err := errors .New ("no datatype set for " + name + " in record layout " + rl .Name )
974
1257
log .Err (err ).Msg ("could not get datatype" )
1258
+ return undefinedDatatype , err
975
1259
}
976
- return undefinedDatatype , nil
977
1260
}
0 commit comments