Merge remote-tracking branch 'origin/screen-lift-controller-mute-logic' into feature/circuittype-property-versiport

This commit is contained in:
equinoy
2026-01-22 15:36:27 -06:00
3 changed files with 209 additions and 146 deletions

View File

@@ -59,45 +59,55 @@ namespace PepperDash.Essentials.Core
void ProcessStatuses() void ProcessStatuses()
{ {
var InError = Monitors.Where(m => m.Status == MonitorStatus.InError); var InError = Monitors.Where(m => m.Status == MonitorStatus.InError).ToList();
var InWarning = Monitors.Where(m => m.Status == MonitorStatus.InWarning); var InWarning = Monitors.Where(m => m.Status == MonitorStatus.InWarning).ToList();
var IsOk = Monitors.Where(m => m.Status == MonitorStatus.IsOk); var IsOk = Monitors.Where(m => m.Status == MonitorStatus.IsOk).ToList();
MonitorStatus initialStatus; MonitorStatus initialStatus;
string prefix = "0:"; string prefix = "0:";
if (InError.Count() > 0) if (InError.Any())
{ {
initialStatus = MonitorStatus.InError; initialStatus = MonitorStatus.InError;
prefix = "3:"; prefix = "3:";
} }
else if (InWarning.Count() > 0) else if (InWarning.Any())
{ {
initialStatus = MonitorStatus.InWarning; initialStatus = MonitorStatus.InWarning;
prefix = "2:"; prefix = "2:";
} }
else if (IsOk.Count() > 0) else if (IsOk.Any())
initialStatus = MonitorStatus.IsOk; initialStatus = MonitorStatus.IsOk;
else else
initialStatus = MonitorStatus.StatusUnknown; initialStatus = MonitorStatus.StatusUnknown;
// Build the error message string // Build the error message string
if (InError.Count() > 0 || InWarning.Count() > 0) if (InError.Any() || InWarning.Any())
{ {
StringBuilder sb = new StringBuilder(prefix); var errorNames = InError
if (InError.Count() > 0) .Select(mon => mon.Parent is IKeyName keyName ? keyName.Name : mon.Parent.Key)
.ToList();
var warningNames = InWarning
.Select(mon => mon.Parent is IKeyName keyName ? keyName.Name : mon.Parent.Key)
.ToList();
var sb = new StringBuilder(prefix);
if (errorNames.Count > 0)
{ {
// Do string splits and joins sb.Append($"{errorNames.Count} Error{(errorNames.Count > 1 ? "s" : "")}: ");
sb.Append(string.Format("{0} Errors:", InError.Count())); sb.Append(string.Join(", ", errorNames));
foreach (var mon in InError)
sb.Append(string.Format("{0}, ", mon.Parent.Key));
} }
if (InWarning.Count() > 0) if (warningNames.Count > 0)
{ {
sb.Append(string.Format("{0} Warnings:", InWarning.Count())); if (errorNames.Count > 0)
foreach (var mon in InWarning) sb.Append("; ");
sb.Append(string.Format("{0}, ", mon.Parent.Key));
sb.Append($"{warningNames.Count} Warning{(warningNames.Count > 1 ? "s" : "")}: ");
sb.Append(string.Join(", ", warningNames));
} }
sb.Append(" Offline");
Message = sb.ToString(); Message = sb.ToString();
} }
else else

View File

@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.Devices.Common.Shades
{ {
None, None,
Raise, Raise,
Lower Lower,
} }
/// <summary> /// <summary>
@@ -50,7 +50,8 @@ namespace PepperDash.Essentials.Devices.Common.Shades
get { return _isInUpPosition; } get { return _isInUpPosition; }
set set
{ {
if (value == _isInUpPosition) return; if (value == _isInUpPosition)
return;
_isInUpPosition = value; _isInUpPosition = value;
IsInUpPosition.FireUpdate(); IsInUpPosition.FireUpdate();
PositionChanged?.Invoke(this, new EventArgs()); PositionChanged?.Invoke(this, new EventArgs());
@@ -87,7 +88,11 @@ namespace PepperDash.Essentials.Devices.Common.Shades
/// <summary> /// <summary>
/// Constructor for ScreenLiftController /// Constructor for ScreenLiftController
/// </summary> /// </summary>
public ScreenLiftController(string key, string name, ScreenLiftControllerConfigProperties config) public ScreenLiftController(
string key,
string name,
ScreenLiftControllerConfigProperties config
)
: base(key, name) : base(key, name)
{ {
Config = config; Config = config;
@@ -116,16 +121,49 @@ namespace PepperDash.Essentials.Devices.Common.Shades
break; break;
} }
} }
IsInUpPosition.OutputChange += (sender, args) =>
{
this.LogDebug(
"ScreenLiftController '{name}' IsInUpPosition changed to {position}",
Name,
IsInUpPosition.BoolValue ? "Up" : "Down"
);
if (!Config.MuteOnScreenUp)
{
return;
}
if (args.BoolValue)
{
return;
}
if (DisplayDevice is IBasicVideoMuteWithFeedback videoMute)
{
this.LogInformation("Unmuting video because screen is down");
videoMute.VideoMuteOff();
}
};
IsInUpPosition.FireUpdate();
} }
private void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs e) private void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs e)
{ {
if (!DisplayDevice.IsCoolingDownFeedback.BoolValue && Type == eScreenLiftControlType.lift) if (
!DisplayDevice.IsCoolingDownFeedback.BoolValue
&& Type == eScreenLiftControlType.lift
)
{ {
Raise(); Raise();
return; return;
} }
if (DisplayDevice.IsCoolingDownFeedback.BoolValue && Type == eScreenLiftControlType.screen) if (
DisplayDevice.IsCoolingDownFeedback.BoolValue
&& Type == eScreenLiftControlType.screen
)
{ {
Raise(); Raise();
return; return;
@@ -172,7 +210,8 @@ namespace PepperDash.Essentials.Devices.Common.Shades
this.LogDebug("Subscribing to {displayKey} feedbacks", DisplayDeviceKey); this.LogDebug("Subscribing to {displayKey} feedbacks", DisplayDeviceKey);
DisplayDevice.IsWarmingUpFeedback.OutputChange += IsWarmingUpFeedback_OutputChange; DisplayDevice.IsWarmingUpFeedback.OutputChange += IsWarmingUpFeedback_OutputChange;
DisplayDevice.IsCoolingDownFeedback.OutputChange += IsCoolingDownFeedback_OutputChange; DisplayDevice.IsCoolingDownFeedback.OutputChange +=
IsCoolingDownFeedback_OutputChange;
} }
return base.CustomActivate(); return base.CustomActivate();
@@ -183,10 +222,17 @@ namespace PepperDash.Essentials.Devices.Common.Shades
/// </summary> /// </summary>
public void Raise() public void Raise()
{ {
if (RaiseRelay == null && LatchedRelay == null) return; if (RaiseRelay == null && LatchedRelay == null)
return;
this.LogDebug("Raise called for {type}", Type); this.LogDebug("Raise called for {type}", Type);
if (Config.MuteOnScreenUp && DisplayDevice is IBasicVideoMuteWithFeedback videoMute)
{
this.LogInformation("Muting video because screen is going up");
videoMute.VideoMuteOn();
}
// If device is moving, bank the command // If device is moving, bank the command
if (_isMoving) if (_isMoving)
{ {
@@ -235,7 +281,8 @@ namespace PepperDash.Essentials.Devices.Common.Shades
/// </summary> /// </summary>
public void Lower() public void Lower()
{ {
if (LowerRelay == null && LatchedRelay == null) return; if (LowerRelay == null && LatchedRelay == null)
return;
this.LogDebug("Lower called for {type}", Type); this.LogDebug("Lower called for {type}", Type);
@@ -339,10 +386,7 @@ namespace PepperDash.Essentials.Devices.Common.Shades
{ {
output.On(); output.On();
var timer = new Timer(pulseTime) var timer = new Timer(pulseTime) { AutoReset = false };
{
AutoReset = false
};
timer.Elapsed += (sender, e) => timer.Elapsed += (sender, e) =>
{ {
@@ -361,7 +405,10 @@ namespace PepperDash.Essentials.Devices.Common.Shades
} }
else else
{ {
this.LogWarning("Error: Unable to get relay device with key '{relayKey}'", relayKey); this.LogWarning(
"Error: Unable to get relay device with key '{relayKey}'",
relayKey
);
return null; return null;
} }
} }
@@ -375,11 +422,13 @@ namespace PepperDash.Essentials.Devices.Common.Shades
} }
else else
{ {
this.LogWarning("Error: Unable to get display device with key '{displayKey}'", displayKey); this.LogWarning(
"Error: Unable to get display device with key '{displayKey}'",
displayKey
);
return null; return null;
} }
} }
} }
/// <summary> /// <summary>

View File

@@ -10,7 +10,6 @@ namespace PepperDash.Essentials.Devices.Common.Shades
/// </summary> /// </summary>
public class ScreenLiftControllerConfigProperties public class ScreenLiftControllerConfigProperties
{ {
/// <summary> /// <summary>
/// Gets or sets the DisplayDeviceKey /// Gets or sets the DisplayDeviceKey
/// </summary> /// </summary>
@@ -37,5 +36,10 @@ namespace PepperDash.Essentials.Devices.Common.Shades
[JsonProperty("relays")] [JsonProperty("relays")]
public Dictionary<string, ScreenLiftRelaysConfig> Relays { get; set; } public Dictionary<string, ScreenLiftRelaysConfig> Relays { get; set; }
/// <summary>
/// Mutes the display when the screen is in the up position
/// </summary>
[JsonProperty("muteOnScreenUp")]
public bool MuteOnScreenUp { get; set; }
} }
} }