YULTek/Otarcik_CAN/Sources/CANDatabase.cpp
2023-01-15 12:38:14 -05:00

248 lines
7.0 KiB
C++

#include "defines.h"
#include "CANDatabase.h"
#include "kvaDbLib.h"
const char* sigEncToStr(KvaDbSignalEncoding sigEnc);
const char* sigRepToStr(KvaDbSignalType sigType);
CCANDatabase::CCANDatabase(QObject *parent) : QObject(parent)
{
}
CCANDatabase::~CCANDatabase()
{
}
int CCANDatabase::Init()
{
return RET_OK;
}
int CCANDatabase::LoadDatabaseFile(QString Filename)
{
#define printf qDebug
KvaDbStatus status;
KvaDbHnd dh = 0;
KvaDbMessageHnd mh = 0;
KvaDbSignalHnd sh = 0;
unsigned int flags = 0;
char filename[] = "IVT-S_all-variations_12082020.dbc";
// Open a database handle
status = kvaDbOpen (&dh);
if (status != kvaDbOK) {
printf("Could not create a database handle: %d\n", status);
return status;
}
// Load the database file
status = kvaDbReadFile (dh, filename);
if (status != kvaDbOK) {
printf("Could not load '%s': %d\n", filename, status);
return status;
}
status = kvaDbGetFlags(dh, &flags);
if (status != kvaDbOK) {
printf ("kvaDbGetFlags failed: %d\n", status);
return status;
}
printf (" Database: flags=0x%x\n", flags);
// Get the first message in the database
status = kvaDbGetFirstMsg (dh, &mh);
if (status != kvaDbOK) {
printf ("kvaDbGetFirstMsg failed: %d\n", status);
return status;
}
// Go through all messages in the database
while (status == kvaDbOK) {
char msg_name[100];
char msg_qname[200];
char msg_comment[200];
int dlc = 0;
unsigned int id = 0;
// Clear the strings
memset(msg_name, 0, sizeof(msg_name));
memset(msg_qname, 0, sizeof(msg_qname));
memset(msg_comment, 0, sizeof(msg_comment));
// Get the properties for each message
status = kvaDbGetMsgName (mh, msg_name, sizeof (msg_name));
if (status != kvaDbOK) {
printf ("kvaDbGetMsgName failed: %d\n", status);
return status;
}
status = kvaDbGetMsgQualifiedName (mh, msg_qname, sizeof (msg_qname));
if (status != kvaDbOK) {
printf ("kvaDbGetMsgQualifiedName failed: %d\n", status);
return status;
}
status = kvaDbGetMsgComment (mh, msg_comment, sizeof (msg_comment));
if (status != kvaDbOK) {
printf ("kvaDbGetMsgComment failed: %d\n", status);
return status;
}
status = kvaDbGetMsgId (mh, &id, &flags);
if (status != kvaDbOK) {
printf ("kvaDbGetMsgId failed: %d\n", status);
return status;
}
status = kvaDbGetMsgDlc (mh, &dlc);
if (status != kvaDbOK) {
printf ("kvaDbGetMsgDlc failed: %d\n", status);
return status;
}
// Print the properties for each message
printf (" Msg: name='%s'\n", msg_name);
printf (" qname='%s', comment='%s'\n", msg_qname, msg_comment);
printf (" id=%x, dlc=%d, flags=%x\n", id, dlc, flags);
// Go through all signals for this message
status = kvaDbGetFirstSignal (mh, &sh);
while (status == kvaDbOK) {
char signal_name[100];
char signal_qname[200];
char signal_comment[200];
char signal_unit[100];
KvaDbSignalEncoding sigEnc;
KvaDbSignalType sigType;
int startbit = 0;
int length = 0;
double minval = 0;
double maxval = 0;
double factor = 0;
double offset = 0;
// Reset the strings
memset(signal_name, 0, sizeof(signal_name));
memset(signal_qname, 0, sizeof(signal_qname));
memset(signal_comment, 0, sizeof(signal_comment));
memset(signal_unit, 0, sizeof(signal_unit));
// Get the properties for each signal.
status = kvaDbGetSignalName (sh, signal_name, sizeof (signal_name));
if (status != kvaDbOK) {
printf ("kvaDbGetSignalName failed: %d\n", status);
return status;
}
status = kvaDbGetSignalQualifiedName (sh, signal_qname, sizeof (signal_qname));
if (status != kvaDbOK) {
printf ("kvaDbGetSignalQualifiedName failed: %d\n", status);
return status;
}
status = kvaDbGetSignalComment (sh, signal_comment, sizeof (signal_comment));
if (status != kvaDbOK) {
printf ("kvaDbGetSignalComment failed: %d\n", status);
return status;
}
status = kvaDbGetSignalUnit (sh, signal_unit, sizeof (signal_unit));
if (status != kvaDbOK) {
printf ("kvaDbGetSignalUnit failed: %d\n", status);
return status;
}
status = kvaDbGetSignalEncoding (sh, &sigEnc);
if (status != kvaDbOK) {
printf ("kvaDbGetSignalEncoding failed: %d\n", status);
return status;
}
status = kvaDbGetSignalRepresentationType(sh, &sigType);
if (status != kvaDbOK) {
printf ("kvaDbGetSignalRepresentationType failed: %d\n", status);
return status;
}
status = kvaDbGetSignalValueLimits(sh, &minval, &maxval);
if (status != kvaDbOK) {
printf ("kvaDbGetSignalValueLimits failed: %d\n", status);
return status;
}
status = kvaDbGetSignalValueScaling(sh, &factor, &offset);
if (status != kvaDbOK) {
printf ("kvaDbGetSignalValueScaling failed: %d\n", status);
return status;
}
status = kvaDbGetSignalValueSize(sh, &startbit, &length);
if (status != kvaDbOK) {
printf ("kvaDbGetSignalValueSize failed: %d\n", status);
return status;
}
printf(" Signal: name='%s', unit='%s'\n", signal_name, signal_unit);
printf(" qname='%s'\n", signal_qname);
printf(" comment='%s'\n", signal_comment);
printf(" encoding='%s'\n", sigEncToStr(sigEnc));
printf(" representation='%s'\n", sigRepToStr(sigType));
printf(" value min=%.02f, value max=%.02f\n", minval, maxval);
printf(" scale faktor=%.02f, offset=%.02f\n", factor, offset);
printf(" startbit=%d, length=%d\n", startbit, length);
status = kvaDbGetNextSignal (mh, &sh);
}
status = kvaDbGetNextMsg (dh, &mh);
}
status = kvaDbClose (dh);
if (status != kvaDbOK) {
printf ("kvaDbClose failed: %d\n", status);
return status;
}
printf("\n\n");
return RET_OK;
}
const char* sigEncToStr(KvaDbSignalEncoding sigEnc)
{
if (sigEnc == kvaDb_Intel) {
return "Intel";
} else if (sigEnc == kvaDb_Motorola) {
return "Motorola";
} else {
return "Undefined";
}
}
// -----------------------------------------------------------------------
// Convert signal representation to a string
// -----------------------------------------------------------------------
const char* sigRepToStr(KvaDbSignalType sigType)
{
if (sigType == kvaDb_Invalid) {
return "Invalid";
} else if (sigType == kvaDb_Signed) {
return "Signed";
} else if (sigType == kvaDb_Unsigned) {
return "Unsigned";
} else if (sigType == kvaDb_Float) {
return "Float";
} else if (sigType == kvaDb_Double) {
return "Double";
} else {
return "Undefined";
}
}