Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Convert DAQ from NIDAQ.jl to DAQmx.jl - #46

Merged
kalidke merged 14 commits into
mainfrom
convert-nidaqmx
Mar 5, 2026
Merged

Convert DAQ from NIDAQ.jl to DAQmx.jl#46
kalidke merged 14 commits into
mainfrom
convert-nidaqmx

Conversation

@kalidke

Copy link
Copy Markdown
Member

Summary

  • Convert DAQ dependency from old NIDAQ.jl to DAQmx.jl (renamed to avoid copyright issues)
  • Refactor export system using Reexport.jl to simplify MicroscopeControl.jl from ~80 lines to ~30
  • Add [sources] for DAQmx since it's not in General registry (requires Julia 1.11+)
  • Fix camera image permutation to (H, W, N) convention, ThorCam mono mode, Makie deprecations
  • Add AbstractSystem interface and error handling for laser/DAQ modules

Test plan

  • Pkg.test() passes with simulated devices
  • Verify using MicroscopeControl loads cleanly with Reexport
  • Confirm DAQmx resolves from GitHub URL via [sources]

🤖 Generated with Claude Code

kalidkeand others added 14 commits January 29, 2026 13:05
- Add AbstractSystem and AbstractSystemState types to instrument.jl
- Export get_state, set_state for system interface
- Fix armcamera duplicate method in ThorCamCSC (remove default argument)
- Fix CrystaLaser constructor: handle missing NI-DAQ gracefully
- Fix VortranLaser constructor: handle missing NI-DAQ gracefully
- Both laser constructors now use try-catch and validate device list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Constructor now validates device index before accessing
- All interface methods check for empty channels before use
- Warnings instead of crashes when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VortranLaser: wrap all DAQ operations in try-catch, check channel counts
- CrystaLaser: wrap all DAQ operations in try-catch, check for empty channels
- Shutdown now completes gracefully even when hardware unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add permutedims after reshape in all camera getdata/getlastframe functions
to convert from row-major C buffer to column-major Julia (H, W) arrays
- Fix array allocations to use (H, W, N) instead of (W, H, N)
- Add HDF5 metadata (dimension_order, dimension_labels, memory_layout)
to make convention explicit for downstream readers
- Document convention in CLAUDE.md
Cameras fixed: DCAM4, SimCamera, ThorCamCSC, ThorCamDCx
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the deprecated NIDAQ.jl package (v0.6) with the locally developed
NIDAQmx.jl package which provides better type safety, error handling, and
a more complete API.
Key changes:
- Update Project.toml dependencies (NIDAQ -> NIDAQmx)
- Update channelfunctions to use NIDAQmx API (ai_channels, ao_channels, etc.)
- Update taskfunctions to use typed task constructors (AITask, AOTask, etc.)
- Enhance createtask() to query device voltage ranges for compatibility
- Update setvoltage/readvoltage to use write_scalar/read_scalar with auto_start
- Add separate method signatures for AOTask/DOTask and AITask/DITask
- Update all consumer modules (CrystaLaser, VortranLaser, TransmissionDaq)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ThorCam DCX: Use IS_CM_MONO8 instead of RGBA8 for grayscale camera
- ThorCam DCX: Change buffer type from Cchar to UInt8 for proper 0-255 range
- Fix Makie deprecation: resolution -> size in all GUI files
- Fix camera display permutation: (H,W) data needs permutedims for Makie
- Add exposure time tolerance check to avoid spurious warnings
- Update CLAUDE.md with image()/heatmap() display documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace manual export propagation with Reexport.jl for cleaner module
structure. MicroscopeControl.jl reduced from 79 to 31 lines by removing
50+ manual exports and 15+ using statements.
Changes:
- Add Reexport.jl dependency
- HardwareInterfaces.jl: @reexport all interface modules
- HardwareImplementations.jl: @reexport all implementation modules
- MicroscopeControl.jl: @reexport both layers, remove manual exports
Adding new hardware now requires edits in only one place instead of three.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Package was renamed upstream.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Brings in Reexport.jl to simplify export propagation from submodules.
Resolved conflict: keep DAQmx (not old NIDAQ) + add Reexport dep.
Fixed CI checkout action back to v6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move NIDAQcard include before TCubeLaserControl since it depends on it.
Restore DAQmx to Project.toml after it was removed during manifest cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DAQmx.jl is not in General registry, so [sources] is needed.
[sources] requires Julia 1.11+.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the live display window is closed, abort the camera and invoke an
optional on_close callback. This lets callers (e.g. MicroscopeAdapt)
hook in additional cleanup like turning off lasers and updating GUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kalidke
kalidke merged commit 28cc6ea into mainMar 5, 2026
0 of 3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kalidke