Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Source/Devices/Neuropixels_1.h
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ class BackgroundUpdaterWithProgressWindow : public ThreadWithProgressWindow
public:
BackgroundUpdaterWithProgressWindow(Neuropixels_1* d);

void run();
void run() override;

bool updateSettings();

Expand Down
47 changes: 22 additions & 25 deletions Source/Devices/PortController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -109,54 +109,51 @@ 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();
}

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));
}

Expand Down
82 changes: 69 additions & 13 deletions Source/Devices/PortController.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_;
Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -125,22 +127,76 @@ 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<oni_frame_t*, CriticalSection, 10> 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;

std::atomic<bool> errorFlag = false;

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);
};
4 changes: 2 additions & 2 deletions Source/Onix1.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
27 changes: 22 additions & 5 deletions Source/OnixSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<ContinuousChannel>* continuousChannels,
OwnedArray<EventChannel>* eventChannels,
OwnedArray<SpikeChannel>* spikeChannels,
Expand Down
4 changes: 3 additions & 1 deletion Source/OnixSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -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(); }

Expand Down
Loading