OVMS3/OVMS.V3/components/can/src/canformat_gvret.h

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__