diff --git a/motorcontrollerconfigwindow.cpp b/motorcontrollerconfigwindow.cpp index 54bdef3..a0a6567 100644 --- a/motorcontrollerconfigwindow.cpp +++ b/motorcontrollerconfigwindow.cpp @@ -16,10 +16,19 @@ MotorControllerConfigWindow::MotorControllerConfigWindow(const QVector transmitStep = 0; doingRequest = false; + QStringList headers; + headers << "Param" << "Value"; + ui->tableParams->setColumnCount(2); + ui->tableParams->setColumnWidth(0, 350); + ui->tableParams->setColumnWidth(1, 150); + ui->tableParams->setHorizontalHeaderLabels(headers); + + connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int))); connect(ui->btnRefresh, SIGNAL(clicked(bool)), this, SLOT(refreshData())); connect(ui->btnSave, SIGNAL(clicked(bool)), this, SLOT(saveData())); connect(&timer, SIGNAL(timeout()), this, SLOT(timerTick())); + connect(ui->btnLoadFile, SIGNAL(clicked(bool)), this, SLOT(loadFile())); } MotorControllerConfigWindow::~MotorControllerConfigWindow() @@ -32,10 +41,7 @@ void MotorControllerConfigWindow::updatedFrames(int numFrames) CANFrame thisFrame; int id; int param; - float valu; - uint8_t eightval; - uint16_t sixteenval; - uint32_t thirtytwoval; + QTableWidgetItem *item; if (numFrames == -1) //all frames deleted { @@ -52,125 +58,32 @@ void MotorControllerConfigWindow::updatedFrames(int numFrames) thisFrame = modelFrames->at(i); id = thisFrame.ID; - if (id == 0x420) + if (id == 0xC2) //response to a query we made { - param = thisFrame.data[0]; - eightval = thisFrame.data[1]; - sixteenval = thisFrame.data[1] + (thisFrame.data[2] * 256ul); - thirtytwoval = sixteenval + (thisFrame.data[3] * 65536ul) + (thisFrame.data[4] * 256ul * 65536ul); - - switch (param) + if (thisFrame.data[2] == 0) { - case 0: //voltage scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editVoltageScale->setText(QString::number(valu, 'g', 4)); - break; - case 1: //voltage bias - ui->editVoltageOffset->setText(QString::number(sixteenval)); - break; - case 2: //current 1 scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editCurrent1Scale->setText(QString::number(valu, 'g', 4)); - break; - case 3: //current 1 bias - ui->editCurrent1Offset->setText(QString::number(sixteenval)); - break; - case 4: //current 2 scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editCurrent2Scale->setText(QString::number(valu, 'g', 4)); - break; - case 5: //current 2 bias - ui->editCurrent2Offset->setText(QString::number(sixteenval)); - break; - case 6: //Inverter temp 1 scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editInvTemp1Scale->setText(QString::number(valu, 'g', 4)); - break; - case 7: //Inverter temp 1 bias - ui->editInvTemp1Offset->setText(QString::number(sixteenval)); - break; - case 8: //Inverter temp 2 scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editInvTemp2Scale->setText(QString::number(valu, 'g', 4)); - break; - case 9: //Inverter temp 2 bias - ui->editInvTemp2Offset->setText(QString::number(sixteenval)); - break; - case 10: //Motor temp 1 scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editMotorTemp1Scale->setText(QString::number(valu, 'g', 4)); - break; - case 11: //Motor temp 1 bias - ui->editMotorTemp1Offset->setText(QString::number(sixteenval)); - break; - case 12: //Motor temp 2 scale (*65536) - valu = thirtytwoval / 65536.0f; - ui->editMotorTemp2Scale->setText(QString::number(valu, 'g', 4)); - break; - case 13: //Motor temp 2 bias - ui->editMotorTemp2Offset->setText(QString::number(sixteenval)); - break; - case 14: //motor type (inductive, pmac, bldc) - ui->editMotorType->setText(QString::number(eightval)); - break; - case 15: //control type (vhz, foc) - ui->editControlType->setText(QString::number(eightval)); - break; - case 16: //encoder count - ui->editEncoderCount->setText(QString::number(sixteenval)); - break; - case 17: //encoder direction (0 = normal, 1 = reversed) - ui->editEncoderDir->setText(QString::number(eightval)); - break; - case 18: - ui->editPolePairs->setText(QString::number(eightval)); - break; - case 19: //rotor time const (*65536) - valu = thirtytwoval / 65536.0f; - ui->editRotorTime->setText(QString::number(valu, 'g', 4)); - break; - case 20: //Torque KP (*4096) - valu = thirtytwoval / 4096.0f; - ui->editTorqueKP->setText(QString::number(valu, 'g', 4)); - break; - case 21: //Torque KI (*4096) - valu = thirtytwoval / 4096.0f; - ui->editTorqueKI->setText(QString::number(valu, 'g', 4)); - break; - case 22: //Torque KD (*4096) - valu = thirtytwoval / 4096.0f; - ui->editTorqueKD->setText(QString::number(valu, 'g', 4)); - break; - case 23: //Max RPM - ui->editMaxRPM->setText(QString::number(sixteenval)); - break; - case 24: //Max Torque - valu = sixteenval / 10.0f; - ui->editMaxTorque->setText(QString::number(valu, 'g', 4)); - break; - case 25: //Max Amps in Drive - valu = sixteenval / 10.0f; - ui->editMaxAmpsDrive->setText(QString::number(valu, 'g', 4)); - break; - case 26: //Max Amps in Regen - valu = sixteenval / 10.0f; - ui->editMaxAmpsRegen->setText(QString::number(valu, 'g', 4)); - break; - case 27: //VHz Full Speed - ui->editVHZFull->setText(QString::number(sixteenval)); - break; - case 28: //Theta offset - ui->editThetaOffset->setText(QString::number(sixteenval)); - break; - case 29: //Hall AB - ui->editHallAB->setText(QString::number(eightval)); - break; - case 30: //Hall BC - ui->editHallBC->setText(QString::number(eightval)); - break; - case 31: //Hall CA - ui->editHallCA->setText(QString::number(eightval)); - break; + int paramID = thisFrame.data[0] + (thisFrame.data[1] * 256); + for (int i = 0; i < params.length(); i++) + { + if (params[i].paramID == paramID) + { + params[i].value = thisFrame.data[4] + (thisFrame.data[5] * 256); + if (params[i].paramType == ASCII) item = new QTableWidgetItem(QString::fromUtf8((char *)params[i].value, 2)); + if (params[i].paramType == HEX) item = new QTableWidgetItem(Utility::formatHexNum(params[i].value)); + if (params[i].paramType == DEC) + { + if (params[i].signedType == UNSIGNED) item = new QTableWidgetItem(QString::number(params[i].value)); + if (params[i].signedType == SIGNED) + { + if (params[i].value < 0x8000) item = new QTableWidgetItem(QString::number(params[i].value)); + else item = new QTableWidgetItem(QString::number(params[i].value - 0x10000)); + } + if (params[i].signedType == Q15) item = new QTableWidgetItem(QString::number(params[i].value / 32768.0)); + } + + break; + } + } } } } @@ -184,6 +97,72 @@ void MotorControllerConfigWindow::refreshData() timer.start(); } +void MotorControllerConfigWindow::loadFile() +{ + QString filename; + QFileDialog dialog; + QFile *inFile; + QByteArray line; + PARAM param; + + QStringList filters; + filters.append(QString(tr("RMS Definition File (*.txt *.TXT)"))); + + dialog.setFileMode(QFileDialog::ExistingFile); + dialog.setNameFilters(filters); + dialog.setViewMode(QFileDialog::Detail); + + if (dialog.exec() == QDialog::Accepted) + { + filename = dialog.selectedFiles()[0]; + inFile = new QFile(filename); + + if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) + { + delete inFile; + return; + } + + ui->tableParams->clear(); + params.clear(); + + while (!inFile->atEnd()) + { + line = inFile->readLine().simplified().toUpper(); + if (!line.startsWith("#") && line.length() > 10) + { + QList tokens = line.split(','); + //Serial_Number_EEPROM , 0x0113, uint, dec, 16, 6, spr, spr, spr + param.paramName = tokens[0].simplified(); + param.paramID = Utility::ParseStringToNum(tokens[1].simplified()); + QString signedStr = tokens[2].simplified().toUpper(); + param.signedType = SIGNED; + if (signedStr.compare("UINT") == 0) param.signedType = UNSIGNED; + if (signedStr.compare("Q15") == 0) param.signedType = Q15; + QString typeStr = tokens[3].simplified().toUpper(); + param.paramType = DEC; + if (typeStr.compare("HEX") == 0) param.paramType = HEX; + if (typeStr.compare("ASCII") == 0) param.paramType = ASCII; + + int row = ui->tableParams->rowCount(); + ui->tableParams->insertRow(row); + + QTableWidgetItem *item = new QTableWidgetItem(param.paramName); + ui->tableParams->setItem(row, 0, item); + item = new QTableWidgetItem(""); + ui->tableParams->setItem(row, 1, item); + + params.append(param); + } + } + + refreshData(); + + inFile->close(); + delete inFile; + } +} + void MotorControllerConfigWindow::saveData() { doingRequest = false; @@ -193,17 +172,27 @@ void MotorControllerConfigWindow::saveData() void MotorControllerConfigWindow::timerTick() { - float valu; - uint32_t intval32; - uint16_t intval16; - uint8_t intval8; - if (doingRequest) //send requests for data { - //qDebug() << "Request: " << QString::number(transmitStep); - send8BitParam(transmitStep, 0); + qDebug() << "Request: " << QString::number(transmitStep); + + outFrame.ID = 0xC1; + outFrame.len = 8; + outFrame.bus = 0; + outFrame.extended = false; + outFrame.data[0] = params[transmitStep].paramID & 0xFF; + outFrame.data[1] = (params[transmitStep].paramID >> 8) & 0xFF; + outFrame.data[2] = 0; //0 = read, 1 = write + outFrame.data[3] = 0; //reserved + outFrame.data[4] = 0; //value goes in bytes 4,5 when writing + outFrame.data[5] = 0; + outFrame.data[6] = 0; //reserved + outFrame.data[7] = 0; //reserved + + emit sendCANFrame(&outFrame, 0); + transmitStep++; - if (transmitStep == 32) + if (transmitStep == params.length()) { timer.stop(); return; @@ -214,193 +203,8 @@ void MotorControllerConfigWindow::timerTick() //qDebug() << "Transmission: " << QString::number(transmitStep); switch (transmitStep) { - case 0: - valu = ui->editVoltageScale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 1: - intval16 = ui->editVoltageOffset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 2: - valu = ui->editCurrent1Scale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 3: - intval16 = ui->editCurrent1Offset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 4: - valu = ui->editCurrent2Scale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 5: - intval16 = ui->editCurrent2Offset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 6: //Inverter temp 1 scale (*65536) - valu = ui->editInvTemp1Scale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 7: //Inverter temp 1 bias - intval16 = ui->editInvTemp1Offset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 8: //Inverter temp 2 scale (*65536) - valu = ui->editInvTemp2Scale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 9: //Inverter temp 2 bias - intval16 = ui->editInvTemp2Offset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 10: //Motor temp 1 scale (*65536) - valu = ui->editMotorTemp1Scale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 11: //Motor temp 1 bias - intval16 = ui->editMotorTemp1Offset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 12: //Motor temp 2 scale (*65536) - valu = ui->editMotorTemp2Scale->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 13: //Motor temp 2 bias - intval16 = ui->editMotorTemp2Offset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 14: //motor type (inductive, pmac, bldc) - intval8 = ui->editMotorType->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 15: //control type (vhz, foc) - intval8 = ui->editControlType->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 16: //encoder count - intval16 = ui->editEncoderCount->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 17: //encoder direction (0 = normal, 1 = reversed) - intval8 = ui->editEncoderDir->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 18: - intval8 = ui->editPolePairs->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 19: //rotor time const (*65536) - valu = ui->editRotorTime->text().toFloat(); - intval32 = valu * 65536; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 20: //Torque KP (*4096) - valu = ui->editTorqueKP->text().toFloat(); - intval32 = valu * 4096; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 21: //Torque KI (*4096) - valu = ui->editTorqueKI->text().toFloat(); - intval32 = valu * 4096; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 22: //Torque KD (*4096) - valu = ui->editTorqueKD->text().toFloat(); - intval32 = valu * 4096; - send32BitParam(0x80 + transmitStep, intval32); - break; - case 23: //Max RPM - intval16 = ui->editMaxRPM->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 24: //Max Torque - valu = ui->editMaxTorque->text().toFloat(); - intval16 = valu * 10; - send16BitParam(0x80 + transmitStep, intval16); - break; - case 25: //Max Amps in Drive - valu = ui->editMaxAmpsDrive->text().toFloat(); - intval16 = valu * 10; - send16BitParam(0x80 + transmitStep, intval16); - break; - case 26: //Max Amps in Regen - valu = ui->editMaxAmpsRegen->text().toFloat(); - intval16 = valu * 10; - send16BitParam(0x80 + transmitStep, intval16); - break; - case 27: //VHz Full Speed - intval16 = ui->editVHZFull->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 28: //Theta offset - intval16 = ui->editThetaOffset->text().toInt(); - send16BitParam(0x80 + transmitStep, intval16); - break; - case 29: //Hall AB - intval8 = ui->editHallAB->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 30: //Hall BC - intval8 = ui->editHallBC->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 31: //Hall CA - intval8 = ui->editHallCA->text().toInt(); - send8BitParam(0x80 + transmitStep, intval8); - break; - case 32: - timer.stop(); - return; - break; + } transmitStep++; } } - -void MotorControllerConfigWindow::send32BitParam(int param, uint32_t valu) -{ - outFrame.ID = 0x230; - outFrame.len = 5; - outFrame.bus = 0; - outFrame.extended = false; - outFrame.data[0] = param & 0xFF; - outFrame.data[1] = valu & 0xFF; - outFrame.data[2] = (valu >> 8) & 0xFF; - outFrame.data[3] = (valu >> 16) & 0xFF; - outFrame.data[4] = (valu >> 24) & 0xFF; - - emit sendCANFrame(&outFrame, 0); -} - -void MotorControllerConfigWindow::send16BitParam(int param, uint16_t valu) -{ - outFrame.ID = 0x230; - outFrame.len = 3; - outFrame.bus = 0; - outFrame.extended = false; - outFrame.data[0] = param & 0xFF; - outFrame.data[1] = valu & 0xFF; - outFrame.data[2] = (valu >> 8) & 0xFF; - - emit sendCANFrame(&outFrame, 0); -} - -void MotorControllerConfigWindow::send8BitParam(int param, uint8_t valu) -{ - outFrame.ID = 0x230; - outFrame.len = 2; - outFrame.bus = 0; - outFrame.extended = false; - outFrame.data[0] = param & 0xFF; - outFrame.data[1] = valu; - - emit sendCANFrame(&outFrame, 0); -} diff --git a/motorcontrollerconfigwindow.h b/motorcontrollerconfigwindow.h index f973300..cff1f61 100644 --- a/motorcontrollerconfigwindow.h +++ b/motorcontrollerconfigwindow.h @@ -9,6 +9,33 @@ namespace Ui { class MotorControllerConfigWindow; } +//Serial_Number_EEPROM , 0x0113, uint, dec, 16, 6, spr, spr, spr + +enum PARAM_TYPE +{ + DEC, + HEX, + ASCII, +}; + +enum PARAM_SIGNED +{ + UNSIGNED, + SIGNED, + Q15 +}; + +class PARAM +{ +public: + QString paramName; + uint32_t paramID; + PARAM_TYPE paramType; + PARAM_SIGNED signedType; + uint16_t value; +}; + + class MotorControllerConfigWindow : public QDialog { Q_OBJECT @@ -26,6 +53,7 @@ private slots: void refreshData(); void saveData(); void timerTick(); + void loadFile(); private: Ui::MotorControllerConfigWindow *ui; @@ -34,10 +62,7 @@ private: CANFrame outFrame; bool doingRequest; int transmitStep; - - void send32BitParam(int param, uint32_t valu); - void send16BitParam(int param, uint16_t valu); - void send8BitParam(int param, uint8_t valu); + QList params; }; diff --git a/re/sniffer/snifferitem.cpp b/re/sniffer/snifferitem.cpp index af8bee1..494fda1 100644 --- a/re/sniffer/snifferitem.cpp +++ b/re/sniffer/snifferitem.cpp @@ -41,7 +41,7 @@ dc SnifferItem::dataChange(uchar i) const ((uchar*) &mLastMarker.data)[i] && !((uchar*) &mNotch)[i] ) { - return ((uchar*) &mCurrent.data)[i] >= ((uchar*) &mLast.data)[i] ? dc::INC : dc::DEC; + return ((uchar*) &mCurrent.data)[i] >= ((uchar*) &mLast.data)[i] ? dc::INC : dc::DEINC; } return dc::NO; diff --git a/re/sniffer/snifferitem.h b/re/sniffer/snifferitem.h index cc06c3a..18d836e 100644 --- a/re/sniffer/snifferitem.h +++ b/re/sniffer/snifferitem.h @@ -15,7 +15,7 @@ enum dc { NO, INC, - DEC + DEINC }; diff --git a/re/sniffer/sniffermodel.cpp b/re/sniffer/sniffermodel.cpp index 031b487..2a3bbed 100644 --- a/re/sniffer/sniffermodel.cpp +++ b/re/sniffer/sniffermodel.cpp @@ -75,7 +75,7 @@ QVariant SnifferModel::data(const QModelIndex &index, int role) const { case dc::INC: return QBrush(Qt::green); - case dc::DEC: + case dc::DEINC: return QBrush(Qt::red); default: break; diff --git a/ui/motorcontrollerconfigwindow.ui b/ui/motorcontrollerconfigwindow.ui index 544f07b..4e04de7 100644 --- a/ui/motorcontrollerconfigwindow.ui +++ b/ui/motorcontrollerconfigwindow.ui @@ -6,8 +6,8 @@ 0 0 - 902 - 328 + 602 + 653 @@ -15,331 +15,24 @@ - - - - - - - - Inv Temp 2 Offset - - - - - - - Current 1 Offset - - - - - - - Motor Type - - - - - - - - - - Motor Temp 1 Scale - - - - - - - Inv Temp 1 Scale - - - - - - - Motor Temp 2 Offset - - - - - - - Encoder Count - - - - - - - Pole Pairs - - - - - - - - - - - - - - - - - - - - - - Max Torque - - - - - - - Motor Temp 1 Offset - - - - - - - Encoder Direction - - - - - - - Voltage Scale - - - - - - - Control Type - - - - - - - - - - - - - - - - - - - - - - Torque KP - - - - - - - Motor Temp 2 Scale - - - - - - - Current 1 Scale - - - - - - - Inv Temp 2 Scale - - - - - - - VHz Full RPM - - - - - - - - - - - - - - - - Torque KI - - - - - - - - - - Current 2 Offset - - - - - - - Voltage Offset - - - - - - - Current 2 Scale - - - - - - - Rotor Time Const - - - - - - - Torque KD - - - - - - - Max Amps Drive - - - - - - - Inv Temp 1 Offset - - - - - - - Max Amps Regen - - - - - - - - - - Hall AB - - - - - - - Theta Offset - - - - - - - - - - Hall CA - - - - - - - - - - Max RPM - - - - - - - Hall BC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 0 + + + true + + + + + + Load Definition File + + +