Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
03f39a0
init commit. v0 of the slide player
nitin710 Mar 24, 2026
436d753
fixed the logic for the min and max time provisions
nitin710 Mar 25, 2026
0f66fa4
adding example slides
nitin710 Mar 25, 2026
362b907
copy settings file to users document directory
nitin710 Mar 25, 2026
b99e032
handles relative path if specified in the settings file
nitin710 Mar 25, 2026
f39beb9
documents as default log location if log directory is not provided
nitin710 Mar 25, 2026
983ee3e
removed log file location from the settings file
nitin710 Mar 25, 2026
cb67b4d
provision for no background
nitin710 Mar 25, 2026
2e0815b
updated comments
nitin710 Mar 25, 2026
25e208a
minor updates to logging and some logic change for the intro slide
nitin710 Mar 25, 2026
66e973b
fix for removing background slide from the set
nitin710 Mar 25, 2026
d000a50
updated cmake lists with the change in location of settings file
nitin710 Mar 26, 2026
20b105b
added minor logging to specify if the settings file already exists
nitin710 Mar 26, 2026
464ea8f
adding VS project files
nitin710 Mar 26, 2026
d2c96fe
removed symlink for compile_commands
nitin710 Mar 26, 2026
3d37c21
Merge remote-tracking branch 'origin/feat-SlidePlayer' into feat-Slid…
nitin710 Mar 26, 2026
3b0c90d
updating the workflows to prep for adding the slidePlayer CI
nitin710 Mar 28, 2026
3bdf0d1
Added xcode project for Slide Player
nitin710 Mar 28, 2026
957befd
added Slide player to the build jobs. updated windows installer project
nitin710 Mar 28, 2026
27e0f5f
renamed the build schemes to match the script
nitin710 Mar 28, 2026
0d0976a
pulled latest dev into Slideplayer
nitin710 Mar 29, 2026
e286c0a
versoin bump to 1.15.0
nitin710 Mar 29, 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
14 changes: 13 additions & 1 deletion .github/workflows/build-all-on-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,19 @@ jobs:
echo "current working directory" && pwd
cd EmotiBitFirmwareInstaller
xcodebuild -project EmotiBitFirmwareInstaller.xcodeproj -scheme Release
build-slideplayer-macos:
needs: clone-macos
runs-on: [self-hosted, macOS]
environment: RUNNER-MACOS
steps:
- name: build using xcode
working-directory: ${{ vars.OFXEMOTIBIT_DIR }}
run: |
echo "current working directory" && pwd
cd SlidePlayer
xcodebuild -project SlidePlayer.xcodeproj -scheme Release
upload-artifact-macos:
needs: [build-oscilloscope-macos, build-dataparser-macos, build-firmwareinstaller-macos]
needs: [build-oscilloscope-macos, build-dataparser-macos, build-firmwareinstaller-macos, build-slideplayer-macos]
if: github.ref == 'refs/heads/dev'
runs-on: [self-hosted, macOS]
environment: RUNNER-MACOS
Expand All @@ -76,6 +87,7 @@ jobs:
mv EmotiBitOscilloscope/bin/EmotiBitOscilloscope.app stageRelease/EmotiBitSoftware-macos-${{ steps.get_version.outputs.version }}
mv EmotiBitDataParser/bin/EmotiBitDataParser.app stageRelease/EmotiBitSoftware-macos-${{ steps.get_version.outputs.version }}
mv EmotiBitFirmwareInstaller/bin/EmotiBitFirmwareInstaller.app stageRelease/EmotiBitSoftware-macos-${{ steps.get_version.outputs.version }}
mv SlidePlayer/bin/SlidePlayer.app stageRelease/EmotiBitSoftware-macos-${{ steps.get_version.outputs.version }}
- name: copy SiLabs drivers
working-directory: ${{ vars.ADDONS_DIR }}
run: |
Expand Down
14 changes: 13 additions & 1 deletion .github/workflows/build-all-on-win.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,20 @@ jobs:
echo "current working directory" && pwd
cd EmotiBitFirmwareInstaller
MSBuild EmotiBitFirmwareInstaller.sln -t:Build -p:Configuration=Release
build-slideplayer-windows:
needs: clone-windows
runs-on: [self-hosted, Windows]
environment: RUNNER-WINDOWS
steps:
- name: build using MSBuild
shell: cmd
working-directory: ${{ vars.OFXEMOTIBIT_DIR }}
run: |
echo "current working directory" && pwd
cd SlidePlayer
MSBuild SlidePlayer.sln -t:Build -p:Configuration=Release
build-installer-windows:
needs: [build-oscilloscope-windows, build-dataparser-windows, build-firmwareinstaller-windows]
needs: [build-oscilloscope-windows, build-dataparser-windows, build-firmwareinstaller-windows, build-slideplayer-windows]
if: github.ref == 'refs/heads/dev'
runs-on: [self-hosted, Windows]
environment: RUNNER-WINDOWS
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@
*.a
*.lib

# build folders
**/build/

# docs
**/docs/

# Executables
*.exe
*.out
Expand Down Expand Up @@ -60,3 +66,6 @@ EmotiBitInstaller/redist/

# testing
tests/EmotiBitDataParser/sample_data/2025-06-27_09-56-59-929206*.csv

# macOS
**/.DS_Store
9 changes: 9 additions & 0 deletions EmotiBitInstaller/EmotiBitInstaller.iss
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@ Source: "..\EmotiBitFirmwareInstaller\bin\data\esp32\*"; DestDir: "{app}\EmotiBi
Source: "..\EmotiBitFirmwareInstaller\bin\data\exec\win\*"; DestDir: "{app}\EmotiBit FirmwareInstaller\data\exec\win"
Source: "..\EmotiBitFirmwareInstaller\bin\data\instructions\*.jpg"; DestDir: "{app}\EmotiBit FirmwareInstaller\data\instructions"

; EmotiBit SlidePlayer
Source: "..\SlidePlayer\bin\SlidePlayer.exe"; DestDir: "{app}\EmotiBit SlidePlayer"
Source: "..\SlidePlayer\bin\*.dll"; DestDir: "{app}\EmotiBit SlidePlayer"
Source: "..\SlidePlayer\bin\data\emotibitSlidePlayerSettings.json"; DestDir: "{app}\EmotiBit SlidePlayer\data"
; Example slides
Source: "..\SlidePlayer\bin\data\example_slides\*"; DestDir: "{app}\EmotiBit SlidePlayer\data\example_slides"; Flags: recursesubdirs

; VC++ 2017 Redistributable
Source: "redist\vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall

Expand All @@ -68,6 +75,7 @@ Source: "..\EmotiBitIcons\icoFiles\EmotiBitLogo.ico"; DestDir: "{app}"
Name: "{group}\EmotiBit Oscilloscope"; Filename: "{app}\EmotiBit Oscilloscope\EmotiBitOscilloscope.exe"; WorkingDir: "{app}\EmotiBit Oscilloscope"
Name: "{group}\EmotiBit DataParser"; Filename: "{app}\EmotiBit DataParser\EmotiBitDataParser.exe"; WorkingDir: "{app}\EmotiBit DataParser"
Name: "{group}\EmotiBit FirmwareInstaller"; Filename: "{app}\EmotiBit FirmwareInstaller\EmotiBitFirmwareInstaller.exe"; WorkingDir: "{app}\EmotiBit FirmwareInstaller"
Name: "{group}\EmotiBit SlidePlayer"; Filename: "{app}\EmotiBit SlidePlayer\SlidePlayer.exe"; WorkingDir: "{app}\EmotiBit SlidePlayer"

[Run]
; Install VC++ 2017 Redistributable if not already installed
Expand All @@ -79,6 +87,7 @@ Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/passive /norestart"; StatusMs
Type: filesandordirs; Name: "{app}\EmotiBit Oscilloscope"
Type: filesandordirs; Name: "{app}\EmotiBit DataParser"
Type: filesandordirs; Name: "{app}\EmotiBit FirmwareInstaller"
Type: filesandordirs; Name: "{app}\EmotiBit SlidePlayer"
; Delete the parent EmotiBit folder if empty after above deletions
Type: dirifempty; Name: "{app}"

Expand Down
8 changes: 8 additions & 0 deletions SlidePlayer/.clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
BasedOnStyle: Google
BreakBeforeBraces: Allman
IndentWidth: 4
UseTab: Never
AllowShortFunctionsOnASingleLine: None
AllowShortBlocksOnASingleLine: Never
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
55 changes: 55 additions & 0 deletions SlidePlayer/.clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
Checks: >
readability-identifier-naming,
readability-identifier-length,
modernize-use-nullptr,
-modernize-use-override,
modernize-use-default-member-init,
bugprone-*,
-bugprone-easily-swappable-parameters

CheckOptions:
# Local variables: snake_case, no prefix
- key: readability-identifier-naming.LocalVariableCase
value: lower_case
- key: readability-identifier-naming.LocalVariablePrefix
value: ''

# Parameters: snake_case, no prefix
- key: readability-identifier-naming.ParameterCase
value: lower_case
- key: readability-identifier-naming.ParameterPrefix
value: ''
- key: readability-identifier-naming.ParameterMinLength
value: '1'

# Member variables: snake_case with trailing underscore
- key: readability-identifier-naming.MemberCase
value: lower_case
- key: readability-identifier-naming.MemberSuffix
value: '_'

# Functions and methods: camelCase (Google style)
- key: readability-identifier-naming.FunctionCase
value: camelBack
- key: readability-identifier-naming.MethodCase
value: camelBack

# Classes and structs: CamelCase
- key: readability-identifier-naming.ClassCase
value: CamelCase
- key: readability-identifier-naming.StructCase
value: CamelCase

# Constants: kCamelCase (Google style)
- key: readability-identifier-naming.ConstantCase
value: CamelCase
- key: readability-identifier-naming.ConstantPrefix
value: 'k'

# Allow single-character names (e.g. loop counters, x/y coords)
- key: readability-identifier-length.MinimumVariableNameLength
value: '1'
- key: readability-identifier-length.MinimumParameterNameLength
value: '1'
- key: readability-identifier-length.MinimumLoopCounterNameLength
value: '1'
207 changes: 207 additions & 0 deletions SlidePlayer/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
cmake_minimum_required(VERSION 3.20)

set(CMAKE_OSX_DEPLOYMENT_TARGET "11.5" CACHE STRING "Minimum macOS version")

project(SlidePlayer)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ── Paths ──────────────────────────────────────────────────────────────────────
set(OF_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../..")
set(OF_LIBS "${OF_ROOT}/libs")
set(OF_COMPILED "${OF_LIBS}/openFrameworksCompiled/lib/osx")
set(OF_THIRD_PARTY "${OF_COMPILED}/build/output")
set(OF_ADDONS "${OF_ROOT}/addons")

# ── Shared app sources (excludes main.cpp so tests can reuse without conflict) ─
file(GLOB MM_SOURCES "src/*.mm")
set(OF_APP_SOURCES
src/ofApp.cpp
${MM_SOURCES}
${OF_ADDONS}/ofxJSON/src/ofxJSONElement.cpp
${OF_ADDONS}/ofxJSON/libs/jsoncpp/src/jsoncpp.cpp
)

# ── Shared compile options ─────────────────────────────────────────────────────
set(OF_COMPILE_OPTIONS
-stdlib=libc++
-Wall
-Werror=return-type
-fexceptions
-fpascal-strings
-fobjc-arc
-x objective-c++ # OF headers require ObjC++ on macOS
)

# ── Shared compile definitions ─────────────────────────────────────────────────
set(OF_COMPILE_DEFINITIONS
__MACOSX_CORE__
USE_FMOD=0
GL_SILENCE_DEPRECATION=1
GLES_SILENCE_DEPRECATION=1
COREVIDEO_SILENCE_GL_DEPRECATION=1
GLM_FORCE_CTOR_INIT
GLM_ENABLE_EXPERIMENTAL
)

# ── Shared include directories ─────────────────────────────────────────────────
set(OF_INCLUDE_DIRS
src
${OF_LIBS}/openFrameworks
${OF_LIBS}/openFrameworks/3d
${OF_LIBS}/openFrameworks/app
${OF_LIBS}/openFrameworks/communication
${OF_LIBS}/openFrameworks/events
${OF_LIBS}/openFrameworks/gl
${OF_LIBS}/openFrameworks/graphics
${OF_LIBS}/openFrameworks/math
${OF_LIBS}/openFrameworks/sound
${OF_LIBS}/openFrameworks/types
${OF_LIBS}/openFrameworks/utils
${OF_LIBS}/openFrameworks/video
${OF_LIBS}/freetype/include
${OF_LIBS}/freetype/include/freetype2
${OF_LIBS}/glew/include
${OF_LIBS}/FreeImage/include
${OF_LIBS}/tess2/include
${OF_LIBS}/cairo/include
${OF_LIBS}/rtAudio/include
${OF_LIBS}/glfw/include
${OF_LIBS}/utf8/include
${OF_LIBS}/json/include
${OF_LIBS}/glm/include
${OF_LIBS}/curl/include
${OF_LIBS}/openssl/include
${OF_LIBS}/uriparser/include
${OF_LIBS}/pugixml/include
${OF_LIBS}/brotli/include
${OF_ADDONS}/ofxJSON/libs/jsoncpp/include
${OF_ADDONS}/ofxJSON/src
)

# ── Shared static libraries ────────────────────────────────────────────────────
set(OF_STATIC_LIBS
${OF_COMPILED}/openFrameworks.a
${OF_THIRD_PARTY}/FreeImage.a
${OF_THIRD_PARTY}/libGLEW.a
${OF_THIRD_PARTY}/libfreetype.a
${OF_THIRD_PARTY}/libpugixml.a
${OF_THIRD_PARTY}/libtess2.a
${OF_THIRD_PARTY}/libcairo.a
${OF_THIRD_PARTY}/libpixman-1.a
${OF_THIRD_PARTY}/librtaudio.a
${OF_THIRD_PARTY}/libglfw3.a
${OF_THIRD_PARTY}/libpng.a
${OF_THIRD_PARTY}/brotli.a
${OF_THIRD_PARTY}/curl.a
${OF_THIRD_PARTY}/openssl.a
${OF_THIRD_PARTY}/uriparser.a
${OF_THIRD_PARTY}/libfmt.a
${OF_THIRD_PARTY}/zlib.a
objc
)

# ── macOS Frameworks ───────────────────────────────────────────────────────────
find_library(FW_ACCELERATE Accelerate)
find_library(FW_APP_KIT AppKit)
find_library(FW_APPLICATION_SERVICES ApplicationServices)
find_library(FW_AV_FOUNDATION AVFoundation)
find_library(FW_AUDIO_TOOLBOX AudioToolbox)
find_library(FW_COCOA Cocoa)
find_library(FW_CORE_AUDIO CoreAudio)
find_library(FW_CORE_FOUNDATION CoreFoundation)
find_library(FW_CORE_MEDIA CoreMedia)
find_library(FW_CORE_SERVICES CoreServices)
find_library(FW_CORE_VIDEO CoreVideo)
find_library(FW_FOUNDATION Foundation)
find_library(FW_IO_KIT IOKit)
find_library(FW_METAL Metal)
find_library(FW_OPEN_GL OpenGL)
find_library(FW_QUARTZ_CORE QuartzCore)
find_library(FW_SECURITY Security)
find_library(FW_SYSTEM_CONFIGURATION SystemConfiguration)

set(OF_FRAMEWORKS
${FW_ACCELERATE}
${FW_APP_KIT}
${FW_APPLICATION_SERVICES}
${FW_AV_FOUNDATION}
${FW_AUDIO_TOOLBOX}
${FW_COCOA}
${FW_CORE_AUDIO}
${FW_CORE_FOUNDATION}
${FW_CORE_MEDIA}
${FW_CORE_SERVICES}
${FW_CORE_VIDEO}
${FW_FOUNDATION}
${FW_IO_KIT}
${FW_METAL}
${FW_OPEN_GL}
${FW_QUARTZ_CORE}
${FW_SECURITY}
${FW_SYSTEM_CONFIGURATION}
)

# ── Main application ───────────────────────────────────────────────────────────
add_executable(${PROJECT_NAME} MACOSX_BUNDLE src/main.cpp ${OF_APP_SOURCES})

target_compile_options(${PROJECT_NAME} PRIVATE ${OF_COMPILE_OPTIONS})
target_compile_definitions(${PROJECT_NAME} PRIVATE ${OF_COMPILE_DEFINITIONS})
target_include_directories(${PROJECT_NAME} PRIVATE ${OF_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${OF_STATIC_LIBS} ${OF_FRAMEWORKS})
target_link_options(${PROJECT_NAME} PRIVATE
-stdlib=libc++
-mmacosx-version-min=11.5
)

set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin"
)

# ── Always copy JSON settings to app bundle Resources ─────────────────────────
set(JSON_SRC "${CMAKE_CURRENT_SOURCE_DIR}/bin/data/emotibitSlidePlayerSettings.json")
set(BUNDLE_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/bin/${PROJECT_NAME}.app/Contents/Resources")

set(EXAMPLE_SLIDES_SRC "${CMAKE_CURRENT_SOURCE_DIR}/bin/data/example_slides")

add_custom_target(copy_settings ALL
COMMAND ${CMAKE_COMMAND} -E make_directory "${BUNDLE_RESOURCES}"
COMMAND ${CMAKE_COMMAND} -E copy "${JSON_SRC}" "${BUNDLE_RESOURCES}/emotibitSlidePlayerSettings.json"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${EXAMPLE_SLIDES_SRC}" "${BUNDLE_RESOURCES}/example_slides"
COMMENT "Copying settings and example slides to app bundle Resources"
)
add_dependencies(copy_settings ${PROJECT_NAME})

# ── Tests ──────────────────────────────────────────────────────────────────────
enable_testing()

include(FetchContent)
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.5.2
)
FetchContent_MakeAvailable(Catch2)

add_executable(slideShow_tests
tests/test_parseSettings.cpp
tests/test_updateCurrentState.cpp
${OF_APP_SOURCES}
)

target_compile_options(slideShow_tests PRIVATE ${OF_COMPILE_OPTIONS})
target_compile_definitions(slideShow_tests PRIVATE ${OF_COMPILE_DEFINITIONS})
target_include_directories(slideShow_tests PRIVATE ${OF_INCLUDE_DIRS})
target_link_libraries(slideShow_tests PRIVATE
Catch2::Catch2WithMain
${OF_STATIC_LIBS}
${OF_FRAMEWORKS}
)
target_link_options(slideShow_tests PRIVATE
-stdlib=libc++
-mmacosx-version-min=11.5
)

include(Catch)
catch_discover_tests(slideShow_tests)
Loading
Loading