diff options
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() + { + + } + } } |
