Skip to content

Commit 6b31520

Browse files
committed
Update behavior while automatically searching for calibration files
- Updated tooltips and error messages - Only update the info string once per toggle - If the automated search checkbox is checked, gray out the individual calibration file buttons - Only search for calibration files when the device is enabled and any other trigger is hit - Limit recursive search for calibration files to two folders from the root - Change some log statements to console instead of debug so users can get real-time feedback
1 parent 576ab10 commit 6b31520

File tree

5 files changed

+107
-50
lines changed

5 files changed

+107
-50
lines changed

Source/OnixSource.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ bool OnixSource::checkHubFirmwareCompatibility(std::shared_ptr<Onix1> context, d
284284
auto majorVersion = (firmwareVersion & 0xFF00) >> 8;
285285
auto minorVersion = firmwareVersion & 0xFF;
286286

287-
LOGD("Breakout board firmware version: v", majorVersion, ".", minorVersion);
287+
LOGC("Breakout board firmware version: v", majorVersion, ".", minorVersion);
288288

289289
if (majorVersion != RequiredMajorVersion)
290290
{
@@ -409,7 +409,7 @@ bool OnixSource::initializeDevices(device_map_t deviceTable, bool updateStreamIn
409409

410410
auto EEPROM = std::make_unique<HeadStageEEPROM>(index, context);
411411
uint32_t hsid = EEPROM->GetHeadStageID();
412-
LOGD("Detected headstage ", onix_hub_str(hsid));
412+
LOGC("Detected headstage ", onix_hub_str(hsid));
413413

414414
if (hsid == ONIX_HUB_HSNP2E)
415415
{

Source/UI/NeuropixelsV1Interface.cpp

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ NeuropixelsV1Interface::NeuropixelsV1Interface(std::shared_ptr<Neuropixels1> d,
8080
searchForCalibrationFilesButton = std::make_unique<ToggleButton>("Search for calibration files automatically");
8181
searchForCalibrationFilesButton->setBounds(infoLabel->getX() + 2, infoLabel->getBottom() + 5, 350, 20);
8282
searchForCalibrationFilesButton->addListener(this);
83-
searchForCalibrationFilesButton->setTooltip("Open a dialog to choose the folder where calibration files exist. This can be a top-level folder which is recursively searched for a matching serial number.");
83+
searchForCalibrationFilesButton->setTooltip("Open a file dialog to choose a folder that contains all calibration files. The calibration file(s) that matches your probe will automatically be selected if it exists in this folder.");
8484
addAndMakeVisible(searchForCalibrationFilesButton.get());
8585

8686
calibrationFolderLabel = std::make_unique<Label>("calibrationFolderLabel", "Calibration Folder");
@@ -99,13 +99,11 @@ NeuropixelsV1Interface::NeuropixelsV1Interface(std::shared_ptr<Neuropixels1> d,
9999
calibrationFolderButton->setBounds(calibrationFolder->getRight() + 3, calibrationFolder->getY(), 26, calibrationFolder->getHeight() + 2);
100100
calibrationFolderButton->setRadius(1.0f);
101101
calibrationFolderButton->addListener(this);
102-
calibrationFolderButton->setTooltip("Open a file dialog to choose the gain calibration folder path to automatically search for probe calibration files.");
102+
calibrationFolderButton->setTooltip("Open a file dialog to choose the calibration folder path to automatically search for probe calibration files.");
103103
addAndMakeVisible(calibrationFolderButton.get());
104104

105105
calibrationFolderChooser = std::make_unique<FileChooser>("Select Gain Calibration Folder.", File());
106106

107-
setCalibrationFolderEnabledState(false);
108-
109107
adcCalibrationFileLabel = std::make_unique<Label>("adcCalibrationFileLabel", "ADC Calibration File");
110108
adcCalibrationFileLabel->setBounds(calibrationFolder->getX(), calibrationFolder->getBottom() + 15, calibrationFolderLabel->getWidth(), calibrationFolderLabel->getHeight());
111109
adcCalibrationFileLabel->setColour(Label::textColourId, Colours::black);
@@ -536,6 +534,8 @@ NeuropixelsV1Interface::NeuropixelsV1Interface(std::shared_ptr<Neuropixels1> d,
536534
addAndMakeVisible(activityViewComponent.get());
537535

538536
updateSettings();
537+
538+
setCalibrationFolderEnabledState(false);
539539
}
540540

541541
drawLegend();
@@ -581,7 +581,7 @@ void NeuropixelsV1Interface::updateInfoString()
581581

582582
if (searchForCalibrationFilesButton->getToggleState())
583583
{
584-
searchForCalibrationFiles(calibrationFolder->getText().toStdString(), std::static_pointer_cast<Neuropixels1>(device)->getProbeSerialNumber());
584+
searchForCalibrationFiles(calibrationFolder->getText().toStdString(), sn);
585585
}
586586
}
587587

@@ -720,7 +720,6 @@ void NeuropixelsV1Interface::buttonClicked(Button* button)
720720
deviceEnableButton->setLabel(disabledButtonText);
721721
}
722722

723-
updateInfoString();
724723
repaint();
725724

726725
CoreServices::updateSignalChain(editor);
@@ -893,26 +892,27 @@ std::string NeuropixelsV1Interface::searchDirectoryForCalibrationFile(std::strin
893892
if (folder == "" || sn == 0)
894893
return "";
895894

896-
File directory = File(folder);
895+
File rootDirectory = File(folder);
897896

898-
if (!directory.isDirectory())
897+
if (!rootDirectory.isDirectory())
899898
{
900899
Onix1::showWarningMessageBoxAsync("Invalid Directory", "The path given for the calibration files directory is invalid. Please try setting it again.");
901900
return "";
902901
}
903902

904-
std::vector<File> calibrationFiles;
905-
906-
for (DirectoryEntry entry : RangedDirectoryIterator(directory, true, filename, File::findFiles, File::FollowSymlinks::no))
907-
{
908-
calibrationFiles.emplace_back(entry.getFile());
909-
LOGD("Discovered file: ", entry.getFile().getFullPathName());
910-
}
903+
auto calibrationFiles = searchDirectoryForFile(rootDirectory, filename, NeuropixelsCalibrationFileRecursiveLevels);
911904

912905
if (calibrationFiles.size() != 1)
913906
{
914-
Onix1::showWarningMessageBoxAsync("Wrong Number of Calibration Files", "Expected to find 1 file matching '" + filename +
915-
"', but found " + std::to_string(calibrationFiles.size()) + " instead. Check logs for all files discovered.");
907+
std::string msg = "Expected to find 1 file matching '" + filename +
908+
"', but found " + std::to_string(calibrationFiles.size()) + " instead.";
909+
910+
if (calibrationFiles.size() > 1)
911+
{
912+
msg += " Check console for all files discovered.";
913+
}
914+
915+
Onix1::showWarningMessageBoxAsync("Wrong Number of Calibration Files", msg);
916916
return "";
917917
}
918918

@@ -921,20 +921,37 @@ std::string NeuropixelsV1Interface::searchDirectoryForCalibrationFile(std::strin
921921

922922
void NeuropixelsV1Interface::setCalibrationFolderEnabledState(bool enabledState)
923923
{
924+
float alphaEnabled = 1.0, alphaDisabled = 0.25;
925+
924926
if (!enabledState)
925927
{
926-
calibrationFolder->setAlpha(0.25);
928+
calibrationFolder->setAlpha(alphaDisabled);
927929
calibrationFolderButton->setEnabled(false);
930+
931+
adcCalibrationFile->setAlpha(alphaEnabled);
932+
adcCalibrationFileButton->setEnabled(true);
933+
934+
gainCalibrationFile->setAlpha(alphaEnabled);
935+
gainCalibrationFileButton->setEnabled(true);
928936
}
929937
else
930938
{
931-
calibrationFolder->setAlpha(1.0);
939+
calibrationFolder->setAlpha(alphaEnabled);
932940
calibrationFolderButton->setEnabled(true);
941+
942+
adcCalibrationFile->setAlpha(alphaDisabled);
943+
adcCalibrationFileButton->setEnabled(false);
944+
945+
gainCalibrationFile->setAlpha(alphaDisabled);
946+
gainCalibrationFileButton->setEnabled(false);
933947
}
934948
}
935949

936950
void NeuropixelsV1Interface::searchForCalibrationFiles(std::string folder, uint64_t sn)
937951
{
952+
if (!device->isEnabled())
953+
return;
954+
938955
auto file = searchDirectoryForGainCalibrationFile(folder, sn);
939956

940957
if (file != "")

Source/UI/NeuropixelsV2eInterface.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ void NeuropixelsV2eInterface::buttonClicked(Button* button)
102102
deviceEnableButton->setLabel(disabledButtonText);
103103
}
104104

105-
updateInfoString();
106105
repaint();
107106

108107
CoreServices::updateSignalChain(editor);

Source/UI/NeuropixelsV2eProbeInterface.cpp

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ NeuropixelsV2eProbeInterface::NeuropixelsV2eProbeInterface(std::shared_ptr<Neuro
6868
searchForCorrectionFilesButton = std::make_unique<ToggleButton>("Search for calibration files automatically");
6969
searchForCorrectionFilesButton->setBounds(infoLabel->getX() + 2, infoLabel->getBottom() + 5, 350, 20);
7070
searchForCorrectionFilesButton->addListener(this);
71-
searchForCorrectionFilesButton->setTooltip("Open a dialog to choose the folder where calibration files exist. This can be a top-level folder which is recursively searched for a matching serial number.");
71+
searchForCorrectionFilesButton->setTooltip("Open a file dialog to choose a folder that contains all calibration files. The calibration file that matches your probe will automatically be selected if it exists in this folder.");
7272
addAndMakeVisible(searchForCorrectionFilesButton.get());
7373

74-
gainCorrectionFolderLabel = std::make_unique<Label>("gainCorrectionFolderLabel", "Gain Correction Folder");
74+
gainCorrectionFolderLabel = std::make_unique<Label>("gainCorrectionFolderLabel", "Calibration Folder");
7575
gainCorrectionFolderLabel->setBounds(searchForCorrectionFilesButton->getX(), searchForCorrectionFilesButton->getBottom() + 5, 240, 16);
7676
gainCorrectionFolderLabel->setColour(Label::textColourId, Colours::black);
7777
addAndMakeVisible(gainCorrectionFolderLabel.get());
@@ -92,8 +92,6 @@ NeuropixelsV2eProbeInterface::NeuropixelsV2eProbeInterface(std::shared_ptr<Neuro
9292

9393
gainCorrectionFolderChooser = std::make_unique<FileChooser>("Select Gain Correction Folder.", File());
9494

95-
setGainCorrectionFolderEnabledState(false);
96-
9795
gainCorrectionFileLabel = std::make_unique<Label>("gainCorrectionFileLabel", "Gain Correction File");
9896
gainCorrectionFileLabel->setBounds(gainCorrectionFolder->getX(), gainCorrectionFolder->getBottom() + 15, gainCorrectionFolderLabel->getWidth(), gainCorrectionFolderLabel->getHeight());
9997
gainCorrectionFileLabel->setColour(Label::textColourId, Colours::black);
@@ -352,6 +350,8 @@ NeuropixelsV2eProbeInterface::NeuropixelsV2eProbeInterface(std::shared_ptr<Neuro
352350
addAndMakeVisible(activityViewComponent.get());
353351

354352
#pragma endregion
353+
354+
setGainCorrectionFolderEnabledState(false);
355355
}
356356

357357
drawLegend();
@@ -380,7 +380,7 @@ void NeuropixelsV2eProbeInterface::updateInfoString()
380380
deviceLabel->setText(deviceString, dontSendNotification);
381381
infoLabel->setText(infoString, dontSendNotification);
382382

383-
if (searchForCorrectionFilesButton->getToggleState())
383+
if (searchForCorrectionFilesButton->getToggleState() && device->isEnabled())
384384
{
385385
auto file = searchDirectoryForCalibrationFile(gainCorrectionFolder->getText().toStdString(), sn);
386386

@@ -470,8 +470,6 @@ void NeuropixelsV2eProbeInterface::buttonClicked(Button* button)
470470

471471
if (fileChooser.browseForFileToOpen())
472472
{
473-
auto npx = std::static_pointer_cast<Neuropixels2e>(device);
474-
475473
if (ProbeInterfaceJson::readProbeSettingsFromJson(fileChooser.getResult(), npx->settings[probeIndex].get()))
476474
{
477475
applyProbeSettings(npx->settings[probeIndex].get());
@@ -485,8 +483,6 @@ void NeuropixelsV2eProbeInterface::buttonClicked(Button* button)
485483

486484
if (fileChooser.browseForFileToSave(true))
487485
{
488-
auto npx = std::static_pointer_cast<Neuropixels2e>(device);
489-
490486
if (!ProbeInterfaceJson::writeProbeSettingsToJson(fileChooser.getResult(), npx->settings[probeIndex].get()))
491487
CoreServices::sendStatusMessage("Failed to write probe channel map.");
492488
else
@@ -530,9 +526,9 @@ void NeuropixelsV2eProbeInterface::buttonClicked(Button* button)
530526
{
531527
setGainCorrectionFolderEnabledState(button->getToggleState());
532528

533-
if (button->getToggleState())
529+
if (button->getToggleState() && device->isEnabled())
534530
{
535-
auto calibrationFile = searchDirectoryForCalibrationFile(gainCorrectionFolder->getText().toStdString(), std::static_pointer_cast<Neuropixels2e>(device)->getProbeSerialNumber(probeIndex));
531+
auto calibrationFile = searchDirectoryForCalibrationFile(gainCorrectionFolder->getText().toStdString(), npx->getProbeSerialNumber(probeIndex));
536532

537533
if (calibrationFile != "")
538534
gainCorrectionFile->setText(calibrationFile);
@@ -543,10 +539,14 @@ void NeuropixelsV2eProbeInterface::buttonClicked(Button* button)
543539
if (gainCorrectionFolderChooser->browseForDirectory())
544540
{
545541
gainCorrectionFolder->setText(gainCorrectionFolderChooser->getResult().getFullPathName());
546-
auto calibrationFile = searchDirectoryForCalibrationFile(gainCorrectionFolder->getText().toStdString(), std::static_pointer_cast<Neuropixels2e>(device)->getProbeSerialNumber(probeIndex));
547542

548-
if (calibrationFile != "")
549-
gainCorrectionFile->setText(calibrationFile);
543+
if (device->isEnabled())
544+
{
545+
auto calibrationFile = searchDirectoryForCalibrationFile(gainCorrectionFolder->getText().toStdString(), npx->getProbeSerialNumber(probeIndex));
546+
547+
if (calibrationFile != "")
548+
gainCorrectionFile->setText(calibrationFile);
549+
}
550550
}
551551
}
552552
}
@@ -559,32 +559,34 @@ void NeuropixelsV2eProbeInterface::textEditorTextChanged(TextEditor& editor)
559559
}
560560
}
561561

562-
std::string NeuropixelsV2eProbeInterface::searchDirectoryForCalibrationFile(std::string folder, uint64_t sn)
562+
std::string NeuropixelsV2eProbeInterface::searchDirectoryForCalibrationFile(std::string directory, uint64_t sn)
563563
{
564-
if (folder == "" || sn == 0)
564+
if (directory == "" || sn == 0)
565565
return "";
566566

567-
File directory = File(folder);
567+
auto rootDirectory = File(directory);
568568

569-
if (!directory.isDirectory())
569+
if (!rootDirectory.isDirectory())
570570
{
571571
Onix1::showWarningMessageBoxAsync("Invalid Directory", "The path given for the calibration files directory is invalid. Please try setting it again.");
572572
return "";
573573
}
574574

575-
std::vector<File> calibrationFiles;
576575
std::string filename = std::to_string(sn) + GainCalibrationFilename;
577576

578-
for (DirectoryEntry entry : RangedDirectoryIterator(directory, true, filename, File::findFiles, File::FollowSymlinks::no))
579-
{
580-
calibrationFiles.emplace_back(entry.getFile());
581-
LOGD("Discovered file: ", entry.getFile().getFullPathName());
582-
}
577+
auto calibrationFiles = searchDirectoryForFile(rootDirectory, filename, NeuropixelsCalibrationFileRecursiveLevels);
583578

584579
if (calibrationFiles.size() != 1)
585580
{
586-
Onix1::showWarningMessageBoxAsync("Wrong Number of Calibration Files", "Expected to find 1 file matching '" + filename +
587-
"', but found " + std::to_string(calibrationFiles.size()) + " instead. Check logs for all files discovered.");
581+
std::string msg = "Expected to find 1 file matching '" + filename +
582+
"', but found " + std::to_string(calibrationFiles.size()) + " instead.";
583+
584+
if (calibrationFiles.size() > 1)
585+
{
586+
msg += " Check logs for all files discovered.";
587+
}
588+
589+
Onix1::showWarningMessageBoxAsync("Wrong Number of Calibration Files", msg);
588590
return "";
589591
}
590592

@@ -593,15 +595,23 @@ std::string NeuropixelsV2eProbeInterface::searchDirectoryForCalibrationFile(std:
593595

594596
void NeuropixelsV2eProbeInterface::setGainCorrectionFolderEnabledState(bool enabledState)
595597
{
598+
float alphaEnabled = 1.0, alphaDisabled = 0.25;
599+
596600
if (!enabledState)
597601
{
598-
gainCorrectionFolder->setAlpha(0.25);
602+
gainCorrectionFolder->setAlpha(alphaDisabled);
599603
gainCorrectionFolderButton->setEnabled(false);
604+
605+
gainCorrectionFile->setAlpha(alphaEnabled);
606+
gainCorrectionFileButton->setEnabled(true);
600607
}
601608
else
602609
{
603-
gainCorrectionFolder->setAlpha(1.0);
610+
gainCorrectionFolder->setAlpha(alphaEnabled);
604611
gainCorrectionFolderButton->setEnabled(true);
612+
613+
gainCorrectionFile->setAlpha(alphaDisabled);
614+
gainCorrectionFileButton->setEnabled(false);
605615
}
606616
}
607617

Source/UI/SettingsInterface.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,5 +150,36 @@ namespace OnixSourcePlugin
150150

151151
return rootElement.release();
152152
}
153+
154+
static constexpr int NeuropixelsCalibrationFileRecursiveLevels = 2;
155+
156+
// Given a File object defining the path to a directory, a filename to search for, and (optionally) the number of recursive levels to
157+
// iterate through, return a list of all files that match the given filename in the directory (or directories for recursive searches)
158+
static std::vector<File> searchDirectoryForFile(File directory, std::string filename, int recursiveLevels = 0)
159+
{
160+
std::vector<File> matchingFiles;
161+
162+
if (!directory.isDirectory())
163+
return matchingFiles;
164+
165+
if (recursiveLevels > 0)
166+
{
167+
for (DirectoryEntry entry : RangedDirectoryIterator(directory, false, "*", File::findDirectories, File::FollowSymlinks::no))
168+
{
169+
auto files = searchDirectoryForFile(entry.getFile(), filename, recursiveLevels - 1);
170+
171+
if (files.size() > 0)
172+
matchingFiles.insert(matchingFiles.end(), files.begin(), files.end());
173+
}
174+
}
175+
176+
for (DirectoryEntry entry : RangedDirectoryIterator(directory, false, filename, File::findFiles, File::FollowSymlinks::no))
177+
{
178+
matchingFiles.emplace_back(entry.getFile());
179+
LOGC("Discovered file: ", entry.getFile().getFullPathName());
180+
}
181+
182+
return matchingFiles;
183+
}
153184
};
154185
}

0 commit comments

Comments
 (0)