From 86ac92e63e22bfa898bbbb2a1aea8ee493655cf9 Mon Sep 17 00:00:00 2001
From: Jon Beniston <jon@beniston.com>
Date: Fri, 17 Jan 2025 13:31:19 +0000
Subject: [PATCH 1/2] SID: Fix crash when loading data from .csv.

---
 plugins/feature/sid/sidgui.cpp | 84 +++++++++++++++++++---------------
 1 file changed, 46 insertions(+), 38 deletions(-)

diff --git a/plugins/feature/sid/sidgui.cpp b/plugins/feature/sid/sidgui.cpp
index 69c7bd3c8..5c8afc8dc 100644
--- a/plugins/feature/sid/sidgui.cpp
+++ b/plugins/feature/sid/sidgui.cpp
@@ -167,9 +167,9 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
     setAttribute(Qt::WA_DeleteOnClose, true);
     m_helpURL = "plugins/feature/sid/readme.md";
     RollupContents *rollupContents = getRollupContents();
-	ui->setupUi(rollupContents);
+    ui->setupUi(rollupContents);
     rollupContents->arrangeRollups();
-	connect(rollupContents, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
+    connect(rollupContents, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
 
     m_sid = reinterpret_cast<SIDMain*>(feature);
     m_sid->setMessageQueueToGUI(&m_inputMessageQueue);
@@ -257,8 +257,8 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
     m_stix = STIX::create();
     if (m_stix)
     {
-         connect(m_stix, &STIX::dataUpdated, this, &SIDGUI::stixDataUpdated);
-         m_stix->getDataPeriodically();
+        connect(m_stix, &STIX::dataUpdated, this, &SIDGUI::stixDataUpdated);
+        m_stix->getDataPeriodically();
     }
 
     plotChart();
@@ -448,7 +448,7 @@ void SIDGUI::onMenuDialogCalled(const QPoint &p)
             "reverseAPIPort",
             "reverseAPIDeviceIndex",
             "reverseAPIChannelIndex"
-        });
+            });
 
         applySettings(m_settingsKeys);
     }
@@ -689,7 +689,7 @@ void SIDGUI::createProtonSeries(QChart *chart, QDateTimeAxis *xAxis, QLogValueAx
     yAxis->setVisible(!secondaryAxis || m_settings.m_displaySecondaryAxis);
 
     for (int i = 0; i < 4; i += 2) // Only plot 10 and 100 MeV so graph isn't too cluttered
-    //for (int i = 0; i < 4; i++)
+        //for (int i = 0; i < 4; i++)
     {
         m_protonMeasurements[i].m_series = new QLineSeries();
         m_protonMeasurements[i].m_series->setName(QString("%1 Proton").arg(SIDGUI::m_protonEnergies[i]));
@@ -1041,21 +1041,21 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
         QAction* fermiDataAction = new QAction("View Fermi data directory...", contextMenu);
         connect(fermiDataAction, &QAction::triggered, this, [url]()->void {
             QDesktopServices::openUrl(QUrl(url));
-        });
+            });
         contextMenu->addAction(fermiDataAction);
 
         QString plotURL = m_grbData[closestPoint].getFermiPlotURL();
         QAction* fermiPlotAction = new QAction("View Fermi data plot...", contextMenu);
         connect(fermiPlotAction, &QAction::triggered, this, [plotURL]()->void {
             QDesktopServices::openUrl(QUrl(plotURL));
-        });
+            });
         contextMenu->addAction(fermiPlotAction);
 
         QString mapURL = m_grbData[closestPoint].getFermiSkyMapURL();
         QAction* fermiMapDataAction = new QAction("View Fermi sky map...", contextMenu);
         connect(fermiMapDataAction, &QAction::triggered, this, [mapURL]()->void {
             QDesktopServices::openUrl(QUrl(mapURL));
-        });
+            });
         contextMenu->addAction(fermiMapDataAction);
     }
 
@@ -1066,7 +1066,7 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
         QString switftURL = m_grbData[closestPoint].getSwiftURL();
         connect(swiftDataAction, &QAction::triggered, this, [switftURL]()->void {
             QDesktopServices::openUrl(QUrl(switftURL));
-        });
+            });
         contextMenu->addAction(swiftDataAction);
     }
 
@@ -1083,7 +1083,7 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
             float dec = m_grbData[closestPoint].m_dec;
             connect(skyMapAction, &QAction::triggered, this, [this, skymap, ra, dec]()->void {
                 sendToSkyMap(skymap, ra, dec);
-            });
+                });
             contextMenu->addAction(skyMapAction);
         }
     }
@@ -1095,7 +1095,7 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
         QString target = QString("%1 %2").arg(ra).arg(dec);
         connect(skyMapAction, &QAction::triggered, this, [target]()->void {
             FeatureWebAPIUtils::openSkyMapAndFind(target);
-        });
+            });
         contextMenu->addAction(skyMapAction);
     }
 
@@ -1114,14 +1114,14 @@ void SIDGUI::showStixContextMenu(QContextMenuEvent *contextEvent, QChartView *ch
     QAction* lcAction = new QAction("View light curves...", contextMenu);
     connect(lcAction, &QAction::triggered, this, [lcURL]()->void {
         QDesktopServices::openUrl(QUrl(lcURL));
-    });
+        });
     contextMenu->addAction(lcAction);
 
     QString dataURL = m_stixData[closestPoint].getDataURL();
     QAction* stixDataAction = new QAction("View STIX data...", contextMenu);
     connect(stixDataAction, &QAction::triggered, this, [dataURL]()->void {
         QDesktopServices::openUrl(QUrl(dataURL));
-    });
+        });
     contextMenu->addAction(stixDataAction);
 
     contextMenu->popup(chartView->viewport()->mapToGlobal(contextEvent->pos()));
@@ -1525,27 +1525,27 @@ void SIDGUI::updateStatus()
         bool oldState;
         switch (state)
         {
-            case Feature::StNotStarted:
-                ui->startStop->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
-                break;
-            case Feature::StIdle:
-                oldState = ui->startStop->blockSignals(true);
-                ui->startStop->setChecked(false);
-                ui->startStop->blockSignals(oldState);
-                ui->startStop->setStyleSheet("QToolButton { background-color : blue; }");
-                break;
-            case Feature::StRunning:
-                oldState = ui->startStop->blockSignals(true);
-                ui->startStop->setChecked(true);
-                ui->startStop->blockSignals(oldState);
-                ui->startStop->setStyleSheet("QToolButton { background-color : green; }");
-                break;
-            case Feature::StError:
-                ui->startStop->setStyleSheet("QToolButton { background-color : red; }");
-                QMessageBox::critical(this, m_settings.m_title, m_sid->getErrorMessage());
-                break;
-            default:
-                break;
+        case Feature::StNotStarted:
+            ui->startStop->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
+            break;
+        case Feature::StIdle:
+            oldState = ui->startStop->blockSignals(true);
+            ui->startStop->setChecked(false);
+            ui->startStop->blockSignals(oldState);
+            ui->startStop->setStyleSheet("QToolButton { background-color : blue; }");
+            break;
+        case Feature::StRunning:
+            oldState = ui->startStop->blockSignals(true);
+            ui->startStop->setChecked(true);
+            ui->startStop->blockSignals(oldState);
+            ui->startStop->setStyleSheet("QToolButton { background-color : green; }");
+            break;
+        case Feature::StError:
+            ui->startStop->setStyleSheet("QToolButton { background-color : red; }");
+            QMessageBox::critical(this, m_settings.m_title, m_sid->getErrorMessage());
+            break;
+        default:
+            break;
         }
 
         m_lastFeatureState = state;
@@ -2396,8 +2396,11 @@ void SIDGUI::readCSV(const QString& filename, bool autoload)
     if (CSV::readRow(in, &colNames))
     {
         QList<ChannelMeasurement *> measurements;
-        for (int i = 0; i < colNames.size() - 1; i++) {
+        QList<int> measurementIdx;
+        for (int i = 0; i < colNames.size() - 1; i++)
+        {
             measurements.append(nullptr);
+            measurementIdx.append(-1);
         }
         for (int i = 1; i < colNames.size(); i++)
         {
@@ -2439,7 +2442,8 @@ void SIDGUI::readCSV(const QString& filename, bool autoload)
                 } else {
                     id = name;
                 }
-                measurements[i-1] = &addMeasurements(id);
+                addMeasurements(id);
+                measurementIdx[i-1] = m_channelMeasurements.size() - 1;
 
                 // Create settings, if we don't have them
                 SIDSettings::ChannelSettings *channelSettings = m_settings.getChannelSettings(id);
@@ -2482,7 +2486,11 @@ void SIDGUI::readCSV(const QString& filename, bool autoload)
                     if (!valueStr.isEmpty())
                     {
                         double value = valueStr.toDouble();
-                        measurements[i]->append(dateTime, value, false);
+                        if (measurements[i]) {
+                            measurements[i]->append(dateTime, value, false);
+                        } else {
+                            m_channelMeasurements[measurementIdx[i]].append(dateTime, value, false);
+                        }
                     }
                 }
             }

From c62a25f40a6bf3ca02b4044ff92322d66cdd5c9a Mon Sep 17 00:00:00 2001
From: Jon Beniston <jon@beniston.com>
Date: Fri, 17 Jan 2025 13:33:53 +0000
Subject: [PATCH 2/2] Undo auto-format.

---
 plugins/feature/sid/sidgui.cpp | 70 +++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/plugins/feature/sid/sidgui.cpp b/plugins/feature/sid/sidgui.cpp
index 5c8afc8dc..2ccd5546e 100644
--- a/plugins/feature/sid/sidgui.cpp
+++ b/plugins/feature/sid/sidgui.cpp
@@ -167,9 +167,9 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
     setAttribute(Qt::WA_DeleteOnClose, true);
     m_helpURL = "plugins/feature/sid/readme.md";
     RollupContents *rollupContents = getRollupContents();
-    ui->setupUi(rollupContents);
+	ui->setupUi(rollupContents);
     rollupContents->arrangeRollups();
-    connect(rollupContents, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
+	connect(rollupContents, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
 
     m_sid = reinterpret_cast<SIDMain*>(feature);
     m_sid->setMessageQueueToGUI(&m_inputMessageQueue);
@@ -257,8 +257,8 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
     m_stix = STIX::create();
     if (m_stix)
     {
-        connect(m_stix, &STIX::dataUpdated, this, &SIDGUI::stixDataUpdated);
-        m_stix->getDataPeriodically();
+         connect(m_stix, &STIX::dataUpdated, this, &SIDGUI::stixDataUpdated);
+         m_stix->getDataPeriodically();
     }
 
     plotChart();
@@ -448,7 +448,7 @@ void SIDGUI::onMenuDialogCalled(const QPoint &p)
             "reverseAPIPort",
             "reverseAPIDeviceIndex",
             "reverseAPIChannelIndex"
-            });
+        });
 
         applySettings(m_settingsKeys);
     }
@@ -689,7 +689,7 @@ void SIDGUI::createProtonSeries(QChart *chart, QDateTimeAxis *xAxis, QLogValueAx
     yAxis->setVisible(!secondaryAxis || m_settings.m_displaySecondaryAxis);
 
     for (int i = 0; i < 4; i += 2) // Only plot 10 and 100 MeV so graph isn't too cluttered
-        //for (int i = 0; i < 4; i++)
+    //for (int i = 0; i < 4; i++)
     {
         m_protonMeasurements[i].m_series = new QLineSeries();
         m_protonMeasurements[i].m_series->setName(QString("%1 Proton").arg(SIDGUI::m_protonEnergies[i]));
@@ -1041,21 +1041,21 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
         QAction* fermiDataAction = new QAction("View Fermi data directory...", contextMenu);
         connect(fermiDataAction, &QAction::triggered, this, [url]()->void {
             QDesktopServices::openUrl(QUrl(url));
-            });
+        });
         contextMenu->addAction(fermiDataAction);
 
         QString plotURL = m_grbData[closestPoint].getFermiPlotURL();
         QAction* fermiPlotAction = new QAction("View Fermi data plot...", contextMenu);
         connect(fermiPlotAction, &QAction::triggered, this, [plotURL]()->void {
             QDesktopServices::openUrl(QUrl(plotURL));
-            });
+        });
         contextMenu->addAction(fermiPlotAction);
 
         QString mapURL = m_grbData[closestPoint].getFermiSkyMapURL();
         QAction* fermiMapDataAction = new QAction("View Fermi sky map...", contextMenu);
         connect(fermiMapDataAction, &QAction::triggered, this, [mapURL]()->void {
             QDesktopServices::openUrl(QUrl(mapURL));
-            });
+        });
         contextMenu->addAction(fermiMapDataAction);
     }
 
@@ -1066,7 +1066,7 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
         QString switftURL = m_grbData[closestPoint].getSwiftURL();
         connect(swiftDataAction, &QAction::triggered, this, [switftURL]()->void {
             QDesktopServices::openUrl(QUrl(switftURL));
-            });
+        });
         contextMenu->addAction(swiftDataAction);
     }
 
@@ -1083,7 +1083,7 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
             float dec = m_grbData[closestPoint].m_dec;
             connect(skyMapAction, &QAction::triggered, this, [this, skymap, ra, dec]()->void {
                 sendToSkyMap(skymap, ra, dec);
-                });
+            });
             contextMenu->addAction(skyMapAction);
         }
     }
@@ -1095,7 +1095,7 @@ void SIDGUI::showGRBContextMenu(QContextMenuEvent *contextEvent, QChartView *cha
         QString target = QString("%1 %2").arg(ra).arg(dec);
         connect(skyMapAction, &QAction::triggered, this, [target]()->void {
             FeatureWebAPIUtils::openSkyMapAndFind(target);
-            });
+        });
         contextMenu->addAction(skyMapAction);
     }
 
@@ -1114,14 +1114,14 @@ void SIDGUI::showStixContextMenu(QContextMenuEvent *contextEvent, QChartView *ch
     QAction* lcAction = new QAction("View light curves...", contextMenu);
     connect(lcAction, &QAction::triggered, this, [lcURL]()->void {
         QDesktopServices::openUrl(QUrl(lcURL));
-        });
+    });
     contextMenu->addAction(lcAction);
 
     QString dataURL = m_stixData[closestPoint].getDataURL();
     QAction* stixDataAction = new QAction("View STIX data...", contextMenu);
     connect(stixDataAction, &QAction::triggered, this, [dataURL]()->void {
         QDesktopServices::openUrl(QUrl(dataURL));
-        });
+    });
     contextMenu->addAction(stixDataAction);
 
     contextMenu->popup(chartView->viewport()->mapToGlobal(contextEvent->pos()));
@@ -1525,27 +1525,27 @@ void SIDGUI::updateStatus()
         bool oldState;
         switch (state)
         {
-        case Feature::StNotStarted:
-            ui->startStop->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
-            break;
-        case Feature::StIdle:
-            oldState = ui->startStop->blockSignals(true);
-            ui->startStop->setChecked(false);
-            ui->startStop->blockSignals(oldState);
-            ui->startStop->setStyleSheet("QToolButton { background-color : blue; }");
-            break;
-        case Feature::StRunning:
-            oldState = ui->startStop->blockSignals(true);
-            ui->startStop->setChecked(true);
-            ui->startStop->blockSignals(oldState);
-            ui->startStop->setStyleSheet("QToolButton { background-color : green; }");
-            break;
-        case Feature::StError:
-            ui->startStop->setStyleSheet("QToolButton { background-color : red; }");
-            QMessageBox::critical(this, m_settings.m_title, m_sid->getErrorMessage());
-            break;
-        default:
-            break;
+            case Feature::StNotStarted:
+                ui->startStop->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
+                break;
+            case Feature::StIdle:
+                oldState = ui->startStop->blockSignals(true);
+                ui->startStop->setChecked(false);
+                ui->startStop->blockSignals(oldState);
+                ui->startStop->setStyleSheet("QToolButton { background-color : blue; }");
+                break;
+            case Feature::StRunning:
+                oldState = ui->startStop->blockSignals(true);
+                ui->startStop->setChecked(true);
+                ui->startStop->blockSignals(oldState);
+                ui->startStop->setStyleSheet("QToolButton { background-color : green; }");
+                break;
+            case Feature::StError:
+                ui->startStop->setStyleSheet("QToolButton { background-color : red; }");
+                QMessageBox::critical(this, m_settings.m_title, m_sid->getErrorMessage());
+                break;
+            default:
+                break;
         }
 
         m_lastFeatureState = state;