From e584fd24ae588e25d6e4d652949eb492b0087c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Teixeira?= Date: Wed, 28 Jan 2026 17:41:42 +0000 Subject: [PATCH 01/16] Update interface based on Harp.Generators 0.4.0 --- Generators/Generators.csproj | 2 +- .../Harp.LedArray/AsyncDevice.Generated.cs | 23 +- Interface/Harp.LedArray/Device.Generated.cs | 232 ++++++++++++++---- Interface/Harp.LedArray/Harp.LedArray.csproj | 2 +- device.yml | 2 +- 5 files changed, 207 insertions(+), 54 deletions(-) diff --git a/Generators/Generators.csproj b/Generators/Generators.csproj index 9e36287..9323234 100644 --- a/Generators/Generators.csproj +++ b/Generators/Generators.csproj @@ -15,7 +15,7 @@ ..\Firmware\Harp.LedArray - + diff --git a/Interface/Harp.LedArray/AsyncDevice.Generated.cs b/Interface/Harp.LedArray/AsyncDevice.Generated.cs index 4df5654..cab6dce 100644 --- a/Interface/Harp.LedArray/AsyncDevice.Generated.cs +++ b/Interface/Harp.LedArray/AsyncDevice.Generated.cs @@ -14,15 +14,18 @@ public partial class Device /// /// The name of the serial port used to communicate with the Harp device. /// + /// + /// A which can be used to cancel the operation. + /// /// /// A task that represents the asynchronous initialization operation. The value of /// the parameter contains a new instance of /// the class. /// - public static async Task CreateAsync(string portName) + public static async Task CreateAsync(string portName, CancellationToken cancellationToken = default) { var device = new AsyncDevice(portName); - var whoAmI = await device.ReadWhoAmIAsync(); + var whoAmI = await device.ReadWhoAmIAsync(cancellationToken); if (whoAmI != Device.WhoAmI) { var errorMessage = string.Format( @@ -1278,7 +1281,7 @@ public async Task> ReadTimestampedLed1PwmRealAsync(Cancellati } /// - /// Asynchronously reads the contents of the LedD1PwmDutyCycleReal register. + /// Asynchronously reads the contents of the Led1PwmDutyCycleReal register. /// /// /// A which can be used to cancel the operation. @@ -1287,14 +1290,14 @@ public async Task> ReadTimestampedLed1PwmRealAsync(Cancellati /// A task that represents the asynchronous read operation. The /// property contains the register payload. /// - public async Task ReadLedD1PwmDutyCycleRealAsync(CancellationToken cancellationToken = default) + public async Task ReadLed1PwmDutyCycleRealAsync(CancellationToken cancellationToken = default) { - var reply = await CommandAsync(HarpCommand.ReadSingle(LedD1PwmDutyCycleReal.Address), cancellationToken); - return LedD1PwmDutyCycleReal.GetPayload(reply); + var reply = await CommandAsync(HarpCommand.ReadSingle(Led1PwmDutyCycleReal.Address), cancellationToken); + return Led1PwmDutyCycleReal.GetPayload(reply); } /// - /// Asynchronously reads the timestamped contents of the LedD1PwmDutyCycleReal register. + /// Asynchronously reads the timestamped contents of the Led1PwmDutyCycleReal register. /// /// /// A which can be used to cancel the operation. @@ -1303,10 +1306,10 @@ public async Task ReadLedD1PwmDutyCycleRealAsync(CancellationToken cancel /// A task that represents the asynchronous read operation. The /// property contains the timestamped register payload. /// - public async Task> ReadTimestampedLedD1PwmDutyCycleRealAsync(CancellationToken cancellationToken = default) + public async Task> ReadTimestampedLed1PwmDutyCycleRealAsync(CancellationToken cancellationToken = default) { - var reply = await CommandAsync(HarpCommand.ReadSingle(LedD1PwmDutyCycleReal.Address), cancellationToken); - return LedD1PwmDutyCycleReal.GetTimestampedPayload(reply); + var reply = await CommandAsync(HarpCommand.ReadSingle(Led1PwmDutyCycleReal.Address), cancellationToken); + return Led1PwmDutyCycleReal.GetTimestampedPayload(reply); } /// diff --git a/Interface/Harp.LedArray/Device.Generated.cs b/Interface/Harp.LedArray/Device.Generated.cs index a154781..0bde045 100644 --- a/Interface/Harp.LedArray/Device.Generated.cs +++ b/Interface/Harp.LedArray/Device.Generated.cs @@ -65,7 +65,7 @@ public Device() : base(WhoAmI) { } { 57, typeof(Led0PwmReal) }, { 58, typeof(Led0PwmDutyCycleReal) }, { 59, typeof(Led1PwmReal) }, - { 60, typeof(LedD1PwmDutyCycleReal) }, + { 60, typeof(Led1PwmDutyCycleReal) }, { 61, typeof(AuxDigitalOutputState) }, { 62, typeof(AuxLedPower) }, { 63, typeof(DigitalOutputState) }, @@ -93,7 +93,7 @@ static string GetDeviceMetadata() /// describing the device registers. /// [Description("Returns the contents of the metadata file describing the LedArray device registers.")] - public partial class GetMetadata : Source + public partial class GetDeviceMetadata : Source { /// /// Returns an observable sequence with the contents of the metadata file @@ -130,6 +130,156 @@ public override IObservable> Process(IObse } } + /// + /// Represents an operator that writes the sequence of " messages + /// to the standard Harp storage format. + /// + [Description("Writes the sequence of LedArray messages to the standard Harp storage format.")] + public partial class DeviceDataWriter : Sink, INamedElement + { + const string BinaryExtension = ".bin"; + const string MetadataFileName = "device.yml"; + readonly Bonsai.Harp.MessageWriter writer = new(); + + string INamedElement.Name => nameof(LedArray) + "DataWriter"; + + /// + /// Gets or sets the relative or absolute path on which to save the message data. + /// + [Description("The relative or absolute path of the directory on which to save the message data.")] + [Editor("Bonsai.Design.SaveFileNameEditor, Bonsai.Design", DesignTypes.UITypeEditor)] + public string Path + { + get => System.IO.Path.GetDirectoryName(writer.FileName); + set => writer.FileName = System.IO.Path.Combine(value, nameof(LedArray) + BinaryExtension); + } + + /// + /// Gets or sets a value indicating whether element writing should be buffered. If , + /// the write commands will be queued in memory as fast as possible and will be processed + /// by the writer in a different thread. Otherwise, writing will be done in the same + /// thread in which notifications arrive. + /// + [Description("Indicates whether writing should be buffered.")] + public bool Buffered + { + get => writer.Buffered; + set => writer.Buffered = value; + } + + /// + /// Gets or sets a value indicating whether to overwrite the output file if it already exists. + /// + [Description("Indicates whether to overwrite the output file if it already exists.")] + public bool Overwrite + { + get => writer.Overwrite; + set => writer.Overwrite = value; + } + + /// + /// Gets or sets a value specifying how the message filter will use the matching criteria. + /// + [Description("Specifies how the message filter will use the matching criteria.")] + public FilterType FilterType + { + get => writer.FilterType; + set => writer.FilterType = value; + } + + /// + /// Gets or sets a value specifying the expected message type. If no value is + /// specified, all messages will be accepted. + /// + [Description("Specifies the expected message type. If no value is specified, all messages will be accepted.")] + public MessageType? MessageType + { + get => writer.MessageType; + set => writer.MessageType = value; + } + + private IObservable WriteDeviceMetadata(IObservable source) + { + var basePath = Path; + if (string.IsNullOrEmpty(basePath)) + return source; + + var metadataPath = System.IO.Path.Combine(basePath, MetadataFileName); + return Observable.Create(observer => + { + Bonsai.IO.PathHelper.EnsureDirectory(metadataPath); + if (System.IO.File.Exists(metadataPath) && !Overwrite) + { + throw new System.IO.IOException(string.Format("The file '{0}' already exists.", metadataPath)); + } + + System.IO.File.WriteAllText(metadataPath, Device.Metadata); + return source.SubscribeSafe(observer); + }); + } + + /// + /// Writes each Harp message in the sequence to the specified binary file, and the + /// contents of the device metadata file to a separate text file. + /// + /// The sequence of messages to write to the file. + /// + /// An observable sequence that is identical to the + /// sequence but where there is an additional side effect of writing the + /// messages to a raw binary file, and the contents of the device metadata file + /// to a separate text file. + /// + public override IObservable Process(IObservable source) + { + return source.Publish(ps => ps.Merge( + WriteDeviceMetadata(writer.Process(ps.GroupBy(message => message.Address))) + .IgnoreElements() + .Cast())); + } + + /// + /// Writes each Harp message in the sequence of observable groups to the + /// corresponding binary file, where the name of each file is generated from + /// the common group register address. The contents of the device metadata file are + /// written to a separate text file. + /// + /// + /// A sequence of observable groups, each of which corresponds to a unique register + /// address. + /// + /// + /// An observable sequence that is identical to the + /// sequence but where there is an additional side effect of writing the Harp + /// messages in each group to the corresponding file, and the contents of the device + /// metadata file to a separate text file. + /// + public IObservable> Process(IObservable> source) + { + return WriteDeviceMetadata(writer.Process(source)); + } + + /// + /// Writes each Harp message in the sequence of observable groups to the + /// corresponding binary file, where the name of each file is generated from + /// the common group register name. The contents of the device metadata file are + /// written to a separate text file. + /// + /// + /// A sequence of observable groups, each of which corresponds to a unique register + /// type. + /// + /// + /// An observable sequence that is identical to the + /// sequence but where there is an additional side effect of writing the Harp + /// messages in each group to the corresponding file, and the contents of the device + /// metadata file to a separate text file. + /// + public IObservable> Process(IObservable> source) + { + return WriteDeviceMetadata(writer.Process(source)); + } + } + /// /// Represents an operator that filters register-specific messages /// reported by the device. @@ -162,7 +312,7 @@ public override IObservable> Process(IObse /// /// /// - /// + /// /// /// /// @@ -195,7 +345,7 @@ public override IObservable> Process(IObse [XmlInclude(typeof(Led0PwmReal))] [XmlInclude(typeof(Led0PwmDutyCycleReal))] [XmlInclude(typeof(Led1PwmReal))] - [XmlInclude(typeof(LedD1PwmDutyCycleReal))] + [XmlInclude(typeof(Led1PwmDutyCycleReal))] [XmlInclude(typeof(AuxDigitalOutputState))] [XmlInclude(typeof(AuxLedPower))] [XmlInclude(typeof(DigitalOutputState))] @@ -249,7 +399,7 @@ string INamedElement.Name /// /// /// - /// + /// /// /// /// @@ -282,7 +432,7 @@ string INamedElement.Name [XmlInclude(typeof(Led0PwmReal))] [XmlInclude(typeof(Led0PwmDutyCycleReal))] [XmlInclude(typeof(Led1PwmReal))] - [XmlInclude(typeof(LedD1PwmDutyCycleReal))] + [XmlInclude(typeof(Led1PwmDutyCycleReal))] [XmlInclude(typeof(AuxDigitalOutputState))] [XmlInclude(typeof(AuxLedPower))] [XmlInclude(typeof(DigitalOutputState))] @@ -315,7 +465,7 @@ string INamedElement.Name [XmlInclude(typeof(TimestampedLed0PwmReal))] [XmlInclude(typeof(TimestampedLed0PwmDutyCycleReal))] [XmlInclude(typeof(TimestampedLed1PwmReal))] - [XmlInclude(typeof(TimestampedLedD1PwmDutyCycleReal))] + [XmlInclude(typeof(TimestampedLed1PwmDutyCycleReal))] [XmlInclude(typeof(TimestampedAuxDigitalOutputState))] [XmlInclude(typeof(TimestampedAuxLedPower))] [XmlInclude(typeof(TimestampedDigitalOutputState))] @@ -366,7 +516,7 @@ public Parse() /// /// /// - /// + /// /// /// /// @@ -399,7 +549,7 @@ public Parse() [XmlInclude(typeof(Led0PwmReal))] [XmlInclude(typeof(Led0PwmDutyCycleReal))] [XmlInclude(typeof(Led1PwmReal))] - [XmlInclude(typeof(LedD1PwmDutyCycleReal))] + [XmlInclude(typeof(Led1PwmDutyCycleReal))] [XmlInclude(typeof(AuxDigitalOutputState))] [XmlInclude(typeof(AuxLedPower))] [XmlInclude(typeof(DigitalOutputState))] @@ -3165,25 +3315,25 @@ public static Timestamped GetPayload(HarpMessage message) /// Represents a register that get the real duty cycle (%) of LED1 when in Pwm mode. /// [Description("Get the real duty cycle (%) of LED1 when in Pwm mode.")] - public partial class LedD1PwmDutyCycleReal + public partial class Led1PwmDutyCycleReal { /// - /// Represents the address of the register. This field is constant. + /// Represents the address of the register. This field is constant. /// public const int Address = 60; /// - /// Represents the payload type of the register. This field is constant. + /// Represents the payload type of the register. This field is constant. /// public const PayloadType RegisterType = PayloadType.Float; /// - /// Represents the length of the register. This field is constant. + /// Represents the length of the register. This field is constant. /// public const int RegisterLength = 1; /// - /// Returns the payload data for register messages. + /// Returns the payload data for register messages. /// /// A object representing the register message. /// A value representing the message payload. @@ -3193,7 +3343,7 @@ public static float GetPayload(HarpMessage message) } /// - /// Returns the timestamped payload data for register messages. + /// Returns the timestamped payload data for register messages. /// /// A object representing the register message. /// A value representing the timestamped message payload. @@ -3203,12 +3353,12 @@ public static Timestamped GetTimestampedPayload(HarpMessage message) } /// - /// Returns a Harp message for the register. + /// Returns a Harp message for the register. /// /// The type of the Harp message. /// The value to be stored in the message payload. /// - /// A object for the register + /// A object for the register /// with the specified message type and payload. /// public static HarpMessage FromPayload(MessageType messageType, float value) @@ -3217,14 +3367,14 @@ public static HarpMessage FromPayload(MessageType messageType, float value) } /// - /// Returns a timestamped Harp message for the + /// Returns a timestamped Harp message for the /// register. /// /// The timestamp of the message payload, in seconds. /// The type of the Harp message. /// The value to be stored in the message payload. /// - /// A object for the register + /// A object for the register /// with the specified message type, timestamp, and payload. /// public static HarpMessage FromPayload(double timestamp, MessageType messageType, float value) @@ -3235,25 +3385,25 @@ public static HarpMessage FromPayload(double timestamp, MessageType messageType, /// /// Provides methods for manipulating timestamped messages from the - /// LedD1PwmDutyCycleReal register. + /// Led1PwmDutyCycleReal register. /// - /// - [Description("Filters and selects timestamped messages from the LedD1PwmDutyCycleReal register.")] - public partial class TimestampedLedD1PwmDutyCycleReal + /// + [Description("Filters and selects timestamped messages from the Led1PwmDutyCycleReal register.")] + public partial class TimestampedLed1PwmDutyCycleReal { /// - /// Represents the address of the register. This field is constant. + /// Represents the address of the register. This field is constant. /// - public const int Address = LedD1PwmDutyCycleReal.Address; + public const int Address = Led1PwmDutyCycleReal.Address; /// - /// Returns timestamped payload data for register messages. + /// Returns timestamped payload data for register messages. /// /// A object representing the register message. /// A value representing the timestamped message payload. public static Timestamped GetPayload(HarpMessage message) { - return LedD1PwmDutyCycleReal.GetTimestampedPayload(message); + return Led1PwmDutyCycleReal.GetTimestampedPayload(message); } } @@ -3698,7 +3848,7 @@ public static Timestamped GetPayload(HarpMessage message) /// /// /// - /// + /// /// /// /// @@ -3731,7 +3881,7 @@ public static Timestamped GetPayload(HarpMessage message) [XmlInclude(typeof(CreateLed0PwmRealPayload))] [XmlInclude(typeof(CreateLed0PwmDutyCycleRealPayload))] [XmlInclude(typeof(CreateLed1PwmRealPayload))] - [XmlInclude(typeof(CreateLedD1PwmDutyCycleRealPayload))] + [XmlInclude(typeof(CreateLed1PwmDutyCycleRealPayload))] [XmlInclude(typeof(CreateAuxDigitalOutputStatePayload))] [XmlInclude(typeof(CreateAuxLedPowerPayload))] [XmlInclude(typeof(CreateDigitalOutputStatePayload))] @@ -3764,7 +3914,7 @@ public static Timestamped GetPayload(HarpMessage message) [XmlInclude(typeof(CreateTimestampedLed0PwmRealPayload))] [XmlInclude(typeof(CreateTimestampedLed0PwmDutyCycleRealPayload))] [XmlInclude(typeof(CreateTimestampedLed1PwmRealPayload))] - [XmlInclude(typeof(CreateTimestampedLedD1PwmDutyCycleRealPayload))] + [XmlInclude(typeof(CreateTimestampedLed1PwmDutyCycleRealPayload))] [XmlInclude(typeof(CreateTimestampedAuxDigitalOutputStatePayload))] [XmlInclude(typeof(CreateTimestampedAuxLedPowerPayload))] [XmlInclude(typeof(CreateTimestampedDigitalOutputStatePayload))] @@ -5362,33 +5512,33 @@ public HarpMessage GetMessage(double timestamp, MessageType messageType) /// Represents an operator that creates a message payload /// that get the real duty cycle (%) of LED1 when in Pwm mode. /// - [DisplayName("LedD1PwmDutyCycleRealPayload")] + [DisplayName("Led1PwmDutyCycleRealPayload")] [Description("Creates a message payload that get the real duty cycle (%) of LED1 when in Pwm mode.")] - public partial class CreateLedD1PwmDutyCycleRealPayload + public partial class CreateLed1PwmDutyCycleRealPayload { /// /// Gets or sets the value that get the real duty cycle (%) of LED1 when in Pwm mode. /// [Description("The value that get the real duty cycle (%) of LED1 when in Pwm mode.")] - public float LedD1PwmDutyCycleReal { get; set; } + public float Led1PwmDutyCycleReal { get; set; } /// - /// Creates a message payload for the LedD1PwmDutyCycleReal register. + /// Creates a message payload for the Led1PwmDutyCycleReal register. /// /// The created message payload value. public float GetPayload() { - return LedD1PwmDutyCycleReal; + return Led1PwmDutyCycleReal; } /// /// Creates a message that get the real duty cycle (%) of LED1 when in Pwm mode. /// /// Specifies the type of the created message. - /// A new message for the LedD1PwmDutyCycleReal register. + /// A new message for the Led1PwmDutyCycleReal register. public HarpMessage GetMessage(MessageType messageType) { - return Harp.LedArray.LedD1PwmDutyCycleReal.FromPayload(messageType, GetPayload()); + return Harp.LedArray.Led1PwmDutyCycleReal.FromPayload(messageType, GetPayload()); } } @@ -5396,19 +5546,19 @@ public HarpMessage GetMessage(MessageType messageType) /// Represents an operator that creates a timestamped message payload /// that get the real duty cycle (%) of LED1 when in Pwm mode. /// - [DisplayName("TimestampedLedD1PwmDutyCycleRealPayload")] + [DisplayName("TimestampedLed1PwmDutyCycleRealPayload")] [Description("Creates a timestamped message payload that get the real duty cycle (%) of LED1 when in Pwm mode.")] - public partial class CreateTimestampedLedD1PwmDutyCycleRealPayload : CreateLedD1PwmDutyCycleRealPayload + public partial class CreateTimestampedLed1PwmDutyCycleRealPayload : CreateLed1PwmDutyCycleRealPayload { /// /// Creates a timestamped message that get the real duty cycle (%) of LED1 when in Pwm mode. /// /// The timestamp of the message payload, in seconds. /// Specifies the type of the created message. - /// A new timestamped message for the LedD1PwmDutyCycleReal register. + /// A new timestamped message for the Led1PwmDutyCycleReal register. public HarpMessage GetMessage(double timestamp, MessageType messageType) { - return Harp.LedArray.LedD1PwmDutyCycleReal.FromPayload(timestamp, messageType, GetPayload()); + return Harp.LedArray.Led1PwmDutyCycleReal.FromPayload(timestamp, messageType, GetPayload()); } } diff --git a/Interface/Harp.LedArray/Harp.LedArray.csproj b/Interface/Harp.LedArray/Harp.LedArray.csproj index 1adb6c6..f3a7968 100644 --- a/Interface/Harp.LedArray/Harp.LedArray.csproj +++ b/Interface/Harp.LedArray/Harp.LedArray.csproj @@ -18,7 +18,7 @@ LICENSE ..\bin\$(Configuration) net462;netstandard2.0 - 0.2.0 + 0.3.0 9.0 diff --git a/device.yml b/device.yml index cc9006d..f50db56 100644 --- a/device.yml +++ b/device.yml @@ -207,7 +207,7 @@ registers: access: Read type: Float description: Get the real frequency (Hz) of LED1 when in Pwm mode. - LedD1PwmDutyCycleReal: + Led1PwmDutyCycleReal: address: 60 access: Read type: Float From fe5e43fb2eb614ebd9c103606f1becce83884a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Teixeira?= Date: Wed, 18 Mar 2026 10:41:52 +0000 Subject: [PATCH 02/16] Add initial app --- App/.editorconfig | 280 ++++ App/.gitattributes | 3 + App/.gitignore | 453 ++++++ App/Directory.Build.props | 7 + App/Harp.LedArray.App.sln | 42 + .../Harp.LedArray.App.csproj | 51 + App/Harp.LedArray.App/Program.cs | 24 + .../Properties/launchSettings.json | 11 + App/Harp.LedArray.App/app.manifest | 18 + .../Adapters/RgbRegisterAdapter.cs | 210 +++ App/Harp.LedArray.Design/App.axaml | 26 + App/Harp.LedArray.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.LedArray.Design/Assets/cf-logo.icns | Bin 0 -> 136081 bytes App/Harp.LedArray.Design/Assets/cf-logo.ico | Bin 0 -> 307515 bytes App/Harp.LedArray.Design/Assets/cf-logo.png | Bin 0 -> 15303 bytes App/Harp.LedArray.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 + App/Harp.LedArray.Design/Controls/GroupBox.cs | 29 + .../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.LedArray.Design/FodyWeavers.xml | 3 + .../Harp.LedArray.Design.csproj | 29 + .../Resources/GroupBox.axaml | 76 + .../Styles/DefaultStyles.axaml | 21 + .../ViewModels/AboutViewModel.cs | 5 + .../ViewModels/MyDeviceViewModel.cs | 1286 +++++++++++++++++ .../ViewModels/ViewModelBase.cs | 54 + App/Harp.LedArray.Design/Views/About.axaml | 39 + App/Harp.LedArray.Design/Views/About.axaml.cs | 11 + .../Views/MainWindow.axaml | 13 + .../Views/MainWindow.axaml.cs | 11 + .../Views/MyDeviceView.axaml | 987 +++++++++++++ .../Views/MyDeviceView.axaml.cs | 11 + App/Harp.LedArray.nsi | Bin 0 -> 11808 bytes App/LICENSE | 21 + App/README.md | 2 + 51 files changed, 4787 insertions(+) create mode 100644 App/.editorconfig create mode 100644 App/.gitattributes create mode 100644 App/.gitignore create mode 100644 App/Directory.Build.props create mode 100644 App/Harp.LedArray.App.sln create mode 100644 App/Harp.LedArray.App/Harp.LedArray.App.csproj create mode 100644 App/Harp.LedArray.App/Program.cs create mode 100644 App/Harp.LedArray.App/Properties/launchSettings.json create mode 100644 App/Harp.LedArray.App/app.manifest create mode 100644 App/Harp.LedArray.Design/Adapters/RgbRegisterAdapter.cs create mode 100644 App/Harp.LedArray.Design/App.axaml create mode 100644 App/Harp.LedArray.Design/App.axaml.cs create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo-small.bmp create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo-white-lettering.png create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo-white-lettering.svg create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo.icns create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo.ico create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo.png create mode 100644 App/Harp.LedArray.Design/Assets/cf-logo.svg create mode 100644 App/Harp.LedArray.Design/Assets/cf_hardware_software_logo.png create mode 100644 App/Harp.LedArray.Design/Assets/cf_hardware_software_logo.svg create mode 100644 App/Harp.LedArray.Design/Assets/cf_hardware_software_logo_white_lettering.png create mode 100644 App/Harp.LedArray.Design/Assets/cf_hardware_software_logo_white_lettering.svg create mode 100644 App/Harp.LedArray.Design/Controls/ExtendedColorPicker.cs create mode 100644 App/Harp.LedArray.Design/Controls/GroupBox.cs create mode 100644 App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml create mode 100644 App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml.cs create mode 100644 App/Harp.LedArray.Design/Controls/VisualStatus.axaml create mode 100644 App/Harp.LedArray.Design/Controls/VisualStatus.axaml.cs create mode 100644 App/Harp.LedArray.Design/Controls/WriteMessagesControl.axaml create mode 100644 App/Harp.LedArray.Design/Controls/WriteMessagesControl.axaml.cs create mode 100644 App/Harp.LedArray.Design/Converters/EnableFlagConverter.cs create mode 100644 App/Harp.LedArray.Design/Converters/EnumDisplayConverter.cs create mode 100644 App/Harp.LedArray.Design/Converters/PayloadFieldConverter.cs create mode 100644 App/Harp.LedArray.Design/Converters/VisualStatusColorConverter.cs create mode 100644 App/Harp.LedArray.Design/FodyWeavers.xml create mode 100644 App/Harp.LedArray.Design/Harp.LedArray.Design.csproj create mode 100644 App/Harp.LedArray.Design/Resources/GroupBox.axaml create mode 100644 App/Harp.LedArray.Design/Styles/DefaultStyles.axaml create mode 100644 App/Harp.LedArray.Design/ViewModels/AboutViewModel.cs create mode 100644 App/Harp.LedArray.Design/ViewModels/MyDeviceViewModel.cs create mode 100644 App/Harp.LedArray.Design/ViewModels/ViewModelBase.cs create mode 100644 App/Harp.LedArray.Design/Views/About.axaml create mode 100644 App/Harp.LedArray.Design/Views/About.axaml.cs create mode 100644 App/Harp.LedArray.Design/Views/MainWindow.axaml create mode 100644 App/Harp.LedArray.Design/Views/MainWindow.axaml.cs create mode 100644 App/Harp.LedArray.Design/Views/MyDeviceView.axaml create mode 100644 App/Harp.LedArray.Design/Views/MyDeviceView.axaml.cs create mode 100644 App/Harp.LedArray.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/.gitattributes b/App/.gitattributes new file mode 100644 index 0000000..cc4d38c --- /dev/null +++ b/App/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +*.cs text +*.csproj text 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..9c9329f --- /dev/null +++ b/App/Directory.Build.props @@ -0,0 +1,7 @@ + + + enable + 11.2.6 + 1.0.0-alpha.1 + + diff --git a/App/Harp.LedArray.App.sln b/App/Harp.LedArray.App.sln new file mode 100644 index 0000000..4465549 --- /dev/null +++ b/App/Harp.LedArray.App.sln @@ -0,0 +1,42 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35707.178 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{E25997E9-FD75-45C0-94EC-5EAC78BE0F73}") = "Harp.LedArray.App", "Harp.LedArray.App\Harp.LedArray.App.csproj", "{234DC1DC-09C3-417D-973A-3647252B26B5}" +EndProject +Project("{E25997E9-FD75-45C0-94EC-5EAC78BE0F73}") = "Harp.LedArray.Design", "Harp.LedArray.Design\Harp.LedArray.Design.csproj", "{3A36EE39-3540-417A-B979-3B36F9F21C3C}" +EndProject +Project("{E25997E9-FD75-45C0-94EC-5EAC78BE0F73}") = "Harp.LedArray", "..\Interface\Harp.LedArray\Harp.LedArray.csproj", "{5D43DE0B-202E-4F4F-9AEF-E63C5AA3530B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3662E764-C393-426E-905E-9F945506CC83}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + Harp.LedArray.nsi = Harp.LedArray.nsi + README.md = README.md + Directory.Build.props = Directory.Build.props + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {234DC1DC-09C3-417D-973A-3647252B26B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {234DC1DC-09C3-417D-973A-3647252B26B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {234DC1DC-09C3-417D-973A-3647252B26B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {234DC1DC-09C3-417D-973A-3647252B26B5}.Release|Any CPU.Build.0 = Release|Any CPU + {3A36EE39-3540-417A-B979-3B36F9F21C3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A36EE39-3540-417A-B979-3B36F9F21C3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A36EE39-3540-417A-B979-3B36F9F21C3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A36EE39-3540-417A-B979-3B36F9F21C3C}.Release|Any CPU.Build.0 = Release|Any CPU + {5D43DE0B-202E-4F4F-9AEF-E63C5AA3530B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D43DE0B-202E-4F4F-9AEF-E63C5AA3530B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D43DE0B-202E-4F4F-9AEF-E63C5AA3530B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D43DE0B-202E-4F4F-9AEF-E63C5AA3530B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/App/Harp.LedArray.App/Harp.LedArray.App.csproj b/App/Harp.LedArray.App/Harp.LedArray.App.csproj new file mode 100644 index 0000000..c8f79ec --- /dev/null +++ b/App/Harp.LedArray.App/Harp.LedArray.App.csproj @@ -0,0 +1,51 @@ + + + WinExe + + net8.0 + enable + true + app.manifest + ..\bin\$(Configuration) + $(AppVersion) + ..\Harp.LedArray.Design\Assets\cf-logo.ico + Harp.LedArray.App + + + + Harp.LedArray.App + Harp.LedArray.App + org.fchampalimaud + $(Version) + $(Version) + AAPL + . + Harp.LedArray.App + cf-logo.icns + NSApplication + true + Champalimaud Foundation + ..\Harp.LedArray.Design\Assets\cf-logo.ico + ..\README.md + git + ..\bin\$(Configuration) + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.LedArray.App/Program.cs b/App/Harp.LedArray.App/Program.cs new file mode 100644 index 0000000..562128d --- /dev/null +++ b/App/Harp.LedArray.App/Program.cs @@ -0,0 +1,24 @@ +using System; + +using Avalonia; +using Avalonia.ReactiveUI; + +namespace Harp.LedArray.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.LedArray.App/Properties/launchSettings.json b/App/Harp.LedArray.App/Properties/launchSettings.json new file mode 100644 index 0000000..861eae1 --- /dev/null +++ b/App/Harp.LedArray.App/Properties/launchSettings.json @@ -0,0 +1,11 @@ +{ + "profiles": { + "Harp.LedArray.App": { + "commandName": "Project" + }, + "WSL": { + "commandName": "WSL2", + "distributionName": "" + } + } +} \ No newline at end of file diff --git a/App/Harp.LedArray.App/app.manifest b/App/Harp.LedArray.App/app.manifest new file mode 100644 index 0000000..e0ce8d0 --- /dev/null +++ b/App/Harp.LedArray.App/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/App/Harp.LedArray.Design/Adapters/RgbRegisterAdapter.cs b/App/Harp.LedArray.Design/Adapters/RgbRegisterAdapter.cs new file mode 100644 index 0000000..d958ea4 --- /dev/null +++ b/App/Harp.LedArray.Design/Adapters/RgbRegisterAdapter.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reactive.Linq; +using Avalonia.Media; +using ReactiveUI; + +namespace Harp.LedArray.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; } + public event Action ColorsChanged; + + // 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())); + + // Subscribe to color changes in each item + foreach (var item in Colors) + { + item.WhenAnyValue(x => x.Color) + .Skip(1) + .Subscribe(_ => OnColorsChanged()); + } + } + + /// + /// 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); + } + } + } + + /// + /// 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; + } + + /// + /// Converts the adapter's colors to a struct value. + /// Assumes the struct has fields/properties named Red0, Green0, Blue0, etc. + /// + public object ToStructValue(Type structType) + { + object instance = Activator.CreateInstance(structType); + + // For single RGB, try Red/Green/Blue fields + if (Colors.Count == 1) + { + SetByteField(structType, instance, "Red", Colors[0].Color.R); + SetByteField(structType, instance, "Green", Colors[0].Color.G); + SetByteField(structType, instance, "Blue", Colors[0].Color.B); + } + else // For arrays/complex, use Red0, Green0, Blue0, etc. + { + for (int i = 0; i < Colors.Count; i++) + { + SetByteField(structType, instance, $"Red{i}", Colors[i].Color.R); + SetByteField(structType, instance, $"Green{i}", Colors[i].Color.G); + SetByteField(structType, instance, $"Blue{i}", Colors[i].Color.B); + } + } + + // If struct, unbox before returning + if (structType.IsValueType) + { + return Convert.ChangeType(instance, structType); + } + return instance; + } + + /// + /// 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; + }); + } + } + + private static void SetByteField(Type type, object obj, string name, byte value) + { + var prop = type.GetProperty(name); + if (prop != null && prop.PropertyType == typeof(byte)) + prop.SetValue(obj, value); + var field = type.GetField(name); + if (field != null && field.FieldType == typeof(byte)) + field.SetValue(obj, value); + } + + 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; + } + + private void OnColorsChanged() + { + ColorsChanged?.Invoke(); + } +} diff --git a/App/Harp.LedArray.Design/App.axaml b/App/Harp.LedArray.Design/App.axaml new file mode 100644 index 0000000..c7933e3 --- /dev/null +++ b/App/Harp.LedArray.Design/App.axaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.LedArray.Design/App.axaml.cs b/App/Harp.LedArray.Design/App.axaml.cs new file mode 100644 index 0000000..9845555 --- /dev/null +++ b/App/Harp.LedArray.Design/App.axaml.cs @@ -0,0 +1,44 @@ +using System; +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; + +using Harp.LedArray.Design.ViewModels; +using Harp.LedArray.Design.Views; + +namespace Harp.LedArray.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 LedArrayViewModel() + }; + } + else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) + { + singleViewPlatform.MainView = new LedArrayView + { + DataContext = new LedArrayViewModel() + }; + } + + 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.LedArray.Design/Assets/cf-logo-small.bmp b/App/Harp.LedArray.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.LedArray.Design/Assets/cf-logo-white-lettering.svg b/App/Harp.LedArray.Design/Assets/cf-logo-white-lettering.svg new file mode 100644 index 0000000..dc288cd --- /dev/null +++ b/App/Harp.LedArray.Design/Assets/cf-logo-white-lettering.svg @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.LedArray.Design/Assets/cf-logo.icns b/App/Harp.LedArray.Design/Assets/cf-logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..6dd5be30a54f69d6c726781311edbafe58cf8779 GIT binary patch literal 136081 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 JuYdku|9^Cxwsrsj literal 0 HcmV?d00001 diff --git a/App/Harp.LedArray.Design/Assets/cf-logo.ico b/App/Harp.LedArray.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.LedArray.Design/Assets/cf-logo.png b/App/Harp.LedArray.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.LedArray.Design/Assets/cf-logo.svg b/App/Harp.LedArray.Design/Assets/cf-logo.svg new file mode 100644 index 0000000..08e8841 --- /dev/null +++ b/App/Harp.LedArray.Design/Assets/cf-logo.svg @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.LedArray.Design/Assets/cf_hardware_software_logo.png b/App/Harp.LedArray.Design/Assets/cf_hardware_software_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f8afc50ced6d5ce389af00e2a767a1196f485b79 GIT binary patch literal 21525 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 literal 0 HcmV?d00001 diff --git a/App/Harp.LedArray.Design/Assets/cf_hardware_software_logo.svg b/App/Harp.LedArray.Design/Assets/cf_hardware_software_logo.svg new file mode 100644 index 0000000..1896536 --- /dev/null +++ b/App/Harp.LedArray.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.LedArray.Design/Assets/cf_hardware_software_logo_white_lettering.png b/App/Harp.LedArray.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.LedArray.Design/Controls/ExtendedColorPicker.cs b/App/Harp.LedArray.Design/Controls/ExtendedColorPicker.cs new file mode 100644 index 0000000..aad02bc --- /dev/null +++ b/App/Harp.LedArray.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.LedArray.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.LedArray.Design/Controls/GroupBox.cs b/App/Harp.LedArray.Design/Controls/GroupBox.cs new file mode 100644 index 0000000..52bcfe0 --- /dev/null +++ b/App/Harp.LedArray.Design/Controls/GroupBox.cs @@ -0,0 +1,29 @@ +using Avalonia; +using Avalonia.Controls.Primitives; +using Avalonia.Media; + +namespace Harp.LedArray.Design.Controls; + +public class GroupBox : HeaderedContentControl +{ + public static readonly StyledProperty HeaderBackgroundProperty = + AvaloniaProperty.Register(nameof(HeaderBackground)); + + public static readonly AttachedProperty SurfaceBackgroundProperty = + AvaloniaProperty.RegisterAttached( + "SurfaceBackground", + defaultValue: null, + inherits: true); + + public IBrush? HeaderBackground + { + get => GetValue(HeaderBackgroundProperty); + set => SetValue(HeaderBackgroundProperty, value); + } + + public static void SetSurfaceBackground(AvaloniaObject element, IBrush? value) => + element.SetValue(SurfaceBackgroundProperty, value); + + public static IBrush? GetSurfaceBackground(AvaloniaObject element) => + element.GetValue(SurfaceBackgroundProperty); +} diff --git a/App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml b/App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml new file mode 100644 index 0000000..4f89fb2 --- /dev/null +++ b/App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + diff --git a/App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml.cs b/App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml.cs new file mode 100644 index 0000000..6263ee3 --- /dev/null +++ b/App/Harp.LedArray.Design/Controls/RgbRegisterControl.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Harp.LedArray.Design.Controls; + +public partial class RgbRegisterControl : UserControl +{ + public RgbRegisterControl() + { + InitializeComponent(); + } +} diff --git a/App/Harp.LedArray.Design/Controls/VisualStatus.axaml b/App/Harp.LedArray.Design/Controls/VisualStatus.axaml new file mode 100644 index 0000000..9625b4b --- /dev/null +++ b/App/Harp.LedArray.Design/Controls/VisualStatus.axaml @@ -0,0 +1,11 @@ + + + + + + diff --git a/App/Harp.LedArray.Design/Controls/VisualStatus.axaml.cs b/App/Harp.LedArray.Design/Controls/VisualStatus.axaml.cs new file mode 100644 index 0000000..196f8a4 --- /dev/null +++ b/App/Harp.LedArray.Design/Controls/VisualStatus.axaml.cs @@ -0,0 +1,21 @@ +using Avalonia; +using Avalonia.Controls; + +namespace Harp.LedArray.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.LedArray.Design/Controls/WriteMessagesControl.axaml b/App/Harp.LedArray.Design/Controls/WriteMessagesControl.axaml new file mode 100644 index 0000000..b082920 --- /dev/null +++ b/App/Harp.LedArray.Design/Controls/WriteMessagesControl.axaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -108,15 +106,15 @@ Spacing="20"> + MinWidth="70" VerticalAlignment="Center" />