Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
bd80f32
Fix code inspection issue
bytedreamer Jan 24, 2026
c55929c
Add Guidelines as submodule at lib/Guidelines
bytedreamer Feb 8, 2026
4b69333
Integrate Guidelines shared WPF library v1.0.0
bytedreamer Feb 8, 2026
c3cbdfe
Remove duplicate StyleGuide.md
bytedreamer Feb 8, 2026
27cc5ae
Update CLAUDE.md UI documentation references
bytedreamer Feb 8, 2026
dfdf48c
Fix: Remove obsolete resource references from LayoutTemplates.xaml
bytedreamer Feb 8, 2026
4f42bdf
Phase 2: Migrate generic converters to Guidelines library
bytedreamer Feb 8, 2026
a4686a1
Update Guidelines submodule to include localization abstraction
bytedreamer Feb 8, 2026
b80b745
Integrate Guidelines window and theme management
bytedreamer Feb 8, 2026
abecf2e
Update Guidelines submodule with improved documentation
bytedreamer Feb 8, 2026
7f6a086
Fix CI submodule checkout and update documentation
bytedreamer Feb 8, 2026
991c498
Clean up documentation structure
bytedreamer Feb 8, 2026
2933024
Use Guidelines HandleDpiChanged for multi-monitor DPI transitions
bytedreamer Feb 8, 2026
3413221
Extract InfoPage components to Guidelines library
bytedreamer Feb 8, 2026
285ce41
Replace custom user settings with Guidelines shared implementation
bytedreamer Feb 8, 2026
22404ea
Replace custom localization markup with Guidelines shared implementation
bytedreamer Feb 8, 2026
bf7e9d6
Fix localization provider not set before window creation
bytedreamer Feb 12, 2026
a1ae326
Replace hardcoded margins and inline styles with shared design system…
bytedreamer Feb 21, 2026
85dc769
Add accessibility properties and fix LedControl hardcoded glow color
bytedreamer Feb 21, 2026
4f4768c
Expand ViewModel unit test coverage for trace entry processing and su…
bytedreamer Feb 21, 2026
a060137
Add FlaUI UI testing with Moq service mocking and CI pipeline stage
bytedreamer Feb 21, 2026
7ca08ac
Fix all ReSharper code inspection warnings
bytedreamer Feb 21, 2026
02495ef
Fix duplicate --logger and --results-directory args in UI test pipeline
bytedreamer Feb 21, 2026
7dd4f28
Add UI test coverage for all pages and replace Thread.Sleep with polling
bytedreamer Feb 21, 2026
59a7af5
Fix Configuration page layout overlap and truncation at narrow widths
bytedreamer Feb 21, 2026
1d61160
Fix UI flow issues across Monitor, Info, and Manage pages
bytedreamer Feb 21, 2026
d8f2365
Improve Configuration page UX with key field controls, placeholders, …
bytedreamer Feb 21, 2026
f9d1fc9
Split UI tests into smoke (on push) and full (daily/tagged) runs
bytedreamer Feb 21, 2026
53804ba
Add full buzzer control settings with device capability checking
bytedreamer Feb 22, 2026
5d802d1
Add full LED control settings with temp/perm tabs and color swatches
bytedreamer Feb 22, 2026
8ea3529
Add security key validation highlighting and fix passive mode key edi…
bytedreamer Feb 22, 2026
74fdbcc
Replace buzzer TextBox inputs with NumberBox controls for consistent …
bytedreamer Feb 22, 2026
e9b58f9
Add timing validation to buzzer and LED controls with mode-aware rules
bytedreamer Feb 22, 2026
cf244c9
Add validation error indicators, INotifyPropertyChanged fix, and UI t…
bytedreamer Feb 22, 2026
bc6b413
Merge pull request #68 from Z-bit-Systems-LLC/l10n_main
bytedreamer Feb 22, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@ BundleArtifacts/
/src/UI/WinUI (Package)/WinUI (Package).assets.cache

.claude
results.sarif
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[submodule "src/UI/UsbSerialForAndroid"]
path = src/UI/UsbSerialForAndroid
url = https://github.com/bytedreamer/UsbSerialForAndroid
[submodule "lib/Guidelines"]
path = lib/Guidelines
url = https://github.com/Z-bit-Systems-LLC/Guidelines.git
44 changes: 42 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,54 @@ $sarif.runs[0].results | Where-Object { $_.level -eq 'warning' } | ForEach-Objec
- Use meaningful variable names that reflect their purpose
- Keep methods focused and small with a single responsibility

## Shared UI Components

This project uses the [Guidelines](https://github.com/Z-bit-Systems-LLC/Guidelines) shared WPF library for design system components.

### Working with the Guidelines Submodule

**Initial clone (new developers):**
```bash
git clone --recursive https://github.com/Z-bit-Systems-LLC/OSDP-Bench.git
```

**Update Guidelines to latest version:**
```bash
git submodule update --remote lib/Guidelines
git add lib/Guidelines
git commit -m "Update Guidelines submodule to latest version"
```

**Making changes to Guidelines:**
If you need to modify the shared library:
1. Make changes in `lib/Guidelines/`
2. Test changes in OSDP-Bench (local project reference)
3. Commit and push in Guidelines repository
4. Update submodule reference in OSDP-Bench

### Design System Reference
See `lib/Guidelines/src/ZBitSystems.Wpf.UI/Styles/StyleGuide.md` for:
- Available styles and design tokens
- Standard components and layouts
- Theme-aware semantic colors
- Usage examples and best practices

## UI Style Guidelines
- **Always use standard styles** - Apply predefined styles from the design system instead of inline properties
- **Use design tokens for spacing** - Reference `{StaticResource Margin.Card}` instead of hardcoding values
- **Apply theme-aware semantic colors** - Use `{DynamicResource SemanticSuccessBrush}` for automatic light/dark theme support
- **Follow the style hierarchy** - Check ComponentStyles.xaml and LayoutTemplates.xaml before creating custom styles
- **Follow the style hierarchy** - Check the shared design system (Guidelines library) and LayoutTemplates.xaml before creating custom styles
- **Update existing code** - When modifying files, replace inline styling with standard styles
- **Create reusable patterns** - If you find yourself repeating XAML structures, consider adding a new style or template
- **Use WrapPanel for responsive layouts** - When controls should be horizontal on wide screens but wrap to vertical on narrow screens, use WrapPanel instead of fixed Grid layouts
- **Avoid Grid row collisions in responsive layouts** - When using code-behind `SizeChanged` handlers to reposition elements between Grid rows, ensure moved elements don't share a row with existing static content. Always verify that the target row is either empty or the static content is also relocated
- **Prefer dynamic resources for colors** - Use `{DynamicResource}` instead of `{StaticResource}` for colors to ensure theme compatibility

For detailed UI styling guidelines and examples, see: `src/UI/Windows/Styles/StyleGuide.md`
### Documentation References

**Shared Design System (Guidelines Library):**
- `lib/Guidelines/src/ZBitSystems.Wpf.UI/Styles/StyleGuide.md` - Complete style guide with design tokens, semantic colors, and component styles

**OSDP-Specific Styling:**
- `src/UI/Windows/Styles/LayoutTemplates.xaml` - Application-specific layout templates (connection status, page headers with activity indicators)
- `src/UI/Windows/Styles/ExampleImplementation.md` - OSDP-specific implementation examples and migration guide
58 changes: 58 additions & 0 deletions OSDP-Bench.sln
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ci", "ci", "{5D426D86-43BB-
ci\azure-pipelines.yml = ci\azure-pipelines.yml
ci\build.yml = ci\build.yml
ci\package.yml = ci\package.yml
ci\ui-tests.yml = ci\ui-tests.yml
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Windows", "src\UI\Windows\Windows.csproj", "{DD8BD355-FB29-42BD-AADD-C0E391EE1825}"
Expand All @@ -30,6 +31,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{ED2EC291-3
CLAUDE.md = CLAUDE.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{3A8DF596-E814-FECC-DD4B-D8EF8AAC1A0D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Guidelines", "Guidelines", "{704960A3-6C7D-5CB1-1F34-76459FC7CBAE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{DDC3EA95-9E27-4E54-C9B7-EF99E65DDDE0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZBitSystems.Wpf.UI", "lib\Guidelines\src\ZBitSystems.Wpf.UI\ZBitSystems.Wpf.UI.csproj", "{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0C88DD14-F956-CE84-757C-A364CCF449FC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI.Tests", "test\UI.Tests\UI.Tests.csproj", "{D8F38927-04C5-4FB4-B7CC-50E201818F89}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -104,13 +117,58 @@ Global
{79C7EB0F-A75B-4DA7-BDDF-12C9714B48DF}.Release|x64.Build.0 = Release|x64
{79C7EB0F-A75B-4DA7-BDDF-12C9714B48DF}.Release|x86.ActiveCfg = Release|Any CPU
{79C7EB0F-A75B-4DA7-BDDF-12C9714B48DF}.Release|x86.Build.0 = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|ARM.Build.0 = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|ARM64.Build.0 = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|x64.ActiveCfg = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|x64.Build.0 = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|x86.ActiveCfg = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Debug|x86.Build.0 = Debug|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|Any CPU.Build.0 = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|ARM.ActiveCfg = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|ARM.Build.0 = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|ARM64.ActiveCfg = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|ARM64.Build.0 = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|x64.ActiveCfg = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|x64.Build.0 = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|x86.ActiveCfg = Release|Any CPU
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E}.Release|x86.Build.0 = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|ARM.ActiveCfg = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|ARM.Build.0 = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|ARM64.Build.0 = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|x64.ActiveCfg = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|x64.Build.0 = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|x86.ActiveCfg = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Debug|x86.Build.0 = Debug|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|Any CPU.Build.0 = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|ARM.ActiveCfg = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|ARM.Build.0 = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|ARM64.ActiveCfg = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|ARM64.Build.0 = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|x64.ActiveCfg = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|x64.Build.0 = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|x86.ActiveCfg = Release|Any CPU
{D8F38927-04C5-4FB4-B7CC-50E201818F89}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{5D426D86-43BB-4D6D-A6BF-0ACC65A19C92} = {8FB5794C-299E-4B9E-8D0D-6BFC695DA91B}
{DD8BD355-FB29-42BD-AADD-C0E391EE1825} = {6AF5FFEF-AFBA-4BB8-A14F-FDE4AEEC19AB}
{704960A3-6C7D-5CB1-1F34-76459FC7CBAE} = {3A8DF596-E814-FECC-DD4B-D8EF8AAC1A0D}
{DDC3EA95-9E27-4E54-C9B7-EF99E65DDDE0} = {704960A3-6C7D-5CB1-1F34-76459FC7CBAE}
{B5DAB0A8-CF87-4799-8BAE-08CE2A33E97E} = {DDC3EA95-9E27-4E54-C9B7-EF99E65DDDE0}
{0F31AAB4-B6FB-4DF1-B6BA-2AF58FADB005} = {0C88DD14-F956-CE84-757C-A364CCF449FC}
{D8F38927-04C5-4FB4-B7CC-50E201818F89} = {0C88DD14-F956-CE84-757C-A364CCF449FC}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {09928BD4-7D4E-4C9A-86DA-49BC36820716}
Expand Down
23 changes: 10 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

A professional tool for configuring and troubleshooting OSDP devices.

[![.NET](https://img.shields.io/badge/.NET-8.0-blue)](https://dotnet.microsoft.com/)
[![.NET](https://img.shields.io/badge/.NET-10.0-blue)](https://dotnet.microsoft.com/)
[![License](https://img.shields.io/badge/License-Eclipse%202.0-green.svg)](LICENSE)

## About
Expand All @@ -21,7 +21,7 @@ Core functionality is under an open source license to help increase the adoption
- **Packet Tracing** - View detailed OSDP communication packets
- **Capture Packet Export** - Export captured packets for offline analysis and sharing
- **Multi-language Support** - Available in multiple languages
- **Cross-platform Core** - Core logic library built on .NET 8.0 can be reused across different platforms
- **Cross-platform Core** - Core logic library built on .NET 10.0 can be reused across different platforms

## Get OSDP Bench

Expand All @@ -36,15 +36,15 @@ OSDP Bench is available for purchase on multiple platforms:

### Prerequisites

- .NET 8.0 SDK or later
- Windows 10/11 (for WinUI version)
- .NET 10.0 SDK or later
- Windows 10/11 (for Windows version)
- Serial port access for device communication

### Building from Source

1. Clone the repository:
1. Clone the repository with submodules:
```bash
git clone https://github.com/bytedreamer/OSDP-Bench.git
git clone --recursive https://github.com/bytedreamer/OSDP-Bench.git
cd OSDP-Bench
```

Expand All @@ -68,17 +68,14 @@ OSDP Bench is available for purchase on multiple platforms:
## Documentation

### Project Documentation
- **[Developer Guidelines](docs/CLAUDE.md)** - Development guidelines and build commands
- **[UI Style Guide](src/UI/Windows/Styles/StyleGuide.md)** - Comprehensive design system and styling guidelines
- **[Developer Guidelines](CLAUDE.md)** - Development guidelines and build commands

### Shared Libraries
- **[Guidelines](https://github.com/Z-bit-Systems-LLC/Guidelines)** - Shared WPF components and CI/CD documentation

### Architecture Plans
- **[Connection Plugin Architecture](docs/CONNECTION_PLUGIN_ARCHITECTURE.md)** - Plan for implementing pluggable connection types (Serial, Bluetooth, Network)

### Localization
- **[Localization Plan](docs/LOCALIZATION_PLAN.md)** - Multi-language support implementation
- **[Language Switching](docs/LANGUAGE_SWITCHING_DEMO.md)** - Language switching functionality
- **[Language Fixes](docs/LANGUAGE_SWITCHING_FIX.md)** - Language switching issue fixes

## Contributing

We welcome contributions! Please follow these guidelines:
Expand Down
35 changes: 35 additions & 0 deletions ci/azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ trigger:

pr: none

schedules:
- cron: '0 6 * * *'
displayName: 'Daily full UI test run'
branches:
include:
- main
always: true

pool:
vmImage: 'windows-latest'

Expand All @@ -22,8 +30,34 @@ jobs:
vmImage: 'windows-latest'
steps:
- checkout: self
submodules: true
- template: build.yml

- job: ui_tests
displayName: 'UI Smoke Tests'
pool:
vmImage: 'windows-latest'
dependsOn:
build
continueOnError: true
steps:
- checkout: self
submodules: true
- template: ui-tests-smoke.yml

- job: ui_tests_full
displayName: 'UI Tests (Full)'
condition: or(eq(variables['Build.Reason'], 'Schedule'), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
pool:
vmImage: 'windows-latest'
dependsOn:
build
continueOnError: true
steps:
- checkout: self
submodules: true
- template: ui-tests.yml

- job: package
displayName: 'Package and Publish'
condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
Expand All @@ -33,6 +67,7 @@ jobs:
build
steps:
- checkout: self
submodules: true
persistCredentials: true
clean: true
- template: package.yml
2 changes: 1 addition & 1 deletion ci/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ steps:
displayName: 'dotnet test'
inputs:
command: 'test'
projects: 'test/*Tests/*.csproj'
projects: 'test/Core.Tests/Core.Tests.csproj'
arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage"'

- task: reportgenerator@5
Expand Down
20 changes: 20 additions & 0 deletions ci/ui-tests-smoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: '10.x'

- task: DotNetCoreCLI@2
displayName: 'dotnet build UI.Tests'
inputs:
command: 'build'
projects: 'test/UI.Tests/UI.Tests.csproj'
arguments: '--configuration $(buildConfiguration)'

- task: DotNetCoreCLI@2
displayName: 'dotnet test UI.Tests (Smoke)'
inputs:
command: 'test'
projects: 'test/UI.Tests/UI.Tests.csproj'
arguments: '--configuration $(buildConfiguration) --filter TestCategory=Smoke'
20 changes: 20 additions & 0 deletions ci/ui-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: '10.x'

- task: DotNetCoreCLI@2
displayName: 'dotnet build UI.Tests'
inputs:
command: 'build'
projects: 'test/UI.Tests/UI.Tests.csproj'
arguments: '--configuration $(buildConfiguration)'

- task: DotNetCoreCLI@2
displayName: 'dotnet test UI.Tests'
inputs:
command: 'test'
projects: 'test/UI.Tests/UI.Tests.csproj'
arguments: '--configuration $(buildConfiguration)'
Loading