From b86f2df89ba8d9cd192c8464ff2f5a9baf50e5f1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Jun 2026 20:40:52 +0000
Subject: [PATCH 1/7] Initial plan
From cffcfbbda1e0081380fa3aaaa215062495da7da0 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Jun 2026 20:43:17 +0000
Subject: [PATCH 2/7] chore: update plan for finalizer removal
---
.../Comm and IR/ComPortController.cs | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index ec679fae5..5d81ead2d 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -119,6 +119,9 @@ private void RegisterAndConfigureComPort()
///
~ComPortController()
{
+ if (Port == null)
+ return;
+
Port.SerialDataReceived -= Port_SerialDataReceived;
}
@@ -156,6 +159,9 @@ void OnDataReceived(string s)
///
public override bool Deactivate()
{
+ if (Port == null)
+ return false;
+
return Port.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success;
}
From 1681d4e796599fd12721c4e8022be7b8e6e4aefc Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Jun 2026 20:43:52 +0000
Subject: [PATCH 3/7] fix: remove ComPortController finalizer and harden
deactivate cleanup
---
.../Comm and IR/ComPortController.cs | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index 5d81ead2d..aa6446788 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -114,17 +114,6 @@ private void RegisterAndConfigureComPort()
Port.SerialDataReceived += Port_SerialDataReceived;
}
- ///
- /// Destructor
- ///
- ~ComPortController()
- {
- if (Port == null)
- return;
-
- Port.SerialDataReceived -= Port_SerialDataReceived;
- }
-
void Port_SerialDataReceived(ComPort ReceivingComPort, ComPortSerialDataEventArgs args)
{
OnDataReceived(args.SerialData);
@@ -162,6 +151,7 @@ public override bool Deactivate()
if (Port == null)
return false;
+ Port.SerialDataReceived -= Port_SerialDataReceived;
return Port.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success;
}
From 148dead020685ed2f7ceb65c0acc3ed3d2163d8e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Jun 2026 20:46:08 +0000
Subject: [PATCH 4/7] fix: treat null com port as already deactivated
---
src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index aa6446788..3dfd8632b 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -149,7 +149,7 @@ void OnDataReceived(string s)
public override bool Deactivate()
{
if (Port == null)
- return false;
+ return true;
Port.SerialDataReceived -= Port_SerialDataReceived;
return Port.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success;
From a2388acf6428ba5d5a694520f8832eca2aa5fb1c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 9 Jun 2026 17:06:54 +0000
Subject: [PATCH 5/7] fix: deactivate ComPortController on program stopping
event
---
.../Comm and IR/ComPortController.cs | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index 3dfd8632b..8b28d23bb 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -50,6 +50,7 @@ public ComPortController(string key, Func
/// Deactivate method
///
From cd8bfcfbdc8028991291b38ced311211ca70b212 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 9 Jun 2026 17:09:30 +0000
Subject: [PATCH 6/7] fix: make ComPortController shutdown deactivation
idempotent
---
.../Comm and IR/ComPortController.cs | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index 8b28d23bb..0bc71c627 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -38,6 +38,8 @@ public class ComPortController : Device, IBasicCommunicationWithStreamDebugging
ComPort Port;
ComPort.ComPortSpec Spec;
+ private readonly object _deactivateLock = new object();
+ private bool _isDeactivated;
///
/// Constructor
@@ -148,7 +150,9 @@ void OnDataReceived(string s)
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
{
if (programEventType == eProgramStatusEventType.Stopping)
+ {
Deactivate();
+ }
}
///
@@ -157,6 +161,16 @@ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType progr
///
public override bool Deactivate()
{
+ lock (_deactivateLock)
+ {
+ if (_isDeactivated)
+ return true;
+
+ _isDeactivated = true;
+ }
+
+ CrestronEnvironment.ProgramStatusEventHandler -= CrestronEnvironment_ProgramStatusEventHandler;
+
if (Port == null)
return true;
From d4f1fecc64e5090a9aa1f5043943c3f044055ab3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 9 Jun 2026 17:11:18 +0000
Subject: [PATCH 7/7] fix: register ComPort shutdown hook after initialization
---
.../Comm and IR/ComPortController.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index 0bc71c627..e6a9773f5 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -52,7 +52,6 @@ public ComPortController(string key, Func
@@ -73,8 +74,6 @@ public ComPortController(string key, Func true);
RegisterAndConfigureComPort();
+ CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
}
private void RegisterAndConfigureComPort()