import os
import subprocess
from cffi import FFI
can_dir = os . path . dirname ( os . path . abspath ( __file__ ) )
libdbc_fn = os . path . join ( can_dir , " libdbc.so " )
subprocess . check_call ( [ " make " , " -j3 " ] , cwd = can_dir ) # don't use all the cores to avoid overheating
ffi = FFI ( )
ffi . cdef ( """
typedef struct {
const char * name ;
double value ;
} SignalPackValue ;
typedef struct {
uint32_t address ;
const char * name ;
double default_value ;
} SignalParseOptions ;
typedef struct {
uint32_t address ;
int check_frequency ;
} MessageParseOptions ;
typedef struct {
uint32_t address ;
uint16_t ts ;
const char * name ;
double value ;
} SignalValue ;
typedef enum {
DEFAULT ,
HONDA_CHECKSUM ,
HONDA_COUNTER ,
TOYOTA_CHECKSUM ,
PEDAL_CHECKSUM ,
PEDAL_COUNTER ,
VOLKSWAGEN_CHECKSUM ,
VOLKSWAGEN_COUNTER ,
} SignalType ;
typedef struct {
const char * name ;
int b1 , b2 , bo ;
bool is_signed ;
double factor , offset ;
SignalType type ;
} Signal ;
typedef struct {
const char * name ;
uint32_t address ;
unsigned int size ;
size_t num_sigs ;
const Signal * sigs ;
} Msg ;
typedef struct {
const char * name ;
uint32_t address ;
const char * def_val ;
const Signal * sigs ;
} Val ;
typedef struct {
const char * name ;
size_t num_msgs ;
const Msg * msgs ;
const Val * vals ;
size_t num_vals ;
} DBC ;
void * can_init ( int bus , const char * dbc_name ,
size_t num_message_options , const MessageParseOptions * message_options ,
size_t num_signal_options , const SignalParseOptions * signal_options ) ;
void can_update_string ( void * can , const char * dat , int len ) ;
size_t can_query_latest ( void * can , bool * out_can_valid , size_t out_values_size , SignalValue * out_values ) ;
const DBC * dbc_lookup ( const char * dbc_name ) ;
void * canpack_init ( const char * dbc_name ) ;
uint64_t canpack_pack ( void * inst , uint32_t address , size_t num_vals , const SignalPackValue * vals , int counter ) ;
""" )
libdbc = ffi . dlopen ( libdbc_fn )