From 66940dc3d74bac4bf6992ffde00ce31db53f1f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beatriz=20Louren=C3=A7o?= Date: Tue, 8 Jul 2025 21:24:29 +0100 Subject: [PATCH 01/65] First commit of the app --- App/.editorconfig | 280 ++ App/.gitignore | 453 ++ App/Directory.Build.props | 7 + App/Harp.Behavior.App.sln | 41 + .../Harp.Behavior.App.csproj | 51 + App/Harp.Behavior.App/Program.cs | 24 + .../Properties/launchSettings.json | 11 + App/Harp.Behavior.App/app.manifest | 18 + .../Adapters/RgbRegisterAdapter.cs | 153 + App/Harp.Behavior.Design/App.axaml | 18 + App/Harp.Behavior.Design/App.axaml.cs | 44 + .../Assets/cf-logo-small.bmp | Bin 0 -> 26930 bytes .../Assets/cf-logo-white-lettering.png | Bin 0 -> 11575 bytes .../Assets/cf-logo-white-lettering.svg | 224 + App/Harp.Behavior.Design/Assets/cf-logo.icns | Bin 0 -> 88286 bytes App/Harp.Behavior.Design/Assets/cf-logo.ico | Bin 0 -> 307515 bytes App/Harp.Behavior.Design/Assets/cf-logo.png | Bin 0 -> 15303 bytes App/Harp.Behavior.Design/Assets/cf-logo.svg | 235 + .../Assets/cf_hardware_software_logo.png | Bin 0 -> 21525 bytes .../Assets/cf_hardware_software_logo.svg | 94 + ...hardware_software_logo_white_lettering.png | Bin 0 -> 13832 bytes ...hardware_software_logo_white_lettering.svg | 81 + .../Controls/ExtendedColorPicker.cs | 33 + .../Controls/RgbRegisterControl.axaml | 38 + .../Controls/RgbRegisterControl.axaml.cs | 11 + .../Controls/VisualStatus.axaml | 11 + .../Controls/VisualStatus.axaml.cs | 21 + .../Controls/WriteMessagesControl.axaml | 28 + .../Controls/WriteMessagesControl.axaml.cs | 11 + .../Converters/EnableFlagConverter.cs | 31 + .../Converters/EnumDisplayConverter.cs | 24 + .../Converters/PayloadFieldConverter.cs | 155 + .../Converters/VisualStatusColorConverter.cs | 23 + App/Harp.Behavior.Design/FodyWeavers.xml | 3 + .../Harp.Behavior.Design.csproj | 29 + .../Styles/DefaultStyles.axaml | 15 + .../ViewModels/AboutViewModel.cs | 5 + .../ViewModels/MyDeviceViewModel.cs | 3986 +++++++++++++++++ .../ViewModels/ViewModelBase.cs | 46 + App/Harp.Behavior.Design/Views/About.axaml | 39 + App/Harp.Behavior.Design/Views/About.axaml.cs | 11 + .../Views/MainWindow.axaml | 13 + .../Views/MainWindow.axaml.cs | 11 + .../Views/MyDeviceView.axaml | 2081 +++++++++ .../Views/MyDeviceView.axaml.cs | 11 + App/Harp.Behavior.nsi | Bin 0 -> 11808 bytes App/LICENSE | 21 + App/README.md | 2 + 48 files changed, 8393 insertions(+) create mode 100644 App/.editorconfig create mode 100644 App/.gitignore create mode 100644 App/Directory.Build.props create mode 100644 App/Harp.Behavior.App.sln create mode 100644 App/Harp.Behavior.App/Harp.Behavior.App.csproj create mode 100644 App/Harp.Behavior.App/Program.cs create mode 100644 App/Harp.Behavior.App/Properties/launchSettings.json create mode 100644 App/Harp.Behavior.App/app.manifest create mode 100644 App/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs create mode 100644 App/Harp.Behavior.Design/App.axaml create mode 100644 App/Harp.Behavior.Design/App.axaml.cs create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo-small.bmp create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo-white-lettering.png create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo-white-lettering.svg create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo.icns create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo.ico create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo.png create mode 100644 App/Harp.Behavior.Design/Assets/cf-logo.svg create mode 100644 App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.png create mode 100644 App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.svg create mode 100644 App/Harp.Behavior.Design/Assets/cf_hardware_software_logo_white_lettering.png create mode 100644 App/Harp.Behavior.Design/Assets/cf_hardware_software_logo_white_lettering.svg create mode 100644 App/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs create mode 100644 App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml create mode 100644 App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml.cs create mode 100644 App/Harp.Behavior.Design/Controls/VisualStatus.axaml create mode 100644 App/Harp.Behavior.Design/Controls/VisualStatus.axaml.cs create mode 100644 App/Harp.Behavior.Design/Controls/WriteMessagesControl.axaml create mode 100644 App/Harp.Behavior.Design/Controls/WriteMessagesControl.axaml.cs create mode 100644 App/Harp.Behavior.Design/Converters/EnableFlagConverter.cs create mode 100644 App/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs create mode 100644 App/Harp.Behavior.Design/Converters/PayloadFieldConverter.cs create mode 100644 App/Harp.Behavior.Design/Converters/VisualStatusColorConverter.cs create mode 100644 App/Harp.Behavior.Design/FodyWeavers.xml create mode 100644 App/Harp.Behavior.Design/Harp.Behavior.Design.csproj create mode 100644 App/Harp.Behavior.Design/Styles/DefaultStyles.axaml create mode 100644 App/Harp.Behavior.Design/ViewModels/AboutViewModel.cs create mode 100644 App/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs create mode 100644 App/Harp.Behavior.Design/ViewModels/ViewModelBase.cs create mode 100644 App/Harp.Behavior.Design/Views/About.axaml create mode 100644 App/Harp.Behavior.Design/Views/About.axaml.cs create mode 100644 App/Harp.Behavior.Design/Views/MainWindow.axaml create mode 100644 App/Harp.Behavior.Design/Views/MainWindow.axaml.cs create mode 100644 App/Harp.Behavior.Design/Views/MyDeviceView.axaml create mode 100644 App/Harp.Behavior.Design/Views/MyDeviceView.axaml.cs create mode 100644 App/Harp.Behavior.nsi create mode 100644 App/LICENSE create mode 100644 App/README.md diff --git a/App/.editorconfig b/App/.editorconfig new file mode 100644 index 0000000..4aaad81 --- /dev/null +++ b/App/.editorconfig @@ -0,0 +1,280 @@ +# editorconfig.org + +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +insert_final_newline = true +indent_style = space +indent_size = 4 +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +end_of_line = crlf +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion +dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion +dotnet_style_namespace_match_folder = true:suggestion + +# C# files +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true +# trim_trailing_whitespace = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# prefer var +csharp_style_var_for_built_in_types = true +csharp_style_var_when_type_is_apparent = true +csharp_style_var_elsewhere = true:suggestion + +# use language keywords instead of BCL types +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style + +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# private static fields should have s_ prefix +dotnet_naming_rule.private_static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.private_static_fields_should_have_prefix.symbols = private_static_fields +dotnet_naming_rule.private_static_fields_should_have_prefix.style = private_static_prefix_style + +dotnet_naming_symbols.private_static_fields.applicable_kinds = field +dotnet_naming_symbols.private_static_fields.required_modifiers = static +dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private + +dotnet_naming_style.private_static_prefix_style.required_prefix = s_ +dotnet_naming_style.private_static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style + +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal + +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# use accessibility modifiers +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion + +# Code style defaults +dotnet_sort_system_directives_first = true +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = false:none +csharp_style_expression_bodied_constructors = false:none +csharp_style_expression_bodied_operators = false:none +csharp_style_expression_bodied_properties = true:none +csharp_style_expression_bodied_indexers = true:none +csharp_style_expression_bodied_accessors = true:none + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false +space_within_single_line_array_initializer_braces = true + +#Net Analyzer +dotnet_analyzer_diagnostic.category-Performance.severity = none #error - Uncomment when all violations are fixed. + +# CS0649: Field 'field' is never assigned to, and will always have its default value 'value' +dotnet_diagnostic.CS0649.severity = error + +# CS1591: Missing XML comment for publicly visible type or member +dotnet_diagnostic.CS1591.severity = suggestion + +# CS0162: Remove unreachable code +dotnet_diagnostic.CS0162.severity = error +# CA1018: Mark attributes with AttributeUsageAttribute +dotnet_diagnostic.CA1018.severity = error +# CA1304: Specify CultureInfo +dotnet_diagnostic.CA1304.severity = warning +# CA1802: Use literals where appropriate +dotnet_diagnostic.CA1802.severity = warning +# CA1813: Avoid unsealed attributes +dotnet_diagnostic.CA1813.severity = error +# CA1815: Override equals and operator equals on value types +dotnet_diagnostic.CA1815.severity = warning +# CA1820: Test for empty strings using string length +dotnet_diagnostic.CA1820.severity = warning +# CA1821: Remove empty finalizers +dotnet_diagnostic.CA1821.severity = error +# CA1822: Mark members as static +dotnet_diagnostic.CA1822.severity = suggestion +dotnet_code_quality.CA1822.api_surface = private, internal +# CA1823: Avoid unused private fields +dotnet_diagnostic.CA1823.severity = error +# CA1825: Avoid zero-length array allocations +dotnet_diagnostic.CA1825.severity = warning +# CA1826: Use property instead of Linq Enumerable method +dotnet_diagnostic.CA1826.severity = suggestion +# CA1827: Do not use Count/LongCount when Any can be used +dotnet_diagnostic.CA1827.severity = warning +# CA1828: Do not use CountAsync/LongCountAsync when AnyAsync can be used +dotnet_diagnostic.CA1828.severity = warning +# CA1829: Use Length/Count property instead of Enumerable.Count method +dotnet_diagnostic.CA1829.severity = warning +#CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters +dotnet_diagnostic.CA1847.severity = warning +# CA1851: Possible multiple enumerations of IEnumerable collection +dotnet_diagnostic.CA1851.severity = warning +#CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method +dotnet_diagnostic.CA1854.severity = warning +#CA2211:Non-constant fields should not be visible +dotnet_diagnostic.CA2211.severity = error + +# Wrapping preferences +csharp_wrap_before_ternary_opsigns = false + +# Avalonia DevAnalyzer preferences +dotnet_diagnostic.AVADEV2001.severity = error + +# Avalonia PublicAnalyzer preferences +dotnet_diagnostic.AVP1000.severity = error +dotnet_diagnostic.AVP1001.severity = error +dotnet_diagnostic.AVP1002.severity = error +dotnet_diagnostic.AVP1010.severity = error +dotnet_diagnostic.AVP1011.severity = error +dotnet_diagnostic.AVP1012.severity = warning +dotnet_diagnostic.AVP1013.severity = error +dotnet_diagnostic.AVP1020.severity = error +dotnet_diagnostic.AVP1021.severity = error +dotnet_diagnostic.AVP1022.severity = error +dotnet_diagnostic.AVP1030.severity = error +dotnet_diagnostic.AVP1031.severity = error +dotnet_diagnostic.AVP1032.severity = error +dotnet_diagnostic.AVP1040.severity = error +dotnet_diagnostic.AVA2001.severity = error +csharp_using_directive_placement = outside_namespace:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_namespace_declarations = block_scoped:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_prefer_system_threading_lock = true:suggestion +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent + +# Xaml files +[*.{xaml,axaml}] +indent_size = 2 +# DuplicateSetterError +avalonia_xaml_diagnostic.AVLN2203.severity = error +# StyleInMergedDictionaries +avalonia_xaml_diagnostic.AVLN2204.severity = error +# RequiredTemplatePartMissing +avalonia_xaml_diagnostic.AVLN2205.severity = error +# OptionalTemplatePartMissing +avalonia_xaml_diagnostic.AVLN2206.severity = info +# TemplatePartWrongType +avalonia_xaml_diagnostic.AVLN2207.severity = error +# ItemContainerInsideTemplate +avalonia_xaml_diagnostic.AVLN2208.severity = error +# Obsolete +avalonia_xaml_diagnostic.AVLN5001.severity = error + +# Xml project files +[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{xml,stylecop,resx,ruleset}] +indent_size = 2 + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +[*.json] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +[*.{cmd,bat}] +end_of_line = crlf diff --git a/App/.gitignore b/App/.gitignore new file mode 100644 index 0000000..4dd3751 --- /dev/null +++ b/App/.gitignore @@ -0,0 +1,453 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/App/Directory.Build.props b/App/Directory.Build.props new file mode 100644 index 0000000..4d9a552 --- /dev/null +++ b/App/Directory.Build.props @@ -0,0 +1,7 @@ + + + enable + 11.2.6 + 1.0.0 + + diff --git a/App/Harp.Behavior.App.sln b/App/Harp.Behavior.App.sln new file mode 100644 index 0000000..174fcca --- /dev/null +++ b/App/Harp.Behavior.App.sln @@ -0,0 +1,41 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35707.178 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{D6F1C6E5-7507-425D-A697-29DAB58ED458}") = "Harp.Behavior.App", "Harp.Behavior.App\Harp.Behavior.App.csproj", "{6281A17E-B18E-4F00-86B9-BC1665108D9D}" +EndProject +Project("{D6F1C6E5-7507-425D-A697-29DAB58ED458}") = "Harp.Behavior.Design", "Harp.Behavior.Design\Harp.Behavior.Design.csproj", "{FCB73743-9ECF-4D3E-A235-F0493BC10629}" +EndProject +Project("{D6F1C6E5-7507-425D-A697-29DAB58ED458}") = "Harp.Behavior", "..\Interface\Harp.Behavior\Harp.Behavior.csproj", "{5C1A2A65-9C57-419A-89A0-0B59BA4CF40C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{10D72C30-D95E-452C-910F-F39FC6BAF129}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + Harp.Behavior.nsi = Harp.Behavior.nsi + README.md = README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6281A17E-B18E-4F00-86B9-BC1665108D9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6281A17E-B18E-4F00-86B9-BC1665108D9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6281A17E-B18E-4F00-86B9-BC1665108D9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6281A17E-B18E-4F00-86B9-BC1665108D9D}.Release|Any CPU.Build.0 = Release|Any CPU + {FCB73743-9ECF-4D3E-A235-F0493BC10629}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCB73743-9ECF-4D3E-A235-F0493BC10629}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCB73743-9ECF-4D3E-A235-F0493BC10629}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCB73743-9ECF-4D3E-A235-F0493BC10629}.Release|Any CPU.Build.0 = Release|Any CPU + {5C1A2A65-9C57-419A-89A0-0B59BA4CF40C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C1A2A65-9C57-419A-89A0-0B59BA4CF40C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C1A2A65-9C57-419A-89A0-0B59BA4CF40C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C1A2A65-9C57-419A-89A0-0B59BA4CF40C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/App/Harp.Behavior.App/Harp.Behavior.App.csproj b/App/Harp.Behavior.App/Harp.Behavior.App.csproj new file mode 100644 index 0000000..80940c0 --- /dev/null +++ b/App/Harp.Behavior.App/Harp.Behavior.App.csproj @@ -0,0 +1,51 @@ + + + WinExe + + net8.0 + enable + true + app.manifest + ..\bin\$(Configuration) + $(AppVersion) + ..\Harp.Behavior.Design\Assets\cf-logo.ico + Harp.Behavior.App + + + + Harp.Behavior.App + Harp.Behavior.App + org.fchampalimaud + $(Version) + $(Version) + AAPL + . + Harp.Behavior.App + cf-logo.icns + NSApplication + true + Champalimaud Foundation + ..\Harp.Behavior.Design\Assets\cf-logo.ico + ..\README.md + git + ..\bin\$(Configuration) + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.Behavior.App/Program.cs b/App/Harp.Behavior.App/Program.cs new file mode 100644 index 0000000..bc33a2b --- /dev/null +++ b/App/Harp.Behavior.App/Program.cs @@ -0,0 +1,24 @@ +using System; + +using Avalonia; +using Avalonia.ReactiveUI; + +namespace Harp.Behavior.App; + +class Program +{ + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace() + .UseReactiveUI(); +} diff --git a/App/Harp.Behavior.App/Properties/launchSettings.json b/App/Harp.Behavior.App/Properties/launchSettings.json new file mode 100644 index 0000000..8455e9d --- /dev/null +++ b/App/Harp.Behavior.App/Properties/launchSettings.json @@ -0,0 +1,11 @@ +{ + "profiles": { + "Harp.Behavior.App": { + "commandName": "Project" + }, + "WSL": { + "commandName": "WSL2", + "distributionName": "" + } + } +} \ No newline at end of file diff --git a/App/Harp.Behavior.App/app.manifest b/App/Harp.Behavior.App/app.manifest new file mode 100644 index 0000000..e0ce8d0 --- /dev/null +++ b/App/Harp.Behavior.App/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/App/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs b/App/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs new file mode 100644 index 0000000..f299c22 --- /dev/null +++ b/App/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reactive.Linq; +using Avalonia.Media; +using ReactiveUI; + +namespace Harp.Behavior.Design.Adapters; + +public class RgbColorItem : ReactiveObject +{ + private Color _color; + public Color Color + { + get => _color; + set => this.RaiseAndSetIfChanged(ref _color, value); + } +} + +public enum RgbKind +{ + None, + Simple, + Array, + Structured, + Complex +} + +public class RgbRegisterAdapter : ReactiveObject +{ + public ObservableCollection Colors { get; } + public bool IsWritable { get; } + public string RegisterKey { get; } + public RgbKind Kind { get; } + + // For simple/structured: expose a single color property + public Color Color + { + get => Colors.Count > 0 ? Colors[0].Color : Avalonia.Media.Colors.Transparent; + set { if (Colors.Count > 0) Colors[0].Color = value; this.RaisePropertyChanged(nameof(Color)); } + } + + private RgbRegisterAdapter _linkedAdapter; + private int _linkedOffset; + + /// + /// Used for design-time data or default initialization. + /// + public RgbRegisterAdapter() + : this("DefaultKey", 1, true, RgbKind.Simple) + { + } + + public RgbRegisterAdapter(string registerKey, int colorCount, bool isWritable, RgbKind kind) + { + RegisterKey = registerKey; + IsWritable = isWritable; + Kind = kind; + Colors = new ObservableCollection( + Enumerable.Range(0, colorCount).Select(_ => new RgbColorItem())); + } + + /// + /// Updates the adapter from a register value (byte[] or struct). + /// + public void UpdateFromRegister(object registerValue) + { + if (registerValue is byte[] arr && arr.Length >= Colors.Count * 3) + { + for (int i = 0; i < Colors.Count; i++) + { + Colors[i].Color = Color.FromRgb(arr[i * 3], arr[i * 3 + 1], arr[i * 3 + 2]); + } + } + // Handle struct/complex types (e.g., with Red0, Green0, Blue0, Red1, ...) + else if (registerValue != null) + { + var type = registerValue.GetType(); + for (int i = 0; i < Colors.Count; i++) + { + string rName = Colors.Count == 1 ? "Red" : $"Red{i}"; + string gName = Colors.Count == 1 ? "Green" : $"Green{i}"; + string bName = Colors.Count == 1 ? "Blue" : $"Blue{i}"; + + var r = GetByteField(type, registerValue, rName); + var g = GetByteField(type, registerValue, gName); + var b = GetByteField(type, registerValue, bName); + Colors[i].Color = Color.FromRgb(r, g, b); + } + } + } + + private static byte GetByteField(Type type, object obj, string name) + { + var prop = type.GetProperty(name); + if (prop != null && prop.PropertyType == typeof(byte)) + return (byte)prop.GetValue(obj); + var field = type.GetField(name); + if (field != null && field.FieldType == typeof(byte)) + return (byte)field.GetValue(obj); + return 0; + } + + /// + /// Converts the adapter's colors to a register value (byte[]). + /// + public byte[] ToRegisterValue() + { + var arr = new byte[Colors.Count * 3]; + for (int i = 0; i < Colors.Count; i++) + { + arr[i * 3] = Colors[i].Color.R; + arr[i * 3 + 1] = Colors[i].Color.G; + arr[i * 3 + 2] = Colors[i].Color.B; + } + return arr; + } + + /// + /// Link this adapter to a parent adapter's color collection (for subrange sync). + /// + public void LinkToParent(RgbRegisterAdapter parent, int offset) + { + _linkedAdapter = parent; + _linkedOffset = offset; + + // Sync initial values + for (int i = 0; i < Colors.Count; i++) + { + Colors[i].Color = parent.Colors[offset + i].Color; + } + + // Subscribe to changes in this adapter and propagate to parent + for (int i = 0; i < Colors.Count; i++) + { + int idx = i; + Colors[i].WhenAnyValue(x => x.Color) + .Skip(1) + .Subscribe(color => + { + parent.Colors[offset + idx].Color = color; + }); + + // Subscribe to changes in parent and propagate to this adapter + parent.Colors[offset + i].WhenAnyValue(x => x.Color) + .Skip(1) + .Subscribe(color => + { + Colors[idx].Color = color; + }); + } + } +} diff --git a/App/Harp.Behavior.Design/App.axaml b/App/Harp.Behavior.Design/App.axaml new file mode 100644 index 0000000..c32c2b9 --- /dev/null +++ b/App/Harp.Behavior.Design/App.axaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/App/Harp.Behavior.Design/App.axaml.cs b/App/Harp.Behavior.Design/App.axaml.cs new file mode 100644 index 0000000..073c400 --- /dev/null +++ b/App/Harp.Behavior.Design/App.axaml.cs @@ -0,0 +1,44 @@ +using System; +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; + +using Harp.Behavior.Design.ViewModels; +using Harp.Behavior.Design.Views; + +namespace Harp.Behavior.Design; + +public partial class App : Application +{ + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.MainWindow = new MainWindow + { + DataContext = new BehaviorViewModel() + }; + } + else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) + { + singleViewPlatform.MainView = new BehaviorView + { + DataContext = new BehaviorViewModel() + }; + } + + base.OnFrameworkInitializationCompleted(); + } + + private void NativeMenuItem_OnClick(object sender, EventArgs e) + { + var about = new About() { DataContext = new AboutViewModel() }; + about.ShowDialog((Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime) + .MainWindow); + } +} diff --git a/App/Harp.Behavior.Design/Assets/cf-logo-small.bmp b/App/Harp.Behavior.Design/Assets/cf-logo-small.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3d701854b9dc6460262d0b77d24f6e25630354c8 GIT binary patch literal 26930 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 lc>TXzrsVYfeeZ&bC5`CstW6!-uD literal 0 HcmV?d00001 diff --git a/App/Harp.Behavior.Design/Assets/cf-logo-white-lettering.svg b/App/Harp.Behavior.Design/Assets/cf-logo-white-lettering.svg new file mode 100644 index 0000000..dc288cd --- /dev/null +++ b/App/Harp.Behavior.Design/Assets/cf-logo-white-lettering.svg @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.Behavior.Design/Assets/cf-logo.icns b/App/Harp.Behavior.Design/Assets/cf-logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..d50056d450a168407f37618c6bba1f7d7ae23e55 GIT binary patch literal 88286 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 literal 0 HcmV?d00001 diff --git a/App/Harp.Behavior.Design/Assets/cf-logo.ico b/App/Harp.Behavior.Design/Assets/cf-logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..7f15636aa159d78cfe186b9c71e39c0ba410b6c9 GIT binary patch literal 307515 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 literal 0 HcmV?d00001 diff --git a/App/Harp.Behavior.Design/Assets/cf-logo.png b/App/Harp.Behavior.Design/Assets/cf-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..007e30e807393c16b4443df31617580818d9b290 GIT binary patch literal 15303 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 AMgRZ+ literal 0 HcmV?d00001 diff --git a/App/Harp.Behavior.Design/Assets/cf-logo.svg b/App/Harp.Behavior.Design/Assets/cf-logo.svg new file mode 100644 index 0000000..08e8841 --- /dev/null +++ b/App/Harp.Behavior.Design/Assets/cf-logo.svg @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.png b/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f8afc50ced6d5ce389af00e2a767a1196f485b79 GIT binary patch literal 21525 zcmXtgWmp@}*Y*Z?m*6ff7Tn#vh2ri|+#P~LaVV}oDA1PT6n7|6T#9RPcegkFKiB&q zyPND>GdpL_9=q>J%sVxCOf*t7001x*6=XC30CWYr{tpEScI5o4>IXZax+v(m1Aqwp zzYhq}X^RZ@BZ-Hsu7{?xwTHKvn-$>g?aglIWbbZa=3>R}>}Hd5B0>slMES4L2Rjc3 zD?nP##MaEs@?UEccW3MWogJKQoX4zZVEs}9iZYTPd~%QSyaNpWEDQvXH>VsQ$x_p# zdsfLIg?}N?yg{i8=jw^%GGKmZYiFYLrvCGLeP%?oJObuoME$}f1ZJ`xjN&)%6cnQS z(~juFRcr*jSXVCFf)%hDJgWj2lrIMFgT$O-#@cs%1FZH1cLm3(ts|xWd&f-h=_P*8 z5s?5b0`~2S+-idG-xU~O4y%OSMEeCuka+yN#f${}E@b)Fj1xG!YJmGC<(@4Ux&_hA zCJv2~p6VY__>NfYtviZLx6(>_!-mld)=O2gGvHB$gAQya*XTM(J0F((8*WM>P|z_x z-;kR!TO0e07s!Vg+5^nN&7(?a@i$f>RinkBbSX>LBdotti+q3G@;u5C=#kn+9V0L|kYIB{V!4bjhj->0(^gE)Hk&zj^E$RICz}Wy^jF?Z}w`Bde9x&)U0Q~Mdo%I&fev{oQ_?70j>)tG+Swq z74xdW(vV8M-{ini^?x0FIfBVSR~$d|1i)c0FLdj%MRH+@bb7|5s?l^8l$n{E^Uu+) z62|W1hXWg6k)(x~FzyV~4sDgS(*#~@4fRe{RH!c|Y6xXR65o1^nL-4TSq~E%!c>Nf z6ffJPcFFftc;edWFXO!|FqUzZ>0gZO@?c7;^bUJjIq4-AR7CiGTBPi`z-m~!jA`x< z++TGZ50z%i4;Vc-z+6%DgJE|232i>_!@Y(Y)fMtBQ_5}VTgp9cq&*1Z1LTO`NgdtL zWPk8(XUE$4=Z@frnSj>Jmp2$u)Q^Iw1%$l2z<~K`i0SJ{^!~ZhVez{w8$OjZ3`vj4EJqzPOy2E&HzlGk${K z%zM;%`jNX^Oaq-+ieb9H1kb>`cXjuG3+qG?xb1Gv9Fkafu)U%gUD5TJ@tq)Ec1&tK zkhV6A>A>GM`B<8ibSdq(PD-m`75Ptt;yxcKr(5%@M#-TABX9rY29kz?-mHBQRLvmt zv!ACDz|Rgq?&{;Rot-;_3y_|udR;obO+0Y4`nPI@8hBx9b#s9fT{(dwgcamI-A!Tn z4lNm!rws&b(F)-hn`(?N!XW9l|Cv(#Jv7EURhzkf(_Rq`Q#cG6KZgl!;Sc8+P&0;! zvS6t@J`vUNY4^iOVIw@OsPZt+2RhS$&Xn)hoQz5nPf2T?CeAEHu<63bQ<8XOw{Ivx zPP)28;n~AUYzeETxO2Srgm5sB{B)f3ZMfkxOv)2vm|4h<5=C{~+J3L0{ zJz6E&)<9BtR73Mjpx9dB$5C$LF0uBnnkM0>0lqv$hiSDf?Wnl#2T#}X^p3jwG!Y;v zsM2-47&}@j_2eT3^?I|y@$vDMerPz!nYub204z~N~Aot*C`Cje1a>=GWvz=)rr*h zr0}VdJaApq06>S?^A^GncjuyDf9U^e&^)Cj`8_}=FkPj8=~egxaW)!_I#V?k4)+;} zvLE{_j=@A81}&asXRtFImbIx!v{$$cdbAGb`{m)Mo)noLk78%ROo&;}dbgGqGGy8b z0Sn;CjVTA9S&ewrDNuyy7lRxH*35xiFYeQS^V7)T`?DC&=4cCPmQMS5#4VJWb;D$8 zgA!+5s@1m)%;v}Q$q?UM-D1rBK`beykcNW#6HFZtUE!g=HI^6GCt`_S1P&8+W09v& zSEK)KF?~=llRQwUxO)(|sO}0)UWuV3?LYKP!n!@))7!1CEPeWb*9-X=-e=V<^o)lT zK#fGRv{XT*!W95pd85T2sNts^t&40@&qlzUr(P(j|7 zn7&@0yWB#K#f!0q`+yBKqs*5gp8R-^DV>ZIVX(!vkDZRv0V_bbHT z9~7>ROO0Z+}jR6T|}2HGlJH#anp9?fCj=e|5+b7PMLUpMinXvD0L|)o}Wo&^~!D zi_9ostL*{$OC5D!@WE4;{{^`x4R<==zlk+&2e3c)CLfBU$-$ka z-O{Te{?*}d?@O0fvgOlh#E4PSa9+M)Fi+;|he6RLR7G14NCCur2~FthVIwGWAy(*G zHnS^3F7^C)H1m+u0)*>?)UDH1p=Fv&D@hgk6oT$oB&|EgVKza<)h|Mf#OR<@(lOXv zRmuKUF#uyCe$d1~3J}Pr=RiAnh;h1BqQ@)f?RT**8!;&5CqTPj&wUW&dqgm_N|OKoLb zJ@-zCgehs+R4mYe*rmqqk^j3d5$U-m+8(35BHJ&TgU%K?q+WVSoX9Gup+- zU3FAmbhHpPLaIX|PYgR;7_=pdWoatJosazxZ_=Ds5Y6lW=I6E$g9f%X2f*RKvi&$z zSI>lWUthX7PVC3To8gEe5CU@~Qt)@fd4d3f=d*z+L2iLqml>Q1sUm$tIpW3_)Ksqt za25O@+tObCN1RuNuZK(o?sW>69!M+cx3oP++rt^o`*#}ir)y~uH$;PhR7h}C-=he)o0KWJTx7?ujQ!osb; z#M0DT4glTC+uFROI&SR42OZR_-PI4@v1^S;-GS;h$J@f3KOM@^5{<-~u8A?PD1}0& zTM|st>zDUPoG}AH9LonvuGp7pqeGiX@~HoC$!04(mxmzk#$i})Vkb%uae=@*kq~VW zQ|psKs!U=L&$s43)UL{${I%=;$!p;1e(kbb*OWCX(|*INLN_K563^lGo1Z@!oHu_Q zKKQ_`B*MiRQZml?h={ZA$kE&{ND)=$QFnZ6HS&;{&l9RECobpqN zaW61@BD>8F00~@fqA}#&!!3NIFd{u$H9LSgcCs*NA6E%uTv7imw{x{U*2QP&&~ zW#GSP+29|XM5y}@QqUvAEqRbn`(bQWou%k27KK1kbhwdAvYg2D2DX_ePqI(lCOXJS zoGfmIybsb<1^f+!I77R@<}+?`&Sk%&xnTjgUADER*t6r_Nnk*u#kyf&VEf!}R+-$m zX4&;!@ZUg2HCziJ=%!hx=1rMM{u-P>t3=*qk>nGGY1spXBlQT4Y0YO_kQtLXg2bH= zInmdVOvH62*{@UQ&h7CM>R~>(+$Eq@vaH)_yGc&#>aqtifU=G(_s1bph|{rL5L|e3 zl5TgG0xdb}dU?bP-U_Kl_KF8N^b$SKM%+Sxi9} z5!Stq68fZ;uc{dbO{GJ<>`mZM%ZAuRd1x&K_Q~>EWn)qg6moAe&j(0G9UPRp@Siv% z$wfWA>;qyWB=`bCOi7qPSiZS+`Eab-sYSV^5MMrz$$=0|CFSO9^L0ovo!qICWm`c$ z)7B%1xz^Fhl23dfEz?!(!fBKzmw|G=AI9Eqqsg=B&bc5|REmtk&upp}kMQX@?nlHB z4{K_iJ1Y@N4#lW$RD4DZ%B>2a;rHUh+;ofJcrS`9*lP;DB7*lixvn1HC7YR_pV#=J zf2oVV>owYiiVP=Ty|v&Xux69;*xOxLM$OJpy@{2NGM5PE-pM%5V%Dp~BJJPryJK0b zV=_$gK9x*#CdV{wMKg7iOvs@C;9j~mWLrNVF=hb*)5~JqV#5a zibtdA@dV{A>b46iNO-MBVhVdO2|;R3w=0bI0fLn1k?CtIFARcCx9^y@+*e(P)lR%% zt{l)uIfDc8;t;qiW0^Ju|8L+q&J9MUlJI`nj>KH+*@RCFe|HB|E?>Udy)a}eYar2BZP z4$VhE0O#}*GKx);rl|A_Maw`7Ng)M#mJ4)xo)^Fx+)2QD?P&ab5O&4D?_Y(>JIWFg z=kJrUR%IYFooSbyw4d8ml2ETd`}gB0omuBPJ72=~y)9Re`W&&i!OKE+Wfkra-MpFi zSa`v&qDeU>8gwF71;oH^Wrb8K;vz$ytS89cTq^Kn^d~v{mKnJ9n*4$j7UW+h%ywvt zyw;1faqT7KH@MSXfNeQ8VhGIXp`rG)I2#uMp4bRmn;5QnVR8+6*kNs}q9vA(#l&)7 z__FR~#qx?u1)08(jrUmfe=e4UWo5^hc!9nH3)<7O4JsDRS_(tF+TT568|9WXw0`2_ z6XFj}Qz-h_%IR2O0SaYRas?+gW5d8XVpk5J7WS1i?!Q3<`!t~mt4FW8rKI>wzB+OD z*4Ch;(tSLI?w#DESRMq7G0vT_xfD%s~C2rD)!MG1UE#SGXgg?3^q?OR)P< ztu%OfsBoP6qN|F^q1-RS9S(^?AZ&2DZwQFnL;B((Ff7f`cqTA`*S_ip0CqjAyxP2Btzm2nEtxCVSZyc3&iKm^d`c)GBCW zYSfsdWW|-*_Yh?BU;lKi# zf<$s|3engJZ=RjhfDY6jzLk63%M1}A*0gOscvW~?2GR{qMk!V6p)f;Yw0W)q@8ZJv zG4n?D{8Tv1#g)ptu8QL?B_`BjGcO;n5_3*T{lFeNpV+kqFq;^xv`rqURpU6fHan$^ z^MkSn-rODZ2K<>88iMbXl#txlLm081FZHL?heaHY-pcHA*P>kwA;#`WOC7#GQ;-g{ z^+0Na^(fcqya3dosT0pegureH&!K%^eegsTRc}gOC>cm^=CO%p7W~*Z8qwEQrHK(9 z)x5-groeTtH&JC!t*A+4m!E(~b`>x}eL;_Dp<`yofkTC1$~Y+au^?6{xL9_@sK&HA z^n(KbEPVB){?c#yGo9R7Ee$jsdCfN|&c23>pm~^=X?+1h{o3h>I2*~^u2R)G0zGfk z9yy-BXhXb-w^0G`XSMk3RWKQEJ15^WaowrB{-uMT!+6-sbKT}RS;sf)i5F&8*&bgT zEQyc#1x3)p2re$F@K$7AY+v(@?-4mGtDo7}9`tW^TVUqRV)%iPlU>eiU;DW`v#bcU zZvFD7sZn))_>=k@f=tORyE8L&gaw(2^=_bA*oPb8@VSVlx&EYC44 zFCc9{=nk0{iu&kRfS0z?oc z+!Ye8xHbmQuof%`y#t0&YA({c>un2x90W`b8eUAKzOmSO-k7_^Nr`HDo+XkZ2q2d* zZM6F87WR#4s&_bt0!F`ddf`90;o z+2rFT)C&KPj*><6D9+nN@Bwz%cs;ivsLegDrv(YYg~V8~9p(mdqGdR^r1S`)?1vNYQY zmyoyFMOwmi+VNfu8#47Cun05AQgNdotaln~s_$(%=YjVM(OH_B1AAnS-Z3RxUQ8!Z z-c^^E7jW(Fb&jEB?VqhYN_m$^$3#oD1R-#bO+xi>3^xhvCqyGSMv??;U1K+Ueh#vR zCp3NK(E)F`H0hUWFrgN?N4wfG>V1}!6Uu5>{|UI z*qR^h2g0wrq(^*^<4y~ser08TjW(sPjn!?CRod50Rw6o+Rg|gBPTm?cH8bI5PwhY| z80Saf8%+TFFwnt_V!uS&S_a|n;LB6)arvL0+~TP`MqiCJlG=U>ma_c*;kmF_-~r5awEBGbF35z|(r{ zp3S^q0jNs`dG`wcQ?;KxvIF;9&S!`_Dx(K2Dwe@2&U~1DOIntq#kk>}oErv!Fr`6? z%*H95E9lfBB(e->s@6aBMV&#!GM%u;P&qMXCF0ym?DOCXp|CH;(fj2ij<)368nFR( zzqtRRc#`;WVa28@bvVzussJr%$s;L+v;L>mwsPaEkBsdfwDuIY@`{B-tvhZ2!_8s@)TO+54`g_h9KbQ2jhn}8siqx3XVhRJL)F@8)oschF;p6W;CGPm z;(KdpB)-TTChdraQnVZ4#bp2@=(EQ0y!}L;0qW8%W}V7!c8;`~Ufq}qhxW0{Tcz0Z zcFZ_SC%8SRQyGc4;&!_P1m$@XuRSHnYww5EeeFN40>GOs1JYu|W>+?DkrB2AcDH^J z?hV7A@uK_k8&9oe5}DE}98#sbR+=?{B@x_F4YoPsTgGGMCjLD*RV*f<6cQa`_SVgr z4_$g4+^_}ytP{<&ezd&|^b`ZeX);y6HqRYL!=xfz+oogEn0p@IFF$U4+__e(;rzBU zBha<5?wvKD#a%dNvnR90zN1^k6z5=Pe6ur}5l_}=7Wlq>K^f{bsu}!xql2%!n|oWq z67VA?wUv8kp*D4`;&Z4TD^f61w!*TGS@V(tW9nh=#+gc%k|;uvj(O>~xMuin)9QrG zaTkFqRf&%S9@Cl&d}uA1c@%Yzd3gi1+NB~1l;Z)Dw|O+p1~uEwB$=v%oO{Rn_I%yO zS3&+)?J#t}tk;L-u;mz@LFl-F3mTHOpsw4!bp^BltYjt7>gcPghD&ih>HO81sBbJ?b;!1V$}W zJg9=Vd$@h?&$A|BsfC-Nl7aV#{aKauthg5ZmCgaD85wGOvKAfj#o|GycO2}(`*|mE zf&f^|BDje)-Gnx?i@4u!GP4msMy8=3FD5mOb3C#7N9y{__s_o&@8jej4Y4B1a=u4THVsNo^27eaZ9LILax7?hIB~ zg>nnnN*?1RZKTx5RvmGK`LGY7uf8O>u$&HaV5(2Q2hjG;m$*Mp?O$IywVU_sjgl!( zT9wh`Y)t)m>1}cJe;Y1Rg7;A08&{sI6!G?f5wE8~4i1QZyYWPWZ2Gf7==PkE-RFEb zF1I%2o_a!9O`3AO=;Q?Z4nC??0N<0IDAo};`yPMyU$tU!E$hJttr0#5`)264>oM2n zaYE%Xc}!2u_TKl(KMQV?wfWB=gX{eWRR+oBB&w30ZL z?cFA%9+4J0UsHM=o;NGWM1>s<*KE+{>ZRA0X78{)RSv0XF$+`QmSBgy5-MkRR(=+d zwZm~?zD1F6O7k_E!+6M_2D`r3BSfV5qNp$s?QCsGGV3|O{_dYIKslpAPqyJ;4xaIi zLg&Y(6uWCrsFFz?N;EZzT~28GWtmB_HjoEfV2?1oWazqbUO&Toy*i7(nCHHL_Iy0< zoq<{B+9dTX496k43eKXIc%TG(;|}q+)6YhDSjcwxucSD_JG2h(JVm4>>FFj(YZ60$ zT!<}6K~yjCp^o-b@ZcpwQRY({hQdQ}_Ah^n0Kku&6lINBVx024nE2)T*UO~3(xgEX zxh?gRr{=L)1H*gimJX&*hqy)h$W=5T)_x>@&T5l?G z4pN4iv)sBHW*~dNs>PG)_AnnpTT9wjePwUcPM{2TZ<^ecr*n+F-A7ovy@a30!IY0Y z%~+Sh?TK5-O|wp>NXbm={3l2j>H~JMN-XjPr_DVp& zNA*ovLY^PB6tI^S;!Fr>IW{|{XOB^%KQ%3RFVECp$a9D_xHDK1Vp=%lLP)w~v}bIh`~tGm&0@iY0v; z=$cNBYkcY~koLlNM0e$hau}Ah=93v?!dUdPj~wOUc^Bkj+l-d6!Z>Vzw9nQcv*%4wQc3DPNQeZjX(dtM+4CHN~=yR{7*DTDCGLKxK1_WNV0dGMye zNK{ylcy+!*0e8_@Cm|h(=Z{gr;)X2W6*R2O`kU?Jda)ZwzA5Na;pZpNZzeR?eCkm3 z9A38pZLu^8;nNeU7xoZJxJ^N%XIz(q0xamc?H8Jt4?_e5KGfs3yj`6W zU~2{bOwoNgsB=iHwMOVy+5+6hKJyyPlzow{1yqev@^e;5M?r_UOB zwvOmGo_M4Gp9^4m+i!c3#6XqygIO|*Mxk8OUKmzGG1V;jj!|ve;JN$e0U2F~Z5g8{ zO?H(XG*U-lcJ%l1{?qa85vjHHw@E>u#Zli(I>%BdSpu=K`UpjFe}=9-Ppi~!vB55W zU{lfMigvRMf?f%j00>rr6 zp5@#E<3&Az>O zs6z(_yV}o__#}4A%d1|_{EM02L>ZUb@#%#>11*>m-dySUcTYZCHESu6k%aqkQNNrd z`7@WMcGC?P@Nl?C#qoz%Hnu_@QxHPfqnYpq2rrIACwxdP?=`!}gAaWb(<-#}Y4^4~ zH?r0!D15!>q}4bY9<)F|NO`?J@Y`gdF-Z-lJ39O*uMT zN1s&sc!G$rqFzJ!4p9_E!ccyiVt|TqyUNlF2UMmF7w+Y<-jppPvKgg%un1!=|5sBV z&+yHOB;7m85m&TKasNuC#lX~)_7L^1*bE%}2U->8D;^2~yCG!Ga!tB*`&4L^8lNTF(9VwC#f94oA! z1K7y6bl`H}AxZQ~pOvUwVcdP1#{l$XtK@jBYFF`*G5XfbRD>HT%!g2tzN8P`x>!*B zv2i}ggcb+oh@F+C(Vp2|?akVUw?FIkQI>4V6%3@f7RV zQ;Cs*L^~f(rwQja34}Q<|4(73F^qU?Z>liaTH#{cU?M1}#4ocv-z zUV50Vcm#nXuXYX$Y$xO{Cp9jF{o~#cV4*-MT4z6hI{R&9l~}~VO*@m~wkA}o5WVp> z{{Kd)M1lU!ui`KDwJ6vR(q!#zdi%kN1f%Iw{RbHBD58i3j*sT9#JVqi$1RpwIF#j` zf7aKg9_)YQr1=xvuM%a+W(LC=sf9%jxZi4-3b`$ZSUBJOV>&z*(moIJ>tw8;zVn*W z_%h5E_V{i|{NLQKI1mg!v>d!SjJo2UBt$0OE_iUUiCX~A$Ln&6?&G2B(p3vyxf5*ea;P~)6RT+e3ge*o`jz$CGX~1vT&|W-OwM-FB2Hs~6N z3ZEDd=1EDtl)+tS$1j_y9ET#JYY--t%&Vc0^-F5}{YXn5*)yeO0K8;Sw*-E(3;MwR z{9E$foI3r4DA2+oI@-jV%@e%K;{XH8yW5;ulYJUK3%w;Mk?FG6+LHD=eK8?cv8o!? zz{+2++eS}g^=#aH;I;p~>~2)k4)GlLCM_L#PR(sh*MrO4cGE`<9ZMN`g<)iv*Vosp zZhLwkds<$C5gv$_!R|oHapE5sn+1kA^Ym)~Wf>as5k)g7VqQ^%KnHVUp{I1z=~=#5 z^DE*2>iO=cSOoU(^(w!*=*Y3Kohg=|@W3{=0elyLhw60p&%`n6i>rW+3tY5_0F0Jz zPy@?9>)&(ZRVS#H#rNi3;s3UR;@I*c(PVvXO)7MH(&7rng=~Bowmv86ctcG5DyF1J zuHvgJgMUuB5yGRZm7F41d&iXJ{n0IZ{jbkGJ^ix?T2>~|D3igeSNrXmYGcvGQGuV5 zCdC@xVb9N|7LjZ0y{0y9kIF`b{Y(xmMi{b4&fY zQSSF-JlD7S-U7e&xKnZ{-f5Ejj6I z)~|kn(a5=HoPM`k-M~im3{X{yI01xdW!wB(cBJY4pIR3C^90K%)*Lh+ON(C#wj~8M7~Q;?rod zg7;kdX+C@sYv01(F;1zq@9jFCuKBzly(_)eXRvIE3a*j<`=@qyyEW3)O#%CfIXil7 zap^nr1FDR$P?i~pYefxTkzNdAzuz9Pp8sTqMpSGpoXVt5$=K+G$px9J9lStkF8x*8 zv1b=T3^%wjcY3Q@^g9Gr(EkweJ?U(aM&r|eKo_a=%+&tRua(9`u(Up1`36P{VJ#AZ z)0g$UE~5y;U%^3(@YJN=HkDHl-FK6_5RGg2V7g2~bEWDCrnKYg2t zTd1cw9~;fMm*;gp!0%>4cv#8Y8qQdVM?4I@CVb0kfy}+J#5vv8nX$$4fJ+m+?tmk1 z%P&_LMHh3I<+O`N){mX#ipeGEUIF|B+(bbYDf`>HQ*CuPD?Ke8tq6ItT`B;+8I?~1 zLHI7}oqQk9+OgAEp_!q~2vfsrj^rbbsW(;!;`)7_v6;SH`Y!3sm)Zih3pjy6$r&Xm zu~$Gh?L$7}HaIB|sF3vtvCEEWdpLa9M2I_j5aNDjf`xx$-p)_Vak0?(V%Hvv-k$X~Q_Mt7V z!XR`GR7_cc|49G1|K1RUKZ{07|m%>In)S`b@0HCdX+T# zjx`%1P17qt7}wdm<7=fys+uX7$5fU`#&799T4;jfg1TJBz@DNa9tR8ko7*}}rhT;- zw*y_oxLME-qcF%CPt}8NBbs~f*wQ{Pg_!7& zA+cF^-*&Pk4`Hmfj}y*@f|HPrDSYR5@8%L2`yH7_VQpSK2O$X@-G&SU_ImEgg77E5 zO%r>wL~v0d!lVwCj3fMF(;L@XlQMrR5;zc^yPa`1GXrV?V|ePAw$;3&G(#2NkKYk( zKd$;hQW1zTU2o*rwD51ChlEgrl ze8)O_>#9pt+uo01q6!MWwk?~00u{*W<8M#zalymT0`fe(>`N-tjit#UEf~sds;2OKCDQc)4eP@ zh&GGtOM|NTg9T}uJ5Ms0Of}Pw#|$eyv>$iFPXMd{SE>qIe_gQ^qX`64G3a>Gs6-+A z$&HKAx-Qa~%Y+E#S^U;D4DiS6u1kwGq>se9^O2+Nh)D9L zh3Gm7K22kbwI6K@zKG&0_ou{HI#q|;`gx3pnRK2sxyw~hiFgDP%(#By*wHIKIe0E? zdV*|Xf?90OX4&e5iO}CWtc7E4T3Z|Hg??K^@expM`d6M}-!dMEv!{q;$PB`D=0wKlCCO>(T(k}sW^O;Gf0vp?Ftkgk#W%Ub3y z9ke+x$jWRugt;F=1$xSX*>^zs{HLz;k7@65m|vVKZ0e=pE{^GQKYm4|c4pSio$@LQ09Agy_pKdT1je zLlnj)Cgg~Z6{BbW{dB;LwzJXe8wvi!ctu6zezL#qI*9dgF#H)PTsSm=YIezTyh~LJ ztTA!;&-V!VGV0WhJqt&-&MjQ?e*W{0T})g~_1Sq9Wz$1e)e$$Vpx=N|*4KG%8}zQ2 zkl`EM)eOvsj5BMfG2EV(bDfHI^f;-KQ|> zoR+8rc3whgFbOJyUfM_hkbR8AT5yGxvGWctqIx$rYE{+3l3J7dJa9@u zC_Tl;MDcPuf-zVm{elbB4dh=6+y9>XBj74NHHlQ4};Ww{Tt<+@*T@>HX@j`FbJgX%RGZ`Gg-!0&nGE8*G4$x5}< zpmbFl4bV@%2O3JMRP%&>ehPs%ybnS}hTp?m>TB5DMer*v=R}4o(AVO287xrE;Usxn z#D3&!zN}1|(#lO|+%`KR2$F1KT5BH}fk6nwafV@P0twNBW5P3Qt{$S7F~wp?XRT-l z8aNo=oxXj?a{NKU%(W; z&t~Aj01IvMd+)XVnV)BV>TtK$Ms|qQ7}IDoBuEA)UroU^*0e4RYgq}nPt7flPi4c}rL z+L`6U7ZogEj6g7oOP}vzvyP|!up+HV6n1*~2F^$F+8==0-~rzJY-zxb*rd9IH|;m^ z2isUP@Fv1#2f|UWib{3?w&LcFd0;W@5FrHaF<4B<1 zv=?v(^9UHkCSC|)OAVBvmq>+d4Xm?{`x9QZ{p0)Yd@Y-mKdW%;ZSR1a@k-4HQtoY1 zj~?WdJ;nLC+_m%$Mg^gga?#F!`wJ&@58Py;nd>aGl_riahq&?Qf+6|9p1h2}M7O(X zvD1cE2m?9Xy#qs>8~7_I265#X5yDL%h=Mi~LY?nVmqk!tA|K~6z}#-RlK_b?JT>ch1h+;dLI zC4lC6$s#z;B)c){6m3L^J*-{CauT8qO7?NEX~f`1s+82IXg{b5M;o4~g;#zV%o_znt>YOweB?Z534U1M|0=|o4m6cBPO z9T>QWi1ZACIvz>S-AnkSCK*I}=5)v)o=yzOPLcuw0v0*HXV=1_8%@H-*|GAJ*uw zTuYp~eMQ-ky|S{@1Z#m_a|3oCRN7nS-JG7NDtV_6cq6C8f`+Ys5| zfmgfcSp@q0FX$Nj%DolzT=P=;2jZQ+Fy*KrZCGu+`O#_gAKW%UAcplKM&Ybe99P<} z6BZveMb0v;O}HL*0T!f3qc8j)boddwX!+gh(gr;q-#^fr5ZA7TXH`@?iTvtnbn6e_ zWyYcUh|eR?**>UrokVk5@8INg;+L-4#~tkw-TtmDH;`JFcsUhe%oXfp-tT!9jSLH` zA}hmWw9}?L)Nu%p+-!&h-*~FwSgbTqlI7{)s%CaeSvg}9)a&oy%XNUx7T!s^QM?!S zlr50t68p^^pwh(WV1IN;JAa<5W&PXRD}(~GA-sAiZ!u-H<@%jKs}YMaRY>%*_q}?59|$L90PkVz~0izb5rW6%4VFTQ1YoX7yk zv3j~KoppH|tGg0Y2t|#}-TS0;W7JEz+eTl+enwm}z)tY+jdvAE1q%}OtA-2Gu;W9nSjjMh+Q zegTMbnr3fKLip3mbB||;1=Ia=i1||c4gaSHhWoqs!AQ1UjYTZcKOWonCoW$nU`2=q zlXMP~4#YU73qv=luBx@2<+DxYQdoZ1r@Xic^a~pIX{#CgdR`{!01h5a7Ut90yq!mC zUK0@ZNcXZDMs%0u~?V0vtn94=Ig@fBkeg*v>ujH-=k{GER0uxjmgTAA9I6qc$d-Ov|I|5D)Qj!p2nzP z`|{q+D-VXsVjMm+^22a(glabE)YyQRRwq%Vep8mD8buW_K}aL&Ql7W;Ia+2O5~P69 zDzts9vy#sN{9y92x2Nz<8kukIQZw?M9uzv$pF6QVw>po2;b)=n&;`1ql}8ifzXW<> zZ;ozvKYw#%I>OFX+%il~JVJl@9H%So075C4kLTPxOIkafmt_BeJSM-JULFQog^#O~ zY=TfG3j5YP@QQw)9;=gEk*&+o2bSZxI-3J2CYP^jUi&RDCR>`z*breA*qRxhHFT2x zwaez;S!cY^{2#L--;$hI5zQzRKX9AHAt8XBScy$`d1%`fM{||(j+ZGvbIgI65TE<$ zsEz4$zhpu<_ihV*^Vy70MEigI{#%>a0=8=n)`bH!kS@n4Ea-VCiP8r#$rC{cE}Tk6 z<&t-4i062%`io{st7DRCHYvCJyEzlai7a12M%L(G=9s=!Ahw9W!Y}>wl$c0iOddzs zJGYPWTBxoJ_(7k8^}qMA-(~NI&f=EJjuEkmTgL~T)7jy+OdomFzu-b zAlm^bCPbX_Dj>767aPQ;20`r1k@ zzyUSt28gR~=_l}$!}puu<7H^eVH;C$L5bZ9_96t~mL z6rfZvjspAaJZts{P~6=mgZZ%Vr+yKfgb^mzV;px08IG{zxkB!X)}=b)(Fjcsk!lvb zi(r`M3E}@j5gAkd`)=n%__BsISn=$uofzp<{3&qr!0mz*Hioj_{}H19p4(RH#SgiS zI$uGk)a=Gv36HsJATa<_;|Q~>;m-=tPkKLVaT(Z{-;%+#^Ql8dgz{AikQdmJzC|%_ z!>&qCP5G0iOM8yM{etbg{EApD3(2EQ91v&kHuN=1Iy7F;aCt#Y-J3n`Smqhc?UDi} zruI+9CnNS|3md;Iogn(?4-Lv(?2YsYUGz?oSnG2#=M5-KNq2AQ&=h;236 zm5X$}F-qh|!efYi+Qg5NPg-rm&O|;sD5JA1(MjmM^*`rSU#@p{J}i1SUjth&Rwz8k z_+5{kP4RDcp9Tt>#=exDJPa|ChJD9MJ*;$Oxs>w&NezZD#FLOES(M#dsAbq~?n*1d zKpb?Olq>^YH&_0yC!x}fsrGtBJ;DM}T%I1k5^la>F6 zq8divahD=vE@4BH#`C#Az0z?5U(N`nhZVYv;Blq=T|3|=`Q=ht9@F@07Rq{71r}gc zr6+n!843hi;4pMN>nU_qRLW%VcTk<;eT88OAgWKj;$Zz>53L7oWtOf+r=L^P%MHt{ zi03{}!9XAtJ6urA<>`d#v>|F2CvV&rN3A9-;&p}r8aH;v=`>qfPO5cj^gA-$KGwwO ztew%&K|cG?kV(v-*BU3!J=EmLNL|(8q$<2ktfn7)8M2}0g#=eWm3+MYa%z86-rXg; z@14gxclCB6x)5DZ#9h-3Dpim_jvw-28l3&mG%k~x+=cC*gl&$-edhaMGx9l{4)HQy zB@?S~aial~IzXi>05TrWn0iVyscS{HAhI7@HZ%M3WAsooE3*SB0!bW} zMOiLWLjy+iuNaohu^7h9;6q1Vg6)uK8Ar$C!EULz`u`Vu5`^u5QA8vK^9ET}wWiQr zc(F{LJb4(mw2Vz@nw3hWR<)Nu?Q4X?;jyBvZJ4mE4U3m8Tie_El!B>Kr&cvLH;=B8 za&X$?S?g3SuCG&HU+>+#YSmaKs*zPyn`)!c_1Q)2c1PI_Isnl15SYIHRIs=P;3;Jn zSUTDO+ygEBtH7mu?My;CRW2HsD1)w0C=~sMij>3SYa#jgQUAclBc_7*4D|h0tn0yi z3xo{utdW=Uu{*5jZG{vHg+igoN7*A3JHppO0;B!`;2$)1-M(P$5-`s~0X34#3%v`- z2Qj4W?|j5gPOba;11$jF1^8_S7DH+g52e=%%i6F-(_9x+7&dHJe|`oEg+j4iQ4yDW zUIm_8Hyo{E7C@%~JOj=_I^}>t_y`hDfwV_>)-cBukYHV~zK^@yTS0h=EP5E#+6$3L zq>xBZg+ifF^mBUMpm&5`{9*_;S09Q@{owro>;~udiNz8JFdsy3LR!!A38T9!SOB0; z8}tp#_!Db%XFMKv9mT6qC=`l;MV~V0U7^QU4~6FaDu{OhXbM1KfNKHlnEi2zI9~_g za{wyKMMwvYMbu|?&__d$cs06zqe=STTkCn^*Qg<|`lPaE{^pr_UhgXZ;M ziyVf*ViSaA@lm78l5W$t3_33pLVR;+JpM*+Yobsn6pFq4IjHhdy|Isy{brM zdET2&pE*!+VHFC6LQxtjlD4KO4Gey0DN2-?FzEL)DFFm!@x&U;Ix685EG+Q(R-P$(4J8ES{#mtp+WOqff0TMdOm;Y@vfy|-!g>aP(rgGufLpoWRo z3Q21K>(gjM!(w$@rl#qW=)mjZb0M2i%#B04#tdAU1$lLSn`L zw|DQsaaH#nz`x(KyOJLmV+Z39d3EpIyNeW<5<-Ou83WPnNR}?@f01T3z|5nlqzLGBF zZl9&$D+NFUddCvT7X}9hi|rnVI-)EGu%e0j<8_Hj;=#%XF{ew4)N^`_netep8Mm8wsl zp?9X8*+Svp+dT-S0G@BGY)g8HPqlj_t(HoqRwaYrTUIa#!I{mpm16mO1Ws?Xz6EzQ zKSHINqXE4W5qIh{H`PJ9LHSM?1b^7>fwaQFz(6eYg6pMNdKrR0L6ZkSg<*ICD+fq5 zELMtXKv%O)Z@G7#gJR6)b`L_SNl3vzh4FAOGm;r<_h6VSb2cNiPP9Tdmz&lv38w+ z(+=hUAe4SrJQwhuY$5ljdWTK5g9h|YW7)AQfz^@A8un+i*M>*I5qa z^Z8x%t0^@*c8!eeE(4bW_&--2L#&;{A$1&~xVGTQ$jHcnIUS5r6X*=RlMrdWU8mYD zm&@%*`N6{iY^YW)klxw6eh>u57?Fzr4iNYtz*U4S6`%{?+o0^Ha2T+^6p^21hKHZ6 z_3x(N_k*HDLI5Dq=c*^fhe9tr9FU39fpnqpOlnPPjg8p;!><#oTz!OIc>d(q8cnE^ zNF-KAti4#swGf^J$T9#i5N|;6I=~%bxg|T2-7X@wkv~^%%>UU+42V z0O<3)M2V5>2)h>GDgb*(Y%P-yOw2=&^!;;0B2#t-m@czzXlQ8f;d;qrT*~DuY4H(I zdMbGeI1J#|Qs#Y`k<2e@yceFaxJoE%A&3*`0`NK@J4NJ2+2P@z=x60r8qhn40Qq*0 zL8%IP3GSub$IQkR6N$uXW9`NW_-TM$6UH*(2Dgm=H=YHDMA+*OrM$!!hYHz;s`XnG zUPanlD!;3>JY6=D6R%`)01}86FD3X74g3fs?GuwbMV&jLVQ+XEX>T&bB?6kt4?7`N z9sZ^KK8jYIkT*DAx|W29X=xvz3rP6x0p9*?i=ibU=rcm)Ad>F!X*BKa)<>lu+7LN9nc zYD*h-jg0I*)Q9JJD`Mnb2D}o0;gpcgvq^qF^t{0^9&V`hrC=e_Tkajii2F9DQgg`) zm$}Law*2J3r04y%v9bf;AEPoGYaEdh%7dYw*hKP(`AiFfU{UBNzCmNRg7`f&{(0;P zxM{@me;$V62{Ro>=!NSDZU(T#QH5nO4F%3r5PYON5`Br_CsF6;A@RFq6MfG2{o{ek z-+>s-ivX{x*B0OaBlel3?|-zBaV-=_%wPV6Kp^|uJqD!!fTU|t90Yi)mDfrn5+2Ac z0FIwYKZIPJ==J})MZ=m^p69KIh&(~ab(sF=@JTG&t)b_gH-n)pC++fFho{$E zt^?rJtO0yqMC#s^5%6wQ&J$?XxdLvTX3qN_mgV!)Xg4qEGjyfYVJ8H^DFQx*8ejHB z#_BCOloTNp#$q0W1 zqFW&AL3|4CMGS}U5D4(D5qulqvk;6*M9zcYS~%|_$VC8dZE%e9ng(>G766ubwC8z; zPeNNv9y4Z4mnoNz0(rCuPo}{~A-D{+bDQrqu~^H3C1Ey5^*!BVfP6fY&sRI7=+0CS zd|3p4QN2%lA|?cMYjC@@_U{28#>mxx+)=Ha5Lc9}-E!#n(P-2Hz)(Ja4}il*87G6_ zM-W_Et&4O%SM#oCzwZYERvmYx2aE{J=Q4%Nd*0)CJif9!8og~i_k1zx{+cYAP^M*2+;R!E3 zn)Lnu1o()f(Lg*NU#wdOHJ~fCAkf%tu?dsz5&&Zb7+*ui@e@?*5y98e6SgMJm|zQu zy#k&*z5@E_%FEo8$>*FW4i-i3iaG+LOj?DX%jFINI0yhK-#;LZNusgbS11(Tp5{-| zkRr^Dgt%tfdBh@TWzy*>$!SJLM&1H&P0IHR0{(5a#)Nz(kx1O0&1MTt4@~gQbRl=` zgjaq6;0HkvG`pkW*-W8uO|>m$-R~~_>cJ)ZZUX3vJ7tMP)@R-u%mD!De13D%4_*Rr zQk8bG?(Xhm0WA2WKKcw@Db=X$D^|Vl?^@a6P$7H&P(Js$bUwQ-ozE?gLJ}lC9jr&UliOT&+4iJv~bn$6^;$4l|o-@(jIGEHbh41#*<5_^EWE@JzivL_|U_ zyp^yQR4b?O0svoXZe;S{3w!pw+gzLK#_ZU$b*k(JP<5-F08iCwNQ<|`^#tCOI(i}G zT+x88l&VR9=gW{!WQK=dX~*@$FkCJrS!;;X0XbuFtm_;Ai(T~v&eW`JWg%y{;t?UP z=fhKE3Yn*qe()-Q)sxGF7zo2~c{3+A3c0<}x^?Uxe>70bsH-3X)IKxb;2qavA(9>W zXFk_7pev=&^ulKv!yEcnRRt4^xVT z$e|DaR{%2%!LW_s`D`}(!dwlGq)GM$R|;hVfU||*v_HFvIs5X_q!q4$BJgT69TD=H z^X)OlnQOipTV%~g9E}pN{%w1r==yUlMWZ#_6V|#GG^z>>=t?aB*6^~)=b?9sRBvw> zdj59>(o7o9QB*#^rfjhz*qH&HFg0!&H?`%;f(KmRc&x~jJnOZXMW(5RZ!QF8l<9Km zzI`ouj=zxUDtDz++w}GH9cxYG2>|ti`4}Ki1F{j2^G3_16>!XIh4r(VwS{1xtB6H5 zwW!O~$jBzfywOZwsPSC8IWv3T_b*$fnKEZcXXr|)wkgF%?*y=14 zxr$_CE563cm&0+?sX(4=^o;az#kt(Upk|i_bfr{V2;jTQtT8pWQn6Gz1+JX);@*>N zgtZdm%xXaQMsm*qsJ^v}NQGWdHxGM%fB!O}-0Ui+n8%tNmOi(hM>L=-rP@MZs?IV2 zz*y@%4wNLzz)kLQbUCj{_v}?1v))#DN~9#peX^OTu3NUJ9InPike66LB6aL*S26 zYf@`csZ@6&kysmg!S%JqKOKykuM6PXp0!9Qo0DE}Z_4uyA41a8)3YQQ1b?tN*0lpf z)s(LQ0O2jOotjs5HeD2_lxhztKXvG|w<`Kd2S<0NeE(Je+snqpjKx`tV_km+;P^T{ zJIe{|agPV5NwhSA;`mI5I7sqt*I^^mkxr*aLNB-p#Md2FA|O61FrQ8O!F~XH7stAe zgVddTeLpjt`(CTYsg6uKLsv?*MP_*TIRSoNqlz!!CIPn_E6ozPqoWC1_`x>aa1i<@I|8si#f#TTJt^DGlj!YWRl~QdXBGwSs zqDFr28V-Q?M@QM}l;@pTtzi5J&xW>#0RW1{HPaYdO(G)k;rwR=yr%`-ZIOsMck&*6 zwJ>QwS4y?bP%gI>kSl6DSFR=lv1gWn>)|*PT^PB{)tHdKa;`dn8Il^x9^mYiIQuN_DUx2;LvHJWGfZ z1Xy7x`z)}>h&(@(&$sH_?!!`^cOuAh1m<`EiwOI_5c7IDf^F?M%%-oW@7PjobgcpU zK^|uXT_9c~u*Z@+=JEtQb>z{2-XIO=N-3o}nQmKakU{ZnVdUXiy@;^oGZ3YeQVWC5 z(3Mh3sd+#b#VMtfQuBZYbfuJ1Y97#lu9Q+r%>x?Hl~PKnc|ZfYQc5W`4`@JFN-3r0 p0S)L%DW%jrpaESerIeZn{vW1nZDy&I$^!rZ002ovPDHLkV1k4_*}VV& literal 0 HcmV?d00001 diff --git a/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.svg b/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.svg new file mode 100644 index 0000000..1896536 --- /dev/null +++ b/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo.svg @@ -0,0 +1,94 @@ + + + + + + + CF_hardware_sofware_logo + + + + + CF_hardware_sofware_logo + + + + + + + + + Hardware and + + + Software + + Platform + + + + diff --git a/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo_white_lettering.png b/App/Harp.Behavior.Design/Assets/cf_hardware_software_logo_white_lettering.png new file mode 100644 index 0000000000000000000000000000000000000000..e201b4ba6f6bd4f070a322d162d40fb69460b12f GIT binary patch literal 13832 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 + + + + + + + + + + Hardware and + Software + Platform + diff --git a/App/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs b/App/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs new file mode 100644 index 0000000..f91dd70 --- /dev/null +++ b/App/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs @@ -0,0 +1,33 @@ +using System; +using System.Reflection; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Interactivity; + +namespace Harp.Behavior.Design.Controls; + +// NOTE: This is currently needed because there's an issue in the ColorPicker control where +// the SelectedIndex is not respected on load. +public class ExtendedColorPicker : ColorPicker +{ + protected override Type StyleKeyOverride => typeof(ColorPicker); + + private int _selectedTabIndex; + + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) + { + // There might be a property set in xaml that get's overridden here + _selectedTabIndex = SelectedIndex; + base.OnApplyTemplate(e); + } + + protected override void OnLoaded(RoutedEventArgs e) + { + base.OnLoaded(e); + + var type = typeof(ColorView); + if (type.GetField("_tabControl", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(this) is not TabControl tabControl) + return; + tabControl.SelectedIndex = _selectedTabIndex; + } +} diff --git a/App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml b/App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml new file mode 100644 index 0000000..871761f --- /dev/null +++ b/App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml.cs b/App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml.cs new file mode 100644 index 0000000..829fd0f --- /dev/null +++ b/App/Harp.Behavior.Design/Controls/RgbRegisterControl.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Harp.Behavior.Design.Controls; + +public partial class RgbRegisterControl : UserControl +{ + public RgbRegisterControl() + { + InitializeComponent(); + } +} diff --git a/App/Harp.Behavior.Design/Controls/VisualStatus.axaml b/App/Harp.Behavior.Design/Controls/VisualStatus.axaml new file mode 100644 index 0000000..20d62e0 --- /dev/null +++ b/App/Harp.Behavior.Design/Controls/VisualStatus.axaml @@ -0,0 +1,11 @@ + + + + + + diff --git a/App/Harp.Behavior.Design/Controls/VisualStatus.axaml.cs b/App/Harp.Behavior.Design/Controls/VisualStatus.axaml.cs new file mode 100644 index 0000000..73eb13f --- /dev/null +++ b/App/Harp.Behavior.Design/Controls/VisualStatus.axaml.cs @@ -0,0 +1,21 @@ +using Avalonia; +using Avalonia.Controls; + +namespace Harp.Behavior.Design.Controls; + +public partial class VisualStatus : ContentControl +{ + public static readonly StyledProperty StatusProperty = + AvaloniaProperty.Register(nameof(Status), null); + + public bool? Status + { + get => GetValue(StatusProperty); + set => SetValue(StatusProperty, value); + } + + public VisualStatus() + { + InitializeComponent(); + } +} diff --git a/App/Harp.Behavior.Design/Controls/WriteMessagesControl.axaml b/App/Harp.Behavior.Design/Controls/WriteMessagesControl.axaml new file mode 100644 index 0000000..d94cfd5 --- /dev/null +++ b/App/Harp.Behavior.Design/Controls/WriteMessagesControl.axaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + - - Enable Pulse Mode - - + - - - - + + + Set Output + + - - - + + + + + + + + Digital Output 1 control and status + + + + + + - - Start - Stop + + + + + + + + + + Enable Pulse Mode + - + - - Set Output - Clear Output - Toggle Output - + + + + + + + + + + + + + + + + + - - - - - - Digital Output 2 control and status - + + + Set Output + + - - - + + + + + + + + + + Digital Output 2 control and status + + + + + + - + - - - - + + + + + + + + Enable Pulse Mode + - - Enable Pulse Mode - - + - - - - - - - - - - - Start - Stop + + + + + + + + + + + + + + + - + - - Set Output - Clear Output - Toggle Output - + + + Set Output + + + + - - - - - Digital Output 3 control and status - - - - - + + + + + + Digital Output 3 control and status + + + + + + - + - - - - + + + + + + + + Enable Pulse Mode + - - Enable Pulse Mode - - + - - - - - - - - - - - Start - Stop + + + + + + + + + + + + + + + - + - - Set Output - Clear Output - Toggle Output - + + + Set Output + + + + + - + @@ -1464,7 +1517,7 @@ - + Current encoder value on Port 2 - + From 871270acdf40f4771a04174926ae788243e73b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beatriz=20Louren=C3=A7o?= Date: Mon, 21 Jul 2025 11:14:01 +0100 Subject: [PATCH 04/65] Toggle buttons at the PWMs implemented --- .../Views/MyDeviceView.axaml | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/App/Harp.Behavior.Design/Views/MyDeviceView.axaml b/App/Harp.Behavior.Design/Views/MyDeviceView.axaml index 22185c7..50906b1 100644 --- a/App/Harp.Behavior.Design/Views/MyDeviceView.axaml +++ b/App/Harp.Behavior.Design/Views/MyDeviceView.axaml @@ -225,11 +225,17 @@ - - + + Start + + + Stop + + - @@ -282,13 +288,15 @@ - - - + + Start + + + Stop + @@ -344,13 +352,15 @@ - - - + + Start + + + Stop + @@ -405,13 +415,15 @@ - - - + + Start + + + Stop + From 0bedc0a3dd87fc7e0167bd1727076fa08fe9cc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beatriz=20Louren=C3=A7o?= Date: Fri, 25 Jul 2025 13:59:11 +0100 Subject: [PATCH 05/65] New tab item tested out --- .../ViewModels/MyDeviceViewModel.cs | 153 +- .../Views/MyDeviceView.axaml | 2469 ++++++++++------- 2 files changed, 1540 insertions(+), 1082 deletions(-) diff --git a/App/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs b/App/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs index 03d4aa9..43f11be 100644 --- a/App/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs +++ b/App/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs @@ -51,6 +51,16 @@ public class BehaviorViewModel : ViewModelBase public ReactiveCommand PwmDO3StartCommand { get; } public ReactiveCommand PwmDO3StopCommand { get; } + public ReactiveCommand ServoOutput2StartCommand { get; } + public ReactiveCommand ServoOutput2StopCommand { get; } + public ReactiveCommand ServoOutput3StartCommand { get; } + public ReactiveCommand ServoOutput3StopCommand { get; } + + public ReactiveCommand Camera0StartCommand { get; } + public ReactiveCommand Camera0StopCommand { get; } + public ReactiveCommand Camera1StartCommand { get; } + public ReactiveCommand Camera1StopCommand { get; } + #endregion #region Device basic information @@ -3275,6 +3285,16 @@ public BehaviorViewModel() PwmDO3StartCommand = ReactiveCommand.Create(ExecutePwmDO3Start, canChangeConfig); PwmDO3StopCommand = ReactiveCommand.Create(ExecutePwmDO3Stop, canChangeConfig); + ServoOutput2StartCommand = ReactiveCommand.Create(ExecuteServoOuput2Start, canChangeConfig); + ServoOutput2StopCommand = ReactiveCommand.Create(ExecuteServoOuput2Stop, canChangeConfig); + ServoOutput3StartCommand = ReactiveCommand.Create(ExecuteServoOuput3Start, canChangeConfig); + ServoOutput3StopCommand = ReactiveCommand.Create(ExecuteServoOuput3Stop, canChangeConfig); + + Camera0StartCommand = ReactiveCommand.Create(ExecuteCamera0Start, canChangeConfig); + Camera0StopCommand = ReactiveCommand.Create(ExecuteCamera0Stop, canChangeConfig); + Camera1StartCommand = ReactiveCommand.Create(ExecuteCamera1Start, canChangeConfig); + Camera1StopCommand = ReactiveCommand.Create(ExecuteCamera1Stop, canChangeConfig); + // force initial population of currently connected ports LoadUsbInformation(); } @@ -3335,6 +3355,48 @@ private void ExecutePwmDO3Stop() IsPwmDO3Enabled_PwmStart = false; } + private void ExecuteServoOuput2Start() + { + IsServoOutput2Enabled_EnableServos = true; + IsServoOutput2Enabled_DisableServos = false; + } + private void ExecuteServoOuput2Stop() + { + IsServoOutput2Enabled_EnableServos = false; + IsServoOutput2Enabled_DisableServos = true; + } + private void ExecuteServoOuput3Start() + { + IsServoOutput3Enabled_EnableServos = true; + IsServoOutput3Enabled_DisableServos = false; + } + private void ExecuteServoOuput3Stop() + { + IsServoOutput3Enabled_EnableServos = false; + IsServoOutput3Enabled_DisableServos = true; + } + + private void ExecuteCamera0Start() + { + IsCameraOutput0Enabled_StartCameras = true; + IsCameraOutput0Enabled_StopCameras = false; + } + private void ExecuteCamera0Stop() + { + IsCameraOutput0Enabled_StartCameras = false; + IsCameraOutput0Enabled_StopCameras = true; + } + private void ExecuteCamera1Start() + { + IsCameraOutput1Enabled_StartCameras = true; + IsCameraOutput1Enabled_StopCameras = false; + } + private void ExecuteCamera1Stop() + { + IsCameraOutput1Enabled_StartCameras = false; + IsCameraOutput1Enabled_StopCameras = true; + } + private IObservable LoadUsbInformation() { return Observable.Start(() => @@ -3605,6 +3667,20 @@ public IObservable GenerateEventMessages() OutputState = OutputStateResult; observer.OnNext($"OutputState: {OutputStateResult}"); + + //var resultRgb0 = await device.ReadRgb0Async(cancellationToken); + //Rgb0 = resultRgb0; + + //observer.OnNext($"Rgb0: {resultRgb0}"); + + //var resultRgb1 = await device.ReadRgb1Async(cancellationToken); + //Rgb1 = resultRgb1; + //observer.OnNext($"Rgb1: {resultRgb1}"); + + //var resultRgbAll = await device.ReadRgbAllAsync(cancellationToken); + //RgbAll = resultRgbAll; + //observer.OnNext($"RgbAll: {resultRgbAll}"); + // var PortDIOStateResult = await device. // Wait a short while before polling again. Adjust delay as necessary. @@ -3632,25 +3708,33 @@ private IObservable SaveConfiguration(bool savePermanently) if (_device == null) throw new Exception("You need to connect to the device first"); + //RgbAllAdapter.UpdateFromRegister(RgbAll); + //Rgb0Adapter.UpdateFromRegister(Rgb0); + //Rgb1Adapter.UpdateFromRegister(Rgb1); + //Rgb0Adapter.LinkToParent(RgbAllAdapter, 0); + //Rgb1Adapter.LinkToParent(RgbAllAdapter, 1); + + //Rgb1Adapter.ToRegisterValue(); + /***************************************************************** * TODO: Please REVIEW all these registers and update the values * ****************************************************************/ - await WriteAndLogAsync( - value => _device.WriteOutputSetAsync(value), - OutputSet, - "OutputSet"); - await WriteAndLogAsync( - value => _device.WriteOutputClearAsync(value), - OutputClear, - "OutputClear"); - await WriteAndLogAsync( - value => _device.WriteOutputToggleAsync(value), - OutputToggle, - "OutputToggle"); - await WriteAndLogAsync( - value => _device.WriteOutputStateAsync(value), - OutputState, - "OutputState"); + //await WriteAndLogAsync( + // value => _device.WriteOutputSetAsync(value), + // OutputSet, + // "OutputSet"); + //await WriteAndLogAsync( + // value => _device.WriteOutputClearAsync(value), + // OutputClear, + // "OutputClear"); + //await WriteAndLogAsync( + // value => _device.WriteOutputToggleAsync(value), + // OutputToggle, + // "OutputToggle"); + //await WriteAndLogAsync( + // value => _device.WriteOutputStateAsync(value), + // OutputState, + // "OutputState"); await WriteAndLogAsync( value => _device.WritePortDIOSetAsync(value), PortDIOSet, @@ -3775,6 +3859,17 @@ await WriteAndLogAsync( value => _device.WriteRgbAllAsync(value), RgbAll, "RgbAll"); + + var c0 = Rgb0Adapter.Color; + var c1 = Rgb1Adapter.Color; + RgbAll = new RgbAllPayload( + c0.R, c0.G, c0.B, + c1.R, c1.G, c1.B); + + Rgb0 = new RgbPayload(c0.R, c0.G, c0.B); + Rgb1 = new RgbPayload(c1.R, c1.G, c1.B); + //Rgb0 = Rgb0Adapter.ToRegisterValue(); + //Rgb0 = Rgb0Adapter.ToRegisterValue(); await WriteAndLogAsync( value => _device.WriteRgb0Async(value), Rgb0, @@ -3784,7 +3879,15 @@ await WriteAndLogAsync( Rgb1, "Rgb1"); await WriteAndLogAsync( - value => _device.WriteLed0CurrentAsync(value), + value => _device.WritePulseRgb0Async(value), + PulseRgb0, + "PulseRgb0"); + await WriteAndLogAsync( + value => _device.WritePulseRgb1Async(value), + PulseRgb1, + "PulseRgb1"); + await WriteAndLogAsync( + value => _device.WriteLed0CurrentAsync(value), Led0Current, "Led0Current"); await WriteAndLogAsync( @@ -3883,6 +3986,22 @@ await WriteAndLogAsync( value => _device.WritePokeInputFilterAsync(value), PokeInputFilter, "PokeInputFilter"); + await WriteAndLogAsync( + value => _device.WriteOutputSetAsync(value), + OutputSet, + "OutputSet"); + await WriteAndLogAsync( + value => _device.WriteOutputClearAsync(value), + OutputClear, + "OutputClear"); + //await WriteAndLogAsync( + // value => _device.WriteOutputToggleAsync(value), + // OutputToggle, + // "OutputToggle"); + //await WriteAndLogAsync( + // value => _device.WriteOutputStateAsync(value), + // OutputState, + // "OutputState"); // Save the configuration to the device permanently if (savePermanently) diff --git a/App/Harp.Behavior.Design/Views/MyDeviceView.axaml b/App/Harp.Behavior.Design/Views/MyDeviceView.axaml index 50906b1..80dad7a 100644 --- a/App/Harp.Behavior.Design/Views/MyDeviceView.axaml +++ b/App/Harp.Behavior.Design/Views/MyDeviceView.axaml @@ -19,6 +19,20 @@ + + + + + + + + @@ -76,67 +90,1037 @@ - - - - + + + - - + + RequestedThemeVariant="Light"> + Content="Theme" FontWeight="Normal" FontSize="14" + IsChecked="{Binding IsDarkMode}"> @@ -120,7 +104,7 @@ Margin="10,0" /> - - - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - - @@ -468,60 +397,50 @@ - - + + - - + - - + + Command="{Binding DO1SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding DO1ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - @@ -546,59 +464,50 @@ - - + + - - - + + Command="{Binding DO2SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding DO2ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - - @@ -624,57 +531,50 @@ - - + + - + + Command="{Binding DO3SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding DO3ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - + + + + + - @@ -747,43 +640,41 @@ - - + + - + + Command="{Binding DOPort0SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding DOPort0ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - @@ -793,28 +684,27 @@ - - + + - + + Command="{Binding SupplyPort0SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding SupplyPort0ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - - - - - - + @@ -850,10 +735,8 @@ - - - + - - + + - - + + Command="{Binding DIOPort0SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding DIOPort0ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - - + + VerticalAlignment="Center" /> - - @@ -925,13 +803,7 @@ - - - - - - - + @@ -948,50 +820,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - + + + + + - @@ -1001,43 +867,41 @@ - - + + - + + Command="{Binding DOPort1SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding DOPort1ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - @@ -1047,50 +911,47 @@ - - + + - + + Command="{Binding SupplyPort1SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding SupplyPort1ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - + - + - + @@ -1100,15 +961,13 @@ - - - - - + - - + + - - + + Command="{Binding DIOPort1SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding DIOPort1ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - + + VerticalAlignment="Center" /> - - @@ -1173,22 +1029,18 @@ - - + + - - - - - - - + - + - + @@ -1198,52 +1050,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - + + + + + - @@ -1253,43 +1101,41 @@ - - + + - + + Command="{Binding DOPort2SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding DOPort2ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - @@ -1299,50 +1145,47 @@ - - + + - + + Command="{Binding SupplyPort2SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding SupplyPort2ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - + - + - + @@ -1352,15 +1195,13 @@ - - - - - + - - + + - - + + Command="{Binding DIOPort2SetCommand}" Width="55" + HorizontalContentAlignment="Center"> Set + Command="{Binding DIOPort2ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - + + VerticalAlignment="Center" /> - @@ -1424,22 +1263,18 @@ - - + + - - - - - - - + - + - + @@ -1449,65 +1284,52 @@ - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - + + - - - - - + - - - - - + + + + + + + + + + + - - - - + + + + @@ -1519,28 +1341,25 @@ - - + + - + + Command="{Binding Led0SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding Led0ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - - - - - - + - - + + - + + Command="{Binding Led1SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding Led1ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - - - - - - - - - - - - - - - - - + + - - - - - + - - - - - + + + + + + + + + + + - - - - + + + + @@ -1685,47 +1490,44 @@ - - + + - + + Command="{Binding Rgb0SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding Rgb0ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - - @@ -1739,104 +1541,82 @@ - - + + - + + Command="{Binding Rgb1SetCommand}" Width="55" HorizontalContentAlignment="Center"> Set + Command="{Binding Rgb1ClearCommand}" Width="55" + HorizontalContentAlignment="Center"> Clear - - - - - - + - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" /> - + Enable - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + - - - - - + - - - + + + + + + + + + - - + + @@ -1850,8 +1630,9 @@ - + @@ -1866,45 +1647,41 @@ - + - - - - - - - - - - - - - - - - - - - - - + + - - - - + + + + + + + + + + + - - - + + + @@ -1916,29 +1693,29 @@ - - + + - + + Command="{Binding Camera0StartCommand}" Width="50" + HorizontalContentAlignment="Center"> Start + Command="{Binding Camera0StopCommand}" Width="50" + HorizontalContentAlignment="Center"> Stop - - - - - + + Width="150" ClipValueToMinMax="True" Increment="1" FormatString="F0" + Margin="0,0,15,0" /> - - - - - - - + diff --git a/Interface/Harp.Behavior.nsi b/Interface/Harp.Behavior.nsi index 756c64b..9202852 100644 --- a/Interface/Harp.Behavior.nsi +++ b/Interface/Harp.Behavior.nsi @@ -1,7 +1,7 @@ !define MUI_VERBOSE 1 !include "FileFunc.nsh" -!define CompanyName "Champalimaud Foundation" +!define CompanyName "harp-tech" !define DeviceName "Harp.Behavior" !define AppName "${DeviceName}.App" !define AppNameNoSpaces "${DeviceName}.App" @@ -25,7 +25,7 @@ Unicode true Name "${AppName} v${AppVersion}" -Icon "${DeviceName}.Design\Assets\cf-logo.ico" +Icon "${DeviceName}.Design\Assets\logo.ico" ;-------------------------------- ;Include Modern UI @@ -55,7 +55,7 @@ RequestExecutionLevel user ;Interface Settings !define MUI_ABORTWARNING !define MUI_HEADERIMAGE - !define MUI_HEADERIMAGE_BITMAP "${DeviceName}.Design\Assets\cf-logo-small.bmp" + !define MUI_HEADERIMAGE_BITMAP "${DeviceName}.Design\Assets\logo.png" !define MUI_HEADERIMAGE_RIGHT ;-------------------------------- ;Pages @@ -101,7 +101,7 @@ Section "${AppName} v${AppVersion}" FirstSection WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "DisplayName" "${CompanyName} - ${AppName}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "InstallLocation" "$\"$INSTDIR$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "DisplayIcon" "$\"$INSTDIR\cf-logo.ico$\"" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "DisplayIcon" "$\"$INSTDIR\logo.ico$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "Publisher" "${CompanyName}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "DisplayVersion" "${AppVersion}" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${CompanyName} ${AppName}" "VersionMajor" ${VERSION_MAJOR} diff --git a/Interface/Harp.Behavior/Harp.Behavior.csproj b/Interface/Harp.Behavior/Harp.Behavior.csproj index 9320794..89a92cb 100644 --- a/Interface/Harp.Behavior/Harp.Behavior.csproj +++ b/Interface/Harp.Behavior/Harp.Behavior.csproj @@ -15,7 +15,7 @@ LICENSE README.md ..\bin\$(Configuration) - net462;netstandard2.0 + net472;net8.0 true 9.0 diff --git a/README.md b/README.md index 64e5a96..9125f63 100644 --- a/README.md +++ b/README.md @@ -26,19 +26,8 @@ This is a multi-purpose device tailored to behavioral experiments. It allows con ## Interface ## - The interface with the Harp Behavior can be done through [Bonsai](https://bonsai-rx.org/) or a dedicated GUI (Graphical User Interface). -In order to use this GUI, there are some software that needs to be installed: - -1 - Install the [drivers](https://bitbucket.org/fchampalimaud/downloads/downloads/UsbDriver-2.12.26.zip). - -2 - Install the [runtime](https://bitbucket.org/fchampalimaud/downloads/downloads/Runtime-1.0.zip). - -3 - Reboot the computer. - -4 - Install the [GUI](https://bitbucket.org/fchampalimaud/downloads/downloads/Harp%20Behavior%20v2.0.0.zip). - ## Licensing ## Each subdirectory will contain a license or, possibly, a set of licenses if it involves both hardware and software. \ No newline at end of file From 4da584ca168cd751d2f33deee3dd1b3d763744ed Mon Sep 17 00:00:00 2001 From: glopesdev Date: Mon, 23 Mar 2026 15:10:03 +0000 Subject: [PATCH 59/65] Rename view model source files to match class name --- .../ViewModels/{MyDeviceViewModel.cs => BehaviorViewModel.cs} | 0 .../Views/{MyDeviceView.axaml => BehaviorView.axaml} | 0 .../Views/{MyDeviceView.axaml.cs => BehaviorView.axaml.cs} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Interface/Harp.Behavior.Design/ViewModels/{MyDeviceViewModel.cs => BehaviorViewModel.cs} (100%) rename Interface/Harp.Behavior.Design/Views/{MyDeviceView.axaml => BehaviorView.axaml} (100%) rename Interface/Harp.Behavior.Design/Views/{MyDeviceView.axaml.cs => BehaviorView.axaml.cs} (100%) diff --git a/Interface/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs b/Interface/Harp.Behavior.Design/ViewModels/BehaviorViewModel.cs similarity index 100% rename from Interface/Harp.Behavior.Design/ViewModels/MyDeviceViewModel.cs rename to Interface/Harp.Behavior.Design/ViewModels/BehaviorViewModel.cs diff --git a/Interface/Harp.Behavior.Design/Views/MyDeviceView.axaml b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml similarity index 100% rename from Interface/Harp.Behavior.Design/Views/MyDeviceView.axaml rename to Interface/Harp.Behavior.Design/Views/BehaviorView.axaml diff --git a/Interface/Harp.Behavior.Design/Views/MyDeviceView.axaml.cs b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml.cs similarity index 100% rename from Interface/Harp.Behavior.Design/Views/MyDeviceView.axaml.cs rename to Interface/Harp.Behavior.Design/Views/BehaviorView.axaml.cs From 729756efba2eeb110f4739835077394bab2e7b94 Mon Sep 17 00:00:00 2001 From: glopesdev Date: Tue, 24 Mar 2026 09:44:11 +0000 Subject: [PATCH 60/65] Remove unused package readme --- Interface/Harp.Behavior.App/Harp.Behavior.App.csproj | 1 - Interface/Harp.Behavior.sln | 1 - 2 files changed, 2 deletions(-) diff --git a/Interface/Harp.Behavior.App/Harp.Behavior.App.csproj b/Interface/Harp.Behavior.App/Harp.Behavior.App.csproj index 739a902..846b3f1 100644 --- a/Interface/Harp.Behavior.App/Harp.Behavior.App.csproj +++ b/Interface/Harp.Behavior.App/Harp.Behavior.App.csproj @@ -26,7 +26,6 @@ true harp-tech ..\Harp.Behavior.Design\Assets\logo.ico - README.md git ..\bin\$(Configuration) diff --git a/Interface/Harp.Behavior.sln b/Interface/Harp.Behavior.sln index ba4cc7b..4ac5e07 100644 --- a/Interface/Harp.Behavior.sln +++ b/Interface/Harp.Behavior.sln @@ -13,7 +13,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig Harp.Behavior.nsi = Harp.Behavior.nsi - README.md = README.md EndProjectSection EndProject Global From d82a2cbb17314c3b00c45130773ac5fc80f80063 Mon Sep 17 00:00:00 2001 From: glopesdev Date: Wed, 25 Mar 2026 10:24:03 +0000 Subject: [PATCH 61/65] Fix nullable warnings --- .../Adapters/RgbRegisterAdapter.cs | 14 ++----- Interface/Harp.Behavior.Design/App.axaml.cs | 12 ++++-- .../Controls/ExtendedColorPicker.cs | 2 +- .../Converters/BooleanConverter.cs | 4 +- .../Converters/EnableFlagConverter.cs | 6 +-- .../Converters/PayloadFieldConverter.cs | 27 ++++++-------- .../ViewModels/BehaviorViewModel.cs | 37 +++++++++++-------- 7 files changed, 50 insertions(+), 52 deletions(-) diff --git a/Interface/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs b/Interface/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs index dd8d639..b6c955c 100644 --- a/Interface/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs +++ b/Interface/Harp.Behavior.Design/Adapters/RgbRegisterAdapter.cs @@ -40,9 +40,6 @@ public Color Color set { if (Colors.Count > 0) Colors[0].Color = value; this.RaisePropertyChanged(nameof(Color)); } } - private RgbRegisterAdapter _linkedAdapter; - private int _linkedOffset; - /// /// Used for design-time data or default initialization. /// @@ -94,11 +91,11 @@ public void UpdateFromRegister(object registerValue) private static byte GetByteField(Type type, object obj, string name) { var prop = type.GetProperty(name); - if (prop != null && prop.PropertyType == typeof(byte)) - return (byte)prop.GetValue(obj); + if (prop is not null && prop.PropertyType == typeof(byte)) + return prop.GetValue(obj) is byte value ? value : (byte)0; var field = type.GetField(name); - if (field != null && field.FieldType == typeof(byte)) - return (byte)field.GetValue(obj); + if (field is not null && field.FieldType == typeof(byte)) + return field.GetValue(obj) is byte value ? value : (byte)0; return 0; } @@ -122,9 +119,6 @@ public byte[] ToRegisterValue() /// public void LinkToParent(RgbRegisterAdapter parent, int offset) { - _linkedAdapter = parent; - _linkedOffset = offset; - // Sync initial values for (int i = 0; i < Colors.Count; i++) { diff --git a/Interface/Harp.Behavior.Design/App.axaml.cs b/Interface/Harp.Behavior.Design/App.axaml.cs index 073c400..4d51a10 100644 --- a/Interface/Harp.Behavior.Design/App.axaml.cs +++ b/Interface/Harp.Behavior.Design/App.axaml.cs @@ -1,5 +1,6 @@ using System; using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; @@ -36,9 +37,12 @@ public override void OnFrameworkInitializationCompleted() } private void NativeMenuItem_OnClick(object sender, EventArgs e) - { - var about = new About() { DataContext = new AboutViewModel() }; - about.ShowDialog((Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime) - .MainWindow); + { + if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime owner && + owner.MainWindow is Window ownerWindow) + { + var about = new About() { DataContext = new AboutViewModel() }; + about.ShowDialog(ownerWindow); + } } } diff --git a/Interface/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs b/Interface/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs index f91dd70..3226da0 100644 --- a/Interface/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs +++ b/Interface/Harp.Behavior.Design/Controls/ExtendedColorPicker.cs @@ -16,7 +16,7 @@ public class ExtendedColorPicker : ColorPicker protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { - // There might be a property set in xaml that get's overridden here + // There might be a property set in xaml that gets overridden here _selectedTabIndex = SelectedIndex; base.OnApplyTemplate(e); } diff --git a/Interface/Harp.Behavior.Design/Converters/BooleanConverter.cs b/Interface/Harp.Behavior.Design/Converters/BooleanConverter.cs index 1772b97..fa7f57f 100644 --- a/Interface/Harp.Behavior.Design/Converters/BooleanConverter.cs +++ b/Interface/Harp.Behavior.Design/Converters/BooleanConverter.cs @@ -9,7 +9,7 @@ namespace Harp.Behavior.Design.Converters; public class BooleanConverter : IValueConverter { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value is bool boolValue) { @@ -18,7 +18,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn return "Input"; // Default fallback } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value is string stringValue) { diff --git a/Interface/Harp.Behavior.Design/Converters/EnableFlagConverter.cs b/Interface/Harp.Behavior.Design/Converters/EnableFlagConverter.cs index 6bc6b75..a308ffb 100644 --- a/Interface/Harp.Behavior.Design/Converters/EnableFlagConverter.cs +++ b/Interface/Harp.Behavior.Design/Converters/EnableFlagConverter.cs @@ -13,10 +13,10 @@ public class EnableFlagConverter : IValueConverter public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { // Convert from enum to bool (for IsChecked) - if (value == null) - return false; + if (value?.ToString() is string text) + return text.Contains("Enable"); - return value.ToString().Contains("Enable"); + return false; } public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) diff --git a/Interface/Harp.Behavior.Design/Converters/PayloadFieldConverter.cs b/Interface/Harp.Behavior.Design/Converters/PayloadFieldConverter.cs index a7d3106..21fe355 100644 --- a/Interface/Harp.Behavior.Design/Converters/PayloadFieldConverter.cs +++ b/Interface/Harp.Behavior.Design/Converters/PayloadFieldConverter.cs @@ -9,10 +9,9 @@ public class PayloadFieldConverter : IValueConverter { public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - if (value == null || parameter == null) + if (value is null || parameter?.ToString() is not string fieldName) return null; - var fieldName = parameter.ToString(); var valueType = value.GetType(); // Handle struct types directly with field/property access @@ -63,20 +62,18 @@ public class PayloadFieldConverter : IValueConverter public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { - if (value == null || parameter == null) + if (value is null || parameter?.ToString() is not string fieldName) return null; - var fieldName = parameter.ToString(); - // Handle struct types - boxed copy approach if (targetType.IsValueType && !targetType.IsPrimitive) { // Create a copy of the current target value if it exists - object currentValue = Activator.CreateInstance(targetType); + var currentValue = Activator.CreateInstance(targetType); // Set the field/property on the copy var fieldInfo = targetType.GetField(fieldName); - if (fieldInfo != null && currentValue != null) + if (fieldInfo is not null && currentValue is not null) { object boxedCopy = currentValue; fieldInfo.SetValue(boxedCopy, value); @@ -84,7 +81,7 @@ public class PayloadFieldConverter : IValueConverter } var propInfo = targetType.GetProperty(fieldName); - if (propInfo != null && propInfo.CanWrite && currentValue != null) + if (propInfo is not null && propInfo.CanWrite && currentValue is not null) { object boxedCopy = currentValue; propInfo.SetValue(boxedCopy, value); @@ -119,20 +116,18 @@ public class PayloadFieldConverter : IValueConverter return value; } - private int GetMaskForField(Type type, string fieldName) + private static int GetMaskForField(Type type, string fieldName) { // Try to find mask by reflection from payload specification // This assumes there's a static class or field with mask information try { - Type payloadSpecType = Type.GetType($"{type.Namespace}.{type.Name}PayloadSpec"); - if (payloadSpecType != null) + if (type.Namespace is string typeNamespace && + Type.GetType($"{typeNamespace}.{type.Name}PayloadSpec") is Type payloadSpecType) { var maskField = payloadSpecType.GetField($"{fieldName}Mask", BindingFlags.Public | BindingFlags.Static); - if (maskField != null) - { - return (int)maskField.GetValue(null); - } + if (maskField?.GetValue(null) is int value) + return value; } } catch @@ -142,7 +137,7 @@ private int GetMaskForField(Type type, string fieldName) return 0; } - private int GetShiftForMask(int mask) + private static int GetShiftForMask(int mask) { int shift = 0; while ((mask & 1) == 0 && shift < 32) diff --git a/Interface/Harp.Behavior.Design/ViewModels/BehaviorViewModel.cs b/Interface/Harp.Behavior.Design/ViewModels/BehaviorViewModel.cs index 49e8187..4d03c01 100644 --- a/Interface/Harp.Behavior.Design/ViewModels/BehaviorViewModel.cs +++ b/Interface/Harp.Behavior.Design/ViewModels/BehaviorViewModel.cs @@ -10,8 +10,8 @@ using System.Threading; using System.Threading.Tasks; using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Media; using Bonsai.Harp; using Harp.Behavior.Design.Adapters; using Harp.Behavior.Design.Views; @@ -25,13 +25,13 @@ namespace Harp.Behavior.Design.ViewModels; public class BehaviorViewModel : ViewModelBase { - public string AppVersion { get; set; } + public string AppVersion { get; set; } = string.Empty; public ReactiveCommand LoadDeviceInformation { get; } #region Connection Information [Reactive] public ObservableCollection Ports { get; set; } - [Reactive] public string SelectedPort { get; set; } + [Reactive] public string? SelectedPort { get; set; } [Reactive] public bool Connected { get; set; } [Reactive] public string ConnectButtonText { get; set; } = "Connect"; public ReactiveCommand ConnectAndGetBaseInfoCommand { get; } @@ -189,9 +189,9 @@ public class BehaviorViewModel : ViewModelBase #region Device basic information [Reactive] public int DeviceID { get; set; } - [Reactive] public string DeviceName { get; set; } - [Reactive] public HarpVersion HardwareVersion { get; set; } - [Reactive] public HarpVersion FirmwareVersion { get; set; } + [Reactive] public string? DeviceName { get; set; } + [Reactive] public HarpVersion? HardwareVersion { get; set; } + [Reactive] public HarpVersion? FirmwareVersion { get; set; } [Reactive] public int SerialNumber { get; set; } #endregion @@ -3080,7 +3080,7 @@ public bool IsEncoderPort2Enabled_EncoderReset #endregion private Harp.Behavior.AsyncDevice? _device; - private IObservable _deviceEventsObservable; + private IObservable? _deviceEventsObservable; private IDisposable? _deviceEventsSubscription; public BehaviorViewModel() @@ -3108,8 +3108,13 @@ public BehaviorViewModel() .Select(selectedPort => !string.IsNullOrEmpty(selectedPort)); ShowAboutCommand = ReactiveCommand.CreateFromTask(async () => - await new About() { DataContext = new AboutViewModel() }.ShowDialog( - (Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow)); + { + if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime owner && + owner.MainWindow is Window ownerWindow) + { + await new About() { DataContext = new AboutViewModel() }.ShowDialog(ownerWindow); + } + }); ConnectAndGetBaseInfoCommand = ReactiveCommand.CreateFromTask(ConnectAndGetBaseInfo, canConnect); ConnectAndGetBaseInfoCommand.IsExecuting.ToPropertyEx(this, x => x.IsConnecting); @@ -3169,10 +3174,10 @@ public BehaviorViewModel() .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(isConnected => { - if (isConnected && _deviceEventsObservable != null) + if (isConnected && _deviceEventsObservable is not null) { // Subscribe on the UI thread so that the HarpEvents collection can be updated safely. - SubscribeToEvents(); + SubscribeToEvents(_deviceEventsObservable); } else { @@ -5208,7 +5213,7 @@ private IObservable LoadUsbInformation() private async Task ConnectAndGetBaseInfo() { if (string.IsNullOrEmpty(SelectedPort)) - throw new Exception("invalid parameter"); + throw new InvalidOperationException("invalid parameter"); if (Connected) { @@ -5730,7 +5735,7 @@ await WriteAndLogAsync( IsEncoderPort2Enabled_EncoderReset = false; // Uncheck after apply // Save the configuration to the device permanently - if (savePermanently) + if (savePermanently && _deviceEventsObservable is not null) { // To prevent multiple calls to the device while it is resetting _deviceEventsSubscription?.Dispose(); @@ -5745,7 +5750,7 @@ await WriteAndLogAsync( await Task.Delay(4000); // Re-subscribe to the device events observable - SubscribeToEvents(); + SubscribeToEvents(_deviceEventsObservable); } }); } @@ -5778,9 +5783,9 @@ private async Task WriteAndLogAsync(Func writeFunc, T value, string }); } - private void SubscribeToEvents() + private void SubscribeToEvents(IObservable deviceEvents) { - _deviceEventsSubscription = _deviceEventsObservable + _deviceEventsSubscription = deviceEvents .ObserveOn(RxApp.MainThreadScheduler) .Subscribe( msg => HarpEvents.Add(msg.ToString()), From 19025ebcca10108543110db12b623f9839710933 Mon Sep 17 00:00:00 2001 From: glopesdev Date: Thu, 30 Apr 2026 15:51:24 +0100 Subject: [PATCH 62/65] Use description attributes for enum display Replace the per-instance Mappings dictionary on EnumDisplayConverter with a reflection-based lookup that reads description attributes off enum fields, cached statically. Declare the converter and a shared item template once at the UserControl level, and apply it to the EnableSerialTimestamp ComboBox. --- .../Converters/EnumDisplayConverter.cs | 17 +++++++++++------ .../Views/BehaviorView.axaml | 8 +++++++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs b/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs index b6bb89f..cb00456 100644 --- a/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs +++ b/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs @@ -1,20 +1,25 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; +using System.ComponentModel; using System.Globalization; +using System.Reflection; using Avalonia.Data.Converters; namespace Harp.Behavior.Design.Converters; public class EnumDisplayConverter : IValueConverter { - public Dictionary Mappings { get; set; } = new Dictionary(); + static readonly ConcurrentDictionary _cache = new(); public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - if (value == null) - return null; - var key = value.ToString(); - return Mappings!.GetValueOrDefault(key, key); + if (value is not Enum e) return value; + return _cache.GetOrAdd(e, static key => + { + var field = key.GetType().GetField(key.ToString()); + return field?.GetCustomAttribute()?.Description + ?? key.ToString(); + }); } public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) diff --git a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml index 65dc8d8..fe87fe6 100644 --- a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml +++ b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml @@ -15,6 +15,10 @@ + + + + @@ -2017,7 +2021,9 @@ - + From d99b152484192d084d8ccf3e83d6059041705c93 Mon Sep 17 00:00:00 2001 From: glopesdev Date: Thu, 30 Apr 2026 21:37:44 +0100 Subject: [PATCH 63/65] Declare DataType on enum display template Declaring an explicit type on the shared EnumDisplayTemplate allows the Avalonia compiler to validate the binding under compiled bindings without relying on inference from the surrounding ItemsControl. --- .../Harp.Behavior.Design/Converters/EnumDisplayConverter.cs | 3 ++- Interface/Harp.Behavior.Design/Views/BehaviorView.axaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs b/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs index cb00456..a9621d6 100644 --- a/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs +++ b/Interface/Harp.Behavior.Design/Converters/EnumDisplayConverter.cs @@ -13,7 +13,8 @@ public class EnumDisplayConverter : IValueConverter public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - if (value is not Enum e) return value; + if (value is not Enum e) + return value; return _cache.GetOrAdd(e, static key => { var field = key.GetType().GetField(key.ToString()); diff --git a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml index fe87fe6..94a7afa 100644 --- a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml +++ b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml @@ -16,7 +16,7 @@ - + From a62c4d35eb7f1a7e2b66109f375b6a049b76f1f3 Mon Sep 17 00:00:00 2001 From: glopesdev Date: Thu, 30 Apr 2026 21:49:31 +0100 Subject: [PATCH 64/65] Read tooltip text from description attribute --- .../Converters/TypeDescriptionConverter.cs | 26 +++++++++++++++++++ .../Views/BehaviorView.axaml | 6 ++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 Interface/Harp.Behavior.Design/Converters/TypeDescriptionConverter.cs diff --git a/Interface/Harp.Behavior.Design/Converters/TypeDescriptionConverter.cs b/Interface/Harp.Behavior.Design/Converters/TypeDescriptionConverter.cs new file mode 100644 index 0000000..c0b5c56 --- /dev/null +++ b/Interface/Harp.Behavior.Design/Converters/TypeDescriptionConverter.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Concurrent; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using Avalonia.Data.Converters; + +namespace Harp.Behavior.Design.Converters; + +public class TypeDescriptionConverter : IValueConverter +{ + static readonly ConcurrentDictionary _cache = new(); + + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not Type t) + return value; + return _cache.GetOrAdd(t, static key => + key.GetCustomAttribute()?.Description ?? key.Name); + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return null; + } +} diff --git a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml index 94a7afa..88ac105 100644 --- a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml +++ b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml @@ -16,6 +16,7 @@ + @@ -2014,7 +2015,10 @@ - EnableSerialTimestamp register mode + + + From dfdcccf3de2b604ecf8173604d0b963110fcadfb Mon Sep 17 00:00:00 2001 From: glopesdev Date: Thu, 30 Apr 2026 21:49:51 +0100 Subject: [PATCH 65/65] Use description attribute for encoder tooltips --- .../Harp.Behavior.Design/Views/BehaviorView.axaml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml index 88ac105..2abf2ba 100644 --- a/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml +++ b/Interface/Harp.Behavior.Design/Views/BehaviorView.axaml @@ -1947,7 +1947,10 @@ - Enable encoder on Port 2 + + + @@ -1959,7 +1962,10 @@ - Encoder operation mode + + + @@ -1971,7 +1977,10 @@ - Reset encoder counter to zero + + + Reset