Added simple openxc cpp generated code
authorRomain Forlot <romain.forlot@iot.bzh>
Thu, 9 Feb 2017 17:09:21 +0000 (17:09 +0000)
committerRomain Forlot <romain.forlot@iot.bzh>
Thu, 9 Feb 2017 17:09:21 +0000 (17:09 +0000)
Change-Id: I9f394653af4407cf1e2f03e5d20df5f7fb6f54d3
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
openxc_example/generate_example.cpp [new file with mode: 0644]
openxc_example/handlers.cpp [new file with mode: 0644]
openxc_example/signals.json [new file with mode: 0644]

diff --git a/openxc_example/generate_example.cpp b/openxc_example/generate_example.cpp
new file mode 100644 (file)
index 0000000..8127a9d
--- /dev/null
@@ -0,0 +1,197 @@
+/* DO NOT MODIFY:  This source is generated by the scripts in the
+ * vi-firmware repository.
+ *
+ * Generated for v7.x of the OpenXC VI firmware.
+ */
+
+#include "diagnostics.h"
+#include "can/canread.h"
+#include "can/canwrite.h"
+#include "signals.h"
+#include "obd2.h"
+#include "util/log.h"
+#include "config.h"
+#include "shared_handlers.h"
+
+namespace can = openxc::can;
+
+using openxc::util::log::debug;
+using openxc::pipeline::Pipeline;
+using openxc::config::getConfiguration;
+using openxc::can::read::booleanDecoder;
+using openxc::can::read::stateDecoder;
+using openxc::can::read::ignoreDecoder;
+using openxc::diagnostics::obd2::handleObd2Pid;
+using namespace openxc::signals::handlers;
+
+#include "can/canread.h"
+
+using openxc::can::read::publishNumericalMessage;
+
+void handleSteeringWheelMessage(CanMessage* message,
+        CanSignal* signals, int signalCount, Pipeline* pipeline) {
+    publishNumericalMessage("latitude", 42.0, pipeline);
+}
+
+openxc_DynamicField handleInverted(CanSignal* signal, CanSignal* signals,
+        int signalCount, float value, bool* send) {
+    return openxc::payload::wrapNumber(value * -1);
+}
+
+void initializeMyStuff() { }
+
+void initializeOtherStuff() { }
+
+void myLooper() {
+    // this function will be called once each time through the main loop, after
+    // all CAN message processing has been completed
+}
+
+const int MESSAGE_SET_COUNT = 1;
+CanMessageSet MESSAGE_SETS[MESSAGE_SET_COUNT] = {
+    { 0, "example", 2, 1, 5, 1 },
+};
+
+const int MAX_CAN_BUS_COUNT = 2;
+CanBus CAN_BUSES[][MAX_CAN_BUS_COUNT] = {
+    { // message set: example
+        { speed: 500000,
+        address: 1,
+        maxMessageFrequency: 0,
+        rawWritable: false,
+        passthroughCanMessages: false,
+        bypassFilters: false,
+        loopback: false
+        },
+
+        { speed: 125000,
+        address: 2,
+        maxMessageFrequency: 0,
+        rawWritable: false,
+        passthroughCanMessages: false,
+        bypassFilters: false,
+        loopback: false
+        },
+
+    },
+};
+
+const int MAX_MESSAGE_COUNT = 1;
+CanMessageDefinition CAN_MESSAGES[][MAX_MESSAGE_COUNT] = {
+    { // message set: example
+        { bus: &CAN_BUSES[0][0], id: 0x128, format: STANDARD, frequencyClock: {0.000000}, forceSendChanged: true}, // ECM_z_5D2
+    },
+};
+
+const int MAX_SIGNAL_STATES = 12;
+const int MAX_SIGNALS_WITH_STATES_COUNT = 1;
+const CanSignalState SIGNAL_STATES[][MAX_SIGNALS_WITH_STATES_COUNT][MAX_SIGNAL_STATES] = {
+    { // message set: example
+        { {value: 1, name: "FIRST"}, {value: 2, name: "SECOND"}, {value: 3, name: "THIRD"}, {value: 4, name: "FOURTH"}, {value: 5, name: "REVERSE"}, {value: 6, name: "NEUTRAL"}, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, },
+    },
+};
+
+const int MAX_SIGNAL_COUNT = 5;
+CanSignal SIGNALS[][MAX_SIGNAL_COUNT] = {
+    { // message set: example
+        {message: &CAN_MESSAGES[0][0], genericName: "GearshiftPosition", bitPosition: 41, bitSize: 3, factor: 1.000000, offset: 0.000000, minValue: 0.000000, maxValue: 0.000000, frequencyClock: {0.000000}, sendSame: true, forceSendChanged: false, states: SIGNAL_STATES[0][0], stateCount: 6, writable: false, decoder: stateDecoder, encoder: NULL}, // GrshftPos
+        {message: &CAN_MESSAGES[0][0], genericName: "SteeringWheelAngle", bitPosition: 52, bitSize: 12, factor: 0.153920, offset: 0.000000, minValue: 0.000000, maxValue: 0.000000, frequencyClock: {0.000000}, sendSame: true, forceSendChanged: false, states: NULL, stateCount: 0, writable: false, decoder: handleUnsignedSteeringWheelAngle, encoder: NULL}, // StrAnglAct
+        {message: &CAN_MESSAGES[0][0], genericName: "engine_speed", bitPosition: 12, bitSize: 8, factor: 1.000000, offset: 0.000000, minValue: 0.000000, maxValue: 0.000000, frequencyClock: {15.000000}, sendSame: true, forceSendChanged: false, states: NULL, stateCount: 0, writable: false, decoder: NULL, encoder: NULL}, // EngSpd
+        {message: &CAN_MESSAGES[0][0], genericName: "steering_angle_sign", bitPosition: 52, bitSize: 12, factor: 1.000000, offset: 0.000000, minValue: 0.000000, maxValue: 0.000000, frequencyClock: {0.000000}, sendSame: true, forceSendChanged: false, states: NULL, stateCount: 0, writable: false, decoder: ignoreDecoder, encoder: NULL}, // StrAnglSign
+        {message: &CAN_MESSAGES[0][0], genericName: "steering_wheel_angle_error", bitPosition: 44, bitSize: 12, factor: 1.000000, offset: 0.000000, minValue: 0.000000, maxValue: 0.000000, frequencyClock: {0.000000}, sendSame: true, forceSendChanged: false, states: NULL, stateCount: 0, writable: false, decoder: ignoreDecoder, encoder: NULL}, // StrAnglErr
+    },
+};
+
+void openxc::signals::initialize(openxc::diagnostics::DiagnosticsManager* diagnosticsManager) {
+    switch(getConfiguration()->messageSetIndex) {
+    case 0: // message set: example
+        initializeMyStuff();
+        break;
+    }
+}
+
+void openxc::signals::loop() {
+    switch(getConfiguration()->messageSetIndex) {
+    case 0: // message set: example
+        myLooper();
+        break;
+    }
+}
+
+const int MAX_COMMAND_COUNT = 1;
+CanCommand COMMANDS[][MAX_COMMAND_COUNT] = {
+    { // message set: example
+        { genericName: "turn_signal_status", handler: handleTurnSignalCommand },
+    },
+};
+
+void openxc::signals::decodeCanMessage(Pipeline* pipeline, CanBus* bus, CanMessage* message) {
+    switch(getConfiguration()->messageSetIndex) {
+    case 0: // message set: example
+        switch(bus->address) {
+        case 1:
+            switch (message->id) {
+            case 0x128: // ECM_z_5D2
+                handleSteeringWheelMessage(message, SIGNALS[0], getSignalCount(), pipeline);
+                can::read::translateSignal(&SIGNALS[0][0], message, SIGNALS[0], getSignalCount(), pipeline); // GrshftPos
+                can::read::translateSignal(&SIGNALS[0][1], message, SIGNALS[0], getSignalCount(), pipeline); // StrAnglAct
+                can::read::translateSignal(&SIGNALS[0][2], message, SIGNALS[0], getSignalCount(), pipeline); // EngSpd
+                can::read::translateSignal(&SIGNALS[0][3], message, SIGNALS[0], getSignalCount(), pipeline); // StrAnglSign
+                can::read::translateSignal(&SIGNALS[0][4], message, SIGNALS[0], getSignalCount(), pipeline); // StrAnglErr
+                break;
+            }
+            break;
+        case 2:
+            switch (message->id) {
+            }
+            break;
+        }
+        break;
+    }
+}
+
+
+CanCommand* openxc::signals::getCommands() {
+    return COMMANDS[getActiveMessageSet()->index];
+}
+
+int openxc::signals::getCommandCount() {
+    return getActiveMessageSet()->commandCount;
+}
+
+CanMessageDefinition* openxc::signals::getMessages() {
+    return CAN_MESSAGES[getActiveMessageSet()->index];
+}
+
+int openxc::signals::getMessageCount() {
+    return getActiveMessageSet()->messageCount;
+}
+
+CanSignal* openxc::signals::getSignals() {
+    return SIGNALS[getActiveMessageSet()->index];
+}
+
+int openxc::signals::getSignalCount() {
+    return getActiveMessageSet()->signalCount;
+}
+
+CanBus* openxc::signals::getCanBuses() {
+    return CAN_BUSES[getActiveMessageSet()->index];
+}
+
+int openxc::signals::getCanBusCount() {
+    return getActiveMessageSet()->busCount;
+}
+
+CanMessageSet* openxc::signals::getActiveMessageSet() {
+    return &MESSAGE_SETS[getConfiguration()->messageSetIndex];
+}
+
+CanMessageSet* openxc::signals::getMessageSets() {
+    return MESSAGE_SETS;
+}
+
+int openxc::signals::getMessageSetCount() {
+    return MESSAGE_SET_COUNT;
+}
+
diff --git a/openxc_example/handlers.cpp b/openxc_example/handlers.cpp
new file mode 100644 (file)
index 0000000..4316f15
--- /dev/null
@@ -0,0 +1,22 @@
+#include "can/canread.h"
+
+using openxc::can::read::publishNumericalMessage;
+
+void handleSteeringWheelMessage(CanMessage* message,
+        CanSignal* signals, int signalCount, Pipeline* pipeline) {
+    publishNumericalMessage("latitude", 42.0, pipeline);
+}
+
+openxc_DynamicField handleInverted(CanSignal* signal, CanSignal* signals,
+        int signalCount, float value, bool* send) {
+    return openxc::payload::wrapNumber(value * -1);
+}
+
+void initializeMyStuff() { }
+
+void initializeOtherStuff() { }
+
+void myLooper() {
+    // this function will be called once each time through the main loop, after
+    // all CAN message processing has been completed
+}
diff --git a/openxc_example/signals.json b/openxc_example/signals.json
new file mode 100644 (file)
index 0000000..a305b95
--- /dev/null
@@ -0,0 +1,70 @@
+{   "name": "example",
+    "extra_sources": [
+        "handlers.cpp"
+    ],
+    "initializers": [
+        "initializeMyStuff"
+    ],
+    "loopers": [
+        "myLooper"
+    ],
+    "buses": {
+        "hs": {
+            "controller": 1,
+            "speed": 500000
+        },
+        "ms": {
+            "controller": 2,
+            "speed": 125000
+        }
+    },
+    "commands": [
+        { "name": "turn_signal_status",
+            "handler": "handleTurnSignalCommand"
+        }
+    ],
+    "messages": {
+        "0x128": {
+            "name": "ECM_z_5D2",
+            "bus": "hs",
+            "signals": {
+                "StrAnglAct": {
+                    "generic_name": "SteeringWheelAngle",
+                    "bit_position": 52,
+                    "bit_size": 12,
+                    "factor": 0.15392,
+                    "offset": 0,
+                    "decoder": "handleUnsignedSteeringWheelAngle"},
+                "StrAnglSign": {
+                    "generic_name": "steering_angle_sign",
+                    "decoder": "ignoreDecoder",
+                    "bit_position": 52,
+                    "bit_size": 12},
+                "EngSpd": {
+                    "generic_name": "engine_speed",
+                    "max_frequency": 15,
+                    "bit_position": 12,
+                    "bit_size": 8},
+                "GrshftPos": {
+                    "generic_name": "GearshiftPosition",
+                    "bit_position": 41,
+                    "bit_size": 3,
+                    "states": {
+                        "FIRST": [1],
+                        "SECOND": [2],
+                        "THIRD": [3],
+                        "FOURTH": [4],
+                        "REVERSE": [5],
+                        "NEUTRAL": [6]}
+                },
+                "StrAnglErr": {
+                    "decoder": "ignoreDecoder",
+                    "generic_name": "steering_wheel_angle_error",
+                    "bit_position": 44,
+                    "bit_size": 12
+                }
+            },
+            "handlers": ["handleSteeringWheelMessage"]
+        }
+    }
+}