diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-02-13 23:29:01 +0000 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-02-13 23:31:56 +0000 |
commit | 90e20942222d7b6142dbdaa05ab7e81bc0f79904 (patch) | |
tree | 9c86470ba813e504a4e6de840ddce00bac65ca03 /can-decoder.cpp | |
parent | 2fc26a117842428f4148621361c53082ac93722f (diff) |
Added needed functions for basics decode needs.
Change-Id: Ic6202927058ff693c7c5c9b04e25b7be2fba340c
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'can-decoder.cpp')
-rw-r--r-- | can-decoder.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/can-decoder.cpp b/can-decoder.cpp new file mode 100644 index 00000000..000db2ac --- /dev/null +++ b/can-decoder.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015, 2016 "IoT.bzh" + * Author "Romain Forlot" <romain.forlot@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Decoder::Decoder +{ + decoded_value = { .has_type = false, + .has_numeric_value = false, + .has_boolean_value = false, + .has_string_value = false }; +} + +float Decoder::parseSignalBitfield(CanSignal* signal, const CanMessage* message) +{ + return bitfield_parse_float(message->data, CAN_MESSAGE_SIZE, + signal->bitPosition, signal->bitSize, signal->factor, + signal->offset); +} + +openxc_DynamicField Decoder::noopDecoder(CanSignal* signal, + CanSignal* signals, int signalCount, float value, bool* send) +{ + decoded_value = { .has_type = true, + .type = openxc_DynamicField_Type_NUM, + .has_numeric_value = true, + .numeric_value = value }; + return decoded_value; +} + +openxc_DynamicField Decoder::booleanDecoder(CanSignal* signal, + CanSignal* signals, int signalCount, float value, bool* send) +{ + decoded_value = { .has_type = true, + .type = openxc_DynamicField_Type_BOOL, + .has_boolean_value = true, + .numeric_value = value == 0.0 ? false : true }; + return decoded_value; +} + +openxc_DynamicField Decoder::ignoreDecoder(CanSignal* signal, + CanSignal* signals, int signalCount, float value, bool* send) +{ + *send = false; + openxc_DynamicField decoded_value = {0}; + return decoded_value; +} + +openxc_DynamicField Decoder::stateDecoder(CanSignal* signal, + CanSignal* signals, int signalCount, float value, bool* send) +{ + openxc_DynamicField decoded_value = {0}; + decoded_value.has_type = true; + decoded_value.type = openxc_DynamicField_Type_STRING; + decoded_value.has_string_value = true; + + const CanSignalState* signalState = lookupSignalState(value, signal); + if(signalState != NULL) { + strcpy(decoded_value.string_value, signalState->name); + } else { + *send = false; + } + return decoded_value; +} + +openxc_DynamicField Decoder::decodeSignal(CanSignal* signal, + float value, CanSignal* signals, int signalCount, bool* send) +{ + SignalDecoder decoder = signal->decoder == NULL ? + noopDecoder : signal->decoder; + openxc_DynamicField decoded_value = decoder(signal, signals, + signalCount, value, send); + return decoded_value; +} + +openxc_DynamicField Decoder::decodeSignal(CanSignal* signal, + const CanMessage* message, CanSignal* signals, int signalCount, + bool* send) { + float value = parseSignalBitfield(signal, message); + return decodeSignal(signal, value, signals, signalCount, send); +}
\ No newline at end of file |