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