Further work to get more buses working on the GVRET/M2RET devices

This commit is contained in:
Collin Kidder
2017-10-22 20:15:18 -04:00
parent 62c70374ab
commit ac976643f4
11 changed files with 168 additions and 80 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
#ifndef CONFIG
#define CONFIG
#define VERSION 178
#define VERSION 179
//try to keep this in sync.
//SavvyCAN will complain if you connect a GVRET board with a revision
+7
View File
@@ -1,6 +1,7 @@
#ifndef CANBus_H
#define CANBus_H
#include <QDataStream>
#include "can_structs.h"
class CANBus
{
@@ -31,4 +32,10 @@ QDataStream & operator>>(QDataStream & pStream, CANBus& pCanBus);
Q_DECLARE_METATYPE(CANBus);
struct BusData {
CANBus mBus;
bool mConfigured;
QVector<CANFltObserver> mTargettedFrames;
};
#endif // CANBus_H
+7
View File
@@ -21,4 +21,11 @@ namespace CANCon {
};
}
class CANConStatus
{
public:
CANCon::status conStatus;
int numHardwareBuses;
};
#endif // CANCONCONST_H
+16 -27
View File
@@ -2,14 +2,6 @@
#include <QThread>
#include "canconnection.h"
struct BusData {
CANBus mBus;
bool mConfigured;
QVector<CANFltObserver> mTargettedFrames;
};
CANConnection::CANConnection(QString pPort,
CANCon::type pType,
int pNumBuses,
@@ -27,7 +19,7 @@ CANConnection::CANConnection(QString pPort,
/* register types */
qRegisterMetaType<CANBus>("CANBus");
qRegisterMetaType<CANFrame>("CANFrame");
qRegisterMetaType<CANCon::status>("CANCon::status");
qRegisterMetaType<CANConStatus>("CANConStatus");
qRegisterMetaType<CANFltObserver>("CANFlt");
/* set queue size */
@@ -35,9 +27,9 @@ CANConnection::CANConnection(QString pPort,
/* allocate buses */
/* TODO: change those tables for a vector */
mBusData_p = new BusData[mNumBuses];
mBusData.resize(mNumBuses);
for(int i=0 ; i<mNumBuses ; i++) {
mBusData_p[i].mConfigured = false;
mBusData[i].mConfigured = false;
}
/* if needed, create a thread and move ourself into it */
@@ -57,10 +49,7 @@ CANConnection::~CANConnection()
mThread_p = NULL;
}
if(mBusData_p) {
delete[] mBusData_p;
mBusData_p = NULL;
}
mBusData.clear();
}
@@ -206,13 +195,13 @@ int CANConnection::getNumBuses() const{
bool CANConnection::isConfigured(int pBusId) {
if( pBusId < 0 || pBusId >= getNumBuses())
return false;
return mBusData_p[pBusId].mConfigured;
return mBusData[pBusId].mConfigured;
}
void CANConnection::setConfigured(int pBusId, bool pConfigured) {
if( pBusId < 0 || pBusId >= getNumBuses())
return;
mBusData_p[pBusId].mConfigured = pConfigured;
mBusData[pBusId].mConfigured = pConfigured;
}
@@ -220,7 +209,7 @@ bool CANConnection::getBusConfig(int pBusId, CANBus& pBus) {
if( pBusId < 0 || pBusId >= getNumBuses() || !isConfigured(pBusId))
return false;
pBus = mBusData_p[pBusId].mBus;
pBus = mBusData[pBusId].mBus;
return true;
}
@@ -229,8 +218,8 @@ void CANConnection::setBusConfig(int pBusId, CANBus& pBus) {
if( pBusId < 0 || pBusId >= getNumBuses())
return;
mBusData_p[pBusId].mConfigured = true;
mBusData_p[pBusId].mBus = pBus;
mBusData[pBusId].mConfigured = true;
mBusData[pBusId].mBus = pBus;
}
@@ -293,7 +282,7 @@ bool CANConnection::addTargettedFrame(int pBusId, uint32_t ID, uint32_t mask, QO
target.id = ID;
target.mask = mask;
target.observer = receiver;
mBusData_p[pBusId].mTargettedFrames.append(target);
mBusData[pBusId].mTargettedFrames.append(target);
return true;
}
@@ -321,7 +310,7 @@ bool CANConnection::removeTargettedFrame(int pBusId, uint32_t ID, uint32_t mask,
target.id = ID;
target.mask = mask;
target.observer = receiver;
mBusData_p[pBusId].mTargettedFrames.removeAll(target);
mBusData[pBusId].mTargettedFrames.removeAll(target);
return true;
}
@@ -329,9 +318,9 @@ bool CANConnection::removeTargettedFrame(int pBusId, uint32_t ID, uint32_t mask,
bool CANConnection::removeAllTargettedFrames(QObject *receiver)
{
for (int i = 0; i < getNumBuses(); i++) {
foreach (const CANFltObserver filt, mBusData_p[i].mTargettedFrames)
foreach (const CANFltObserver filt, mBusData[i].mTargettedFrames)
{
if (filt.observer == receiver) mBusData_p[i].mTargettedFrames.removeOne(filt);
if (filt.observer == receiver) mBusData[i].mTargettedFrames.removeOne(filt);
}
}
@@ -342,10 +331,10 @@ void CANConnection::checkTargettedFrame(CANFrame &frame)
{
unsigned int maskedID;
//qDebug() << "Got frame with ID " << frame.ID << " on bus " << frame.bus;
if (mBusData_p == 0) return;
if (mBusData.count() == 0) return;
if (mBusData_p[frame.bus].mTargettedFrames.length() == 0) return;
foreach (const CANFltObserver filt, mBusData_p[frame.bus].mTargettedFrames)
if (mBusData[frame.bus].mTargettedFrames.length() == 0) return;
foreach (const CANFltObserver filt, mBusData[frame.bus].mTargettedFrames)
{
//qDebug() << "Checking filter with id " << filt.id << " mask " << filt.mask;
maskedID = frame.ID & filt.mask;
+3 -3
View File
@@ -89,7 +89,7 @@ signals:
* @brief event emitted when the CANCon::status of the connection changes (connected->not_connected or the other way round)
* @param pStatus: the new status of the device
*/
void status(CANCon::status pStatus);
void status(CANConStatus pStatus);
/**
* @brief Event sent when device has done something worthy of debugging output.
@@ -183,7 +183,8 @@ public slots:
void debugInput(QByteArray bytes);
protected:
int mNumBuses; //protected to allow connected device to figure out how many buses are available
int mNumBuses; //protected to allow connected device to figure out how many buses are available
QVector<BusData> mBusData;
//determine if the passed frame is part of a filter or not.
void checkTargettedFrame(CANFrame &frame);
@@ -297,7 +298,6 @@ private:
bool mIsCapSuspended;
QAtomicInt mStatus;
bool mStarted;
BusData* mBusData_p;
QThread* mThread_p;
};
+11 -3
View File
@@ -65,11 +65,13 @@ int CANConnectionModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
int rows=0;
int rows = 0;
QList<CANConnection*>& conns = CANConManager::getInstance()->getConnections();
foreach(const CANConnection* conn_p, conns)
rows+=conn_p->getNumBuses();
rows += conn_p->getNumBuses();
qDebug() << "Num Rows: " << rows;
return rows;
}
@@ -143,6 +145,7 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
qDebug() << "Row: " << index.row();
int busId;
CANConnection *conn_p = getAtIdx(index.row(), busId);
@@ -151,6 +154,8 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const
ret = conn_p->getBusSettings(busId, bus);
bool isSocketCAN = (conn_p->getType() == CANCon::SOCKETCAN) ? true: false;
qDebug() << "ConnP: " << conn_p << " ret " << ret;
if (role == Qt::DisplayRole) {
if(!conn_p)
return QVariant();
@@ -254,6 +259,9 @@ CANConnection* CANConnectionModel::getAtIdx(int pIdx, int& pBusId) const
void CANConnectionModel::refresh(int pIndex)
{
beginResetModel();
endResetModel();
/*
QModelIndex begin;
QModelIndex end;
@@ -265,5 +273,5 @@ void CANConnectionModel::refresh(int pIndex)
begin = createIndex(0, 0);
end = createIndex(rowCount()-1, columnCount()-1);
}
dataChanged(begin, end, QVector<int>(Qt::DisplayRole));
dataChanged(begin, end, QVector<int>(Qt::DisplayRole)); */
}
+4 -29
View File
@@ -197,7 +197,7 @@ void ConnectionWindow::handleConnTypeChanged()
/* status */
void ConnectionWindow::connectionStatus(CANCon::status pStatus)
void ConnectionWindow::connectionStatus(CANConStatus pStatus)
{
Q_UNUSED(pStatus);
@@ -208,34 +208,9 @@ void ConnectionWindow::connectionStatus(CANCon::status pStatus)
void ConnectionWindow::handleOKButton()
{
int whichRow = ui->tableConnections->selectionModel()->currentIndex().row();
CANConnection* conn_p = NULL;
if (whichRow > -1)
{
/* set information for selected connection */
int busId;
CANBus bus;
bool ret;
conn_p = connModel->getAtIdx(whichRow, busId);
if(!conn_p) return;
ret = conn_p->getBusSettings(busId, bus);
if(!ret) return;
//bus.setListenOnly(ui->ckListenOnly->isChecked());
//bus.setSingleWire(ui->ckSingleWire->isChecked());
//bus.setEnabled(ui->ckEnabled->isChecked());
//bus.setSpeed(ui->cbSpeed->currentText().toInt());
/* update bus settings */
conn_p->setBusSettings(busId, bus);
connModel->refresh(whichRow);
}
else if( ! CANConManager::getInstance()->getByName(getPortName()) )
if( ! CANConManager::getInstance()->getByName(getPortName()) )
{
/* create connection */
conn_p = create(getConnectionType(), getPortName());
@@ -483,8 +458,8 @@ CANConnection* ConnectionWindow::create(CANCon::type pTye, QString pPortName)
if(conn_p)
{
/* connect signal */
connect(conn_p, SIGNAL(status(CANCon::status)),
this, SLOT(connectionStatus(CANCon::status)));
connect(conn_p, SIGNAL(status(CANConStatus)),
this, SLOT(connectionStatus(CANConStatus)));
/*TODO add return value and checks */
conn_p->start();
+1 -1
View File
@@ -57,7 +57,7 @@ private slots:
void handleClearDebugText();
void handleSendHex();
void handleSendText();
void connectionStatus(CANCon::status);
void connectionStatus(CANConStatus);
private:
Ui::ConnectionWindow *ui;
+105 -8
View File
@@ -232,6 +232,10 @@ void GVRetSerial::connectDevice()
output.append((char)0xE7); //this puts the device into binary comm mode
output.append((char)0xE7);
output.append((char)0xF1);
output.append((char)0x0C); //get number of actually implemented buses. Not implemented except on M2RET
mNumBuses = 2; //the proper number if C/12 is not implemented
output.append((char)0xF1); //signal we want to issue a command
output.append((char)0x06); //request canbus stats from the board
@@ -249,15 +253,11 @@ void GVRetSerial::connectDevice()
output.append((char)0xFF); //signal we don't want single wire mode
}*/
output.append((char)0xF1); //yet another command
output.append((char)0x09); //comm validation command
output.append((char)0xF1); //and another command
output.append((char)0x01); //Time Sync - Not implemented until 333 but we can try
output.append((char)0xF1);
output.append((char)0x12); //get number of actually implemented buses. Not implemented except on M2RET
mNumBuses = 2; //the proper number if 0x12 is not implemented
output.append((char)0xF1); //yet another command
output.append((char)0x09); //comm validation command
continuousTimeSync = true;
@@ -274,7 +274,10 @@ void GVRetSerial::connectDevice()
}
else {
setStatus(CANCon::CONNECTED);
emit status(getStatus());
CANConStatus stats;
stats.conStatus = getStatus();
stats.numHardwareBuses = mNumBuses;
emit status(stats);
}
/* connect reading event */
@@ -336,6 +339,10 @@ void GVRetSerial::debugInput(QByteArray bytes) {
void GVRetSerial::procRXChar(unsigned char c)
{
CANConStatus stats;
int oldBuses;
QByteArray output;
switch (rx_state)
{
case IDLE:
@@ -380,6 +387,12 @@ void GVRetSerial::procRXChar(unsigned char c)
break;
case 12:
rx_state = GET_NUM_BUSES;
qDebug() << "Got num buses reply";
rx_step = 0;
break;
case 13:
rx_state = GET_EXT_BUSES;
qDebug() << "Got extended buses info reply";
rx_step = 0;
break;
}
@@ -545,6 +558,8 @@ void GVRetSerial::procRXChar(unsigned char c)
rx_state = IDLE;
qDebug() << "Baud 0 = " << can0Baud;
qDebug() << "Baud 1 = " << can1Baud;
mBusData[0].mBus.setSpeed(can0Baud);
mBusData[1].mBus.setSpeed(can1Baud);
can0Baud |= 0x80000000;
if (can0Enabled) can0Baud |= 0x40000000;
@@ -556,7 +571,9 @@ void GVRetSerial::procRXChar(unsigned char c)
if (deviceSingleWireMode > 0) can1Baud |= 0x10000000;
setStatus(CANCon::CONNECTED);
emit status(getStatus());
stats.conStatus = getStatus();
stats.numHardwareBuses = mNumBuses;
emit status(stats);
int can0Status = 0x78; //updating everything we can update
int can1Status = 0x78;
@@ -606,8 +623,88 @@ void GVRetSerial::procRXChar(unsigned char c)
rx_state = IDLE;
break;
case GET_NUM_BUSES:
oldBuses = mNumBuses;
mNumBuses = c;
rx_state = IDLE;
qDebug() << "Get number of buses = " << mNumBuses;
stats.conStatus = getStatus();
stats.numHardwareBuses = mNumBuses;
mBusData.resize(mNumBuses);
if (mNumBuses > oldBuses)
{
for (int i = oldBuses; i < mNumBuses; i++)
{
mBusData[i].mConfigured = true;
mBusData[i].mBus = mBusData[0].mBus;
}
}
output.append((char)0xF1); //start a new command
output.append((char)13); //get extended buses
serial->write(output);
emit status(stats);
break;
case GET_EXT_BUSES:
switch (rx_step)
{
case 0:
swcanEnabled = (c & 0xF);
swcanListenOnly = (c >> 4);
break;
case 1:
swcanBaud = c;
break;
case 2:
swcanBaud |= c << 8;
break;
case 3:
swcanBaud |= c << 16;
break;
case 4:
swcanBaud |= c << 24;
break;
case 5:
lin1Enabled = (c & 0xF);
break;
case 6:
lin1Baud = c;
break;
case 7:
lin1Baud |= c << 8;
break;
case 8:
lin1Baud |= c << 16;
break;
case 9:
lin1Baud |= c << 24;
case 10:
lin2Enabled = (c & 0xF);
break;
case 11:
lin2Baud = c;
break;
case 12:
lin2Baud |= c << 8;
break;
case 13:
lin2Baud |= c << 16;
break;
case 14:
lin2Baud |= c << 24;
rx_state = IDLE;
qDebug() << "SWCAN Baud = " << swcanBaud;
qDebug() << "LIN1 Baud = " << lin1Baud;
qDebug() << "LIN2 Baud = " << lin2Baud;
mBusData[2].mBus.setSpeed(swcanBaud);
setStatus(CANCon::CONNECTED);
stats.conStatus = getStatus();
stats.numHardwareBuses = mNumBuses;
emit status(stats);
break;
}
rx_step++;
break;
}
}
+6 -6
View File
@@ -16,7 +16,7 @@
namespace SERIALSTATE {
enum STATE //keep this enum synchronized with the Arduino firmware project
enum STATE
{
IDLE,
GET_COMMAND,
@@ -29,12 +29,12 @@ enum STATE //keep this enum synchronized with the Arduino firmware project
GET_CANBUS_PARAMS,
GET_DEVICE_INFO,
SET_SINGLEWIRE_MODE,
GET_NUM_BUSES
GET_NUM_BUSES,
GET_EXT_BUSES
};
}
using namespace SERIALSTATE;
class GVRetSerial : public CANConnection
{
@@ -83,9 +83,9 @@ protected:
STATE rx_state;
uint32_t rx_step;
CANFrame buildFrame;
int can0Baud, can1Baud;
bool can0Enabled, can1Enabled;
bool can0ListenOnly, can1ListenOnly;
int can0Baud, can1Baud, swcanBaud, lin1Baud, lin2Baud;
bool can0Enabled, can1Enabled, swcanEnabled, lin1Enabled, lin2Enabled;
bool can0ListenOnly, can1ListenOnly, swcanListenOnly;
int deviceBuildNum;
int deviceSingleWireMode;
uint32_t buildTimeBasis;
+7 -2
View File
@@ -211,6 +211,7 @@ void SocketCan::framesReceived()
void SocketCan::testConnection() {
QCanBusDevice* dev_p = QCanBus::instance()->createDevice("socketcan", getPort());
CANConStatus stats;
switch(getStatus())
{
@@ -220,7 +221,9 @@ void SocketCan::testConnection() {
disconnectDevice();
setStatus(CANCon::NOT_CONNECTED);
emit status(getStatus());
stats.conStatus = getStatus();
stats.numHardwareBuses = mNumBuses;
emit status(stats);
}
break;
case CANCon::NOT_CONNECTED:
@@ -235,7 +238,9 @@ void SocketCan::testConnection() {
dev_p->disconnectDevice();
setStatus(CANCon::CONNECTED);
emit status(getStatus());
stats.conStatus = getStatus();
stats.numHardwareBuses = mNumBuses;
emit status(stats);
}
break;
default: {}