Changed motor controller config window to target Rinehart Motion controllers instead of my custom controller.

Yes, I still need to move it into dynamic library and out of the main program.
This commit is contained in:
Collin Kidder
2017-08-11 13:52:40 -04:00
parent 5dd2456b98
commit 5b3eef1cf3
6 changed files with 168 additions and 646 deletions
+119 -315
View File
@@ -16,10 +16,19 @@ MotorControllerConfigWindow::MotorControllerConfigWindow(const QVector<CANFrame>
transmitStep = 0; transmitStep = 0;
doingRequest = false; 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(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int)));
connect(ui->btnRefresh, SIGNAL(clicked(bool)), this, SLOT(refreshData())); connect(ui->btnRefresh, SIGNAL(clicked(bool)), this, SLOT(refreshData()));
connect(ui->btnSave, SIGNAL(clicked(bool)), this, SLOT(saveData())); connect(ui->btnSave, SIGNAL(clicked(bool)), this, SLOT(saveData()));
connect(&timer, SIGNAL(timeout()), this, SLOT(timerTick())); connect(&timer, SIGNAL(timeout()), this, SLOT(timerTick()));
connect(ui->btnLoadFile, SIGNAL(clicked(bool)), this, SLOT(loadFile()));
} }
MotorControllerConfigWindow::~MotorControllerConfigWindow() MotorControllerConfigWindow::~MotorControllerConfigWindow()
@@ -32,10 +41,7 @@ void MotorControllerConfigWindow::updatedFrames(int numFrames)
CANFrame thisFrame; CANFrame thisFrame;
int id; int id;
int param; int param;
float valu; QTableWidgetItem *item;
uint8_t eightval;
uint16_t sixteenval;
uint32_t thirtytwoval;
if (numFrames == -1) //all frames deleted if (numFrames == -1) //all frames deleted
{ {
@@ -52,125 +58,32 @@ void MotorControllerConfigWindow::updatedFrames(int numFrames)
thisFrame = modelFrames->at(i); thisFrame = modelFrames->at(i);
id = thisFrame.ID; id = thisFrame.ID;
if (id == 0x420) if (id == 0xC2) //response to a query we made
{ {
param = thisFrame.data[0]; if (thisFrame.data[2] == 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)
{ {
case 0: //voltage scale (*65536) int paramID = thisFrame.data[0] + (thisFrame.data[1] * 256);
valu = thirtytwoval / 65536.0f; for (int i = 0; i < params.length(); i++)
ui->editVoltageScale->setText(QString::number(valu, 'g', 4)); {
break; if (params[i].paramID == paramID)
case 1: //voltage bias {
ui->editVoltageOffset->setText(QString::number(sixteenval)); params[i].value = thisFrame.data[4] + (thisFrame.data[5] * 256);
break; if (params[i].paramType == ASCII) item = new QTableWidgetItem(QString::fromUtf8((char *)params[i].value, 2));
case 2: //current 1 scale (*65536) if (params[i].paramType == HEX) item = new QTableWidgetItem(Utility::formatHexNum(params[i].value));
valu = thirtytwoval / 65536.0f; if (params[i].paramType == DEC)
ui->editCurrent1Scale->setText(QString::number(valu, 'g', 4)); {
break; if (params[i].signedType == UNSIGNED) item = new QTableWidgetItem(QString::number(params[i].value));
case 3: //current 1 bias if (params[i].signedType == SIGNED)
ui->editCurrent1Offset->setText(QString::number(sixteenval)); {
break; if (params[i].value < 0x8000) item = new QTableWidgetItem(QString::number(params[i].value));
case 4: //current 2 scale (*65536) else item = new QTableWidgetItem(QString::number(params[i].value - 0x10000));
valu = thirtytwoval / 65536.0f; }
ui->editCurrent2Scale->setText(QString::number(valu, 'g', 4)); if (params[i].signedType == Q15) item = new QTableWidgetItem(QString::number(params[i].value / 32768.0));
break; }
case 5: //current 2 bias
ui->editCurrent2Offset->setText(QString::number(sixteenval)); break;
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;
} }
} }
} }
@@ -184,6 +97,72 @@ void MotorControllerConfigWindow::refreshData()
timer.start(); 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<QByteArray> 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() void MotorControllerConfigWindow::saveData()
{ {
doingRequest = false; doingRequest = false;
@@ -193,17 +172,27 @@ void MotorControllerConfigWindow::saveData()
void MotorControllerConfigWindow::timerTick() void MotorControllerConfigWindow::timerTick()
{ {
float valu;
uint32_t intval32;
uint16_t intval16;
uint8_t intval8;
if (doingRequest) //send requests for data if (doingRequest) //send requests for data
{ {
//qDebug() << "Request: " << QString::number(transmitStep); qDebug() << "Request: " << QString::number(transmitStep);
send8BitParam(transmitStep, 0);
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++; transmitStep++;
if (transmitStep == 32) if (transmitStep == params.length())
{ {
timer.stop(); timer.stop();
return; return;
@@ -214,193 +203,8 @@ void MotorControllerConfigWindow::timerTick()
//qDebug() << "Transmission: " << QString::number(transmitStep); //qDebug() << "Transmission: " << QString::number(transmitStep);
switch (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++; 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);
}
+29 -4
View File
@@ -9,6 +9,33 @@ namespace Ui {
class MotorControllerConfigWindow; 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 class MotorControllerConfigWindow : public QDialog
{ {
Q_OBJECT Q_OBJECT
@@ -26,6 +53,7 @@ private slots:
void refreshData(); void refreshData();
void saveData(); void saveData();
void timerTick(); void timerTick();
void loadFile();
private: private:
Ui::MotorControllerConfigWindow *ui; Ui::MotorControllerConfigWindow *ui;
@@ -34,10 +62,7 @@ private:
CANFrame outFrame; CANFrame outFrame;
bool doingRequest; bool doingRequest;
int transmitStep; int transmitStep;
QList<PARAM> params;
void send32BitParam(int param, uint32_t valu);
void send16BitParam(int param, uint16_t valu);
void send8BitParam(int param, uint8_t valu);
}; };
+1 -1
View File
@@ -41,7 +41,7 @@ dc SnifferItem::dataChange(uchar i) const
((uchar*) &mLastMarker.data)[i] && ((uchar*) &mLastMarker.data)[i] &&
!((uchar*) &mNotch)[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; return dc::NO;
+1 -1
View File
@@ -15,7 +15,7 @@ enum dc
{ {
NO, NO,
INC, INC,
DEC DEINC
}; };
+1 -1
View File
@@ -75,7 +75,7 @@ QVariant SnifferModel::data(const QModelIndex &index, int role) const
{ {
case dc::INC: case dc::INC:
return QBrush(Qt::green); return QBrush(Qt::green);
case dc::DEC: case dc::DEINC:
return QBrush(Qt::red); return QBrush(Qt::red);
default: default:
break; break;
+17 -324
View File
@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>902</width> <width>602</width>
<height>328</height> <height>653</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -15,331 +15,24 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <widget class="QTableWidget" name="tableParams">
<item row="2" column="7"> <property name="columnCount">
<widget class="QLineEdit" name="editMotorTemp1Offset"/> <number>0</number>
</item> </property>
<item row="2" column="2"> <attribute name="horizontalHeaderStretchLastSection">
<widget class="QLabel" name="label_13"> <bool>true</bool>
<property name="text"> </attribute>
<string>Inv Temp 2 Offset</string> </widget>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Current 1 Offset</string>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Motor Type</string>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QLineEdit" name="editCurrent1Offset"/>
</item>
<item row="2" column="4">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Motor Temp 1 Scale</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Inv Temp 1 Scale</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Motor Temp 2 Offset</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Encoder Count</string>
</property>
</widget>
</item>
<item row="4" column="4">
<widget class="QLabel" name="label_25">
<property name="text">
<string>Pole Pairs</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="editEncoderCount"/>
</item>
<item row="0" column="5">
<widget class="QLineEdit" name="editCurrent1Scale"/>
</item>
<item row="4" column="3">
<widget class="QLineEdit" name="editEncoderDir"/>
</item>
<item row="4" column="7">
<widget class="QLineEdit" name="editRotorTime"/>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="editCurrent2Scale"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Max Torque</string>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Motor Temp 1 Offset</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Encoder Direction</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Voltage Scale</string>
</property>
</widget>
</item>
<item row="3" column="6">
<widget class="QLabel" name="label_24">
<property name="text">
<string>Control Type</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="editVoltageOffset"/>
</item>
<item row="1" column="3">
<widget class="QLineEdit" name="editCurrent2Offset"/>
</item>
<item row="1" column="5">
<widget class="QLineEdit" name="editInvTemp1Scale"/>
</item>
<item row="1" column="7">
<widget class="QLineEdit" name="editInvTemp1Offset"/>
</item>
<item row="2" column="3">
<widget class="QLineEdit" name="editInvTemp2Offset"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Torque KP</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Motor Temp 2 Scale</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Current 1 Scale</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Inv Temp 2 Scale</string>
</property>
</widget>
</item>
<item row="6" column="6">
<widget class="QLabel" name="label_30">
<property name="text">
<string>VHz Full RPM</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QLineEdit" name="editMotorTemp2Offset"/>
</item>
<item row="3" column="5">
<widget class="QLineEdit" name="editMotorType"/>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="editVoltageScale"/>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Torque KI</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="editInvTemp2Scale"/>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Current 2 Offset</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Voltage Offset</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Current 2 Scale</string>
</property>
</widget>
</item>
<item row="4" column="6">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Rotor Time Const</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QLabel" name="label_27">
<property name="text">
<string>Torque KD</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Max Amps Drive</string>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Inv Temp 1 Offset</string>
</property>
</widget>
</item>
<item row="6" column="4">
<widget class="QLabel" name="label_29">
<property name="text">
<string>Max Amps Regen</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="editMotorTemp2Scale"/>
</item>
<item row="7" column="2">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Hall AB</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Theta Offset</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QLineEdit" name="editMotorTemp1Scale"/>
</item>
<item row="7" column="6">
<widget class="QLabel" name="label_32">
<property name="text">
<string>Hall CA</string>
</property>
</widget>
</item>
<item row="4" column="5">
<widget class="QLineEdit" name="editPolePairs"/>
</item>
<item row="5" column="6">
<widget class="QLabel" name="label_28">
<property name="text">
<string>Max RPM</string>
</property>
</widget>
</item>
<item row="7" column="4">
<widget class="QLabel" name="label_31">
<property name="text">
<string>Hall BC</string>
</property>
</widget>
</item>
<item row="3" column="7">
<widget class="QLineEdit" name="editControlType"/>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="editTorqueKP"/>
</item>
<item row="5" column="3">
<widget class="QLineEdit" name="editTorqueKI"/>
</item>
<item row="5" column="5">
<widget class="QLineEdit" name="editTorqueKD"/>
</item>
<item row="5" column="7">
<widget class="QLineEdit" name="editMaxRPM"/>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="editMaxTorque"/>
</item>
<item row="6" column="3">
<widget class="QLineEdit" name="editMaxAmpsDrive"/>
</item>
<item row="6" column="5">
<widget class="QLineEdit" name="editMaxAmpsRegen"/>
</item>
<item row="6" column="7">
<widget class="QLineEdit" name="editVHZFull"/>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="editThetaOffset"/>
</item>
<item row="7" column="3">
<widget class="QLineEdit" name="editHallAB"/>
</item>
<item row="7" column="5">
<widget class="QLineEdit" name="editHallBC"/>
</item>
<item row="7" column="7">
<widget class="QLineEdit" name="editHallCA"/>
</item>
</layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="btnLoadFile">
<property name="text">
<string>Load Definition File</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="btnRefresh"> <widget class="QPushButton" name="btnRefresh">
<property name="text"> <property name="text">