Ich würde in einer .rule gerne eine Struktur definieren. In C/C++ würde ich das wie folgt machen:
Ziel ist es, die im folgenden Code einzeln deklarierten Variablen gesammelt in einer Variable dieser Struktur zu halten:
Code:
struct CanMessage {
int canId;
int msgLen;
int canDataList[8];
};
Code:
rule "11 Bit CAN frame received"
when
Item CanReceived received update
then
if (CanReceived.state.format("%s") != "null") {
// Extrahiere String aus Item
var String recStr = CanReceived.state.format("%s")
// Entferne ersten Character, hier das 'R'
recStr = recStr.substring(1)
// Splitte String in CAN ID und Daten auf
val segments = recStr.split('#').iterator
val int canId = Integer::parseInt(segments.next(), 16)
logInfo("CAN", "canId: " + Integer::toHexString(canId)) // Ausgabe hexadezimal
// logInfo("CAN", "canId: " + canId.toString()) // Ausgabe dezimal
// Fülle Datenarray mit CAN Daten
val String canData = segments.next()
segments.toSet()
var canDataList = newArrayList(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
var msgLen = 0
var stringPos = 0
while (!canData.substring(stringPos).isEmpty()) {
// logInfo("CAN", "stringPos: " + stringPos)
val dataElement = Integer::parseInt(canData.substring(stringPos, stringPos + 2), 16)
// logInfo("CAN", "dataElement: " + dataElement)
canDataList.set(stringPos / 2, dataElement)
stringPos = stringPos + 2
}
msgLen = stringPos / 2
var index = 0
while (index < msgLen) {
logInfo("CAN", "Data[" + index + "]: " + Integer::toHexString(canDataList.get(index))) // Ausgabe hexadezimal
// logInfo("CAN", "Data[" + index + "]: " + canDataList.get(index)) // Ausgabe dezimal
index = index + 1
}
} else {
say("Ungültig!")
}
end


Kommentar