diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-08-21 16:49:02 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-08-21 16:49:02 +0300 |
| commit | 3d8c362cd5409246c7026ea956ce10d51ed9ebc3 (patch) | |
| tree | d5ab6ab53d4b461df12c8b9d1edeb654e0cb48de /Software | |
| parent | cc556a1c4a0813a548bf95d693c4e2748f895e13 (diff) | |
| download | Tango-3d8c362cd5409246c7026ea956ce10d51ed9ebc3.tar.gz Tango-3d8c362cd5409246c7026ea956ce10d51ed9ebc3.zip | |
Telemetry Wires.
Implemented Firmware User Notifications.
Added Missing UI Settings Units Display.
Add Machine Name to General Information Dialog.
Diffstat (limited to 'Software')
27 files changed, 1029 insertions, 97 deletions
diff --git a/Software/PMR/Messages/Common/MessageType.proto b/Software/PMR/Messages/Common/MessageType.proto index 620ebb0ca..2d26f71a1 100644 --- a/Software/PMR/Messages/Common/MessageType.proto +++ b/Software/PMR/Messages/Common/MessageType.proto @@ -303,6 +303,8 @@ enum MessageType SetBuzzerSettingsResponse = 9011; SetWhiteThreadSkipRequest = 9012; SetWhiteThreadSkipResponse = 9013; + StartNotificationRequest = 9014; + StartNotificationResponse = 9015; //Power StartPowerDownRequest = 10000; diff --git a/Software/PMR/Messages/Diagnostics/StartTelemetryWireResponse.proto b/Software/PMR/Messages/Diagnostics/StartTelemetryWireResponse.proto index 05f1d44ee..710cdb3a9 100644 --- a/Software/PMR/Messages/Diagnostics/StartTelemetryWireResponse.proto +++ b/Software/PMR/Messages/Diagnostics/StartTelemetryWireResponse.proto @@ -1,10 +1,11 @@ syntax = "proto3"; +import "TelemetryWire.proto"; + package Tango.PMR.Diagnostics; option java_package = "com.twine.tango.pmr.diagnostics"; message StartTelemetryWireResponse { - string Name = 1; - float Value = 2; + repeated TelemetryWire Wires = 1; }
\ No newline at end of file diff --git a/Software/PMR/Messages/Diagnostics/TelemetryWire.proto b/Software/PMR/Messages/Diagnostics/TelemetryWire.proto new file mode 100644 index 000000000..8ccdebe31 --- /dev/null +++ b/Software/PMR/Messages/Diagnostics/TelemetryWire.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package Tango.PMR.Diagnostics; +option java_package = "com.twine.tango.pmr.diagnostics"; + +message TelemetryWire +{ + string Name = 1; + float Value = 2; +}
\ No newline at end of file diff --git a/Software/PMR/Messages/MachineStatus/NotificationType.proto b/Software/PMR/Messages/MachineStatus/NotificationType.proto new file mode 100644 index 000000000..ad4f5a781 --- /dev/null +++ b/Software/PMR/Messages/MachineStatus/NotificationType.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package Tango.PMR.MachineStatus; +option java_package = "com.twine.tango.pmr.machinestatus"; + +enum NotificationType +{ + NotifyInfo = 0; + NotifyWarning = 1; + NotifyError = 2; + NotifyCritical = 3; + NotifySuccess = 4; +} diff --git a/Software/PMR/Messages/MachineStatus/StartNotificationRequest.proto b/Software/PMR/Messages/MachineStatus/StartNotificationRequest.proto new file mode 100644 index 000000000..cc55923cb --- /dev/null +++ b/Software/PMR/Messages/MachineStatus/StartNotificationRequest.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +package Tango.PMR.MachineStatus; +option java_package = "com.twine.tango.pmr.machinestatus"; + +message StartNotificationRequest +{ + +}
\ No newline at end of file diff --git a/Software/PMR/Messages/MachineStatus/StartNotificationResponse.proto b/Software/PMR/Messages/MachineStatus/StartNotificationResponse.proto new file mode 100644 index 000000000..973d486a4 --- /dev/null +++ b/Software/PMR/Messages/MachineStatus/StartNotificationResponse.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +import "NotificationType.proto"; + +package Tango.PMR.MachineStatus; +option java_package = "com.twine.tango.pmr.machinestatus"; + +message StartNotificationResponse +{ + NotificationType Type = 1; + bool IsBlocking = 2; + string Title = 3; + string Message = 4; +}
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml index f92b92b5e..707219398 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml @@ -165,14 +165,14 @@ <TextBlock VerticalAlignment="Bottom">Spool Type</TextBlock> <touch:TouchComboBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="200" ItemsSource="{Binding SpoolTypes}" SelectedItem="{Binding SelectedSpoolType}" DisplayMemberPath="Name"></touch:TouchComboBox> - <TextBlock VerticalAlignment="Bottom">Default Segment Length</TextBlock> + <TextBlock VerticalAlignment="Bottom">Default Segment Length (m)</TextBlock> <touch:TouchNumericTextBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="200" Minimum="1" Maximum="1000" Value="{Binding Settings.DefaultSegmentLength}" HasDecimalPoint="True" KeyboardContainer="{Binding ElementName=Container}"></touch:TouchNumericTextBox> <TextBlock VerticalAlignment="Bottom">Default Color Space</TextBlock> <touch:TouchComboBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="200" ItemsSource="{Binding TabsColorSpaces}" SelectedItem="{Binding DefaultTabColorSpace}" DisplayMemberPath="FinalName"></touch:TouchComboBox> - <TextBlock VerticalAlignment="Bottom">Vector Fine Tuning Job Length</TextBlock> + <TextBlock VerticalAlignment="Bottom">Vector Fine Tuning Job Length (m)</TextBlock> <touch:TouchNumericTextBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="200" Minimum="100" Maximum="500" Value="{Binding FineTuningLength}" HasDecimalPoint="False" KeyboardContainer="{Binding ElementName=Container}"></touch:TouchNumericTextBox> <TextBlock VerticalAlignment="Bottom">Use Light Inks When Possible</TextBlock> @@ -187,13 +187,13 @@ <TextBlock VerticalAlignment="Bottom">Enable Machine Buzzer</TextBlock> <touch:TouchToggleSlider Style="{StaticResource TangoToggleButtonGrayAccent}" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="90" IsChecked="{Binding Settings.EnableBuzzer}" KeyboardNavigation.TabNavigation ="None" IsTabStop="False"></touch:TouchToggleSlider> - <TextBlock VerticalAlignment="Bottom">Machine Buzzer Duration</TextBlock> + <TextBlock VerticalAlignment="Bottom">Machine Buzzer Duration (s)</TextBlock> <touch:TouchNumericTextBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="200" Minimum="10" Maximum="180" Value="{Binding Settings.BuzzerDuration}" HasDecimalPoint="False" KeyboardContainer="{Binding ElementName=Container}"></touch:TouchNumericTextBox> <TextBlock VerticalAlignment="Bottom">Enable White Thread Trimming Feature</TextBlock> <touch:TouchToggleSlider Style="{StaticResource TangoToggleButtonGrayAccent}" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="90" IsChecked="{Binding Settings.EnableWhiteThreadSkip}" KeyboardNavigation.TabNavigation ="None" IsTabStop="False"></touch:TouchToggleSlider> - <TextBlock VerticalAlignment="Bottom">Production Data Graph Start Time</TextBlock> + <TextBlock VerticalAlignment="Bottom">Production Data Graph Start Time (h)</TextBlock> <touch:TouchNumericTextBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="200" Minimum="0" Maximum="12" Value="{Binding Settings.ProductionDataStartTimeHours}" HasDecimalPoint="False" KeyboardContainer="{Binding ElementName=Container}"></touch:TouchNumericTextBox> </controls:TableGrid> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs index a246e3bfc..695d71b4b 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs @@ -106,6 +106,8 @@ namespace Tango.PPC.Common.Connection MachineOperator.EnableMachineStatusUpdates = true; MachineOperator.EnableDiagnostics = true; MachineOperator.EnablePowerUpSequence = true; + MachineOperator.EnableNotifications = true; + MachineOperator.EnableTelemetryWire = true; MachineOperator.EnableEmbeddedDebugging = settings.EnableEmbeddedDebugLogs; MachineOperator.EnableAutomaticThreadLoading = settings.EnableAutomaticThreadLoading; MachineOperator.JobRunsLogger.JobSource = BL.Enumerations.JobSource.Local; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationView.xaml new file mode 100644 index 000000000..6951ce0ad --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationView.xaml @@ -0,0 +1,55 @@ +<UserControl x:Class="Tango.PPC.UI.Dialogs.FirmwareNotificationView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:touch="clr-namespace:Tango.Touch.Controls;assembly=Tango.Touch" + xmlns:local="clr-namespace:Tango.PPC.UI.Dialogs" + mc:Ignorable="d" + Background="{StaticResource TangoPrimaryBackgroundBrush}" d:DesignHeight="555" d:DesignWidth="560" Width="570" Height="600" d:DataContext="{d:DesignInstance Type=local:FirmwareNotificationViewVM, IsDesignTimeCreatable=False}"> + <Grid Margin="20"> + <DockPanel> + <Grid DockPanel.Dock="Bottom"> + <touch:TouchButton HorizontalAlignment="Right" CornerRadius="25" Command="{Binding CloseCommand}" Style="{StaticResource TangoHollowButton}" Width="150" Height="50" VerticalAlignment="Bottom">CLOSE</touch:TouchButton> + </Grid> + <StackPanel DockPanel.Dock="Top"> + <touch:TouchIcon DockPanel.Dock="Left" MaxHeight="100"> + <touch:TouchIcon.Style> + <Style TargetType="touch:TouchIcon"> + <Setter Property="Icon" Value="Information"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding Type}" Value="NotifyInfo"> + <Setter Property="Icon" Value="Information"></Setter> + <Setter Property="Foreground" Value="{StaticResource TangoDarkForegroundBrush}"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="NotifySuccess"> + <Setter Property="Icon" Value="Check"></Setter> + <Setter Property="Foreground" Value="{StaticResource TangoSuccessBrush}"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="NotifyWarning"> + <Setter Property="Icon" Value="AlertCircleOutline"></Setter> + <Setter Property="Foreground" Value="{StaticResource TangoWarningBrush}"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="NotifyError"> + <Setter Property="Icon" Value="AlertCircleOutline"></Setter> + <Setter Property="Foreground" Value="{StaticResource TangoErrorBrush}"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="NotifyCritical"> + <Setter Property="Icon" Value="Alert"></Setter> + <Setter Property="Foreground" Value="{StaticResource TangoErrorBrush}"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </touch:TouchIcon.Style> + </touch:TouchIcon> + <TextBlock HorizontalAlignment="Center" Margin="0 20 0 0" FontSize="{StaticResource TangoHeaderFontSize}" Text="{Binding Title}"></TextBlock> + <TextBlock Margin="20 10" HorizontalAlignment="Center" TextWrapping="Wrap" TextAlignment="Center" Text="{Binding Message}"> + + </TextBlock> + </StackPanel> + <Grid> + + </Grid> + </DockPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationView.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationView.xaml.cs new file mode 100644 index 000000000..ba264c8a4 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.PPC.UI.Dialogs +{ + /// <summary> + /// Interaction logic for SpoolReplaceView.xaml + /// </summary> + public partial class FirmwareNotificationView : UserControl + { + public FirmwareNotificationView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationViewVM.cs new file mode 100644 index 000000000..dd3989566 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/FirmwareNotificationViewVM.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.PMR.MachineStatus; +using Tango.SharedUI; + +namespace Tango.PPC.UI.Dialogs +{ + public class FirmwareNotificationViewVM : DialogViewVM + { + public NotificationType Type { get; set; } + public String Title { get; set; } + public String Message { get; set; } + + public FirmwareNotificationViewVM() + { + + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/GeneralInformationView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/GeneralInformationView.xaml index 85d905841..c7b7e2952 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/GeneralInformationView.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/GeneralInformationView.xaml @@ -55,6 +55,21 @@ </Paragraph> </TableCell> </TableRow> + + <TableRow> + <TableCell> + <Paragraph> + <TextBlock>Machine Name:</TextBlock> + </Paragraph> + </TableCell> + + <TableCell> + <Paragraph> + <TextBlock Text="{Binding MachineProvider.Machine.Name,Mode=OneWay,IsAsync=True,FallbackValue='N/A'}"/> + </Paragraph> + </TableCell> + </TableRow> + <TableRow> <TableCell> <Paragraph> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj b/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj index f0a513cb5..31c46b296 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj @@ -225,6 +225,10 @@ <DependentUpon>JerricanReplaceView.xaml</DependentUpon> </Compile> <Compile Include="Dialogs\JerricanReplaceViewVM.cs" /> + <Compile Include="Dialogs\FirmwareNotificationView.xaml.cs"> + <DependentUpon>FirmwareNotificationView.xaml</DependentUpon> + </Compile> + <Compile Include="Dialogs\FirmwareNotificationViewVM.cs" /> <Compile Include="Dialogs\WasteReplacementViewVM.cs" /> <Compile Include="Dialogs\WasteReplacementView.xaml.cs"> <DependentUpon>WasteReplacementView.xaml</DependentUpon> @@ -405,6 +409,10 @@ <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </Page> + <Page Include="Dialogs\FirmwareNotificationView.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> <Page Include="Dialogs\WasteReplacementView.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> @@ -1035,7 +1043,7 @@ if $(ConfigurationName) == X1 copy /Y "$(ProjectDir)Intro.wmv" "$(TargetDir)" </PropertyGroup> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> <Import Project="..\..\packages\WPFMediaKit.2.2.0\build\WPFMediaKit.targets" Condition="Exists('..\..\packages\WPFMediaKit.2.2.0\build\WPFMediaKit.targets')" /> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MainViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MainViewVM.cs index 67b007371..33e5239b0 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MainViewVM.cs @@ -25,6 +25,7 @@ using Tango.PPC.UI.AppBarItems; using Tango.PPC.Common.Notifications.NotificationItems; using Tango.Core.Commands; using System.Timers; +using Tango.PMR.MachineStatus; namespace Tango.PPC.UI.ViewModels { @@ -104,16 +105,18 @@ namespace Tango.PPC.UI.ViewModels _screenSaverTimer.Elapsed += _screenSaverTimer_Elapsed; _screenSaverTimer.Start(); + + MachineProvider.MachineOperator.NotificationAvailable += MachineOperator_NotificationAvailable; } #region Waste Replacement private void MachineOperator_WasteReplacementRequired(object sender, EventArgs e) { - InvokeUI(async () => + InvokeUI(async () => { var vm = await NotificationProvider.ShowDialog<WasteReplacementViewVM>(); - + if (MachineProvider.IsConnected) { try @@ -298,7 +301,7 @@ namespace Tango.PPC.UI.ViewModels private void MachineOperator_ThreadLoadingConfirmationRequired(object sender, ThreadLoadingConfirmationRequiredEventArgs e) { -// DisplayThreadLoading(e); + // DisplayThreadLoading(e); } #endregion @@ -340,7 +343,56 @@ namespace Tango.PPC.UI.ViewModels IsScreenSaverOn = true; } } - + + #endregion + + #region Firmware Notifications + + private void MachineOperator_NotificationAvailable(object sender, PMR.MachineStatus.StartNotificationResponse e) + { + InvokeUI(async () => + { + if (!e.IsBlocking) + { + NotificationProvider.PushNotification(new MessageNotificationItem() + { + CanClose = true, + MessageType = ConvertNotificationToMessageType(e.Type), + Message = e.Title, + ExpandedMessage = e.Message + }); + } + else + { + await NotificationProvider.ShowDialog<FirmwareNotificationViewVM>(new FirmwareNotificationViewVM() + { + Type = e.Type, + Title = e.Title, + Message = e.Message + }); + } + }); + } + + private MessageNotificationItem.MessageNotificationItemTypes ConvertNotificationToMessageType(NotificationType type) + { + switch (type) + { + case NotificationType.NotifyInfo: + return MessageNotificationItem.MessageNotificationItemTypes.Info; + case NotificationType.NotifyWarning: + return MessageNotificationItem.MessageNotificationItemTypes.Warning; + case NotificationType.NotifyError: + return MessageNotificationItem.MessageNotificationItemTypes.Error; + case NotificationType.NotifyCritical: + return MessageNotificationItem.MessageNotificationItemTypes.Critical; + case NotificationType.NotifySuccess: + return MessageNotificationItem.MessageNotificationItemTypes.Success; + default: + return MessageNotificationItem.MessageNotificationItemTypes.Info; + } + } + #endregion } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest b/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest index d72e75011..efc5f8179 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/app.manifest @@ -16,7 +16,7 @@ Remove this element if your application requires this virtualization for backwards compatibility. --> - <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> + <!--<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />--> </requestedPrivileges> </security> </trustInfo> diff --git a/Software/Visual_Studio/Tango.Integration/Operation/IMachineOperator.cs b/Software/Visual_Studio/Tango.Integration/Operation/IMachineOperator.cs index 0f9f3b008..0a46e0eb4 100644 --- a/Software/Visual_Studio/Tango.Integration/Operation/IMachineOperator.cs +++ b/Software/Visual_Studio/Tango.Integration/Operation/IMachineOperator.cs @@ -273,6 +273,11 @@ namespace Tango.Integration.Operation event EventHandler<StartTelemetryWireResponse> TelemetryWireAvailable; /// <summary> + /// Occurs when a new user notification is available. + /// </summary> + event EventHandler<StartNotificationResponse> NotificationAvailable; + + /// <summary> /// Occurs when waste replacement is required. /// </summary> event EventHandler WasteReplacementRequired; @@ -323,6 +328,11 @@ namespace Tango.Integration.Operation bool EnableTelemetryWire { get; set; } /// <summary> + /// Gets or set a value indicating whether to enable user notifications from the firmware. + /// </summary> + bool EnableNotifications { get; set; } + + /// <summary> /// Gets the last process parameters table sent to the embedded device. /// </summary> ProcessParametersTable CurrentProcessParameters { get; } diff --git a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs index eb994afc6..1da752d23 100644 --- a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs +++ b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs @@ -76,6 +76,7 @@ namespace Tango.Integration.Operation private bool _machineStatusSent; private bool _inkFillingStatusSent; private bool _telemetryWireSent; + private bool _notificationsSent; private bool _threadLoadingSent; private bool _isPowerDownRequestInProgress; private bool _isHeadCleaningInProgress; @@ -357,6 +358,7 @@ namespace Tango.Integration.Operation public event EventHandler WasteReplacementRequired; public event EventHandler<StartTelemetryWireResponse> TelemetryWireAvailable; + public event EventHandler<StartNotificationResponse> NotificationAvailable; #endregion @@ -673,6 +675,20 @@ namespace Tango.Integration.Operation } } + private bool _enableNotifications; + public bool EnableNotifications + { + get { return _enableNotifications; } + set + { + if (_enableNotifications != value) + { + _enableNotifications = value; + RaisePropertyChangedAuto(); + OnEnableNotificationsChanged(value); + } + } + } /// <summary> /// Gets or sets the machine events state provider used to get notifications about current machine events and errors. @@ -734,6 +750,7 @@ namespace Tango.Integration.Operation /// </summary> public MachineTypes MachineType { get; set; } + #endregion #region Virtual Methods @@ -824,6 +841,33 @@ namespace Tango.Integration.Operation } } + private void OnEnableNotificationsChanged(bool value) + { + if (value && State == TransportComponentState.Connected && !_notificationsSent) + { + var request = new StartNotificationRequest(); + + _notificationsSent = true; + + LogManager.Log($"Sending '{nameof(StartNotificationRequest)}'..."); + + SendContinuousRequest<StartNotificationRequest, StartNotificationResponse>(request, new TransportContinuousRequestConfig() { ShouldLog = false }).ObserveOn(new NewThreadScheduler()).Subscribe( + (response) => + { + OnNotificationAvailable(response); + }, + (ex) => + { + _notificationsSent = false; + }, + () => + { + _notificationsSent = false; + LogManager.Log("Notifications response completed!?", LogCategory.Warning); + }); + } + } + /// <summary> /// Called when the enable events property has been changed. /// </summary> @@ -1079,6 +1123,11 @@ namespace Tango.Integration.Operation TelemetryWireAvailable?.Invoke(this, response); } + private void OnNotificationAvailable(StartNotificationResponse response) + { + NotificationAvailable?.Invoke(this, response); + } + /// <summary> /// Called when events notification message has been received. /// </summary> @@ -1543,6 +1592,7 @@ namespace Tango.Integration.Operation _eventsSent = false; _machineStatusSent = false; _telemetryWireSent = false; + _notificationsSent = false; //MachineStatus = null; @@ -1646,6 +1696,7 @@ namespace Tango.Integration.Operation _debugSent = false; _machineStatusSent = false; _telemetryWireSent = false; + _notificationsSent = false; _bitResults = null; @@ -1656,6 +1707,7 @@ namespace Tango.Integration.Operation OnEnableAutomaticThreadLoadingChanged(EnableAutomaticThreadLoading); OnEnableInkFillingStatus(EnableInkFillingStatus); OnEnableTelemetryWireChanged(EnableTelemetryWire); + OnEnableNotificationsChanged(EnableNotifications); if (EnablePowerUpSequence) { diff --git a/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs b/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs index 981ffe4f4..b056b402d 100644 --- a/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs +++ b/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs @@ -22,7 +22,7 @@ namespace Tango.PMR.Common { static MessageTypeReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "ChFNZXNzYWdlVHlwZS5wcm90bxIQVGFuZ28uUE1SLkNvbW1vbirjRQoLTWVz", + "ChFNZXNzYWdlVHlwZS5wcm90bxIQVGFuZ28uUE1SLkNvbW1vbiqiRgoLTWVz", "c2FnZVR5cGUSCAoETm9uZRAAEhEKDUVycm9yUmVzcG9uc2UQARIUChBDYWxj", "dWxhdGVSZXF1ZXN0EAMSFQoRQ2FsY3VsYXRlUmVzcG9uc2UQBBITCg9Qcm9n", "cmVzc1JlcXVlc3QQBRIUChBQcm9ncmVzc1Jlc3BvbnNlEAYSHAoYU3R1YkNh", @@ -196,33 +196,34 @@ namespace Tango.PMR.Common { "b3duVGltZVJlcXVlc3QQsEYSHQoYU2V0UG93ZXJEb3duVGltZVJlc3BvbnNl", "ELFGEh0KGFNldEJ1enplclNldHRpbmdzUmVxdWVzdBCyRhIeChlTZXRCdXp6", "ZXJTZXR0aW5nc1Jlc3BvbnNlELNGEh4KGVNldFdoaXRlVGhyZWFkU2tpcFJl", - "cXVlc3QQtEYSHwoaU2V0V2hpdGVUaHJlYWRTa2lwUmVzcG9uc2UQtUYSGgoV", - "U3RhcnRQb3dlckRvd25SZXF1ZXN0EJBOEhsKFlN0YXJ0UG93ZXJEb3duUmVz", - "cG9uc2UQkU4SGgoVQWJvcnRQb3dlckRvd25SZXF1ZXN0EJJOEhsKFkFib3J0", - "UG93ZXJEb3duUmVzcG9uc2UQk04SGAoTU3RhcnRQb3dlclVwUmVxdWVzdBCU", - "ThIZChRTdGFydFBvd2VyVXBSZXNwb25zZRCVThIYChNBYm9ydFBvd2VyVXBS", - "ZXF1ZXN0EJZOEhkKFEFib3J0UG93ZXJVcFJlc3BvbnNlEJdOEhMKDlN0YW5k", - "QnlSZXF1ZXN0EJhOEhQKD1N0YW5kQnlSZXNwb25zZRCZThIeChlTdGFydFRo", - "cmVhZExvYWRpbmdSZXF1ZXN0EPhVEh8KGlN0YXJ0VGhyZWFkTG9hZGluZ1Jl", - "c3BvbnNlEPlVEiEKHENvbnRpbnVlVGhyZWFkTG9hZGluZ1JlcXVlc3QQ+lUS", - "IgodQ29udGludWVUaHJlYWRMb2FkaW5nUmVzcG9uc2UQ+1USHQoYU3RvcFRo", - "cmVhZExvYWRpbmdSZXF1ZXN0EPxVEh4KGVN0b3BUaHJlYWRMb2FkaW5nUmVz", - "cG9uc2UQ/VUSHAoXVHJ5VGhyZWFkTG9hZGluZ1JlcXVlc3QQ/lUSHQoYVHJ5", - "VGhyZWFkTG9hZGluZ1Jlc3BvbnNlEP9VEiAKG0F0dGVtcHRUaHJlYWRKb2dn", - "aW5nUmVxdWVzdBCAVhIhChxBdHRlbXB0VGhyZWFkSm9nZ2luZ1Jlc3BvbnNl", - "EIFWEh4KGUFib3J0VGhyZWFkTG9hZGluZ1JlcXVlc3QQglYSHwoaQWJvcnRU", - "aHJlYWRMb2FkaW5nUmVzcG9uc2UQg1YSIQocU3RhcnRJbmtGaWxsaW5nU3Rh", - "dHVzUmVxdWVzdBDgXRIiCh1TdGFydElua0ZpbGxpbmdTdGF0dXNSZXNwb25z", - "ZRDhXRIeChlJbml0aWF0ZUlua0ZpbGxpbmdSZXF1ZXN0EOJdEh8KGkluaXRp", - "YXRlSW5rRmlsbGluZ1Jlc3BvbnNlEONdEhgKE1dhc3RlUmVwbGFjZVJlcXVl", - "c3QQ5F0SGQoUV2FzdGVSZXBsYWNlUmVzcG9uc2UQ5V0SHAoXU2V0SmVycmlj", - "YW5MZXZlbFJlcXVlc3QQ5l0SHQoYU2V0SmVycmljYW5MZXZlbFJlc3BvbnNl", - "EOddEhwKF1B1dERhdGFTdG9yZUl0ZW1SZXF1ZXN0EMhlEh0KGFB1dERhdGFT", - "dG9yZUl0ZW1SZXNwb25zZRDJZRIcChdHZXREYXRhU3RvcmVJdGVtUmVxdWVz", - "dBDKZRIdChhHZXREYXRhU3RvcmVJdGVtUmVzcG9uc2UQy2USIQocRGF0YVN0", - "b3JlSXRlbU1vZGlmaWVkUmVxdWVzdBDMZRIiCh1EYXRhU3RvcmVJdGVtTW9k", - "aWZpZWRSZXNwb25zZRDNZUIcChpjb20udHdpbmUudGFuZ28ucG1yLmNvbW1v", - "bmIGcHJvdG8z")); + "cXVlc3QQtEYSHwoaU2V0V2hpdGVUaHJlYWRTa2lwUmVzcG9uc2UQtUYSHQoY", + "U3RhcnROb3RpZmljYXRpb25SZXF1ZXN0ELZGEh4KGVN0YXJ0Tm90aWZpY2F0", + "aW9uUmVzcG9uc2UQt0YSGgoVU3RhcnRQb3dlckRvd25SZXF1ZXN0EJBOEhsK", + "FlN0YXJ0UG93ZXJEb3duUmVzcG9uc2UQkU4SGgoVQWJvcnRQb3dlckRvd25S", + "ZXF1ZXN0EJJOEhsKFkFib3J0UG93ZXJEb3duUmVzcG9uc2UQk04SGAoTU3Rh", + "cnRQb3dlclVwUmVxdWVzdBCUThIZChRTdGFydFBvd2VyVXBSZXNwb25zZRCV", + "ThIYChNBYm9ydFBvd2VyVXBSZXF1ZXN0EJZOEhkKFEFib3J0UG93ZXJVcFJl", + "c3BvbnNlEJdOEhMKDlN0YW5kQnlSZXF1ZXN0EJhOEhQKD1N0YW5kQnlSZXNw", + "b25zZRCZThIeChlTdGFydFRocmVhZExvYWRpbmdSZXF1ZXN0EPhVEh8KGlN0", + "YXJ0VGhyZWFkTG9hZGluZ1Jlc3BvbnNlEPlVEiEKHENvbnRpbnVlVGhyZWFk", + "TG9hZGluZ1JlcXVlc3QQ+lUSIgodQ29udGludWVUaHJlYWRMb2FkaW5nUmVz", + "cG9uc2UQ+1USHQoYU3RvcFRocmVhZExvYWRpbmdSZXF1ZXN0EPxVEh4KGVN0", + "b3BUaHJlYWRMb2FkaW5nUmVzcG9uc2UQ/VUSHAoXVHJ5VGhyZWFkTG9hZGlu", + "Z1JlcXVlc3QQ/lUSHQoYVHJ5VGhyZWFkTG9hZGluZ1Jlc3BvbnNlEP9VEiAK", + "G0F0dGVtcHRUaHJlYWRKb2dnaW5nUmVxdWVzdBCAVhIhChxBdHRlbXB0VGhy", + "ZWFkSm9nZ2luZ1Jlc3BvbnNlEIFWEh4KGUFib3J0VGhyZWFkTG9hZGluZ1Jl", + "cXVlc3QQglYSHwoaQWJvcnRUaHJlYWRMb2FkaW5nUmVzcG9uc2UQg1YSIQoc", + "U3RhcnRJbmtGaWxsaW5nU3RhdHVzUmVxdWVzdBDgXRIiCh1TdGFydElua0Zp", + "bGxpbmdTdGF0dXNSZXNwb25zZRDhXRIeChlJbml0aWF0ZUlua0ZpbGxpbmdS", + "ZXF1ZXN0EOJdEh8KGkluaXRpYXRlSW5rRmlsbGluZ1Jlc3BvbnNlEONdEhgK", + "E1dhc3RlUmVwbGFjZVJlcXVlc3QQ5F0SGQoUV2FzdGVSZXBsYWNlUmVzcG9u", + "c2UQ5V0SHAoXU2V0SmVycmljYW5MZXZlbFJlcXVlc3QQ5l0SHQoYU2V0SmVy", + "cmljYW5MZXZlbFJlc3BvbnNlEOddEhwKF1B1dERhdGFTdG9yZUl0ZW1SZXF1", + "ZXN0EMhlEh0KGFB1dERhdGFTdG9yZUl0ZW1SZXNwb25zZRDJZRIcChdHZXRE", + "YXRhU3RvcmVJdGVtUmVxdWVzdBDKZRIdChhHZXREYXRhU3RvcmVJdGVtUmVz", + "cG9uc2UQy2USIQocRGF0YVN0b3JlSXRlbU1vZGlmaWVkUmVxdWVzdBDMZRIi", + "Ch1EYXRhU3RvcmVJdGVtTW9kaWZpZWRSZXNwb25zZRDNZUIcChpjb20udHdp", + "bmUudGFuZ28ucG1yLmNvbW1vbmIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.Common.MessageType), }, null)); @@ -538,6 +539,8 @@ namespace Tango.PMR.Common { [pbr::OriginalName("SetBuzzerSettingsResponse")] SetBuzzerSettingsResponse = 9011, [pbr::OriginalName("SetWhiteThreadSkipRequest")] SetWhiteThreadSkipRequest = 9012, [pbr::OriginalName("SetWhiteThreadSkipResponse")] SetWhiteThreadSkipResponse = 9013, + [pbr::OriginalName("StartNotificationRequest")] StartNotificationRequest = 9014, + [pbr::OriginalName("StartNotificationResponse")] StartNotificationResponse = 9015, /// <summary> ///Power /// </summary> diff --git a/Software/Visual_Studio/Tango.PMR/Diagnostics/StartTelemetryWireResponse.cs b/Software/Visual_Studio/Tango.PMR/Diagnostics/StartTelemetryWireResponse.cs index b9155dcb4..97bcf2931 100644 --- a/Software/Visual_Studio/Tango.PMR/Diagnostics/StartTelemetryWireResponse.cs +++ b/Software/Visual_Studio/Tango.PMR/Diagnostics/StartTelemetryWireResponse.cs @@ -23,13 +23,14 @@ namespace Tango.PMR.Diagnostics { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "CiBTdGFydFRlbGVtZXRyeVdpcmVSZXNwb25zZS5wcm90bxIVVGFuZ28uUE1S", - "LkRpYWdub3N0aWNzIjkKGlN0YXJ0VGVsZW1ldHJ5V2lyZVJlc3BvbnNlEgwK", - "BE5hbWUYASABKAkSDQoFVmFsdWUYAiABKAJCIQofY29tLnR3aW5lLnRhbmdv", + "LkRpYWdub3N0aWNzGhNUZWxlbWV0cnlXaXJlLnByb3RvIlEKGlN0YXJ0VGVs", + "ZW1ldHJ5V2lyZVJlc3BvbnNlEjMKBVdpcmVzGAEgAygLMiQuVGFuZ28uUE1S", + "LkRpYWdub3N0aWNzLlRlbGVtZXRyeVdpcmVCIQofY29tLnR3aW5lLnRhbmdv", "LnBtci5kaWFnbm9zdGljc2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { }, + new pbr::FileDescriptor[] { global::Tango.PMR.Diagnostics.TelemetryWireReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.Diagnostics.StartTelemetryWireResponse), global::Tango.PMR.Diagnostics.StartTelemetryWireResponse.Parser, new[]{ "Name", "Value" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.Diagnostics.StartTelemetryWireResponse), global::Tango.PMR.Diagnostics.StartTelemetryWireResponse.Parser, new[]{ "Wires" }, null, null, null) })); } #endregion @@ -60,8 +61,7 @@ namespace Tango.PMR.Diagnostics { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public StartTelemetryWireResponse(StartTelemetryWireResponse other) : this() { - name_ = other.name_; - value_ = other.value_; + wires_ = other.wires_.Clone(); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -69,26 +69,14 @@ namespace Tango.PMR.Diagnostics { return new StartTelemetryWireResponse(this); } - /// <summary>Field number for the "Name" field.</summary> - public const int NameFieldNumber = 1; - private string name_ = ""; + /// <summary>Field number for the "Wires" field.</summary> + public const int WiresFieldNumber = 1; + private static readonly pb::FieldCodec<global::Tango.PMR.Diagnostics.TelemetryWire> _repeated_wires_codec + = pb::FieldCodec.ForMessage(10, global::Tango.PMR.Diagnostics.TelemetryWire.Parser); + private readonly pbc::RepeatedField<global::Tango.PMR.Diagnostics.TelemetryWire> wires_ = new pbc::RepeatedField<global::Tango.PMR.Diagnostics.TelemetryWire>(); [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// <summary>Field number for the "Value" field.</summary> - public const int ValueFieldNumber = 2; - private float value_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public float Value { - get { return value_; } - set { - value_ = value; - } + public pbc::RepeatedField<global::Tango.PMR.Diagnostics.TelemetryWire> Wires { + get { return wires_; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -104,16 +92,14 @@ namespace Tango.PMR.Diagnostics { if (ReferenceEquals(other, this)) { return true; } - if (Name != other.Name) return false; - if (Value != other.Value) return false; + if(!wires_.Equals(other.wires_)) return false; return true; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override int GetHashCode() { int hash = 1; - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (Value != 0F) hash ^= Value.GetHashCode(); + hash ^= wires_.GetHashCode(); return hash; } @@ -124,25 +110,13 @@ namespace Tango.PMR.Diagnostics { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public void WriteTo(pb::CodedOutputStream output) { - if (Name.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Name); - } - if (Value != 0F) { - output.WriteRawTag(21); - output.WriteFloat(Value); - } + wires_.WriteTo(output, _repeated_wires_codec); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public int CalculateSize() { int size = 0; - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - if (Value != 0F) { - size += 1 + 4; - } + size += wires_.CalculateSize(_repeated_wires_codec); return size; } @@ -151,12 +125,7 @@ namespace Tango.PMR.Diagnostics { if (other == null) { return; } - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.Value != 0F) { - Value = other.Value; - } + wires_.Add(other.wires_); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -168,11 +137,7 @@ namespace Tango.PMR.Diagnostics { input.SkipLastField(); break; case 10: { - Name = input.ReadString(); - break; - } - case 21: { - Value = input.ReadFloat(); + wires_.AddEntriesFrom(input, _repeated_wires_codec); break; } } diff --git a/Software/Visual_Studio/Tango.PMR/Diagnostics/TelemetryWire.cs b/Software/Visual_Studio/Tango.PMR/Diagnostics/TelemetryWire.cs new file mode 100644 index 000000000..b30dc3caa --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/Diagnostics/TelemetryWire.cs @@ -0,0 +1,187 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: TelemetryWire.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.Diagnostics { + + /// <summary>Holder for reflection information generated from TelemetryWire.proto</summary> + public static partial class TelemetryWireReflection { + + #region Descriptor + /// <summary>File descriptor for TelemetryWire.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static TelemetryWireReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChNUZWxlbWV0cnlXaXJlLnByb3RvEhVUYW5nby5QTVIuRGlhZ25vc3RpY3Mi", + "LAoNVGVsZW1ldHJ5V2lyZRIMCgROYW1lGAEgASgJEg0KBVZhbHVlGAIgASgC", + "QiEKH2NvbS50d2luZS50YW5nby5wbXIuZGlhZ25vc3RpY3NiBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.Diagnostics.TelemetryWire), global::Tango.PMR.Diagnostics.TelemetryWire.Parser, new[]{ "Name", "Value" }, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class TelemetryWire : pb::IMessage<TelemetryWire> { + private static readonly pb::MessageParser<TelemetryWire> _parser = new pb::MessageParser<TelemetryWire>(() => new TelemetryWire()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<TelemetryWire> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.Diagnostics.TelemetryWireReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public TelemetryWire() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public TelemetryWire(TelemetryWire other) : this() { + name_ = other.name_; + value_ = other.value_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public TelemetryWire Clone() { + return new TelemetryWire(this); + } + + /// <summary>Field number for the "Name" field.</summary> + public const int NameFieldNumber = 1; + private string name_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Name { + get { return name_; } + set { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// <summary>Field number for the "Value" field.</summary> + public const int ValueFieldNumber = 2; + private float value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float Value { + get { return value_; } + set { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as TelemetryWire); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(TelemetryWire other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Name != other.Name) return false; + if (Value != other.Value) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Name.Length != 0) hash ^= Name.GetHashCode(); + if (Value != 0F) hash ^= Value.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Name.Length != 0) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (Value != 0F) { + output.WriteRawTag(21); + output.WriteFloat(Value); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Name.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (Value != 0F) { + size += 1 + 4; + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(TelemetryWire other) { + if (other == null) { + return; + } + if (other.Name.Length != 0) { + Name = other.Name; + } + if (other.Value != 0F) { + Value = other.Value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 21: { + Value = input.ReadFloat(); + break; + } + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/MachineStatus/NotificationType.cs b/Software/Visual_Studio/Tango.PMR/MachineStatus/NotificationType.cs new file mode 100644 index 000000000..cbf0d38c0 --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/MachineStatus/NotificationType.cs @@ -0,0 +1,50 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: NotificationType.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.MachineStatus { + + /// <summary>Holder for reflection information generated from NotificationType.proto</summary> + public static partial class NotificationTypeReflection { + + #region Descriptor + /// <summary>File descriptor for NotificationType.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static NotificationTypeReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChZOb3RpZmljYXRpb25UeXBlLnByb3RvEhdUYW5nby5QTVIuTWFjaGluZVN0", + "YXR1cyptChBOb3RpZmljYXRpb25UeXBlEg4KCk5vdGlmeUluZm8QABIRCg1O", + "b3RpZnlXYXJuaW5nEAESDwoLTm90aWZ5RXJyb3IQAhISCg5Ob3RpZnlDcml0", + "aWNhbBADEhEKDU5vdGlmeVN1Y2Nlc3MQBEIjCiFjb20udHdpbmUudGFuZ28u", + "cG1yLm1hY2hpbmVzdGF0dXNiBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.MachineStatus.NotificationType), }, null)); + } + #endregion + + } + #region Enums + public enum NotificationType { + [pbr::OriginalName("NotifyInfo")] NotifyInfo = 0, + [pbr::OriginalName("NotifyWarning")] NotifyWarning = 1, + [pbr::OriginalName("NotifyError")] NotifyError = 2, + [pbr::OriginalName("NotifyCritical")] NotifyCritical = 3, + [pbr::OriginalName("NotifySuccess")] NotifySuccess = 4, + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/MachineStatus/StartNotificationRequest.cs b/Software/Visual_Studio/Tango.PMR/MachineStatus/StartNotificationRequest.cs new file mode 100644 index 000000000..002c42984 --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/MachineStatus/StartNotificationRequest.cs @@ -0,0 +1,131 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: StartNotificationRequest.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.MachineStatus { + + /// <summary>Holder for reflection information generated from StartNotificationRequest.proto</summary> + public static partial class StartNotificationRequestReflection { + + #region Descriptor + /// <summary>File descriptor for StartNotificationRequest.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static StartNotificationRequestReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Ch5TdGFydE5vdGlmaWNhdGlvblJlcXVlc3QucHJvdG8SF1RhbmdvLlBNUi5N", + "YWNoaW5lU3RhdHVzIhoKGFN0YXJ0Tm90aWZpY2F0aW9uUmVxdWVzdEIjCiFj", + "b20udHdpbmUudGFuZ28ucG1yLm1hY2hpbmVzdGF0dXNiBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.MachineStatus.StartNotificationRequest), global::Tango.PMR.MachineStatus.StartNotificationRequest.Parser, null, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class StartNotificationRequest : pb::IMessage<StartNotificationRequest> { + private static readonly pb::MessageParser<StartNotificationRequest> _parser = new pb::MessageParser<StartNotificationRequest>(() => new StartNotificationRequest()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<StartNotificationRequest> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.MachineStatus.StartNotificationRequestReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public StartNotificationRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public StartNotificationRequest(StartNotificationRequest other) : this() { + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public StartNotificationRequest Clone() { + return new StartNotificationRequest(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as StartNotificationRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(StartNotificationRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(StartNotificationRequest other) { + if (other == null) { + return; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/MachineStatus/StartNotificationResponse.cs b/Software/Visual_Studio/Tango.PMR/MachineStatus/StartNotificationResponse.cs new file mode 100644 index 000000000..5b6210b8f --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/MachineStatus/StartNotificationResponse.cs @@ -0,0 +1,246 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: StartNotificationResponse.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.MachineStatus { + + /// <summary>Holder for reflection information generated from StartNotificationResponse.proto</summary> + public static partial class StartNotificationResponseReflection { + + #region Descriptor + /// <summary>File descriptor for StartNotificationResponse.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static StartNotificationResponseReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Ch9TdGFydE5vdGlmaWNhdGlvblJlc3BvbnNlLnByb3RvEhdUYW5nby5QTVIu", + "TWFjaGluZVN0YXR1cxoWTm90aWZpY2F0aW9uVHlwZS5wcm90byKIAQoZU3Rh", + "cnROb3RpZmljYXRpb25SZXNwb25zZRI3CgRUeXBlGAEgASgOMikuVGFuZ28u", + "UE1SLk1hY2hpbmVTdGF0dXMuTm90aWZpY2F0aW9uVHlwZRISCgpJc0Jsb2Nr", + "aW5nGAIgASgIEg0KBVRpdGxlGAMgASgJEg8KB01lc3NhZ2UYBCABKAlCIwoh", + "Y29tLnR3aW5lLnRhbmdvLnBtci5tYWNoaW5lc3RhdHVzYgZwcm90bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Tango.PMR.MachineStatus.NotificationTypeReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.MachineStatus.StartNotificationResponse), global::Tango.PMR.MachineStatus.StartNotificationResponse.Parser, new[]{ "Type", "IsBlocking", "Title", "Message" }, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class StartNotificationResponse : pb::IMessage<StartNotificationResponse> { + private static readonly pb::MessageParser<StartNotificationResponse> _parser = new pb::MessageParser<StartNotificationResponse>(() => new StartNotificationResponse()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<StartNotificationResponse> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.MachineStatus.StartNotificationResponseReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public StartNotificationResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public StartNotificationResponse(StartNotificationResponse other) : this() { + type_ = other.type_; + isBlocking_ = other.isBlocking_; + title_ = other.title_; + message_ = other.message_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public StartNotificationResponse Clone() { + return new StartNotificationResponse(this); + } + + /// <summary>Field number for the "Type" field.</summary> + public const int TypeFieldNumber = 1; + private global::Tango.PMR.MachineStatus.NotificationType type_ = 0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::Tango.PMR.MachineStatus.NotificationType Type { + get { return type_; } + set { + type_ = value; + } + } + + /// <summary>Field number for the "IsBlocking" field.</summary> + public const int IsBlockingFieldNumber = 2; + private bool isBlocking_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool IsBlocking { + get { return isBlocking_; } + set { + isBlocking_ = value; + } + } + + /// <summary>Field number for the "Title" field.</summary> + public const int TitleFieldNumber = 3; + private string title_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Title { + get { return title_; } + set { + title_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// <summary>Field number for the "Message" field.</summary> + public const int MessageFieldNumber = 4; + private string message_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Message { + get { return message_; } + set { + message_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as StartNotificationResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(StartNotificationResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Type != other.Type) return false; + if (IsBlocking != other.IsBlocking) return false; + if (Title != other.Title) return false; + if (Message != other.Message) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Type != 0) hash ^= Type.GetHashCode(); + if (IsBlocking != false) hash ^= IsBlocking.GetHashCode(); + if (Title.Length != 0) hash ^= Title.GetHashCode(); + if (Message.Length != 0) hash ^= Message.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Type != 0) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (IsBlocking != false) { + output.WriteRawTag(16); + output.WriteBool(IsBlocking); + } + if (Title.Length != 0) { + output.WriteRawTag(26); + output.WriteString(Title); + } + if (Message.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Message); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Type != 0) { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); + } + if (IsBlocking != false) { + size += 1 + 1; + } + if (Title.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Title); + } + if (Message.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Message); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(StartNotificationResponse other) { + if (other == null) { + return; + } + if (other.Type != 0) { + Type = other.Type; + } + if (other.IsBlocking != false) { + IsBlocking = other.IsBlocking; + } + if (other.Title.Length != 0) { + Title = other.Title; + } + if (other.Message.Length != 0) { + Message = other.Message; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 8: { + type_ = (global::Tango.PMR.MachineStatus.NotificationType) input.ReadEnum(); + break; + } + case 16: { + IsBlocking = input.ReadBool(); + break; + } + case 26: { + Title = input.ReadString(); + break; + } + case 34: { + Message = input.ReadString(); + break; + } + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj index 79dab6329..aedc6495c 100644 --- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj +++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj @@ -169,6 +169,7 @@ <Compile Include="Diagnostics\StopDiagnosticsResponse.cs" /> <Compile Include="Diagnostics\StopEventsNotificationRequest.cs" /> <Compile Include="Diagnostics\StopEventsNotificationResponse.cs" /> + <Compile Include="Diagnostics\TelemetryWire.cs" /> <Compile Include="Diagnostics\ThreadAbortJoggingRequest.cs" /> <Compile Include="Diagnostics\ThreadAbortJoggingResponse.cs" /> <Compile Include="Diagnostics\ThreadJoggingRequest.cs" /> @@ -307,6 +308,7 @@ <Compile Include="MachineStatus\IDSPackLevel.cs" /> <Compile Include="MachineStatus\MachineState.cs" /> <Compile Include="MachineStatus\MachineStatus.cs" /> + <Compile Include="MachineStatus\NotificationType.cs" /> <Compile Include="MachineStatus\PumpState.cs" /> <Compile Include="MachineStatus\PumpStatus.cs" /> <Compile Include="MachineStatus\PumpType.cs" /> @@ -323,6 +325,8 @@ <Compile Include="MachineStatus\SpoolTypeChangedResponse.cs" /> <Compile Include="MachineStatus\StartMachineStatusUpdateRequest.cs" /> <Compile Include="MachineStatus\StartMachineStatusUpdateResponse.cs" /> + <Compile Include="MachineStatus\StartNotificationRequest.cs" /> + <Compile Include="MachineStatus\StartNotificationResponse.cs" /> <Compile Include="MachineStatus\Status.cs" /> <Compile Include="MachineStatus\StopMachineStatusUpdateRequest.cs" /> <Compile Include="MachineStatus\StopMachineStatusUpdateResponse.cs" /> diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryWireStreamingSource.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryWireStreamingSource.cs index 41ac42324..91585fff2 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryWireStreamingSource.cs +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryWireStreamingSource.cs @@ -52,8 +52,7 @@ namespace Tango.Telemetry.Sources { ID = String.Empty, Time = DateTime.UtcNow, - Name = e.Name, - Value = e.Value + Wires = e.Wires.Select(x => new Wire() { Name = x.Name, Value = x.Value }).ToList() } }); } diff --git a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryWire.cs b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryWire.cs index 5b3d82fbc..ef6d67675 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryWire.cs +++ b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryWire.cs @@ -6,9 +6,20 @@ using System.Threading.Tasks; namespace Tango.Telemetry.Telemetries { - public class TelemetryWire : TelemetryBase + public class Wire { public String Name { get; set; } public double Value { get; set; } } + + [TelemetryName("Wire", 1)] + public class TelemetryWire : TelemetryBase + { + public List<Wire> Wires { get; set; } + + public TelemetryWire() + { + Wires = new List<Wire>(); + } + } } diff --git a/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs b/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs index 945fe5f1f..07d301f3d 100644 --- a/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs +++ b/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs @@ -44,6 +44,7 @@ namespace Tango.Telemetry.Tester.IOT.CLI //publisher.RegisterSource(new DiagnosticsTestSource()); publisher.RegisterSource(new EventsTestSource()); publisher.RegisterSource(new MachineStatusTestSource()); + publisher.RegisterSource(new WiresTestSource()); var logsSource = new TelemetryLogsStreamingSource(); logsSource.Config.Categories.Add(LogCategory.Info); @@ -365,4 +366,46 @@ namespace Tango.Telemetry.Tester.IOT.CLI } } + + public class WiresTestSource : ITelemetryStreamingSource + { + public bool IsStarted { get; } + public string Name { get; } = "Wires Test Streaming"; + public bool RequiresTelemetryDuplicationTracking { get; } + + public event EventHandler<TelemetryAvailableEventArgs> TelemetryAvailable; + + public void Dispose() + { + + } + + public void Start() + { + Task.Factory.StartNew(() => + { + TelemetryWire wires = new TelemetryWire(); + + for (int i = 0; i < 10; i++) + { + wires.Wires.Add(new Wire() + { + Name = "Wire 1", + Value = i, + }); + } + + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() + { + DisableDeliveryRetries = true, + TelemetryObject = wires + }); + }); + } + + public void Stop() + { + + } + } } |
