197 lines
7.2 KiB
C++
197 lines
7.2 KiB
C++
/*
|
|
; Project: Open Vehicle Monitor System
|
|
; Module: CAN dump CRTD format
|
|
; Date: 18th January 2018
|
|
;
|
|
; (C) 2018 Mark Webb-Johnson
|
|
;
|
|
; Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
; of this software and associated documentation files (the "Software"), to deal
|
|
; in the Software without restriction, including without limitation the rights
|
|
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
; copies of the Software, and to permit persons to whom the Software is
|
|
; furnished to do so, subject to the following conditions:
|
|
;
|
|
; The above copyright notice and this permission notice shall be included in
|
|
; all copies or substantial portions of the Software.
|
|
;
|
|
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
; THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef __CANFORMAT_GVRET_H__
|
|
#define __CANFORMAT_GVRET_H__
|
|
|
|
#include "canformat.h"
|
|
|
|
#define CANFORMAT_GVRET_MAXLEN 48
|
|
|
|
#define GVRET_SET_BINARY 0xe7
|
|
#define GVRET_START_BYTE 0xf1
|
|
#define GVRET_NOTDEAD_1 0xde
|
|
#define GVRET_NOTDEAD_2 0xed
|
|
|
|
typedef enum
|
|
{
|
|
BUILD_CAN_FRAME = 0,
|
|
TIME_SYNC = 1,
|
|
GET_DIG_INPUTS = 2,
|
|
GET_ANALOG_INPUTS = 3,
|
|
SET_DIG_OUTPUTS = 4,
|
|
SETUP_CANBUS = 5,
|
|
GET_CANBUS_PARAMS = 6,
|
|
GET_DEVICE_INFO = 7,
|
|
SET_SINGLEWIRE_MODE = 8,
|
|
KEEP_ALIVE = 9,
|
|
SET_SYSTEM_TYPE = 10,
|
|
ECHO_CAN_FRAME = 11,
|
|
GET_NUM_BUSES = 12,
|
|
GET_EXT_BUSES = 13,
|
|
SET_EXT_BUSES = 14
|
|
} gvret_cmd_t;
|
|
|
|
typedef struct __attribute__ ((__packed__))
|
|
{
|
|
uint8_t startbyte;
|
|
uint8_t command;
|
|
union
|
|
{
|
|
struct // 0 - Send a frame out one of the buses
|
|
{
|
|
uint32_t id; // Frame ID LSB to MSB
|
|
uint8_t bus; // which bus (0 = CAN0, 1 = CAN1, 2 = SWCAN, 3 = LIN1, 4 = LIN2)
|
|
uint8_t length; // Frame length
|
|
uint8_t data[8]; // Data bytes
|
|
} build_can_frame;
|
|
struct // 4 - Set state of digital outputs
|
|
{
|
|
uint8_t outputvals; // Bitfield - Bit 0 = DIgital output 1, etc. 0 = Low, 1 = High
|
|
} set_dig_outputs;
|
|
struct // 5 - Set CAN bus configuration
|
|
{
|
|
uint32_t can1; // CAN0 Speed. If Bit 31 set then Bit 30 = Enable Bit 29 = Listen Only
|
|
uint32_t can2; // CAN1 Speed. Same deal, if bit 31 set then use 30 and 29 for config options
|
|
} setup_canbus;
|
|
struct // 8 - Set singlewire mode
|
|
{
|
|
uint8_t mode; // if 0x10 then single wire mode, otherwise no. Not very applicable to M2
|
|
} set_singlewire_mode;
|
|
struct // 10 - Set system type
|
|
{
|
|
uint8_t type; // System type (right now only 0 for M2 project but GVRET takes 0-2)
|
|
} set_system_type;
|
|
struct // 11 - Echo CAN frame
|
|
{
|
|
uint32_t id; // Frame ID LSB to MSB
|
|
uint8_t bus; // which bus (0 = CAN0, 1 = CAN1, 2 = SWCAN, 3 = LIN1, 4 = LIN2)
|
|
uint8_t length; // Frame length
|
|
uint8_t data[8]; // Byte 6-? - Data bytes
|
|
} echo_can_frame;
|
|
} body;
|
|
} gvret_commandmsg_t;
|
|
|
|
typedef struct __attribute__ ((__packed__))
|
|
{
|
|
uint8_t startbyte;
|
|
uint8_t command;
|
|
union
|
|
{
|
|
struct __attribute__ ((__packed__)) // 1 - Time Sync
|
|
{
|
|
uint32_t microseconds; // Microseconds since start up LSB to MSB
|
|
} time_sync;
|
|
struct __attribute__ ((__packed__)) // 2 - Set state of digital inputs
|
|
{
|
|
uint8_t inputvals; // Bitfield of inputs (Bit 0 = Input 0, etc) 0 = Low, 1 = High
|
|
uint8_t checksum; // Checksum byte
|
|
} get_dig_inputs;
|
|
struct __attribute__ ((__packed__)) // 3 - Get state of analog input pins
|
|
{
|
|
uint16_t inputvals[4]; // Analog input LSB then MSB
|
|
uint8_t checksum; // Checksum byte
|
|
} get_analog_inputs;
|
|
struct __attribute__ ((__packed__)) // 6 - Get CAN bus config
|
|
{
|
|
uint8_t can1_mode; // Bit 0 - Enable Bit 4 - Listen only
|
|
uint32_t can1_speed; // CAN0 Speed LSB to MSB
|
|
uint8_t can2_mode; // Bit 0 - Enable Bit 4 - ListenOnly
|
|
uint32_t can2_speed; // CAN1 Speed LSB to MSB
|
|
} get_canbus_params;
|
|
struct __attribute__ ((__packed__)) // 7 - Get device info
|
|
{
|
|
uint16_t build; // Build number LSB to MSB
|
|
uint8_t eeprom; // EEPROM version
|
|
uint8_t filetype; // File output type
|
|
uint8_t autolog; // Auto start logging
|
|
uint8_t singlewire; // Single wire mode
|
|
} get_device_info;
|
|
struct __attribute__ ((__packed__)) // 9 - Keep alive
|
|
{
|
|
uint8_t notdead1; // 0xDE
|
|
uint8_t notdead2; // 0xAD - So, if it isn't dead it responds with DEAD.
|
|
} keep_alive;
|
|
struct __attribute__ ((__packed__)) // 12 - Get number of buses
|
|
{
|
|
uint8_t buses; // Number of buses
|
|
} get_num_buses;
|
|
struct __attribute__ ((__packed__)) // 13 - Get extended buses
|
|
{
|
|
uint8_t swcan_mode; // Bit 0 - Enable Bit 4 - Listen only
|
|
uint32_t swcan_speed; // CAN0 Speed LSB to MSB
|
|
uint8_t lin1_mode; // Bit 0 - Enable Bit 4 - ListenOnly
|
|
uint32_t lin1_speed; // CAN1 Speed LSB to MSB
|
|
uint8_t lin2_mode; // Bit 0 - Enable Bit 4 - ListenOnly
|
|
uint32_t lin2_speed; // CAN1 Speed LSB to MSB
|
|
} get_ext_buses;
|
|
} body;
|
|
} gvret_replymsg_t;
|
|
|
|
typedef struct __attribute__ ((__packed__))
|
|
{
|
|
uint8_t startbyte; // 0xF1
|
|
uint8_t command; // 0x00
|
|
uint32_t microseconds; // Microseconds since start up LSB to MSB
|
|
uint32_t id; // Frame ID, Bit 31 - Extended Frame
|
|
uint8_t lenbus; // Frame length in bottom 4 bits, Bus received on in upper 4 bits
|
|
uint8_t data[9]; // Data bytes (plus zero termination)
|
|
} gvret_binary_frame_t;
|
|
|
|
class canformat_gvret : public canformat
|
|
{
|
|
public:
|
|
canformat_gvret(const char* type);
|
|
virtual ~canformat_gvret();
|
|
|
|
public:
|
|
virtual std::string get(CAN_log_message_t* message);
|
|
virtual std::string getheader(struct timeval *time);
|
|
virtual size_t put(CAN_log_message_t* message, uint8_t *buffer, size_t len, bool* hasmore, canlogconnection* clc=NULL);
|
|
};
|
|
|
|
class canformat_gvret_ascii : public canformat_gvret
|
|
{
|
|
public:
|
|
canformat_gvret_ascii(const char* type);
|
|
virtual std::string get(CAN_log_message_t* message);
|
|
virtual size_t put(CAN_log_message_t* message, uint8_t *buffer, size_t len, bool* hasmore, canlogconnection* clc=NULL);
|
|
};
|
|
|
|
class canformat_gvret_binary : public canformat_gvret
|
|
{
|
|
public:
|
|
canformat_gvret_binary(const char* type);
|
|
virtual std::string get(CAN_log_message_t* message);
|
|
virtual std::string getheader(struct timeval *time);
|
|
virtual size_t put(CAN_log_message_t* message, uint8_t *buffer, size_t len, bool* hasmore, canlogconnection* clc=NULL);
|
|
|
|
private:
|
|
void PopulateBusList12(gvret_replymsg_t* r);
|
|
void PopulateBusList3(gvret_replymsg_t* r);
|
|
};
|
|
|
|
#endif // __CANFORMAT_GVRET_H__
|