From 5e54c3c0545217fe9f921a913186316e38ed1fe2 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 16 Oct 2024 13:22:47 -0500 Subject: [PATCH 1/2] fix: add logging and error handling --- .../MobileControlEssentialsRoomBridge.cs | 433 +++++++++--------- 1 file changed, 227 insertions(+), 206 deletions(-) diff --git a/3-series/RoomBridges/MobileControlEssentialsRoomBridge.cs b/3-series/RoomBridges/MobileControlEssentialsRoomBridge.cs index 0d10c34..a64d7e4 100644 --- a/3-series/RoomBridges/MobileControlEssentialsRoomBridge.cs +++ b/3-series/RoomBridges/MobileControlEssentialsRoomBridge.cs @@ -77,7 +77,7 @@ protected override void CustomRegisterWithAppServer(MobileControlSystemControlle // sub-controller parsing could be attached to these classes, so that the systemController // doesn't need to know about everything. - Debug.Console(0, this, "Registering Actions with AppServer"); + this.LogInformation("Registering Actions with AppServer"); AddAction("/promptForCode", (id, content) => OnUserPromptedForCode()); AddAction("/clientJoined", (id, content) => OnClientJoined()); @@ -106,7 +106,7 @@ protected override void CustomRegisterWithAppServer(MobileControlSystemControlle var msg = content.ToObject(); - Debug.Console(2, this, "Received request to route to source: {0} on list: {1}", msg.SourceListItemKey, msg.SourceListKey); + this.LogVerbose("Received request to route to source: {sourceListKey} on list: {sourceList}", msg.SourceListItemKey, msg.SourceListKey); routeRoom.RunRouteAction(msg.SourceListItemKey, msg.SourceListKey); }); @@ -118,7 +118,7 @@ protected override void CustomRegisterWithAppServer(MobileControlSystemControlle var msg = content.ToObject(); - Debug.Console(2, this, $"Running direct route from {msg.SourceKey} to {msg.DestinationKey} with signal type {msg.SignalType}"); + this.LogVerbose("Running direct route from {sourceKey} to {destinationKey} with signal type {signalType}", msg.SourceKey, msg.DestinationKey, msg.SignalType); directRouteRoom.RunDirectRoute(msg.SourceKey, msg.DestinationKey, msg.SignalType); }); @@ -179,7 +179,7 @@ protected override void CustomRegisterWithAppServer(MobileControlSystemControlle // Registers for initial volume events, if possible if (volumeRoom.CurrentVolumeControls is IBasicVolumeWithFeedback currentVolumeDevice) { - Debug.Console(2, this, "Registering for volume feedback events"); + this.LogVerbose("Registering for volume feedback events"); currentVolumeDevice.MuteFeedback.OutputChange += MuteFeedback_OutputChange; currentVolumeDevice.VolumeLevelFeedback.OutputChange += VolumeLevelFeedback_OutputChange; @@ -244,7 +244,7 @@ private void UpdateTouchPanelAppUrls(string userAppUrl) if (dev == null) { continue; - } + } //UpdateAppUrl($"{userAppUrl}?token={tp.Token}"); @@ -274,14 +274,14 @@ private void GetRoom() { if (Room != null) { - Debug.Console(0, this, "Room with key {0} already linked.", DefaultRoomKey); + this.LogInformation("Room with key {key} already linked.", DefaultRoomKey); return; } if (!(DeviceManager.GetDeviceForKey(DefaultRoomKey) is IEssentialsRoom tempRoom)) { - Debug.Console(0, this, "Room with key {0} not found or is not an Essentials Room", DefaultRoomKey); + this.LogInformation("Room with key {key} not found or is not an Essentials Room", DefaultRoomKey); return; } @@ -296,7 +296,7 @@ protected override void UserCodeChange() QrCodeUrl = qrUrl; - Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Server user code changed: {userCode} - {qrUrl}", this, UserCode, qrUrl); + this.LogDebug("Server user code changed: {userCode} - {qrUrl}", UserCode, qrUrl); OnUserCodeChanged(); } @@ -331,7 +331,7 @@ private void PrivacyModeIsOnFeedback_OutputChange(object sender, FeedbackEventAr { "master", new Volume("master") { PrivacyMuted = e.BoolValue - } + } } }; @@ -381,7 +381,7 @@ private void IsSharingFeedback_OutputChange(object sender, FeedbackEventArgs e) /// private void IsWarmingUpFeedback_OutputChange(object sender, FeedbackEventArgs e) { - var state = new + var state = new { isWarmingUp = e.BoolValue }; @@ -396,7 +396,7 @@ private void IsWarmingUpFeedback_OutputChange(object sender, FeedbackEventArgs e /// private void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs e) { - var state = new + var state = new { isCoolingDown = e.BoolValue }; @@ -410,7 +410,7 @@ private void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs /// private void OnFeedback_OutputChange(object sender, FeedbackEventArgs e) { - var state = new + var state = new { isOn = e.BoolValue }; @@ -478,7 +478,7 @@ private void Room_CurrentSingleSourceChange(SourceListItem info, ChangeType type    } } */ - + } /// @@ -489,6 +489,11 @@ private void SendFullStatusForClientId(string id, IEssentialsRoom room) { //Parent.SendMessageObject(GetFullStatus(room)); var message = GetFullStatusForClientId(room); + + if (message == null) + { + return; + } PostStatusMessage(message, id); } @@ -500,43 +505,50 @@ private void SendFullStatusForClientId(string id, IEssentialsRoom room) /// The status response message private RoomStateMessage GetFullStatusForClientId(IEssentialsRoom room) { - Debug.Console(2, this, "GetFullStatus"); + try + { + this.LogVerbose("GetFullStatus"); - var sourceKey = room is IHasCurrentSourceInfoChange ? (room as IHasCurrentSourceInfoChange).CurrentSourceInfoKey : null; + var sourceKey = room is IHasCurrentSourceInfoChange ? (room as IHasCurrentSourceInfoChange).CurrentSourceInfoKey : null; - var volumes = new Dictionary(); - if (room is IHasCurrentVolumeControls rmVc) - { - if (rmVc.CurrentVolumeControls is IBasicVolumeWithFeedback vc) + var volumes = new Dictionary(); + if (room is IHasCurrentVolumeControls rmVc) { - var volume = new Volume("master", vc.VolumeLevelFeedback.UShortValue, vc.MuteFeedback.BoolValue, "Volume", true, ""); - if (room is IPrivacy privacyRoom) + if (rmVc.CurrentVolumeControls is IBasicVolumeWithFeedback vc) { - volume.HasPrivacyMute = true; - volume.PrivacyMuted = privacyRoom.PrivacyModeIsOnFeedback.BoolValue; - } + var volume = new Volume("master", vc.VolumeLevelFeedback.UShortValue, vc.MuteFeedback.BoolValue, "Volume", true, ""); + if (room is IPrivacy privacyRoom) + { + volume.HasPrivacyMute = true; + volume.PrivacyMuted = privacyRoom.PrivacyModeIsOnFeedback.BoolValue; + } - volumes.Add("master", volume); + volumes.Add("master", volume); + } } - } - var state = new RoomStateMessage - { - Configuration = GetRoomConfiguration(room), - ActivityMode = 1, - IsOn = room.OnFeedback.BoolValue, - SelectedSourceKey = sourceKey, - Volumes = volumes, - IsWarmingUp = room.IsWarmingUpFeedback.BoolValue, - IsCoolingDown = room.IsCoolingDownFeedback.BoolValue - }; + var state = new RoomStateMessage + { + Configuration = GetRoomConfiguration(room), + ActivityMode = 1, + IsOn = room.OnFeedback.BoolValue, + SelectedSourceKey = sourceKey, + Volumes = volumes, + IsWarmingUp = room.IsWarmingUpFeedback.BoolValue, + IsCoolingDown = room.IsCoolingDownFeedback.BoolValue + }; + + if (room is IEssentialsHuddleVtc1Room vtcRoom) + { + state.IsInCall = vtcRoom.InCallFeedback.BoolValue; + } - if (room is IEssentialsHuddleVtc1Room vtcRoom) + return state; + } catch (Exception ex) { - state.IsInCall = vtcRoom.InCallFeedback.BoolValue; + Debug.LogMessage(ex, "Error getting full status", this); + return null; } - - return state; } /// @@ -545,229 +557,238 @@ private RoomStateMessage GetFullStatusForClientId(IEssentialsRoom room) /// private RoomConfiguration GetRoomConfiguration(IEssentialsRoom room) { - - var configuration = new RoomConfiguration - { - //ShutdownPromptSeconds = room.ShutdownPromptSeconds, - TouchpanelKeys = DeviceManager.AllDevices. - OfType() - .Where((tp) => tp.DefaultRoomKey.Equals(room.Key, StringComparison.InvariantCultureIgnoreCase)) - .Select(tp => tp.Key).ToList() - }; - try { - var zrcTp = DeviceManager.AllDevices.OfType().SingleOrDefault((tp) => tp.ZoomRoomController); + var configuration = new RoomConfiguration + { + //ShutdownPromptSeconds = room.ShutdownPromptSeconds, + TouchpanelKeys = DeviceManager.AllDevices. + OfType() + .Where((tp) => tp.DefaultRoomKey.Equals(room.Key, StringComparison.InvariantCultureIgnoreCase)) + .Select(tp => tp.Key).ToList() + }; + + try + { + var zrcTp = DeviceManager.AllDevices.OfType().SingleOrDefault((tp) => tp.ZoomRoomController); - configuration.ZoomRoomControllerKey = zrcTp != null ? zrcTp.Key : null; - } - catch - { - configuration.ZoomRoomControllerKey = room.Key; - } + configuration.ZoomRoomControllerKey = zrcTp != null ? zrcTp.Key : null; + } + catch + { + configuration.ZoomRoomControllerKey = room.Key; + } - if (room is IHasCiscoNavigatorTouchpanel ciscoNavRoom) - { - Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, $"Setting CiscoNavigatorKey to: {ciscoNavRoom.CiscoNavigatorTouchpanelKey}", this); - configuration.CiscoNavigatorKey = ciscoNavRoom.CiscoNavigatorTouchpanelKey; - } + if (room is IHasCiscoNavigatorTouchpanel ciscoNavRoom) + { + Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, $"Setting CiscoNavigatorKey to: {ciscoNavRoom.CiscoNavigatorTouchpanelKey}", this); + configuration.CiscoNavigatorKey = ciscoNavRoom.CiscoNavigatorTouchpanelKey; + } - // find the room combiner for this room by checking if the room is in the list of rooms for the room combiner - var roomCombiner = DeviceManager.AllDevices.OfType().FirstOrDefault(); + // find the room combiner for this room by checking if the room is in the list of rooms for the room combiner + var roomCombiner = DeviceManager.AllDevices.OfType().FirstOrDefault(); - configuration.RoomCombinerKey = roomCombiner != null ? roomCombiner.Key : null; + configuration.RoomCombinerKey = roomCombiner != null ? roomCombiner.Key : null; - if (room is IEssentialsRoomPropertiesConfig propertiesConfig) - { - configuration.HelpMessage = propertiesConfig.PropertiesConfig.HelpMessageForDisplay; - } + if (room is IEssentialsRoomPropertiesConfig propertiesConfig) + { + configuration.HelpMessage = propertiesConfig.PropertiesConfig.HelpMessageForDisplay; + } - if (room is IEssentialsHuddleSpaceRoom huddleRoom && !string.IsNullOrEmpty(huddleRoom.PropertiesConfig.HelpMessageForDisplay)) - { - Debug.Console(2, this, "Getting huddle room config"); - configuration.HelpMessage = huddleRoom.PropertiesConfig.HelpMessageForDisplay; - configuration.UiBehavior = huddleRoom.PropertiesConfig.UiBehavior; - configuration.DefaultPresentationSourceKey = huddleRoom.PropertiesConfig.DefaultSourceItem; + if (room is IEssentialsHuddleSpaceRoom huddleRoom && !string.IsNullOrEmpty(huddleRoom.PropertiesConfig.HelpMessageForDisplay)) + { + this.LogVerbose("Getting huddle room config"); + configuration.HelpMessage = huddleRoom.PropertiesConfig.HelpMessageForDisplay; + configuration.UiBehavior = huddleRoom.PropertiesConfig.UiBehavior; + configuration.DefaultPresentationSourceKey = huddleRoom.PropertiesConfig.DefaultSourceItem; - } + } - if (room is IEssentialsHuddleVtc1Room vtc1Room && !string.IsNullOrEmpty(vtc1Room.PropertiesConfig.HelpMessageForDisplay)) - { - Debug.Console(2, this, "Getting vtc room config"); - configuration.HelpMessage = vtc1Room.PropertiesConfig.HelpMessageForDisplay; - configuration.UiBehavior = vtc1Room.PropertiesConfig.UiBehavior; - configuration.DefaultPresentationSourceKey = vtc1Room.PropertiesConfig.DefaultSourceItem; - } + if (room is IEssentialsHuddleVtc1Room vtc1Room && !string.IsNullOrEmpty(vtc1Room.PropertiesConfig.HelpMessageForDisplay)) + { + this.LogVerbose("Getting vtc room config"); + configuration.HelpMessage = vtc1Room.PropertiesConfig.HelpMessageForDisplay; + configuration.UiBehavior = vtc1Room.PropertiesConfig.UiBehavior; + configuration.DefaultPresentationSourceKey = vtc1Room.PropertiesConfig.DefaultSourceItem; + } - if (room is IEssentialsTechRoom techRoom && !string.IsNullOrEmpty(techRoom.PropertiesConfig.HelpMessage)) - { - Debug.Console(2, this, "Getting tech room config"); - configuration.HelpMessage = techRoom.PropertiesConfig.HelpMessage; - } + if (room is IEssentialsTechRoom techRoom && !string.IsNullOrEmpty(techRoom.PropertiesConfig.HelpMessage)) + { + this.LogVerbose("Getting tech room config"); + configuration.HelpMessage = techRoom.PropertiesConfig.HelpMessage; + } - if (room is IHasVideoCodec vcRoom) - { - if (vcRoom.VideoCodec != null) + if (room is IHasVideoCodec vcRoom) { - Debug.Console(2, this, "Getting codec config"); - var type = vcRoom.VideoCodec.GetType(); + if (vcRoom.VideoCodec != null) + { + this.LogVerbose("Getting codec config"); + var type = vcRoom.VideoCodec.GetType(); - configuration.HasVideoConferencing = true; - configuration.VideoCodecKey = vcRoom.VideoCodec.Key; - configuration.VideoCodecIsZoomRoom = type.Name.Equals("ZoomRoom", StringComparison.InvariantCultureIgnoreCase); - } - }; + configuration.HasVideoConferencing = true; + configuration.VideoCodecKey = vcRoom.VideoCodec.Key; + configuration.VideoCodecIsZoomRoom = type.Name.Equals("ZoomRoom", StringComparison.InvariantCultureIgnoreCase); + } + }; - if (room is IHasAudioCodec acRoom) - { - if (acRoom.AudioCodec != null) + if (room is IHasAudioCodec acRoom) { - Debug.Console(2, this, "Getting audio codec config"); - configuration.HasAudioConferencing = true; - configuration.AudioCodecKey = acRoom.AudioCodec.Key; + if (acRoom.AudioCodec != null) + { + this.LogVerbose("Getting audio codec config"); + configuration.HasAudioConferencing = true; + configuration.AudioCodecKey = acRoom.AudioCodec.Key; + } } - } - - if (room is IHasMatrixRouting matrixRoutingRoom) - { - Debug.Console(2, this, "Getting matrix routing config"); - configuration.MatrixRoutingKey = matrixRoutingRoom.MatrixRoutingDeviceKey; - configuration.EndpointKeys = matrixRoutingRoom.EndpointKeys; - } - if (room is IEnvironmentalControls envRoom) - { - Debug.Console(2, this, "Getting environmental controls config. RoomHasEnvironmentalControls: {0}", envRoom.HasEnvironmentalControlDevices); - configuration.HasEnvironmentalControls = envRoom.HasEnvironmentalControlDevices; + if (room is IHasMatrixRouting matrixRoutingRoom) + { + this.LogVerbose("Getting matrix routing config"); + configuration.MatrixRoutingKey = matrixRoutingRoom.MatrixRoutingDeviceKey; + configuration.EndpointKeys = matrixRoutingRoom.EndpointKeys; + } - if (envRoom.HasEnvironmentalControlDevices) + if (room is IEnvironmentalControls envRoom) { - Debug.Console(2, this, "Room Has {0} Environmental Control Devices.", envRoom.EnvironmentalControlDevices.Count); + this.LogVerbose("Getting environmental controls config. RoomHasEnvironmentalControls: {hasEnvironmentalControls}", envRoom.HasEnvironmentalControlDevices); + configuration.HasEnvironmentalControls = envRoom.HasEnvironmentalControlDevices; - foreach (var dev in envRoom.EnvironmentalControlDevices) + if (envRoom.HasEnvironmentalControlDevices) { - Debug.Console(2, this, "Adding environmental device: {0}", dev.Key); - - eEnvironmentalDeviceTypes type = eEnvironmentalDeviceTypes.None; + this.LogVerbose("Room Has {count} Environmental Control Devices.", envRoom.EnvironmentalControlDevices.Count); - if (dev is ILightingScenes || dev is Devices.Common.Lighting.LightingBase) + foreach (var dev in envRoom.EnvironmentalControlDevices) { - type = eEnvironmentalDeviceTypes.Lighting; + this.LogVerbose("Adding environmental device: {key}", dev.Key); + + eEnvironmentalDeviceTypes type = eEnvironmentalDeviceTypes.None; + + if (dev is ILightingScenes || dev is Devices.Common.Lighting.LightingBase) + { + type = eEnvironmentalDeviceTypes.Lighting; + } + else if (dev is ShadeBase || dev is IShadesOpenCloseStop || dev is IShadesOpenClosePreset) + { + type = eEnvironmentalDeviceTypes.Shade; + } + else if (dev is IShades) + { + type = eEnvironmentalDeviceTypes.ShadeController; + } + else if (dev is ISwitchedOutput) + { + type = eEnvironmentalDeviceTypes.Relay; + } + + this.LogVerbose("Environmental Device Type: {type}", type); + + var envDevice = new EnvironmentalDeviceConfiguration(dev.Key, type); + + configuration.EnvironmentalDevices.Add(envDevice); } - else if (dev is ShadeBase || dev is IShadesOpenCloseStop || dev is IShadesOpenClosePreset) - { - type = eEnvironmentalDeviceTypes.Shade; - } - else if (dev is IShades) - { - type = eEnvironmentalDeviceTypes.ShadeController; - } - else if (dev is ISwitchedOutput) - { - type = eEnvironmentalDeviceTypes.Relay; - } - - Debug.Console(2, this, "Environmental Device Type: {0}", type); - - var envDevice = new EnvironmentalDeviceConfiguration(dev.Key, type); - - configuration.EnvironmentalDevices.Add(envDevice); + } + else + { + this.LogVerbose("Room Has No Environmental Control Devices"); } } - else + + if (room is IHasDefaultDisplay defDisplayRoom) { - Debug.Console(2, this, "Room Has No Environmental Control Devices"); + this.LogVerbose("Getting default display config"); + configuration.DefaultDisplayKey = defDisplayRoom.DefaultDisplay.Key; + configuration.Destinations.Add(eSourceListItemDestinationTypes.defaultDisplay, defDisplayRoom.DefaultDisplay.Key); } - } - if (room is IHasDefaultDisplay defDisplayRoom) - { - Debug.Console(2, this, "Getting default display config"); - configuration.DefaultDisplayKey = defDisplayRoom.DefaultDisplay.Key; - configuration.Destinations.Add(eSourceListItemDestinationTypes.defaultDisplay, defDisplayRoom.DefaultDisplay.Key); - } + if (room is IHasMultipleDisplays multiDisplayRoom) + { + this.LogVerbose("Getting multiple display config"); - if (room is IHasMultipleDisplays multiDisplayRoom) - { - Debug.Console(2, this, "Getting multiple display config"); + if (multiDisplayRoom.Displays == null) + { + this.LogVerbose("Displays collection is null"); + } + else + { + this.LogVerbose("Displays collection exists"); - if (multiDisplayRoom.Displays == null) + configuration.Destinations = multiDisplayRoom.Displays.ToDictionary(kv => kv.Key, kv => kv.Value.Key); + } + } + + if (room is IHasAccessoryDevices accRoom) { - Debug.Console(2, this, "Displays collection is null"); + Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Getting accessory devices config", this); + + if (accRoom.AccessoryDeviceKeys == null) + { + Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Accessory devices collection is null", this); + } + else + { + Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Accessory devices collection exists", this); + + configuration.AccessoryDeviceKeys = accRoom.AccessoryDeviceKeys; + } } - else + + var sourceList = ConfigReader.ConfigObject.GetSourceListForKey(room.SourceListKey); + if (sourceList != null) { - Debug.Console(2, this, "Displays collection exists"); + this.LogVerbose("Getting source list config"); + configuration.SourceList = sourceList; + configuration.HasRoutingControls = true; - configuration.Destinations = multiDisplayRoom.Displays.ToDictionary(kv => kv.Key, kv => kv.Value.Key); + foreach (var source in sourceList) + { + if (source.Value.SourceDevice is Devices.Common.IRSetTopBoxBase) + { + configuration.HasSetTopBoxControls = true; + continue; + } + else if (source.Value.SourceDevice is CameraBase) + { + configuration.HasCameraControls = true; + continue; + } + } } - } - if(room is IHasAccessoryDevices accRoom) - { - Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Getting accessory devices config", this); + var destinationList = ConfigReader.ConfigObject.GetDestinationListForKey(room.DestinationListKey); - if (accRoom.AccessoryDeviceKeys == null) + if (destinationList != null) { - Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Accessory devices collection is null", this); + configuration.DestinationList = destinationList; } - else - { - Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Accessory devices collection exists", this); - - configuration.AccessoryDeviceKeys = accRoom.AccessoryDeviceKeys; - } - } - var sourceList = ConfigReader.ConfigObject.GetSourceListForKey(room.SourceListKey); - if (sourceList != null) - { - Debug.Console(2, this, "Getting source list config"); - configuration.SourceList = sourceList; - configuration.HasRoutingControls = true; + var audioControlPointList = ConfigReader.ConfigObject.GetAudioControlPointListForKey(room.AudioControlPointListKey); - foreach (var source in sourceList) + if (audioControlPointList != null) { - if (source.Value.SourceDevice is Devices.Common.IRSetTopBoxBase) - { - configuration.HasSetTopBoxControls = true; - continue; - } - else if (source.Value.SourceDevice is CameraBase) - { - configuration.HasCameraControls = true; - continue; - } + configuration.AudioControlPointList = audioControlPointList; } - } - var destinationList = ConfigReader.ConfigObject.GetDestinationListForKey(room.DestinationListKey); + var cameraList = ConfigReader.ConfigObject.GetCameraListForKey(room.CameraListKey); - if(destinationList != null) - { - configuration.DestinationList = destinationList; - } + if (cameraList != null) + { + configuration.CameraList = cameraList; + } - var audioControlPointList = ConfigReader.ConfigObject.GetAudioControlPointListForKey(room.AudioControlPointListKey); + return configuration; - if(audioControlPointList != null) - { - configuration.AudioControlPointList = audioControlPointList; } - - var cameraList = ConfigReader.ConfigObject.GetCameraListForKey(room.CameraListKey); - - if(cameraList != null) + catch (Exception ex) { - configuration.CameraList = cameraList; + Debug.LogMessage(ex, "Exception getting room configuration"); + return new RoomConfiguration(); } - - return configuration; } + } public class RoomStateMessage : DeviceStateMessageBase From 3fe1c20cae8b5df1d7ba00aaee4df07c6af95356 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 16 Oct 2024 13:22:57 -0500 Subject: [PATCH 2/2] chore: update essentials version --- .../epi-essentials-mobile-control.csproj | 2 +- .../mobile-control-messengers/mobile-control-messengers.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/4-series/epi-essentials-mobile-control/epi-essentials-mobile-control.csproj b/4-series/epi-essentials-mobile-control/epi-essentials-mobile-control.csproj index 9a8b0f5..f964790 100644 --- a/4-series/epi-essentials-mobile-control/epi-essentials-mobile-control.csproj +++ b/4-series/epi-essentials-mobile-control/epi-essentials-mobile-control.csproj @@ -29,7 +29,7 @@ TRACE;SERIES4 - + diff --git a/4-series/mobile-control-messengers/mobile-control-messengers.csproj b/4-series/mobile-control-messengers/mobile-control-messengers.csproj index f4ca591..28f8139 100644 --- a/4-series/mobile-control-messengers/mobile-control-messengers.csproj +++ b/4-series/mobile-control-messengers/mobile-control-messengers.csproj @@ -62,6 +62,6 @@ - + \ No newline at end of file