diff --git a/config.h b/config.h index 94ffff0..eba6add 100644 --- a/config.h +++ b/config.h @@ -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 diff --git a/connections/canbus.h b/connections/canbus.h index 9b39358..73f945f 100644 --- a/connections/canbus.h +++ b/connections/canbus.h @@ -1,6 +1,7 @@ #ifndef CANBus_H #define CANBus_H #include +#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 mTargettedFrames; +}; + #endif // CANBus_H diff --git a/connections/canconconst.h b/connections/canconconst.h index 707355d..386407a 100644 --- a/connections/canconconst.h +++ b/connections/canconconst.h @@ -21,4 +21,11 @@ namespace CANCon { }; } +class CANConStatus +{ +public: + CANCon::status conStatus; + int numHardwareBuses; +}; + #endif // CANCONCONST_H diff --git a/connections/canconnection.cpp b/connections/canconnection.cpp index 0294795..8617ac9 100644 --- a/connections/canconnection.cpp +++ b/connections/canconnection.cpp @@ -2,14 +2,6 @@ #include #include "canconnection.h" - -struct BusData { - CANBus mBus; - bool mConfigured; - QVector mTargettedFrames; -}; - - CANConnection::CANConnection(QString pPort, CANCon::type pType, int pNumBuses, @@ -27,7 +19,7 @@ CANConnection::CANConnection(QString pPort, /* register types */ qRegisterMetaType("CANBus"); qRegisterMetaType("CANFrame"); - qRegisterMetaType("CANCon::status"); + qRegisterMetaType("CANConStatus"); qRegisterMetaType("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= 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; diff --git a/connections/canconnection.h b/connections/canconnection.h index c659cab..0966ea2 100644 --- a/connections/canconnection.h +++ b/connections/canconnection.h @@ -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 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; }; diff --git a/connections/canconnectionmodel.cpp b/connections/canconnectionmodel.cpp index dd88ad9..4a94f0a 100644 --- a/connections/canconnectionmodel.cpp +++ b/connections/canconnectionmodel.cpp @@ -65,11 +65,13 @@ int CANConnectionModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); - int rows=0; + int rows = 0; QList& 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(Qt::DisplayRole)); + dataChanged(begin, end, QVector(Qt::DisplayRole)); */ } diff --git a/connections/connectionwindow.cpp b/connections/connectionwindow.cpp index b28bb93..3289906 100644 --- a/connections/connectionwindow.cpp +++ b/connections/connectionwindow.cpp @@ -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(); diff --git a/connections/connectionwindow.h b/connections/connectionwindow.h index 58e99b2..77a0d88 100644 --- a/connections/connectionwindow.h +++ b/connections/connectionwindow.h @@ -57,7 +57,7 @@ private slots: void handleClearDebugText(); void handleSendHex(); void handleSendText(); - void connectionStatus(CANCon::status); + void connectionStatus(CANConStatus); private: Ui::ConnectionWindow *ui; diff --git a/connections/gvretserial.cpp b/connections/gvretserial.cpp index b8f24c6..b336e87 100644 --- a/connections/gvretserial.cpp +++ b/connections/gvretserial.cpp @@ -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; } } diff --git a/connections/gvretserial.h b/connections/gvretserial.h index 6b8e5ac..a4a3963 100644 --- a/connections/gvretserial.h +++ b/connections/gvretserial.h @@ -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; diff --git a/connections/socketcan.cpp b/connections/socketcan.cpp index 7eefe2f..6455d21 100644 --- a/connections/socketcan.cpp +++ b/connections/socketcan.cpp @@ -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: {}