diff options
Diffstat (limited to 'src/can-utils.hpp')
-rw-r--r-- | src/can-utils.hpp | 174 |
1 files changed, 98 insertions, 76 deletions
diff --git a/src/can-utils.hpp b/src/can-utils.hpp index db97b4b..0b0971d 100644 --- a/src/can-utils.hpp +++ b/src/can-utils.hpp @@ -17,9 +17,18 @@ #pragma once +#include <map> +#include <queue> +#include <vector> +#include <cstdio> #include <string> +#include <thread> +#include <linux/can.h> + #include "timer.hpp" #include "openxc.pb.h" +#include <afb/afb-binding.h> +#include <afb/afb-service-itf.h> // TODO actual max is 32 but dropped to 24 for memory considerations #define MAX_ACCEPTANCE_FILTERS 24 @@ -30,20 +39,21 @@ #define CAN_ACTIVE_TIMEOUT_S 30 -/* Public: The type signature for a CAN signal decoder. +/** + * @brief The type signature for a CAN signal decoder. * - * A SignalDecoder transforms a raw floating point CAN signal into a number, + * @desc A SignalDecoder transforms a raw floating point CAN signal into a number, * string or boolean. * - * signal - The CAN signal that we are decoding. - * signals - The list of all signals. - * signalCount - The length of the signals array. - * value - The CAN signal parsed from the message as a raw floating point - * value. - * send - An output parameter. If the decoding failed or the CAN signal should - * not send for some other reason, this should be flipped to false. + * @param[in] CanSignal signal - The CAN signal that we are decoding. + * @param[in] CanSignal signals - The list of all signals. + * @param[in] int signalCount - The length of the signals array. + * @param[in] float value - The CAN signal parsed from the message as a raw floating point + * value. + * @param[out] bool send - An output parameter. If the decoding failed or the CAN signal should + * not send for some other reason, this should be flipped to false. * - * Returns a decoded value in an openxc_DynamicField struct. + * @return a decoded value in an openxc_DynamicField struct. */ typedef openxc_DynamicField (*SignalDecoder)(struct CanSignal* signal, CanSignal* signals, int signalCount, float value, bool* send); @@ -51,7 +61,7 @@ typedef openxc_DynamicField (*SignalDecoder)(struct CanSignal* signal, /** * @brief: The type signature for a CAN signal encoder. * - * A SignalEncoder transforms a number, string or boolean into a raw floating + * @desc A SignalEncoder transforms a number, string or boolean into a raw floating * point value that fits in the CAN signal. * * @params[signal] - The CAN signal to encode. @@ -62,7 +72,8 @@ typedef openxc_DynamicField (*SignalDecoder)(struct CanSignal* signal, typedef uint64_t (*SignalEncoder)(struct CanSignal* signal, openxc_DynamicField* value, bool* send); -/* Public: The ID format for a CAN message. +/** + * @brief The ID format for a CAN message. * * STANDARD - standard 11-bit CAN arbitration ID. * EXTENDED - an extended frame, with a 29-bit arbitration ID. @@ -73,13 +84,17 @@ enum CanMessageFormat { }; typedef enum CanMessageFormat CanMessageFormat; -/* A compact representation of a single CAN message, meant to be used in in/out +/** + * @brief A compact representation of a single CAN message, meant to be used in in/out * buffers. * - * id - The ID of the message. - * format - the format of the message's ID. - * data - The message's data field. - * length - the length of the data array (max 8). + * param[in] uint32_t id - The ID of the message. + * param[in] CanMessageFormat format - the format of the message's ID. + * param[in] uint8_t data - The message's data field. + * @param[in] uint8_t length - the length of the data array (max 8). +************************* +* old CanMessage struct * +************************* struct CanMessage { uint32_t id; CanMessageFormat format; @@ -90,7 +105,7 @@ typedef struct CanMessage CanMessage; */ class can_message_t { private: - afb_binding_interface interface_; + const struct afb_binding_interface *interface_; uint32_t id_; CanMessageFormat format_; uint8_t data_[CAN_MESSAGE_SIZE]; @@ -115,9 +130,7 @@ class can_message_t { * @brief Object representing a can device. Handle opening, closing and reading on the * socket. This is the low level object to be use by can_bus_t. * - * @params[*interface_] - afb_binding_interface to the binder. Used to log messages - * @params[device_name_] - name of the linux device handling the can bus. Generally vcan0, can0, etc. - * + * @params[in] std::string device_name_ - name of the linux device handling the can bus. Generally vcan0, can0, etc. */ class can_bus_dev_t { private: @@ -133,6 +146,8 @@ class can_bus_dev_t { bool is_running_; public: + can_bus_dev_t(const std::string& dev_name); + int open(); int close(); bool is_running(); @@ -145,13 +160,13 @@ class can_bus_dev_t { /** * @brief Object used to handle decoding and manage event queue to be pushed. * - * @params[*interface_] - afb_binding_interface to the binder. Used to log messages - * @params[conf_file_ifstream_] - stream of configuration file used to initialize - * can_bus_dev_t objects. + * @params[in] interface_ - afb_binding_interface pointer to the binder. Used to log messages + * @params[in] conf_file_ - configuration file handle used to initialize can_bus_dev_t objects. */ class can_bus_t { private: - afb_binding_interface *interface_; + const struct afb_binding_interface *interface_; + int conf_file_; std::thread th_decoding_; std::thread th_pushing_; @@ -160,6 +175,7 @@ class can_bus_t { std::queue <openxc_VehicleMessage> vehicle_message_q_; public: + can_bus_t(const struct afb_binding_interface *itf, int& conf_file); int init_can_dev(); std::vector<std::string> read_conf(); @@ -172,11 +188,12 @@ class can_bus_t { bool has_vehicle_message() const; }; -/* Public: A state encoded (SED) signal's mapping from numerical values to +/** + * @brief A state encoded (SED) signal's mapping from numerical values to * OpenXC state names. * - * value - The integer value of the state on the CAN bus. - * name - The corresponding string name for the state in OpenXC. + * @param[in] in value - The integer value of the state on the CAN bus. + * @param[in] char* name - The corresponding string name for the state in OpenXC. */ struct CanSignalState { const int value; @@ -184,38 +201,39 @@ struct CanSignalState { }; typedef struct CanSignalState CanSignalState; -/* Public: A CAN signal to decode from the bus and output over USB. +/** + * @brief A CAN signal to decode from the bus and output over USB. * - * message - The message this signal is a part of. - * genericName - The name of the signal to be output over USB. - * bitPosition - The starting bit of the signal in its CAN message (assuming + * @param[in] message - The message this signal is a part of. + * @param[in] genericName - The name of the signal to be output over USB. + * @param[in] bitPosition - The starting bit of the signal in its CAN message (assuming * non-inverted bit numbering, i.e. the most significant bit of * each byte is 0) - * bitSize - The width of the bit field in the CAN message. - * factor - The final value will be multiplied by this factor. Use 1 if you + * @param[in] bitSize - The width of the bit field in the CAN message. + * @param[in] factor - The final value will be multiplied by this factor. Use 1 if you * don't need a factor. - * offset - The final value will be added to this offset. Use 0 if you + * @param[in] offset - The final value will be added to this offset. Use 0 if you * don't need an offset. - * minValue - The minimum value for the processed signal. - * maxValue - The maximum value for the processed signal. - * frequencyClock - A FrequencyClock struct to control the maximum frequency to + * @param[in] minValue - The minimum value for the processed signal. + * @param[in] maxValue - The maximum value for the processed signal. + * @param[in] frequencyClock - A FrequencyClock struct to control the maximum frequency to * process and send this signal. To process every value, set the * clock's frequency to 0. - * sendSame - If true, will re-send even if the value hasn't changed. - * forceSendChanged - If true, regardless of the frequency, it will send the + * @param[in] sendSame - If true, will re-send even if the value hasn't changed. + * @param[in] forceSendChanged - If true, regardless of the frequency, it will send the * value if it has changed. - * states - An array of CanSignalState describing the mapping + * @param[in] states - An array of CanSignalState describing the mapping * between numerical and string values for valid states. - * stateCount - The length of the states array. - * writable - True if the signal is allowed to be written from the USB host + * @param[in] stateCount - The length of the states array. + * @param[in] writable - True if the signal is allowed to be written from the USB host * back to CAN. Defaults to false. - * decoder - An optional function to decode a signal from the bus to a human - * readable value. If NULL, the default numerical decoder is used. - * encoder - An optional function to encode a signal value to be written to + * @param[in] decoder - An optional function to decode a signal from the bus to a human + * readable value. If NULL, the default numerical decoder is used. + * @param[in] encoder - An optional function to encode a signal value to be written to * CAN into a byte array. If NULL, the default numerical encoder * is used. - * received - True if this signal has ever been received. - * lastValue - The last received value of the signal. If 'received' is false, + * @param[in] received - True if this signal has ever been received. + * @param[in] lastValue - The last received value of the signal. If 'received' is false, * this value is undefined. */ struct CanSignal { @@ -240,19 +258,20 @@ struct CanSignal { }; typedef struct CanSignal CanSignal; -/* Public: The definition of a CAN message. This includes a lot of metadata, so +/** + * @brief The definition of a CAN message. This includes a lot of metadata, so * to save memory this struct should not be used for storing incoming and * outgoing CAN messages. * - * bus - A pointer to the bus this message is on. - * id - The ID of the message. - * format - the format of the message's ID. - * clock - an optional frequency clock to control the output of this + * @param[in] bus - A pointer to the bus this message is on. + * @param[in] id - The ID of the message. + * @param[in] format - the format of the message's ID. + * @param[in] clock - an optional frequency clock to control the output of this * message, if sent raw, or simply to mark the max frequency for custom * handlers to retrieve. - * forceSendChanged - If true, regardless of the frequency, it will send CAN + * @param[in] forceSendChanged - If true, regardless of the frequency, it will send CAN * message if it has changed when using raw passthrough. - * lastValue - The last received value of the message. Defaults to undefined. + * @param[in] lastValue - The last received value of the message. Defaults to undefined. * This is required for the forceSendChanged functionality, as the stack * needs to compare an incoming CAN message with the previous frame. */ @@ -292,18 +311,19 @@ struct CanMessageDefinitionListEntry { LIST_HEAD(CanMessageDefinitionList, CanMessageDefinitionListEntry); */ -/** Public: A parent wrapper for a particular set of CAN messages and associated +/** + * @brief A parent wrapper for a particular set of CAN messages and associated * CAN buses(e.g. a vehicle or program). * - * index - A numerical ID for the message set, ideally the index in an array + * @param[in] index - A numerical ID for the message set, ideally the index in an array * for fast lookup - * name - The name of the message set. - * busCount - The number of CAN buses defined for this message set. - * messageCount - The number of CAN messages (across all buses) defined for + * @param[in] name - The name of the message set. + * @param[in] busCount - The number of CAN buses defined for this message set. + * @param[in] messageCount - The number of CAN messages (across all buses) defined for * this message set. - * signalCount - The number of CAN signals (across all messages) defined for + * @param[in] signalCount - The number of CAN signals (across all messages) defined for * this message set. - * commandCount - The number of CanCommmands defined for this message set. + * @param[in] commandCount - The number of CanCommmands defined for this message set. */ typedef struct { uint8_t index; @@ -314,15 +334,16 @@ LIST_HEAD(CanMessageDefinitionList, CanMessageDefinitionListEntry); unsigned short commandCount; } CanMessageSet; -/* Public: The type signature for a function to handle a custom OpenXC command. +/** + * @brief The type signature for a function to handle a custom OpenXC command. * - * name - the name of the received command. - * value - the value of the received command, in a DynamicField. The actual type + * @param[in] char* name - the name of the received command. + * @param[in] openxc_DynamicField* value - the value of the received command, in a DynamicField. The actual type * may be a number, string or bool. - * event - an optional event from the received command, in a DynamicField. The + * @param[in] openxc_DynamicField* event - an optional event from the received command, in a DynamicField. The * actual type may be a number, string or bool. - * signals - The list of all signals. - * signalCount - The length of the signals array. + * @param[in] CanSignal* signals - The list of all signals. + * @param[in] int signalCount - The length of the signals array. */ typedef void (*CommandHandler)(const char* name, openxc_DynamicField* value, openxc_DynamicField* event, CanSignal* signals, int signalCount); @@ -349,15 +370,16 @@ typedef struct { CommandHandler handler; } CanCommand; -/* Pre initialize actions made before CAN bus initialization +/** + * @brief Pre initialize actions made before CAN bus initialization * - * bus - A CanBus struct defining the bus's metadata - * writable - configure the controller in a writable mode. If false, it will be + * @param[in] can_bus_dev_t bus - A CanBus struct defining the bus's metadata + * @param[in] bool writable - configure the controller in a writable mode. If false, it will be * configured as "listen only" and will not allow writes or even CAN ACKs. - * buses - An array of all CAN buses. - * busCount - The length of the buses array. + * @param[in] buses - An array of all CAN buses. + * @param[in] int busCount - The length of the buses array. */ -void pre_initialize(CanBus* bus, bool writable, CanBus* buses, const int busCount); +void pre_initialize(can_bus_dev_t* bus, bool writable, CanBus* buses, const int busCount); /* Post-initialize actions made after CAN bus initialization and before the * event loop connection. @@ -368,7 +390,7 @@ void pre_initialize(CanBus* bus, bool writable, CanBus* buses, const int busCoun * buses - An array of all CAN buses. * busCount - The length of the buses array. */ -void post_initialize(CanBus* bus, bool writable, CanBus* buses, const int busCount); +void post_initialize(can_bus_dev_t* bus, bool writable, CanBus* buses, const int busCount); /* Public: Check if the device is connected to an active CAN bus, i.e. it's * received a message in the recent past. @@ -376,7 +398,7 @@ void post_initialize(CanBus* bus, bool writable, CanBus* buses, const int busCou * Returns true if a message was received on the CAN bus within * CAN_ACTIVE_TIMEOUT_S seconds. */ -bool isBusActive(CanBus* bus); +bool isBusActive(can_bus_dev_t* bus); /* Public: Log transfer statistics about all active CAN buses to the debug log. * |