|
@@ -1,6 +1,12 @@
|
|
#include "mainwindow.h"
|
|
#include "mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
|
|
|
|
|
|
+#include <QFileDialog>
|
|
|
|
+#include <QFile>
|
|
|
|
+#include <QMessageBox>
|
|
|
|
+
|
|
|
|
+#include <math.h>
|
|
|
|
+
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
: QMainWindow(parent)
|
|
: QMainWindow(parent)
|
|
, ui(new Ui::MainWindow)
|
|
, ui(new Ui::MainWindow)
|
|
@@ -12,6 +18,7 @@ MainWindow::MainWindow(QWidget *parent)
|
|
ui->lineEdit_speedlimit->setText(QString::number(mfSpeedLimit));
|
|
ui->lineEdit_speedlimit->setText(QString::number(mfSpeedLimit));
|
|
ui->lineEdit_torqueatlimit->setText(QString::number(mfTorqueAtLimit));
|
|
ui->lineEdit_torqueatlimit->setText(QString::number(mfTorqueAtLimit));
|
|
ui->lineEdit_TorqueStart->setText(QString::number(mfTorqueStart));
|
|
ui->lineEdit_TorqueStart->setText(QString::number(mfTorqueStart));
|
|
|
|
+ ui->lineEdit_VelStep->setText(QString::number(mfVelStep));
|
|
|
|
|
|
mpa = iv::modulecomm::RegisterSend("torquebrake",1000,1);
|
|
mpa = iv::modulecomm::RegisterSend("torquebrake",1000,1);
|
|
ModuleFun fungpsimu =std::bind(&MainWindow::UpdateGPSIMU,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
|
|
ModuleFun fungpsimu =std::bind(&MainWindow::UpdateGPSIMU,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
|
|
@@ -77,6 +84,8 @@ void MainWindow::on_checkBox_clicked()
|
|
if(ui->checkBox->isChecked())
|
|
if(ui->checkBox->isChecked())
|
|
{
|
|
{
|
|
mbEnable = true;
|
|
mbEnable = true;
|
|
|
|
+ mfAvgSpeed = 0.0;
|
|
|
|
+ mfVectorAcc.clear();
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -87,6 +96,8 @@ void MainWindow::on_checkBox_clicked()
|
|
mfSpeedLimit = ui->lineEdit_speedlimit->text().toDouble();
|
|
mfSpeedLimit = ui->lineEdit_speedlimit->text().toDouble();
|
|
mfTorqueAtLimit = ui->lineEdit_torqueatlimit->text().toDouble();
|
|
mfTorqueAtLimit = ui->lineEdit_torqueatlimit->text().toDouble();
|
|
mfTorqueStart = ui->lineEdit_TorqueStart->text().toDouble();
|
|
mfTorqueStart = ui->lineEdit_TorqueStart->text().toDouble();
|
|
|
|
+ mfVelStep = ui->lineEdit_VelStep->text().toDouble();
|
|
|
|
+ if(mfVelStep == 0.0)mfVelStep = 1.0;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -112,18 +123,141 @@ void MainWindow::UpdateGPSIMU(const char *strdata, const unsigned int nSize, con
|
|
void MainWindow::UpdatePlainText(iv::gps::gpsimu &xgpsimu)
|
|
void MainWindow::UpdatePlainText(iv::gps::gpsimu &xgpsimu)
|
|
{
|
|
{
|
|
char strout[1000];
|
|
char strout[1000];
|
|
- snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f\t%6.3f\t%6.3f\t%6.3f\t",
|
|
|
|
- xgpsimu.speed(),xgpsimu.acce_x(),mfTorque,mfBrake,
|
|
|
|
- xgpsimu.acc_calc(),xgpsimu.acce_y(),xgpsimu.acce_z());
|
|
|
|
|
|
+
|
|
|
|
+ double fspeed = 3.6 * sqrt(pow(xgpsimu.ve(),2) + pow(xgpsimu.vn(),2));
|
|
|
|
+ snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f",
|
|
|
|
+ fspeed,xgpsimu.acce_x() * 9.8,mfTorque,mfBrake);
|
|
ui->plainTextEdit->appendPlainText(strout);
|
|
ui->plainTextEdit->appendPlainText(strout);
|
|
|
|
+
|
|
|
|
+ double froundspeed = mfVelStep * std::round(fspeed/mfVelStep);
|
|
|
|
+ if(froundspeed != mfAvgSpeed)
|
|
|
|
+ {
|
|
|
|
+ if(mfVectorAcc.size()> 0)
|
|
|
|
+ {
|
|
|
|
+ double fAvgAcc = 0.0;
|
|
|
|
+ unsigned int i;
|
|
|
|
+ for(i=0;i<mfVectorAcc.size();i++)
|
|
|
|
+ {
|
|
|
|
+ fAvgAcc = fAvgAcc + mfVectorAcc[i];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ fAvgAcc = fAvgAcc/mfVectorAcc.size();
|
|
|
|
+ snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f",
|
|
|
|
+ mfAvgSpeed,fAvgAcc,mfTorque,mfBrake);
|
|
|
|
+ ui->plainTextEdit_AvgAcc->appendPlainText(strout);
|
|
|
|
+ }
|
|
|
|
+ mfAvgSpeed = froundspeed;
|
|
|
|
+ mfVectorAcc.clear();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ mfVectorAcc.push_back(xgpsimu.acce_x()*9.8);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void MainWindow::on_pushButton_ClearRecord_clicked()
|
|
void MainWindow::on_pushButton_ClearRecord_clicked()
|
|
{
|
|
{
|
|
ui->plainTextEdit->clear();
|
|
ui->plainTextEdit->clear();
|
|
|
|
+ ui->plainTextEdit_AvgAcc->clear();
|
|
}
|
|
}
|
|
|
|
|
|
-void MainWindow::on_pushButton_SaveRecord_clicked()
|
|
|
|
|
|
+
|
|
|
|
+void MainWindow::on_pushButton_SortTable_clicked()
|
|
{
|
|
{
|
|
|
|
+ QString str = QFileDialog::getOpenFileName(this,"Load Table",".","*.txt");
|
|
|
|
+ if(str.isEmpty())return;
|
|
|
|
+
|
|
|
|
+ std::vector<iv::tableunit> xvectorunit;
|
|
|
|
+ std::vector<iv::tableunit> xvectorunitsave;
|
|
|
|
+
|
|
|
|
+ QFile xFile;
|
|
|
|
+ xFile.setFileName(str);
|
|
|
|
+ if(xFile.open(QIODevice::ReadOnly))
|
|
|
|
+ {
|
|
|
|
+ QByteArray ba = xFile.readAll();
|
|
|
|
+ QString strba;
|
|
|
|
+ strba.append(ba);
|
|
|
|
+ QStringList strlinelist =strba.split("\n");// strba.split(QRegExp("[\t ;]+"));
|
|
|
|
+ int nline = strlinelist.size();
|
|
|
|
+ int i;
|
|
|
|
+ for(i=0;i<nline;i++)
|
|
|
|
+ {
|
|
|
|
+ QString str = strlinelist.at(i);
|
|
|
|
+ QStringList strvaluelist = str.split(QRegExp("[\t ;]+"));
|
|
|
|
+ if(strvaluelist.size()>=4)
|
|
|
|
+ {
|
|
|
|
+ double vel,acc,torque,brake;
|
|
|
|
+ vel = QString(strvaluelist.at(0)).toDouble();
|
|
|
|
+ acc = QString(strvaluelist.at(1)).toDouble();
|
|
|
|
+ torque = QString(strvaluelist.at(2)).toDouble();
|
|
|
|
+ brake = QString(strvaluelist.at(3)).toDouble();
|
|
|
|
+ iv::tableunit xunit;
|
|
|
|
+ xunit.mfVel = vel;
|
|
|
|
+ xunit.mfAcc = acc;
|
|
|
|
+ xunit.mfTorque = torque;
|
|
|
|
+ xunit.mfBrake = brake;
|
|
|
|
+ xvectorunit.push_back(xunit);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ xFile.close();
|
|
|
|
|
|
|
|
+ if(xvectorunit.size()<1)
|
|
|
|
+ {
|
|
|
|
+ QMessageBox::warning(this,"Warning","No Table Found.",QMessageBox::YesAll);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ while(xvectorunit.size()>0)
|
|
|
|
+ {
|
|
|
|
+ iv::tableunit xunit = xvectorunit[0];
|
|
|
|
+ xvectorunit.erase(xvectorunit.begin());
|
|
|
|
+ unsigned int i = 0;
|
|
|
|
+ for(i=0;i<xvectorunitsave.size();i++)
|
|
|
|
+ {
|
|
|
|
+ if(xunit.mfVel==xvectorunitsave[i].mfVel)
|
|
|
|
+ {
|
|
|
|
+ if(xunit.mfAcc < xvectorunitsave[i].mfAcc)
|
|
|
|
+ {
|
|
|
|
+ xvectorunitsave.insert(xvectorunitsave.begin()+i,xunit);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if(xunit.mfVel < xvectorunitsave[i].mfVel)
|
|
|
|
+ {
|
|
|
|
+ xvectorunitsave.insert(xvectorunitsave.begin()+i,xunit);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(i == xvectorunitsave.size())xvectorunitsave.push_back(xunit);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ QString strsavename = QFileDialog::getSaveFileName(this,"Save Table",".","*.txt");
|
|
|
|
+ if(strsavename.isEmpty())return;
|
|
|
|
+
|
|
|
|
+ QFile xFileSave;
|
|
|
|
+ xFileSave.setFileName(strsavename);
|
|
|
|
+ if(xFileSave.open(QIODevice::ReadWrite))
|
|
|
|
+ {
|
|
|
|
+ unsigned int i;
|
|
|
|
+ for(i=0;i<xvectorunitsave.size();i++)
|
|
|
|
+ {
|
|
|
|
+ char strout[1000];
|
|
|
|
+ snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f\n",
|
|
|
|
+ xvectorunitsave[i].mfVel,xvectorunitsave[i].mfAcc,
|
|
|
|
+ xvectorunitsave[i].mfTorque,xvectorunitsave[i].mfBrake);
|
|
|
|
+ xFileSave.write(strout,strnlen(strout,1000));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ QMessageBox::warning(this,"Warning","Save File Error.",QMessageBox::YesAll);
|
|
|
|
+ }
|
|
|
|
+ xFileSave.close();
|
|
}
|
|
}
|