Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
972f0a7
Ensure start/stop recording is triggered for editors on state changes
anjaldoshi Aug 15, 2025
dd6d72e
Show the channel number in the tooltip, even if it is not shown on th…
MarinManuel Aug 22, 2025
759700a
Merge pull request #669 from MarinManuel
anjaldoshi Aug 22, 2025
dcfe5b1
Add unit and integration tests on PR
medengineer Sep 3, 2025
c098d16
Use main branch of python-tools for tests
medengineer Oct 22, 2025
38dfd75
Add input range handling and auto-scaling for AUX channels
anjaldoshi Nov 12, 2025
8586285
Hide range units in options bar when AUX auto-scaling is enabled
anjaldoshi Nov 12, 2025
1202fbb
Remove test input range settings for AUX channels in FileReader
anjaldoshi Nov 12, 2025
d2dda07
Display units alongside channel type in LFP Viewer
anjaldoshi Nov 12, 2025
279705d
Adjust left margin of LFP Display dynamically based on channel name w…
anjaldoshi Nov 12, 2025
ef83d54
Add error logging for missing files in BinaryFileSource
anjaldoshi Nov 20, 2025
90bc34d
Validate selected and masked channels against channel count limit whe…
anjaldoshi Nov 26, 2025
2064ffc
Add file validation and error handling in BinaryRecording and RecordNode
anjaldoshi Nov 27, 2025
64eb6bc
Upgrade Python version
medengineer Dec 10, 2025
01cc224
Restore cross-platform builds on PRs
medengineer Dec 12, 2025
9c8a0e1
Merge pull request #681 from medengineer/add-GHA-tests
anjaldoshi Dec 12, 2025
a96ba3d
Add error handling for file loading in SelectFile action
anjaldoshi Dec 13, 2025
a4e3f64
Update LfpViewer to use new channel position and group metadata
anjaldoshi Dec 15, 2025
7321cd1
Add error logging for missing event sample numbers file
anjaldoshi Dec 23, 2025
eafde66
Add warning messages in FileReader
anjaldoshi Dec 23, 2025
6964897
Add plugin update check and notification on startup
anjaldoshi Dec 24, 2025
ced20df
Modify plugin update notification message
anjaldoshi Dec 24, 2025
8553e28
Hide console window only when launched by double-clicking, not from CLI
anjaldoshi Jan 9, 2026
eeaaa4f
Fix MaskChannelsParameter value copying when actual channel count exc…
anjaldoshi Jan 9, 2026
ce3e4f1
Optimize `SelectedChannelsParameter::setChannelCount` logic
anjaldoshi Jan 9, 2026
101fec1
Add validation checks for channel count and file size in BinaryFileSo…
anjaldoshi Jan 13, 2026
be3918e
Fix Audio Monitor resetting selected channels on update when no spike…
anjaldoshi Jan 15, 2026
09605fc
Bump version to 1.0.2
anjaldoshi Jan 15, 2026
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
133 changes: 133 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
name: Tests

on:
pull_request:
paths:
- 'JuceLibraryCode/**'
- 'Plugins/**'
- 'Resources/**'
- 'Source/**'
- 'CMakeLists.txt'
- 'HelperFunctions.cmake'
branches:
- 'development'
- 'testing'

jobs:
unit-tests:
name: Unit Tests
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@v4
- name: build
env:
CC: gcc-10
CXX: g++-10
run: |
sudo apt update
sudo ./Resources/Scripts/install_linux_dependencies.sh
git apply Resources/Scripts/gha_unit_tests.patch
cd Build && cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON ..
make -j8
- name: run tests
run: |
chmod +x ./Resources/Scripts/run_unit_tests_linux.sh
./Resources/Scripts/run_unit_tests_linux.sh Build/TestBin
shell: bash

integration-tests:
name: Integration Tests
runs-on: windows-2022

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: Start Windows Audio Engine
run: net start audiosrv
- name: Install Scream
shell: powershell
run: |
Start-Service audio*
Invoke-WebRequest https://github.com/duncanthrax/scream/releases/download/3.6/Scream3.6.zip -OutFile C:\Scream3.6.zip
Expand-7ZipArchive -Path C:\Scream3.6.zip -DestinationPath C:\Scream
$cert = (Get-AuthenticodeSignature C:\Scream\Install\driver\Scream.sys).SignerCertificate
$store = [System.Security.Cryptography.X509Certificates.X509Store]::new("TrustedPublisher", "LocalMachine")
$store.Open("ReadWrite")
$store.Add($cert)
$store.Close()
cd C:\Scream\Install\driver
C:\Scream\Install\helpers\devcon install Scream.inf *Scream
- name: Show audio device
run: Get-CimInstance Win32_SoundDevice | fl *
- name: configure
run: |
cd Build
cmake -G "Visual Studio 17 2022" -A x64 ..
- name: Add msbuild to PATH
uses: microsoft/[email protected]
- name: build
run: |
cd Build
msbuild ALL_BUILD.vcxproj -p:Configuration=Release -p:Platform=x64 -m
- name: Install open-ephys-data-format
shell: powershell
run: |
New-Item -Path '..\OEPlugins' -ItemType Directory
git clone --branch main https://github.com/open-ephys-plugins/open-ephys-data-format.git ..\OEPlugins\open-ephys-data-format
cd ..\OEPlugins\open-ephys-data-format\Build
cmake -G "Visual Studio 17 2022" -A x64 ..
msbuild INSTALL.vcxproj -p:Configuration=Release -p:Platform=x64
- name: Install OpenEphysHDF5Lib
shell: powershell
run: |
git clone --branch main https://github.com/open-ephys-plugins/OpenEphysHDF5Lib.git ..\OEPlugins\OpenEphysHDF5Lib
cd ..\OEPlugins\OpenEphysHDF5Lib\Build
cmake -G "Visual Studio 17 2022" -A x64 ..
msbuild INSTALL.vcxproj -p:Configuration=Release -p:Platform=x64
- name: Install nwb-format
shell: powershell
run: |
git clone --branch main https://github.com/open-ephys-plugins/nwb-format.git ..\OEPlugins\nwb-format
cd ..\OEPlugins\nwb-format\Build
cmake -G "Visual Studio 17 2022" -A x64 ..
msbuild INSTALL.vcxproj -p:Configuration=Release -p:Platform=x64
- name: Install test-suite
shell: powershell
run: |
git clone --branch main https://github.com/open-ephys/open-ephys-python-tools.git C:\open-ephys-python-tools
cd C:\open-ephys-python-tools
pip install -e .
pip install psutil
- name: Run Tests
shell: powershell
run: |
New-Item -Path 'C:\open-ephys\data' -ItemType Directory
git clone --branch main https://github.com/open-ephys/open-ephys-test-suite.git C:\test-suite
cd C:\test-suite
$process = Start-Process -FilePath "Build\Release\open-ephys.exe" -ArgumentList "Build\Release\configs\file_reader_config.xml" -NoNewWindow -PassThru
Write-Host "Started open-ephys process with ID: $($process.Id)"
Start-Sleep -Seconds 10
Write-Host "Starting Python script..."
python run_all.py 2>&1 | Tee-Object -FilePath "python_output.log"
Write-Host "Python script completed. Output saved to python_output.log"
Stop-Process -Id $process.Id -Force
env:
OE_WINDOWS_GITHUB_RECORD_PATH: C:\open-ephys\data
- name: Set timestamp
shell: powershell
id: timestamp
run: |
$timestamp = Get-Date -Format 'yyyy_MM_dd_HH_mm_ss'
"timestamp=$timestamp" >> $env:GITHUB_OUTPUT
- name: Upload test results
uses: actions/upload-artifact@v4
with:
name: windows_${{ steps.timestamp.outputs.timestamp }}.log
path: python_output.log
retention-days: 7
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#Open Ephys GUI main build file
cmake_minimum_required(VERSION 3.15)

set(GUI_VERSION 1.0.1)
set(GUI_VERSION 1.0.2)

string(REGEX MATCHALL "[0-9]+" VERSION_LIST ${GUI_VERSION})
list(LENGTH VERSION_LIST num_version_components)
Expand Down
16 changes: 15 additions & 1 deletion Plugins/LfpViewer/DisplayBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,19 +64,33 @@ void DisplayBuffer::addChannel (
ContinuousChannel::Type type,
bool isRecorded,
int group,
float xpos,
float ypos,
String description,
String structure)
String structure,
float inputRangeMin,
float inputRangeMax,
String units,
bool hasGroupMetadata,
bool hasYposMetadata,
bool hasXposMetadata)
{
ChannelMetadata metadata = ChannelMetadata();
metadata.name = name;
metadata.type = type;
metadata.group = group;
metadata.xpos = xpos;
metadata.ypos = ypos;
metadata.structure = structure;
metadata.type = type;
metadata.isRecorded = isRecorded;
metadata.description = description;
metadata.inputRangeMin = inputRangeMin;
metadata.inputRangeMax = inputRangeMax;
metadata.units = units;
metadata.hasGroupMetadata = hasGroupMetadata;
metadata.hasYposMetadata = hasYposMetadata;
metadata.hasXposMetadata = hasXposMetadata;

channelMetadata.add (metadata);
channelMap[channelNum] = numChannels;
Expand Down
16 changes: 15 additions & 1 deletion Plugins/LfpViewer/DisplayBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,16 @@ class TESTABLE DisplayBuffer : public AudioBuffer<float>
ContinuousChannel::Type channelType,
bool isRecorded,
int group = 0,
float xpos = 0.0f,
float ypos = 0,
String description = "",
String structure = "None");
String structure = "None",
float inputRangeMin = -5000.0f,
float inputRangeMax = +5000.0f,
String units = "",
bool hasGroupMetadata = false,
bool hasYposMetadata = false,
bool hasXposMetadata = false);

/** Initializes the event channel at the start of each buffer */
void initializeEventChannel (int nSamples);
Expand All @@ -86,11 +93,18 @@ class TESTABLE DisplayBuffer : public AudioBuffer<float>
{
String name = "";
int group = 0;
float xpos = 0.0f;
float ypos = 0;
String structure = "None";
ContinuousChannel::Type type;
bool isRecorded = false;
String description = "";
float inputRangeMin = -5000.0f;
float inputRangeMax = +5000.0f;
String units = "";
bool hasGroupMetadata = false;
bool hasYposMetadata = false;
bool hasXposMetadata = false;
};

Array<ChannelMetadata> channelMetadata;
Expand Down
22 changes: 22 additions & 0 deletions Plugins/LfpViewer/LfpChannelDisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ void LfpChannelDisplay::setType (ContinuousChannel::Type type_)
typeStr = options->getTypeName (type);
}

void LfpChannelDisplay::setUnits (const String& newUnits)
{
units = newUnits;
}

const String& LfpChannelDisplay::getUnits() const
{
return units;
}

void LfpChannelDisplay::setEnabledState (bool state)
{
/*if (state)
Expand Down Expand Up @@ -809,6 +819,18 @@ void LfpChannelDisplay::setDepth (float depth_)
depth = depth_;
}

void LfpChannelDisplay::setXpos (float xpos_)
{
xpos = xpos_;
}

void LfpChannelDisplay::setMetadataPresence (bool hasGroupMetadata_, bool hasYposMetadata_, bool hasXposMetadata_)
{
groupMetadataAvailable = hasGroupMetadata_;
yposMetadataAvailable = hasYposMetadata_;
xposMetadataAvailable = hasXposMetadata_;
}

void LfpChannelDisplay::setRecorded (bool recorded_)
{
isRecorded = recorded_;
Expand Down
26 changes: 24 additions & 2 deletions Plugins/LfpViewer/LfpChannelDisplay.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ class LfpChannelDisplay : public Component
/** Sets the channel depth*/
void setDepth (float);

/** Sets the channel x-position */
void setXpos (float);

/** Records which metadata fields were provided for this channel */
void setMetadataPresence (bool hasGroupMetadata_, bool hasYposMetadata_, bool hasXposMetadata_);

/** Sets whether or not the channel is recorded by an upstream Record Node*/
void setRecorded (bool);

Expand All @@ -113,6 +119,12 @@ class LfpChannelDisplay : public Component
/** Return the assigned channel name */
String getName();

/** Set the units string used for display */
void setUnits (const String& newUnits);

/** Return the units string for this channel */
const String& getUnits() const;

/** Returns the assigned channel number for this display, relative
to the subset of channels being drawn to the canvas */
int getDrawableChannelNumber();
Expand Down Expand Up @@ -170,6 +182,10 @@ class LfpChannelDisplay : public Component

float getDepth() { return depth; }
int getGroup() { return group; }
float getXpos() const { return xpos; }
bool hasGroupMetadata() const { return groupMetadataAvailable; }
bool hasYposMetadata() const { return yposMetadataAvailable; }
bool hasXposMetadata() const { return xposMetadataAvailable; }

int ifrom, ito, ito_local, ifrom_local;

Expand All @@ -189,10 +205,16 @@ class LfpChannelDisplay : public Component
int drawableChan;

String name;
int group;
float depth;
int group = 0;
float depth = 0.0f;
float xpos = 0.0f;
bool groupMetadataAvailable = false;
bool yposMetadataAvailable = false;
bool xposMetadataAvailable = false;
bool isRecorded;

String units;

FontOptions channelFont;

Colour lineColour;
Expand Down
30 changes: 26 additions & 4 deletions Plugins/LfpViewer/LfpChannelDisplayInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,31 @@ void LfpChannelDisplayInfo::paint (Graphics& g)

if (getChannelTypeStringVisibility())
{
constexpr int textHeight = 14;
constexpr int textStartX = 5;
const int textY = center + 10;

g.setFont (FontOptions (13.0f));
g.drawText (typeStr, 5, center + 10, 50, 14, Justification::centred, false);
g.setColour (lineColour);
const auto currentFont = g.getCurrentFont();

const int typeWidth = currentFont.getStringWidth (typeStr);
const int typeBoundsWidth = typeWidth + 2;
g.drawText (typeStr, textStartX, textY, typeBoundsWidth, textHeight, Justification::centredLeft, false);

const String& unitsText = getUnits();
if (unitsText.isNotEmpty())
{
const int unitsX = textStartX + typeWidth + 5;
const int unitsWidth = getWidth() - unitsX - 4;

if (unitsWidth > 0)
{
g.setColour (Colours::grey.withAlpha (0.8f));
g.setFont (FontOptions (12.0f));
g.drawFittedText (unitsText, unitsX, textY, unitsWidth, textHeight, Justification::centredLeft, 1, 0.8f);
}
}
}

if (isSingleChannel)
Expand Down Expand Up @@ -325,8 +348,7 @@ bool LfpChannelDisplayInfo::isChannelNumberHidden()
String LfpChannelDisplayInfo::getTooltip()
{
const bool showChannelNumbers = options->getChannelNameState();
const String channelString = (isChannelNumberHidden() ? ("--") : showChannelNumbers ? String (getChannelNumber() + 1)
: getName());
const String channelString = showChannelNumbers ? String (getChannelNumber() + 1) : getName();

return channelString;
}
}
Loading
Loading