made sure device table updates from saved values correctly

This commit is contained in:
Blake Leverington 2024-08-07 15:40:32 +02:00
parent dfcc2a7394
commit 5756204257
3 changed files with 119 additions and 39 deletions

View File

@ -1,5 +1,5 @@
[Global]
NrDevices=1
NrDevices=3
HostIp=10.0.7.1
[Device0]
@ -11,10 +11,11 @@ Sensors=5
Master=1
MasterDelay=61
SlaveDelay=34
Threshold=10
Threshold=11
Size=4
CalibFile=C:/Users/lhcb/Desktop/program_fpga_rms_cali/calibration_factor/board0.txt
CalibFile=C:/Users/leverington/Downloads/board0.txt
ClusterSize=4
Device0\CalibFile=C:/Users/leverington/Downloads/board0.txt
[Device1]
IP=10.0.7.18
@ -25,9 +26,10 @@ Sensors=5
Master=0
MasterDelay=7
SlaveDelay=1
Threshold=10
Threshold=12
Size=4
CalibFile=
ClusterSize=5
[Trigger]
Period=9000
@ -46,6 +48,10 @@ Sensors=2
Master=0
MasterDelay=7
SlaveDelay=1
Device0\CalibFile=C:/Users/leverington/Downloads/board0.txt
Threshold=13
ClusterSize=6
CalibFile=
[Device3]
IP=10.0.7.6

View File

@ -13,8 +13,12 @@ DialogDevices::DialogDevices(QWidget *parent) :
ui(new Ui::DialogDevices)
{
ui->setupUi(this);
deviceSettings = new QSettings("./device_config.ini", QSettings::IniFormat);
}
DialogDevices::~DialogDevices()
{
delete ui;
@ -40,12 +44,25 @@ void DialogDevices::applyCalibrationDataToDevice(int dev_nr, const QVector<unsig
{
// Implementation for applying the calibration data to the specific device
// For example, updating device settings or performing calculations
qDebug() << "Calibration data loaded for Device" << dev_nr << ":" << data;
// Example: Set the calibration data in your application logic
// deviceSettings->setValue("Device%1/CalibrationData", data); // if storing in settings
// Check if device number is valid
if (dev_nr < 0 || dev_nr >= deviceCalibrationData.size()) {
QMessageBox::warning(this, "Invalid Device", "The device number is out of range.");
return;
}
// Check if the provided data is valid
if (data.size() != 320) {
QMessageBox::warning(this, "Invalid Data", "The calibration data must contain exactly 320 values.");
return;
}
// Apply the calibration data to the specified device
deviceCalibrationData[dev_nr] = data;
}
// Load calibration factors from a file and store them
void DialogDevices::selectCalibrationFile(int dev_nr)
{
@ -80,6 +97,11 @@ void DialogDevices::selectCalibrationFile(int dev_nr)
index++;
}
// Ensure remaining indices are filled with default values
while (index < 320) {
calibrationFactors[index++] = 8192;
}
file.close();
// Store calibration factors for the device
@ -153,7 +175,7 @@ void DialogDevices::importSettings()
ui->tableDevices->setRowCount(nr_devices);
// Ensure the device calibration data vector is initialized properly
deviceCalibrationData.resize(nr_devices);
deviceCalibrationData.resize(nr_devices, QVector<unsigned short>(320, 8192));
for (int dev_nr = 0; dev_nr < nr_devices; dev_nr++)
{
@ -180,11 +202,26 @@ void DialogDevices::importSettings()
ui->tableDevices->setItem(dev_nr, 6, newItem);
newItem = new QTableWidgetItem(deviceSettings->value("SlaveDelay", "1").toString());
ui->tableDevices->setItem(dev_nr, 7, newItem);
newItem = new QTableWidgetItem(deviceSettings->value("ClusThresh", "10").toString());
newItem = new QTableWidgetItem(deviceSettings->value("Threshold", "10").toString());
ui->tableDevices->setItem(dev_nr, 8, newItem);
newItem = new QTableWidgetItem(deviceSettings->value("ClusSize", "4").toString());
newItem = new QTableWidgetItem(deviceSettings->value("ClusterSize", "4").toString());
ui->tableDevices->setItem(dev_nr, 9, newItem);
// Load calibration file path and update table
QString calibFilePath = deviceSettings->value("CalibFile", "").toString();
newItem = new QTableWidgetItem(calibFilePath);
ui->tableDevices->setItem(dev_nr, 10, newItem);
// If the calibration file exists, load the factors
if (!calibFilePath.isEmpty()) {
QVector<unsigned short> calibrationFactors(320, 8192);
if (loadCalibrationFactorsFromFile(calibFilePath, calibrationFactors)) {
deviceCalibrationData[dev_nr] = calibrationFactors;
applyCalibrationDataToDevice(dev_nr, calibrationFactors);
}
}
// Add a button for selecting calibration files
QPushButton* calibButton = new QPushButton("Select File");
ui->tableDevices->setCellWidget(dev_nr, 11, calibButton);
@ -309,8 +346,8 @@ int DialogDevices::validateAndSave()
num_value = user_data.toInt();
if (num_value < 1)
num_value = 1;
if (num_value > 255)
num_value = 255;
if (num_value > 65535)
num_value = 65535;
generated = QString("%1").arg(num_value);
//if the strings are identical, save the value and return 1
if (generated.compare(user_data) != 0)
@ -322,8 +359,8 @@ int DialogDevices::validateAndSave()
num_value = user_data.toInt();
if (num_value < 1)
num_value = 1;
if (num_value > 255)
num_value = 255;
if (num_value > 320)
num_value = 320;
generated = QString("%1").arg(num_value);
//if the strings are identical, save the value and return 1
if (generated.compare(user_data) != 0)
@ -333,49 +370,84 @@ int DialogDevices::validateAndSave()
// Calibration file path
user_data = ui->tableDevices->item(dev_nr, 10)->text();
if (user_data.isEmpty())
data_ok = 0;
// Save the calibration file path
if (user_data.isEmpty()) {
// Set default calibration factors if the path is empty
QVector<unsigned short> defaultCalibration(320, 8192);
deviceCalibrationData[dev_nr] = defaultCalibration;
applyCalibrationDataToDevice(dev_nr, defaultCalibration);
} else {
deviceSettings->setValue("Device" + QString::number(dev_nr) + "/CalibFile", user_data); // Save the file path
}
// Save settings for each device
top(deviceSettings);
QString group_label = QString("Device%1").arg(dev_nr);
deviceSettings->beginGroup(group_label);
deviceSettings->setValue("CalibFile", user_data); // Save the file path
deviceSettings->endGroup();
deviceSettings->setValue("IP", ui->tableDevices->item(dev_nr, 0)->text());
deviceSettings->setValue("HardwareVer", ui->tableDevices->item(dev_nr, 1)->text());
deviceSettings->setValue("Plane", ui->tableDevices->item(dev_nr, 2)->text());
deviceSettings->setValue("Position", ui->tableDevices->item(dev_nr, 3)->text());
deviceSettings->setValue("Sensors", ui->tableDevices->item(dev_nr, 4)->text());
deviceSettings->setValue("Master", ui->tableDevices->item(dev_nr, 5)->text());
deviceSettings->setValue("MasterDelay", ui->tableDevices->item(dev_nr, 6)->text());
deviceSettings->setValue("SlaveDelay", ui->tableDevices->item(dev_nr, 7)->text());
deviceSettings->setValue("Threshold", ui->tableDevices->item(dev_nr, 8)->text());
deviceSettings->setValue("ClusterSize", ui->tableDevices->item(dev_nr, 9)->text());
deviceSettings->setValue("CalibFile", ui->tableDevices->item(dev_nr, 10)->text());
deviceSettings->endGroup();
}
//now store the data
if (!data_ok)
return 0;
// Store the global number of devices
top(deviceSettings);
deviceSettings->beginGroup("Global");
deviceSettings->setValue("NrDevices", nr_devices);
deviceSettings->endGroup();
for (int dev_nr = 0; dev_nr < nr_devices; dev_nr++)
{
top(deviceSettings);
QString group_label = QString("Device%1").arg(dev_nr);
deviceSettings->beginGroup(group_label);
deviceSettings->setValue("IP", ui->tableDevices->item(dev_nr,0)->text());
deviceSettings->setValue("HardwareVer", ui->tableDevices->item(dev_nr,1)->text());
deviceSettings->setValue("Plane", ui->tableDevices->item(dev_nr,2)->text());
deviceSettings->setValue("Position", ui->tableDevices->item(dev_nr,3)->text());
deviceSettings->setValue("Sensors", ui->tableDevices->item(dev_nr,4)->text());
deviceSettings->setValue("Master", ui->tableDevices->item(dev_nr,5)->text());
deviceSettings->setValue("MasterDelay", ui->tableDevices->item(dev_nr,6)->text());
deviceSettings->setValue("SlaveDelay", ui->tableDevices->item(dev_nr,7)->text());
deviceSettings->setValue("Threshold", ui->tableDevices->item(dev_nr,8)->text());
deviceSettings->setValue("ClusterSize", ui->tableDevices->item(dev_nr,9)->text());
deviceSettings->setValue("CalibFile", ui->tableDevices->item(dev_nr, 10)->text());
if (!data_ok) {
QMessageBox::warning(this, "Invalid Data", "Some device settings were invalid and have been corrected. Please review the settings.");
}
return 1;
return data_ok;
}
// Function to load calibration factors from a file
bool DialogDevices::loadCalibrationFactorsFromFile(const QString& filePath, QVector<unsigned short>& calibrationFactors)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qWarning() << "Could not open calibration file:" << filePath;
return false;
}
QTextStream in(&file);
int index = 0;
while (!in.atEnd() && index < 320) {
QString line = in.readLine().trimmed();
bool ok;
int value = line.toInt(&ok);
// Validate value and ensure it is within the range of an unsigned short
if (ok && value >= 0 && value <= 65535) {
calibrationFactors[index] = static_cast<unsigned short>(value);
} else {
qWarning() << "Invalid calibration factor in file:" << line << "at index" << index;
calibrationFactors[index] = 8192; // Use default if invalid
}
index++;
}
// Ensure remaining indices are filled with default values
while (index < 320) {
calibrationFactors[index++] = 8192;
}
file.close();
return true;
}
void DialogDevices::on_spinNrDevices_valueChanged(int arg1)
{
if (initialized)

View File

@ -5,6 +5,7 @@
#include <QSettings>
#include <QShowEvent>
#include <QVector> // Include QVector for calibration data storage
#include <QTableWidgetItem>
namespace Ui {
class DialogDevices;
@ -25,6 +26,7 @@ public slots:
void accept();
protected:
int validateAndSave();
bool loadCalibrationFactorsFromFile(const QString &filePath, QVector<unsigned short> &calibrationFactors); // Function to load calibration factors from a file
void applyCalibrationDataToDevice(int dev_nr, const QVector<unsigned short>& data); // Function to apply calibration data to a device
void importSettings();
int last_nr_devices = -1;