Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
6f2d1fc
First pass with maintained functionality.
cboulay Dec 17, 2025
f5e1a48
First pass with maintained functionality.
cboulay Dec 17, 2025
2e9ce00
Add mock amp server
cboulay Dec 17, 2025
dff592d
Add listen-only mode
cboulay Dec 17, 2025
7401d92
Moved code files into `src` folder.
cboulay Dec 18, 2025
e14a9fd
Add MockAmpServer
cboulay Dec 18, 2025
d7ce4e0
Update build
cboulay Jan 10, 2026
3da08fa
MSVC math
cboulay Jan 10, 2026
6d311dc
Better local search paths for liblsl (parallel development)
cboulay Jan 10, 2026
6a496b8
Fix MVSC vs MinGW differences in `byteswap` semantics
cboulay Jan 10, 2026
f523a4b
MinGW - copy dlls on install
cboulay Jan 10, 2026
491f793
1. ByteSwap.h - Removed signed overloads to avoid ambiguity with si…
cboulay Jan 10, 2026
654578e
Leverage LSLCMake.cmake
cboulay Jan 10, 2026
f73d2ae
Simplify liblsl-finding
cboulay Jan 10, 2026
b07cca5
bump liblsl version
cboulay Jan 12, 2026
e0946d9
Don't upload non-signed macos builds to release
cboulay Jan 12, 2026
8e353fd
keychain password can be random string
cboulay Jan 15, 2026
f22ce84
bump liblsl version to get one with asio symbols hidden
cboulay Jan 16, 2026
81515ec
WIP - compatibility with net station
cboulay Jan 16, 2026
64d8dba
WIP - channel labels; impedances
cboulay Jan 22, 2026
d990485
Add Physio16 support
cboulay Jan 24, 2026
40c4bb5
Update README and .gitignore
cboulay Jan 24, 2026
26b2a8d
Add --native-format argument to transmit data in original (unscaled) …
cboulay Jan 25, 2026
85664b9
Add support for DIN
cboulay Feb 5, 2026
768c92e
Add --fast-recovery and --align-timestamps options. These should be m…
cboulay Feb 5, 2026
17b57cd
Updated impedance measurements to align with instructions from Magsti…
cboulay Feb 6, 2026
dbbb963
Add Impedance.md information
cboulay Feb 6, 2026
7f102ee
Update mock amplifier
cboulay Feb 6, 2026
5db53a1
overwrite screenshot
cboulay Feb 6, 2026
ccb2eba
More robust notification handling
cboulay Feb 26, 2026
7a7d98e
More robust notification handling and auto-reinit stream when Net Sta…
cboulay Feb 26, 2026
92a02ec
Improve notifications in mock
cboulay Feb 26, 2026
37b2e19
Enable the selection of more sample rate combinations in the UI.
cboulay Feb 26, 2026
f6784cf
Hide DeviceID from user and other UI tweaks.
cboulay Feb 26, 2026
52c6817
Fix impedance calculation
cboulay Feb 26, 2026
5b7d4b9
GUI QOL fixes
cboulay Feb 26, 2026
04a747d
Timestamp per-batch and use push_chunk.
cboulay Feb 26, 2026
5bc7352
replaces raw string literals (which hit MSVC's 16380-char limit) with…
cboulay Feb 27, 2026
4d0d5bd
Create standalone DIN stream at irregular rate.
cboulay Feb 27, 2026
74f6f00
Create notifications streamer to re-publish notifications received fr…
cboulay Feb 27, 2026
e83d1ff
notificationStreamer_ unaffected by sample rate changes, stream start…
cboulay Feb 27, 2026
8100835
Add always-0 reference channel.
cboulay Feb 27, 2026
934dba2
Warn if amp already running at 500 Hz or 1 kHz because we won't know …
cboulay Feb 27, 2026
cf7a707
Add din_lsl_monitor.py script to verify DIN stream.
cboulay Feb 28, 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
37 changes: 0 additions & 37 deletions .appveyor.yml

This file was deleted.

266 changes: 266 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,266 @@
# =============================================================================
# EGIAmpServer Build Workflow
# =============================================================================
# This workflow builds, tests, and packages EGIAmpServer for all
# supported platforms.
#
# Features:
# - Multi-platform builds (Linux, macOS, Windows)
# - Qt6 integration
# - Automatic liblsl fetch via FetchContent
# - CPack packaging
# - macOS code signing and notarization (on release)
# =============================================================================

name: Build

on:
push:
branches: [main, master]
tags: ['v*']
pull_request:
branches: [main, master]
release:
types: [published]
workflow_dispatch:

env:
BUILD_TYPE: Release

jobs:
# ===========================================================================
# Build Job - Multi-platform builds
# ===========================================================================
build:
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- { name: "Ubuntu 22.04", os: ubuntu-22.04 }
- { name: "Ubuntu 24.04", os: ubuntu-24.04 }
- { name: "macOS", os: macos-14, cmake_extra: '-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"' }
- { name: "Windows", os: windows-latest }

steps:
- name: Checkout
uses: actions/checkout@v4

# -----------------------------------------------------------------------
# Install CMake 3.28+ (Ubuntu 22.04 ships with 3.22)
# -----------------------------------------------------------------------
- name: Install CMake
if: runner.os == 'Linux'
uses: lukka/get-cmake@latest

# -----------------------------------------------------------------------
# Install Qt6 (6.8 LTS across all platforms)
# -----------------------------------------------------------------------
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libgl1-mesa-dev libxkbcommon-dev libxcb-cursor0

- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.8.*'
cache: true

# -----------------------------------------------------------------------
# Configure
# -----------------------------------------------------------------------
- name: Configure CMake
run: >
cmake -S . -B build
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
-DLSL_FETCH_IF_MISSING=ON
${{ matrix.config.cmake_extra }}

# -----------------------------------------------------------------------
# Build
# -----------------------------------------------------------------------
- name: Build
run: cmake --build build --config ${{ env.BUILD_TYPE }} --parallel

# -----------------------------------------------------------------------
# Test
# -----------------------------------------------------------------------
- name: Test CLI (Unix)
if: runner.os != 'Windows'
run: ./build/src/cli/EGIAmpServerCLI --help

- name: Test CLI (Windows)
if: runner.os == 'Windows'
run: .\build\src\cli\Release\EGIAmpServerCLI.exe --help

# -----------------------------------------------------------------------
# Install
# -----------------------------------------------------------------------
- name: Install
run: cmake --install build --config ${{ env.BUILD_TYPE }}

# -----------------------------------------------------------------------
# Package
# -----------------------------------------------------------------------
- name: Package
run: cpack -C ${{ env.BUILD_TYPE }}
working-directory: build

# -----------------------------------------------------------------------
# Upload Artifacts
# -----------------------------------------------------------------------
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: package-${{ matrix.config.os }}
path: |
build/*.zip
build/*.tar.gz
build/*.deb
if-no-files-found: ignore

# ===========================================================================
# macOS Signing and Notarization (Release only)
# ===========================================================================
sign-macos:
name: Sign & Notarize (macOS)
needs: build
if: github.event_name == 'release'
runs-on: macos-14

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Download macOS Artifact
uses: actions/download-artifact@v4
with:
name: package-macos-14
path: packages

- name: Extract Package
run: |
cd packages
tar -xzf *.tar.gz
# Move contents out of versioned subdirectory to packages/
SUBDIR=$(ls -d EGIAmpServer-*/ | head -1)
mv "$SUBDIR"/* .
rmdir "$SUBDIR"
ls -la

# -----------------------------------------------------------------------
# Install Apple Certificates
# -----------------------------------------------------------------------
- name: Install Apple Certificates
env:
MACOS_CERTIFICATE: ${{ secrets.PROD_MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}
run: |
# Create temporary keychain
KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain
MACOS_CI_KEYCHAIN_PWD=$(openssl rand -base64 32)
security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
security default-keychain -s $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH

# Import certificate
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
echo -n "$MACOS_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
security import $CERTIFICATE_PATH -P "$MACOS_CERTIFICATE_PWD" -k $KEYCHAIN_PATH -A -t cert -f pkcs12
rm $CERTIFICATE_PATH

# Allow codesign to access keychain
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH

# Extract identity name and export to environment
IDENTITY=$(security find-identity -v -p codesigning $KEYCHAIN_PATH | grep "Developer ID Application" | head -1 | awk -F'"' '{print $2}')
echo "APPLE_CODE_SIGN_IDENTITY_APP=$IDENTITY" >> $GITHUB_ENV

# -----------------------------------------------------------------------
# Setup Notarization Credentials
# -----------------------------------------------------------------------
- name: Setup Notarization
env:
NOTARIZATION_APPLE_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}
NOTARIZATION_PWD: ${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}
NOTARIZATION_TEAM_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}
run: |
xcrun notarytool store-credentials "notarize-profile" \
--apple-id "$NOTARIZATION_APPLE_ID" \
--password "$NOTARIZATION_PWD" \
--team-id "$NOTARIZATION_TEAM_ID"
echo "APPLE_NOTARIZE_KEYCHAIN_PROFILE=notarize-profile" >> $GITHUB_ENV

# -----------------------------------------------------------------------
# Sign and Notarize
# -----------------------------------------------------------------------
- name: Sign and Notarize
env:
ENTITLEMENTS_FILE: ${{ github.workspace }}/app.entitlements
run: |
APP_PATH=$(find packages -name "*.app" -type d | head -1)
if [[ -n "$APP_PATH" ]]; then
./scripts/sign_and_notarize.sh "$APP_PATH" --notarize
fi

# -----------------------------------------------------------------------
# Repackage
# -----------------------------------------------------------------------
- name: Repackage
run: |
cd packages

echo "Contents of packages directory:"
ls -la

rm -f *.tar.gz

VERSION=$(grep -A1 'project(EGIAmpServer' ../CMakeLists.txt | grep VERSION | sed 's/.*VERSION \([0-9.]*\).*/\1/')
echo "Detected version: $VERSION"

tar -cvzf "EGIAmpServer-${VERSION}-macOS_universal-signed.tar.gz" \
EGIAmpServer.app ampserver_config.cfg

echo "Created package:"
ls -la *.tar.gz

- name: Upload Signed Package
uses: actions/upload-artifact@v4
with:
name: package-macos-signed
path: packages/*-signed.tar.gz

- name: Upload to Release
if: github.event_name == 'release'
uses: softprops/action-gh-release@v2
with:
files: packages/*-signed.tar.gz

# ===========================================================================
# Upload unsigned packages to release
# ===========================================================================
release:
name: Upload to Release
needs: build
if: github.event_name == 'release'
runs-on: ubuntu-latest

steps:
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Upload to Release
uses: softprops/action-gh-release@v2
with:
files: |
artifacts/**/*.zip
artifacts/package-ubuntu-*/*.tar.gz
artifacts/**/*.deb
20 changes: 19 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
ui_*.h
# Build directories
/build*/
/cmake-build-*/

# CMake
/CMakeLists.txt.user
/CMakeLists.json

# Qt generated files
ui_*.h
moc_*.cpp
qrc_*.cpp

# IDE
/.idea/
/.vscode/
*.swp
*~
settings.local.json

# macOS
.DS_Store
28 changes: 0 additions & 28 deletions .travis.yml

This file was deleted.

Loading