diff --git a/Source/Devices/Neuropixels_1.h b/Source/Devices/Neuropixels_1.h index 2c4ac49..7da604c 100644 --- a/Source/Devices/Neuropixels_1.h +++ b/Source/Devices/Neuropixels_1.h @@ -285,7 +285,7 @@ class BackgroundUpdaterWithProgressWindow : public ThreadWithProgressWindow public: BackgroundUpdaterWithProgressWindow(Neuropixels_1* d); - void run(); + void run() override; bool updateSettings(); diff --git a/Source/Devices/PortController.cpp b/Source/Devices/PortController.cpp index c244773..1d0eddb 100644 --- a/Source/Devices/PortController.cpp +++ b/Source/Devices/PortController.cpp @@ -88,7 +88,7 @@ DiscoveryParameters PortController::getHeadstageDiscoveryParameters(String heads { if (headstage == NEUROPIXELSV1F_HEADSTAGE_NAME) { - return DiscoveryParameters(5.0f, 7.0f, 1.0f, 0.2f); + return DiscoveryParameters(5.0, 7.0, 1.0, 0.2); } return DiscoveryParameters(); @@ -109,28 +109,21 @@ String PortController::getPortName(int offset) } } -bool PortController::configureVoltage(float voltage) +bool PortController::configureVoltage(double voltage) { if (voltage == defaultVoltage) { - if (discoveryParameters == DiscoveryParameters()) return false; - - for (voltage = discoveryParameters.minVoltage; voltage <= discoveryParameters.maxVoltage; voltage += discoveryParameters.voltageIncrement) - { - setVoltage(voltage); - - if (checkLinkState()) - { - setVoltage(voltage + discoveryParameters.voltageOffset); - return checkLinkState(); - } - } + if (discoveryParameters == DiscoveryParameters() || discoveryParameters.voltageIncrement <= 0) + return false; + + ConfigureVoltageWithProgressBar progressBar = ConfigureVoltageWithProgressBar(discoveryParameters, this); + progressBar.runThread(); + + return progressBar.getResult(); } - else if (voltage >= 0.0f && voltage <= 7.0f) + else if (voltage >= 0.0 && voltage <= 7.0) { - setVoltageOverride(0.0f, true); - setVoltageOverride(voltage, true); - sleep_for(std::chrono::milliseconds(600)); + setVoltage(voltage); return checkLinkState(); } @@ -138,25 +131,29 @@ bool PortController::configureVoltage(float voltage) return false; } -void PortController::setVoltageOverride(float voltage, bool waitToSettle) +void PortController::setVoltageOverride(double voltage, bool waitToSettle) { - if (voltage < 0.0f && voltage > 7.0f) { LOGE("Invalid voltage value. Tried to set the port to " + String(voltage) + " V."); return; } + if (voltage < 0.0 && voltage > 7.0) { LOGE("Invalid voltage value. Tried to set the port to " + String(voltage) + " V."); return; } deviceContext->writeRegister((oni_dev_idx_t)port, (oni_reg_addr_t)PortControllerRegister::PORTVOLTAGE, voltage * 10); - if (deviceContext->getLastResult() != ONI_ESUCCESS) return; + + lastVoltageSet = voltage; + if (waitToSettle) sleep_for(std::chrono::milliseconds(500)); } -void PortController::setVoltage(float voltage) +void PortController::setVoltage(double voltage) { - if (voltage < 0.0f && voltage > 7.0f) { LOGE("Invalid voltage value. Tried to set the port to " + String(voltage) + " V."); return; } + if (voltage < 0.0 && voltage > 7.0) { LOGE("Invalid voltage value. Tried to set the port to " + String(voltage) + " V."); return; } deviceContext->writeRegister((oni_dev_idx_t)port, (oni_reg_addr_t)PortControllerRegister::PORTVOLTAGE, 0); - if (deviceContext->getLastResult() != ONI_ESUCCESS) return; sleep_for(std::chrono::milliseconds(300)); + if (deviceContext->getLastResult() != ONI_ESUCCESS) return; deviceContext->writeRegister((oni_dev_idx_t)port, (oni_reg_addr_t)PortControllerRegister::PORTVOLTAGE, voltage * 10); - if (deviceContext->getLastResult() != ONI_ESUCCESS) return; + + lastVoltageSet = voltage; + sleep_for(std::chrono::milliseconds(500)); } diff --git a/Source/Devices/PortController.h b/Source/Devices/PortController.h index 5e1a39a..211a748 100644 --- a/Source/Devices/PortController.h +++ b/Source/Devices/PortController.h @@ -54,14 +54,14 @@ enum class PortStatusCode : uint32_t class DiscoveryParameters { public: - float minVoltage = 0.0f; - float maxVoltage = 0.0f; - float voltageOffset = 0.0f; - float voltageIncrement = 0.0f; + double minVoltage = 0.0; + double maxVoltage = 0.0; + double voltageOffset = 0.0; + double voltageIncrement = 0.0; DiscoveryParameters() {}; - DiscoveryParameters(float minVoltage_, float maxVoltage_, float voltageOffset_, float voltageIncrement_) + DiscoveryParameters(double minVoltage_, double maxVoltage_, double voltageOffset_, double voltageIncrement_) { minVoltage = minVoltage_; maxVoltage = maxVoltage_; @@ -96,13 +96,13 @@ class PortController : public OnixDevice void updateDiscoveryParameters(DiscoveryParameters parameters); - bool configureVoltage(float voltage = defaultVoltage); + bool configureVoltage(double voltage = defaultVoltage); /** Sets the voltage to the given value, after setting the voltage to zero */ - void setVoltage(float voltage); + void setVoltage(double voltage); /** Overrides the voltage setting and directly sets it to the given voltage */ - void setVoltageOverride(float voltage, bool waitToSettle = true); + void setVoltageOverride(double voltage, bool waitToSettle = true); bool checkLinkState() const; @@ -114,6 +114,8 @@ class PortController : public OnixDevice static String getPortName(PortName port) { return port == PortName::PortA ? "Port A" : "Port B"; } + String getPortName() const { return getPortName(port); } + static PortName getPortFromIndex(oni_dev_idx_t index); static int getOffsetFromIndex(oni_dev_idx_t index); @@ -125,18 +127,22 @@ class PortController : public OnixDevice /** Check if the port status changed and there is an error reported */ bool getErrorFlag() { return errorFlag; } - static const int HubAddressPortA = 256; - static const int HubAddressPortB = 512; + double getLastVoltageSet() const { return lastVoltageSet; } + + static constexpr int HubAddressPortA = 256; + static constexpr int HubAddressPortB = 512; private: Array frameArray; const PortName port; - static constexpr float defaultVoltage = -1.0f; + static constexpr double defaultVoltage = -1.0; + + double lastVoltageSet = 0.0; - const uint32_t LINKSTATE_PP = 0x2; // parity check pass bit - const uint32_t LINKSTATE_SL = 0x1; // SERDES lock bit + static constexpr uint32_t LINKSTATE_PP = 0x2; // parity check pass bit + static constexpr uint32_t LINKSTATE_SL = 0x1; // SERDES lock bit DiscoveryParameters discoveryParameters; @@ -144,3 +150,53 @@ class PortController : public OnixDevice JUCE_LEAK_DETECTOR(PortController); }; + +class ConfigureVoltageWithProgressBar : public ThreadWithProgressWindow +{ +public: + ConfigureVoltageWithProgressBar(DiscoveryParameters params, PortController* port) + : ThreadWithProgressWindow("Configuring voltage on " + port->getPortName(), true, false) + { + m_params = params; + m_port = port; + } + + void run() override + { + double voltage, progress = 0.0; + + double increment = m_params.voltageIncrement / (m_params.maxVoltage - m_params.minVoltage); + + for (voltage = m_params.minVoltage; voltage <= m_params.maxVoltage; voltage += m_params.voltageIncrement) + { + progress += increment; + setProgress(progress); + + m_port->setVoltage(voltage); + + if (m_port->checkLinkState()) + { + setProgress(0.95); + m_port->setVoltage(voltage + m_params.voltageOffset); + result = m_port->checkLinkState();; + setProgress(1.0); + return; + } + } + + result = false; + return; + } + + bool getResult() const { return result; } + +private: + + DiscoveryParameters m_params; + + PortController* m_port; + + bool result = false; + + JUCE_LEAK_DETECTOR(ConfigureVoltageWithProgressBar); +}; diff --git a/Source/Onix1.h b/Source/Onix1.h index 279a8be..397b8a0 100644 --- a/Source/Onix1.h +++ b/Source/Onix1.h @@ -29,8 +29,8 @@ #include "../../plugin-GUI/Source/Utils/Utils.h" -constexpr const char* NEUROPIXELSV1F_HEADSTAGE_NAME = "Neuropixels 1.0f"; -constexpr const char* BREAKOUT_BOARD_NAME = "Breakout Board"; +constexpr char* NEUROPIXELSV1F_HEADSTAGE_NAME = "Neuropixels 1.0f"; +constexpr char* BREAKOUT_BOARD_NAME = "Breakout Board"; class error_t : public std::exception { diff --git a/Source/OnixSource.cpp b/Source/OnixSource.cpp index a1a864b..8dd355f 100644 --- a/Source/OnixSource.cpp +++ b/Source/OnixSource.cpp @@ -437,34 +437,51 @@ bool OnixSource::configurePortVoltage(PortName port, String voltage) const if (voltage == "" || voltage == "Auto") return portA->configureVoltage(); else - return portA->configureVoltage(voltage.getFloatValue()); + return portA->configureVoltage(voltage.getDoubleValue()); case PortName::PortB: if (voltage == "" || voltage == "Auto") return portB->configureVoltage(); else - return portB->configureVoltage(voltage.getFloatValue()); + return portB->configureVoltage(voltage.getDoubleValue()); default: return false; } } -void OnixSource::setPortVoltage(PortName port, float voltage) const +void OnixSource::setPortVoltage(PortName port, double voltage) const { if (!context->isInitialized()) return; + bool waitToSettle = voltage > 0; + switch (port) { case PortName::PortA: - portA->setVoltageOverride(voltage); + portA->setVoltageOverride(voltage, waitToSettle); return; case PortName::PortB: - portB->setVoltageOverride(voltage); + portB->setVoltageOverride(voltage, waitToSettle); return; default: return; } } +double OnixSource::getLastVoltageSet(PortName port) +{ + if (!context->isInitialized()) return 0.0; + + switch (port) + { + case PortName::PortA: + return portA->getLastVoltageSet(); + case PortName::PortB: + return portB->getLastVoltageSet(); + default: + return 0.0; + } +} + void OnixSource::updateSettings(OwnedArray* continuousChannels, OwnedArray* eventChannels, OwnedArray* spikeChannels, diff --git a/Source/OnixSource.h b/Source/OnixSource.h index c5dccf3..59a56f4 100644 --- a/Source/OnixSource.h +++ b/Source/OnixSource.h @@ -82,7 +82,9 @@ class OnixSource : public DataThread bool configurePortVoltage(PortName port, String voltage) const; /** Sets the port voltage */ - void setPortVoltage(PortName port, float voltage) const; + void setPortVoltage(PortName port, double voltage) const; + + double getLastVoltageSet(PortName port); void resetContext() { if (context != nullptr && context->isInitialized()) context->issueReset(); } diff --git a/Source/OnixSourceEditor.cpp b/Source/OnixSourceEditor.cpp index af9b6c2..51777a3 100644 --- a/Source/OnixSourceEditor.cpp +++ b/Source/OnixSourceEditor.cpp @@ -66,6 +66,13 @@ OnixSourceEditor::OnixSourceEditor(GenericProcessor* parentNode, OnixSource* sou portVoltageValueA->addListener(this); addAndMakeVisible(portVoltageValueA.get()); + lastVoltageSetA = std::make_unique