YULTek/Otarcik_CAN/Sources/Gui/ProgramSettingsPage.cpp

407 lines
14 KiB
C++

#include "ProgramSettingsPage.h"
#include "ui_ProgramSettingsPage.h"
#include "CANDevice.h"
#include "OtarcikCan.h"
#include <QFileDialog>
#include <QFileInfo>
CProgramSettingsPage::CProgramSettingsPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::CProgramSettingsPage)
{
ui->setupUi(this);
mProgramPtr = 0;
mDevicesList = 0;
mDeviceChangeModeEnabled = false;
ui->mDBSignalDetailsTable->setColumnCount(10);
ui->mDBSignalDetailsTable->setHorizontalHeaderLabels(QStringList() << "Signal" << "Bit No" << "Length" << "Type" << "Max Val" << "Min Val" << "Offset" << "Scale factor" << "Unit" << "Byte order");
ui->mDevicePollPeriodSpinBx->setRange(200,60000);
ui->mCANBaudrateComboBx->clear();
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_1M",QVariant(PCAN_BAUD_1M));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_800K",QVariant(PCAN_BAUD_800K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_500K",QVariant(PCAN_BAUD_500K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_250K",QVariant(PCAN_BAUD_250K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_125K",QVariant(PCAN_BAUD_125K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_100K",QVariant(PCAN_BAUD_100K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_95K",QVariant(PCAN_BAUD_95K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_83K",QVariant(PCAN_BAUD_83K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_50K",QVariant(PCAN_BAUD_50K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_47K",QVariant(PCAN_BAUD_47K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_33K",QVariant(PCAN_BAUD_33K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_20K",QVariant(PCAN_BAUD_20K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_10K",QVariant(PCAN_BAUD_10K));
ui->mCANBaudrateComboBx->addItem("PCAN_BAUD_5K",QVariant(PCAN_BAUD_5K));
ui->mCANIDComboBx->addItem("PCAN_USBBUS1",QVariant(PCAN_USBBUS1));
ui->mCANIDComboBx->addItem("PCAN_USBBUS2",QVariant(PCAN_USBBUS2));
ui->mCANIDComboBx->addItem("PCAN_USBBUS3",QVariant(PCAN_USBBUS3));
ui->mCANIDComboBx->addItem("PCAN_USBBUS4",QVariant(PCAN_USBBUS4));
ui->mCANIDComboBx->addItem("PCAN_USBBUS5",QVariant(PCAN_USBBUS5));
ui->mCANIDComboBx->addItem("PCAN_USBBUS6",QVariant(PCAN_USBBUS6));
ui->mCANIDComboBx->addItem("PCAN_USBBUS7",QVariant(PCAN_USBBUS7));
ui->mCANIDComboBx->addItem("PCAN_USBBUS8",QVariant(PCAN_USBBUS8));
ui->mCANIDComboBx->addItem("PCAN_USBBUS9",QVariant(PCAN_USBBUS9));
ui->mCANIDComboBx->addItem("PCAN_USBBUS10",QVariant(PCAN_USBBUS10));
ui->mCANIDComboBx->addItem("PCAN_USBBUS11",QVariant(PCAN_USBBUS11));
ui->mCANIDComboBx->addItem("PCAN_USBBUS12",QVariant(PCAN_USBBUS12));
ui->mCANIDComboBx->addItem("PCAN_USBBUS13",QVariant(PCAN_USBBUS13));
ui->mCANIDComboBx->addItem("PCAN_USBBUS14",QVariant(PCAN_USBBUS14));
ui->mCANIDComboBx->addItem("PCAN_USBBUS15",QVariant(PCAN_USBBUS15));
ui->mCANIDComboBx->addItem("PCAN_USBBUS16",QVariant(PCAN_USBBUS16));
ui->mDeviceDescriptionTxtEdit->setEnabled(false);
ui->mDatabaseFileSelectBtn->hide();
ui->mCANBaudrateComboBx->setEnabled(false);
ui->mCANIDComboBx->setEnabled(false);
ui->mDevicePollPeriodSpinBx->setEnabled(false);
ui->mCancelModifyParamsBtn->hide();
ui->mDeviceNameEditBx->setEnabled(false);
connect(ui->mDevicesList,&QListWidget::itemSelectionChanged,this,&CProgramSettingsPage::DeviceSelectionChanged);
connect(ui->mDBMessagesListWidget,&QListWidget::itemSelectionChanged,this,&CProgramSettingsPage::MessageSelectionChanged);
connect(ui->mModifyDevParamsBtn,&QPushButton::clicked,this,&CProgramSettingsPage::ModifyDeviceBtnPressed);
connect(ui->mCancelModifyParamsBtn,&QPushButton::clicked,this,&CProgramSettingsPage::CancelModifyDevBtnPressed);
connect(ui->mDatabaseFileSelectBtn,&QPushButton::clicked,this,&CProgramSettingsPage::SelectDBFileBtnPressed);
// connect(ui->mDBSignalDetailsTable,&QTableWidget::itemSelectionChanged,this,&CProgramSettingsPage::SignalSelectionChanged);
}
CProgramSettingsPage::~CProgramSettingsPage()
{
delete ui;
}
int CProgramSettingsPage::SetDevicesList(QList<CCANDevice *> *DevicesList)
{
if(DevicesList == 0)
{
return RET_GENERAL_ERROR;
}
mDevicesList = DevicesList;
if(mDevicesList == 0)
{
return RET_GENERAL_ERROR;
}
ui->mDevicesList->clear();
for(int i = 0; i < mDevicesList->size(); i++)
{
QString name = mDevicesList->at(i)->mDeviceName;
if(name.isEmpty())
{
name = QString("Device %1").arg(i+1);
}
ui->mDevicesList->addItem(name);
}
ui->mDevicesList->setCurrentRow(0);
return RET_OK;
}
int CProgramSettingsPage::ClearDatabaseData()
{
ui->mDBMessagesListWidget->clear();
return RET_OK;
}
int CProgramSettingsPage::UpdatePage()
{
int index = ui->mDevicesList->currentRow();
if(index < 0 || index >= mDevicesList->size())
{
return RET_GENERAL_ERROR;
}
CCANDevice *Device = mDevicesList->at(index);
if(Device != 0)
{
//Update device name in the list (it might have just changed)
ui->mDevicesList->item(ui->mDevicesList->currentRow())->setText(Device->mDeviceName);
//update device information
ui->mDeviceNameEditBx->setPlainText(Device->mDeviceName);
ui->mCANBaudrateComboBx->setCurrentIndex(ui->mCANBaudrateComboBx->findData(Device->mCANDeviceBaudrate));
ui->mCANIDComboBx->setCurrentIndex(ui->mCANIDComboBx->findData(Device->mCANDeviceID));
ui->mDeviceDescriptionTxtEdit->setPlainText(Device->mDeviceDescription);
QFileInfo FileInfo(Device->mCANDeviceDatabaseFilename);
ui->mDatabaseFileNameLbl->setText(FileInfo.fileName());
ui->mDatabaseFileNameLbl->setToolTip(Device->mCANDeviceDatabaseFilename);
// ui->mDatabaseFileNameLbl->setText(QString("%1").arg(Device->mCANDeviceDatabaseFilename));
ui->mDevicePollPeriodSpinBx->setValue(Device->mDevicePollPeriod);
//update device database information
ui->mDBMessagesListWidget->clear();
ui->mDBSignalDetailsTable->clearContents();
ui->mDBSignalDetailsTable->setRowCount(0);
if(Device->mMessageList.isEmpty())
{
ui->mDBMessagesListWidget->insertItem(0,"Aucun message");
ui->mDBMessageIDLbl->setText("Message ID: ");
ui->mDBMessageLengthLbl->setText("Message Length: ");
ui->mDBMessageNameLbl->setText("Message Name: ");
ui->mDBMessageNbSignalsLbl->setText("Number of signals: ");
}
else
{
ui->mDBMessagesListWidget->clear();
for(int msg = 0; msg < Device->mMessageList.size(); msg++)
{
ui->mDBMessagesListWidget->insertItem(msg,Device->mMessageList.at(msg)->mCANMsgName);
}
ui->mDBMessagesListWidget->setCurrentRow(0);
}
}
}
int CProgramSettingsPage::UpdateMessageInformation()
{
int index = ui->mDevicesList->currentRow();
if(index < 0 || index >= mDevicesList->size())
{
return RET_GENERAL_ERROR;
}
CCANDevice *Device = mDevicesList->at(index);
if(Device != 0)
{
int MsgIndex = ui->mDBMessagesListWidget->currentRow();
if(MsgIndex < 0 || MsgIndex >= Device->mMessageList.size())
{
return RET_GENERAL_ERROR;
}
CCANMessage *Message = Device->mMessageList.at(MsgIndex);
ui->mDBMessageIDLbl->setText(QString("Message ID: 0x%1").arg(Message->mCANMsgID,0,16));
ui->mDBMessageLengthLbl->setText(QString("Message Length: %1").arg(Message->mCANMsgLength));
ui->mDBMessageNameLbl->setText(QString("Message Name: %1").arg(Message->mCANMsgName));
ui->mDBMessageNbSignalsLbl->setText(QString("Number of signals: %1").arg(Message->mSignalsList.size()));
ui->mDBSignalDetailsTable->clearContents();
ui->mDBSignalDetailsTable->setRowCount(0);
ui->mDBSignalDetailsTable->setRowCount(Message->mSignalsList.size());
for(int Sig = 0; Sig < Message->mSignalsList.size(); Sig++)
{
CCANSignal *Signal = Message->mSignalsList.at(Sig);
QTableWidgetItem *NewItem;
//Signal name
NewItem = new QTableWidgetItem(Signal->mSignalName);
ui->mDBSignalDetailsTable->setItem(Sig,0,NewItem);
//Bit No
NewItem = new QTableWidgetItem(QString("%1").arg(Signal->mStartBit));
ui->mDBSignalDetailsTable->setItem(Sig,1,NewItem);
//Length
NewItem = new QTableWidgetItem(QString("%1").arg(Signal->mSignalSize));
ui->mDBSignalDetailsTable->setItem(Sig,2,NewItem);
//Type
switch(Signal->mValueType)
{
case CCANSignal::CAN_SIGNAL_TYPE_INVALID:
{
NewItem = new QTableWidgetItem(QString("INVALIDE"));
break;
}
case CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT:
{
NewItem = new QTableWidgetItem(QString("int"));
break;
}
case CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT:
{
NewItem = new QTableWidgetItem(QString("uint"));
break;
}
case CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT:
{
NewItem = new QTableWidgetItem(QString("Float_32"));
break;
}
case CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE:
{
NewItem = new QTableWidgetItem(QString("Double"));
break;
}
}
ui->mDBSignalDetailsTable->setItem(Sig,3,NewItem);
//Max Val
NewItem = new QTableWidgetItem(QString("%1").arg(Signal->mMaxValue));
ui->mDBSignalDetailsTable->setItem(Sig,4,NewItem);
//Min Val
NewItem = new QTableWidgetItem(QString("%1").arg(Signal->mMinValue));
ui->mDBSignalDetailsTable->setItem(Sig,5,NewItem);
//Offset
NewItem = new QTableWidgetItem(QString("%1").arg(Signal->mValueOffset));
ui->mDBSignalDetailsTable->setItem(Sig,6,NewItem);
//Scale Factor
NewItem = new QTableWidgetItem(QString("%1").arg(Signal->mValueFactor,0,'f',1));
ui->mDBSignalDetailsTable->setItem(Sig,7,NewItem);
//Unit
NewItem = new QTableWidgetItem(Signal->mSignalUnit);
ui->mDBSignalDetailsTable->setItem(Sig,8,NewItem);
//Endian
switch(Signal->mEncoding)
{
case CCANSignal::CAN_SIGNAL_ENCODING_INTEL:
{
NewItem = new QTableWidgetItem(QString("Intel"));
break;
}
case CCANSignal::CAN_SIGNAL_ENCODING_MOTOROLA:
{
NewItem = new QTableWidgetItem(QString("Motorola"));
break;
}
case CCANSignal::CAN_SIGNAL_ENCODING_INVALID:
{
NewItem = new QTableWidgetItem(QString("INVALID"));
break;
}
}
ui->mDBSignalDetailsTable->setItem(Sig,9,NewItem);
}
ui->mDBSignalDetailsTable->resizeColumnsToContents();
}
}
void CProgramSettingsPage::DeviceSelectionChanged()
{
UpdatePage();
}
void CProgramSettingsPage::SignalSelectionChanged()
{
}
void CProgramSettingsPage::MessageSelectionChanged()
{
UpdateMessageInformation();
}
void CProgramSettingsPage::ModifyDeviceBtnPressed()
{
if(mDeviceChangeModeEnabled)
{
//Save Data
int index = ui->mDevicesList->currentRow();
if(index >= 0 && index < mDevicesList->size())
{
CCANDevice *ModifiedDevice = mDevicesList->at(index);
ModifiedDevice->mCANDeviceBaudrate = ui->mCANBaudrateComboBx->currentData().toInt();
ModifiedDevice->mCANDeviceID = ui->mCANIDComboBx->currentData().toInt();
ModifiedDevice->mCANDeviceDatabaseFilename = ui->mDatabaseFileNameLbl->toolTip(); //The full path is stored in the tooltip!
ModifiedDevice->mDeviceDescription = ui->mDeviceDescriptionTxtEdit->toPlainText();
ModifiedDevice->mDeviceName = ui->mDeviceNameEditBx->toPlainText();
ModifiedDevice->mDevicePollPeriod = ui->mDevicePollPeriodSpinBx->value();
mProgramPtr->SaveSystemConfigRequest();
}
ui->mDeviceDescriptionTxtEdit->setEnabled(false);
ui->mDatabaseFileSelectBtn->hide();
ui->mCANBaudrateComboBx->setEnabled(false);
ui->mCANIDComboBx->setEnabled(false);
ui->mDevicesList->setEnabled(true);
ui->mDevicePollPeriodSpinBx->setEnabled(false);
ui->mModifyDevParamsBtn->setText("Modifier");
ui->mCancelModifyParamsBtn->hide();
ui->mDeviceNameEditBx->setEnabled(false);
mDeviceChangeModeEnabled = false;
}
else
{
//Modify data
ui->mDeviceDescriptionTxtEdit->setEnabled(true);
ui->mDatabaseFileSelectBtn->show();
ui->mCANBaudrateComboBx->setEnabled(true);
ui->mCANIDComboBx->setEnabled(true);
ui->mDevicesList->setEnabled(false);
ui->mDevicePollPeriodSpinBx->setEnabled(true);
ui->mModifyDevParamsBtn->setText("Sauvegarder");
ui->mCancelModifyParamsBtn->show();
ui->mDeviceNameEditBx->setEnabled(true);
mDeviceChangeModeEnabled = true;
}
}
void CProgramSettingsPage::CancelModifyDevBtnPressed()
{
ui->mDeviceDescriptionTxtEdit->setEnabled(false);
ui->mDatabaseFileSelectBtn->hide();
ui->mCANBaudrateComboBx->setEnabled(false);
ui->mCANIDComboBx->setEnabled(false);
ui->mDevicesList->setEnabled(true);
ui->mDevicePollPeriodSpinBx->setEnabled(false);
ui->mModifyDevParamsBtn->setText("Modifier");
ui->mCancelModifyParamsBtn->hide();
ui->mDeviceNameEditBx->setEnabled(false);
mDeviceChangeModeEnabled = false;
UpdatePage();
}
void CProgramSettingsPage::SelectDBFileBtnPressed()
{
QString FileName;
FileName = QFileDialog::getOpenFileName(this,tr("Fichier database"), "./", tr("Fichiers dbc (*.dbc)"));
if(!FileName.isEmpty())
{
QFileInfo FileInfo(FileName);
ui->mDatabaseFileNameLbl->setText(FileInfo.fileName());
ui->mDatabaseFileNameLbl->setToolTip(FileName);
}
}