2019-11-22 21:46:33 -08:00
|
|
|
#pragma once
|
|
|
|
|
2019-12-03 08:43:05 -08:00
|
|
|
#include <map>
|
2022-12-31 16:49:26 -08:00
|
|
|
#include <string>
|
|
|
|
#include <utility>
|
2019-11-22 21:46:33 -08:00
|
|
|
#include <unordered_map>
|
2022-12-31 16:49:26 -08:00
|
|
|
#include <vector>
|
2019-11-22 21:46:33 -08:00
|
|
|
|
2021-03-09 07:33:37 -08:00
|
|
|
#include <capnp/dynamic.h>
|
2019-11-22 21:46:33 -08:00
|
|
|
#include <capnp/serialize.h>
|
2021-03-09 07:33:37 -08:00
|
|
|
|
|
|
|
#ifndef DYNAMIC_CAPNP
|
2019-11-22 21:46:33 -08:00
|
|
|
#include "cereal/gen/cpp/log.capnp.h"
|
2021-03-09 07:33:37 -08:00
|
|
|
#endif
|
2019-11-22 21:46:33 -08:00
|
|
|
|
2022-12-31 16:49:26 -08:00
|
|
|
#include "opendbc/can/common_dbc.h"
|
|
|
|
|
2022-02-24 22:58:37 -08:00
|
|
|
#define INFO printf
|
|
|
|
#define WARN printf
|
|
|
|
#define DEBUG(...)
|
2022-02-28 09:10:34 -08:00
|
|
|
//#define DEBUG printf
|
2022-02-24 22:58:37 -08:00
|
|
|
|
2019-11-22 21:46:33 -08:00
|
|
|
#define MAX_BAD_COUNTER 5
|
2022-08-19 16:19:36 -07:00
|
|
|
#define CAN_INVALID_CNT 5
|
2019-11-22 21:46:33 -08:00
|
|
|
|
2022-05-15 18:26:19 -07:00
|
|
|
void init_crc_lookup_tables();
|
|
|
|
|
2022-02-28 09:10:34 -08:00
|
|
|
// Car specific functions
|
2022-06-30 11:31:58 -07:00
|
|
|
unsigned int honda_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
|
|
|
unsigned int toyota_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
|
|
|
unsigned int subaru_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
|
|
|
unsigned int chrysler_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
|
|
|
unsigned int volkswagen_mqb_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
2022-07-15 10:29:12 -07:00
|
|
|
unsigned int xor_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
2022-06-30 11:31:58 -07:00
|
|
|
unsigned int hkg_can_fd_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
|
|
|
unsigned int pedal_checksum(uint32_t address, const Signal &sig, const std::vector<uint8_t> &d);
|
2019-11-22 21:46:33 -08:00
|
|
|
|
|
|
|
class MessageState {
|
|
|
|
public:
|
2023-04-13 14:48:00 -07:00
|
|
|
std::string name;
|
2019-11-22 21:46:33 -08:00
|
|
|
uint32_t address;
|
|
|
|
unsigned int size;
|
|
|
|
|
|
|
|
std::vector<Signal> parse_sigs;
|
|
|
|
std::vector<double> vals;
|
2022-02-10 13:01:30 -08:00
|
|
|
std::vector<std::vector<double>> all_vals;
|
2019-11-22 21:46:33 -08:00
|
|
|
|
2022-06-22 15:13:59 -07:00
|
|
|
uint64_t last_seen_nanos;
|
2019-11-22 21:46:33 -08:00
|
|
|
uint64_t check_threshold;
|
|
|
|
|
|
|
|
uint8_t counter;
|
|
|
|
uint8_t counter_fail;
|
|
|
|
|
2021-03-09 07:33:37 -08:00
|
|
|
bool ignore_checksum = false;
|
|
|
|
bool ignore_counter = false;
|
|
|
|
|
2022-02-28 09:10:34 -08:00
|
|
|
bool parse(uint64_t sec, const std::vector<uint8_t> &dat);
|
2019-11-22 21:46:33 -08:00
|
|
|
bool update_counter_generic(int64_t v, int cnt_size);
|
|
|
|
};
|
|
|
|
|
|
|
|
class CANParser {
|
|
|
|
private:
|
|
|
|
const int bus;
|
2021-03-09 07:10:39 -08:00
|
|
|
kj::Array<capnp::word> aligned_buf;
|
2019-11-22 21:46:33 -08:00
|
|
|
|
|
|
|
const DBC *dbc = NULL;
|
|
|
|
std::unordered_map<uint32_t, MessageState> message_states;
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool can_valid = false;
|
2022-04-12 22:34:27 -07:00
|
|
|
bool bus_timeout = false;
|
2022-05-16 21:56:14 -07:00
|
|
|
uint64_t first_sec = 0;
|
2019-11-22 21:46:33 -08:00
|
|
|
uint64_t last_sec = 0;
|
2022-04-12 22:34:27 -07:00
|
|
|
uint64_t last_nonempty_sec = 0;
|
|
|
|
uint64_t bus_timeout_threshold = 0;
|
2022-08-19 16:19:36 -07:00
|
|
|
uint64_t can_invalid_cnt = CAN_INVALID_CNT;
|
2019-11-22 21:46:33 -08:00
|
|
|
|
|
|
|
CANParser(int abus, const std::string& dbc_name,
|
|
|
|
const std::vector<MessageParseOptions> &options,
|
|
|
|
const std::vector<SignalParseOptions> &sigoptions);
|
2021-03-09 07:33:37 -08:00
|
|
|
CANParser(int abus, const std::string& dbc_name, bool ignore_checksum, bool ignore_counter);
|
|
|
|
#ifndef DYNAMIC_CAPNP
|
|
|
|
void update_string(const std::string &data, bool sendcan);
|
2023-04-22 17:54:36 -07:00
|
|
|
void update_strings(const std::vector<std::string> &data, std::vector<SignalValue> &vals, bool sendcan);
|
2019-11-22 21:46:33 -08:00
|
|
|
void UpdateCans(uint64_t sec, const capnp::List<cereal::CanData>::Reader& cans);
|
2021-03-09 07:33:37 -08:00
|
|
|
#endif
|
|
|
|
void UpdateCans(uint64_t sec, const capnp::DynamicStruct::Reader& cans);
|
2019-11-22 21:46:33 -08:00
|
|
|
void UpdateValid(uint64_t sec);
|
2023-04-22 17:54:36 -07:00
|
|
|
void query_latest(std::vector<SignalValue> &vals, uint64_t last_ts = 0);
|
2019-12-03 08:43:05 -08:00
|
|
|
};
|
2019-11-22 21:46:33 -08:00
|
|
|
|
2019-12-03 08:43:05 -08:00
|
|
|
class CANPacker {
|
|
|
|
private:
|
|
|
|
const DBC *dbc = NULL;
|
|
|
|
std::map<std::pair<uint32_t, std::string>, Signal> signal_lookup;
|
|
|
|
std::map<uint32_t, Msg> message_lookup;
|
2022-07-21 17:51:49 -07:00
|
|
|
std::map<uint32_t, uint32_t> counters;
|
2019-12-03 08:43:05 -08:00
|
|
|
|
|
|
|
public:
|
|
|
|
CANPacker(const std::string& dbc_name);
|
2022-07-21 17:51:49 -07:00
|
|
|
std::vector<uint8_t> pack(uint32_t address, const std::vector<SignalPackValue> &values);
|
2021-03-09 07:33:37 -08:00
|
|
|
Msg* lookup_message(uint32_t address);
|
2019-11-22 21:46:33 -08:00
|
|
|
};
|