Minor improvements for TextBlocks

This commit is contained in:
ig 2023-07-03 15:47:34 +02:00
parent e31c40b659
commit 6648d318ca
3 changed files with 63 additions and 141 deletions

View File

@ -19,7 +19,7 @@ public static class Flow
var arrow = Enumerable.Repeat(arrowChar, width).Join(); var arrow = Enumerable.Repeat(arrowChar, width).Join();
// note : appending "fake label" below to make it vertically symmetric // note : appending "fake label" below to make it vertically symmetric
return TextBlock.CenterHorizontal(label, arrow, ""); return TextBlock.AlignCenterHorizontal(label, arrow, "");
} }
[SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")]
@ -35,6 +35,6 @@ public static class Flow
.Concat(halfArrow) .Concat(halfArrow)
.ToArray(height / 2 * 2 + 1); .ToArray(height / 2 * 2 + 1);
return TextBlock.CenterHorizontal(lines); return TextBlock.AlignCenterHorizontal(lines);
} }
} }

View File

@ -34,13 +34,12 @@ internal static class Program
private const UInt32 UpdateIntervalSeconds = 2; private const UInt32 UpdateIntervalSeconds = 2;
private static readonly Byte[] BatteryNodes = { 2, 3, 4, 5, 6 }; private static readonly Byte[] BatteryNodes = { 2, 3, 4, 5, 6 };
private const String BatteryTty = "/dev/ttyUSB0";
#if DEBUG #if DEBUG
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001); private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001);
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002); private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002);
private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003); private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003);
private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("localhost", 5004); private static readonly TcpChannel IslandBusLoadChannel = new TcpChannel("localhost", 5004);
private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005); private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005);
private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006); private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006);
private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007); private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
@ -49,7 +48,7 @@ internal static class Program
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("10.0.2.1", 502); // "192.168.1.2"; private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("10.0.2.1", 502); // "192.168.1.2";
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("10.0.3.1", 502); // "192.168.1.3"; private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("10.0.3.1", 502); // "192.168.1.3";
private static readonly TcpChannel GridMeterChannel = new TcpChannel("10.0.4.1", 502); // "192.168.1.241"; private static readonly TcpChannel GridMeterChannel = new TcpChannel("10.0.4.1", 502); // "192.168.1.241";
private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("10.0.4.2", 502); // "192.168.1.241"; private static readonly TcpChannel IslandBusLoadChannel = new TcpChannel("10.0.4.2", 502); // "192.168.1.241";
private static readonly TcpChannel AmptChannel = new TcpChannel("10.0.5.1", 502); // "192.168.1.249"; private static readonly TcpChannel AmptChannel = new TcpChannel("10.0.5.1", 502); // "192.168.1.249";
private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007); private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
#endif #endif
@ -88,14 +87,14 @@ internal static class Program
var sdNotifyReturn = sd_notify(0, "READY=1"); var sdNotifyReturn = sd_notify(0, "READY=1");
var battery48TlDevices = BatteryNodes var battery48TlDevices = BatteryNodes
.Select(n => new Battery48TlDevice(BatteryTty, n)) .Select(n => new Battery48TlDevice(BatteriesChannel, n))
.ToList(); .ToList();
var batteryDevices = new Battery48TlDevices(battery48TlDevices); var batteryDevices = new Battery48TlDevices(battery48TlDevices);
var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel); var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel);
var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel); var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel);
var gridMeterDevice = new EmuMeterDevice(GridMeterChannel); var gridMeterDevice = new EmuMeterDevice(GridMeterChannel);
var acIslandLoadMeter = new EmuMeterDevice(AcOutLoadChannel); var acIslandLoadMeter = new EmuMeterDevice(IslandBusLoadChannel);
var amptDevice = new AmptDevices(AmptChannel); var amptDevice = new AmptDevices(AmptChannel);
var saliMaxRelaysDevice = new RelaysDevice(RelaysChannel); var saliMaxRelaysDevice = new RelaysDevice(RelaysChannel);
@ -240,24 +239,24 @@ internal static class Program
.Select(s1 => s1.Status.Ac.Power) .Select(s1 => s1.Status.Ac.Power)
.ToArray()); .ToArray());
var dcLinkVoltage = TextBlock.CenterHorizontal("", var dcLinkVoltage = TextBlock.AlignCenterHorizontal("",
s.DcDc.Dc.Link.Voltage.ToDisplayString(), s.DcDc.Dc.Link.Voltage.ToDisplayString(),
""); "");
//var inverterPowerByPhase = new ActivePower[(Int32)s.AcDc.Ac.L1.Power.Active, (Int32)s.AcDc.Ac.L2.Power.Active, (Int32)s.AcDc.Ac.L3.Power.Active]; //var inverterPowerByPhase = new ActivePower[(Int32)s.AcDc.Ac.L1.Power.Active, (Int32)s.AcDc.Ac.L2.Power.Active, (Int32)s.AcDc.Ac.L3.Power.Active];
// Voltage Measurement Values // Voltage Measurement Values
//var inverterVoltage = new Voltage [(Int32)s.AcDc.Ac.L1.Voltage, (Int32)s.AcDc.Ac.L2.Voltage, (Int32)s.AcDc.Ac.L3.Voltage]; //var inverterVoltage = new Voltage [(Int32)s.AcDc.Ac.L1.Voltage, (Int32)s.AcDc.Ac.L2.Voltage, (Int32)s.AcDc.Ac.L3.Voltage];
//var dcLinkVoltage = s.DcDc.Dc.Link.Voltage; //var dcLinkVoltage = s.DcDc.Dc.Link.Voltage;
var dc48Voltage = s.DcDc.Dc.Battery.Voltage.ToDisplayString(); var dc48Voltage = s.DcDc.Dc.Battery.Voltage;
var batteryVoltage = s.Battery.Dc.Voltage.ToDisplayString; var batteryVoltage = s.Battery.Dc.Voltage;
var batterySoc = s.Battery.Soc.ToDisplayString(); var batterySoc = s.Battery.Soc;
var batteryCurrent = s.Battery.Dc.Current.ToDisplayString(); var batteryCurrent = s.Battery.Dc.Current;
var batteryTemp = s.Battery.Temperature.ToDisplayString(); var batteryTemp = s.Battery.Temperature;
var gridBusColumn = ColumnBox("Pv", "Grid Bus", "Load" , gridVoltageByPhase , gridLoadPower); var gridBusColumn = ColumnBox("Pv", "Grid Bus", "Load" , gridVoltageByPhase , gridLoadPower);
var islandBusColumn = ColumnBox("Pv", "Island Bus", "Load" , inverterPowerByPhase, islandLoadPower); var islandBusColumn = ColumnBox("Pv", "Island Bus", "Load" , inverterPowerByPhase, islandLoadPower);
var dcBusColumn = ColumnBox("Pv", "Dc Bus", "Load" , dcLinkVoltage, 0, pvOnDcPower); var dcBusColumn = ColumnBox("Pv", "Dc Bus", "Load" , dcLinkVoltage, 0, pvOnDcPower);
var gridBusFlow = Flow.Horizontal(gridPower); var gridBusFlow = Flow.Horizontal(gridPower);
var flowGridBusToIslandBus = Flow.Horizontal((ActivePower)islandToGridBusPower); var flowGridBusToIslandBus = Flow.Horizontal((ActivePower)islandToGridBusPower);
var flowIslandBusToInverter = Flow.Horizontal(inverterPower); var flowIslandBusToInverter = Flow.Horizontal(inverterPower);
@ -268,37 +267,38 @@ internal static class Program
var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid"); var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid");
var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter"); var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter");
var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC"); var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC");
var batteryAvgBox = TextBlock.AlignLeft(batteryVoltage, var batteryAvgBox = TextBlock.AlignLeft(batteryVoltage.ToDisplayString(),
batterySoc, batterySoc.ToDisplayString(),
batteryCurrent, batteryCurrent.ToDisplayString(),
batteryTemp) batteryTemp.ToDisplayString())
.TitleBox("Battery"); .TitleBox("Battery");
//////////////////// Batteries ///////////////////////// //////////////////// Batteries /////////////////////////
var batteryBoxes = s.Battery IReadOnlyList<TextBlock> batteryBoxes = s.Battery
.Devices .Devices
.Select(CreateIndividualBattery) .Select(CreateIndividualBattery)
.ToArray(s.Battery.Devices.Count); .ToArray(s.Battery.Devices.Count);
var individualBatteries = TextBlock.AlignLeft(batteryBoxes); var individualBatteries = batteryBoxes.Any()
? TextBlock.AlignLeft(batteryBoxes)
: TextBlock.Spacer(1);
var totalBoxes = TextBlock.AlignCenterVertical(gridBox,
var totalBoxes = TextBlock.CenterVertical(gridBox, gridBusFlow,
gridBusFlow, gridBusColumn,
gridBusColumn, flowGridBusToIslandBus,
flowGridBusToIslandBus, islandBusColumn,
islandBusColumn, flowIslandBusToInverter,
flowIslandBusToInverter, inverterBox,
inverterBox, flowInverterToDcBus,
flowInverterToDcBus, dcBusColumn,
dcBusColumn, flowDcBusToDcDc,
flowDcBusToDcDc, dcDcBox,
dcDcBox, flowDcDcToBattery,
flowDcDcToBattery, batteryAvgBox,
batteryAvgBox, individualBatteries);
individualBatteries);
totalBoxes.WriteLine(); totalBoxes.WriteLine();
} }
@ -316,12 +316,7 @@ internal static class Program
var flow = Flow.Horizontal(battery.Dc.Power); var flow = Flow.Horizontal(battery.Dc.Power);
return TextBlock.CenterVertical(flow, box); return TextBlock.AlignCenterVertical(flow, box);
}
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox)
{
return ColumnBox(pvTitle, busTitle, loadTitle, dataBox, 0);
} }
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower) private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower)
@ -331,13 +326,13 @@ internal static class Program
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower, ActivePower pvPower) private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower, ActivePower pvPower)
{ {
var pvBox = TextBlock.AlignLeft("").TitleBox(pvTitle); var pvBox = TextBlock.FromString(pvTitle).Box();
var pvToBus = Flow.Vertical(pvPower); var pvToBus = Flow.Vertical(pvPower);
var busBox = TextBlock.AlignLeft(dataBox).TitleBox(busTitle); var busBox = TextBlock.AlignLeft(dataBox).TitleBox(busTitle);
var busToLoad = Flow.Vertical(loadPower); var busToLoad = Flow.Vertical(loadPower);
var loadBox = TextBlock.AlignLeft("").TitleBox(loadTitle); var loadBox = TextBlock.FromString(loadTitle).Box();
return TextBlock.CenterHorizontal(pvBox, pvToBus, busBox, busToLoad, loadBox); return TextBlock.AlignCenterHorizontal(pvBox, pvToBus, busBox, busToLoad, loadBox);
} }
private static async Task<T?> ResultOrNull<T>(this Task<T> task) private static async Task<T?> ResultOrNull<T>(this Task<T> task)

View File

@ -1,82 +1,5 @@
namespace InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Utils;
// public class TextBlock
// {
// public static TextBlock Empty { get; } = new TextBlock(Array.Empty<String>());
//
// public IReadOnlyList<String> Lines { get; }
//
// public Int32 Width => Lines.Count == 0
// ? 0
// : Lines.Max(l=>l.Length);
//
// public Int32 Height => Lines.Count;
//
// public TextBlock(IReadOnlyList<String> lines) => Lines = lines;
//
// public TextBlock AlignLeft (Int32 width = -1) => AlignHorizontal((l, w) => l.PadRight(w), width);
// public TextBlock AlignRight (Int32 width = -1) => AlignHorizontal((l, w) => l.PadLeft(w), width);
// public TextBlock AlignHCenter(Int32 width = -1) => AlignHorizontal((l, w) => l.PadLeft((w + l.Length) / 2).PadRight(w), width);
//
// public TextBlock AlignTop (Int32 height) => Lines.Concat(EmptyLines(height)).Take(height).ToArray(height);
// public TextBlock AlignBottom (Int32 height) => EmptyLines(Lines.Count - height).Concat(Lines).Take(height).ToArray(height);
// //public TextBlock AlignVCenter(Int32 height) => EmptyLines(height/2).Concat(Lines).Take(height).ToArray(height);
// //public TextBlock AlignVCenter(Int32 height) => AlignHorizontal((l, w) => l.PadLeft((w + l.Length) / 2).PadRight(w), width);
//
// private static IEnumerable<String> EmptyLines(Int32 height)
// {
// return height > 0
// ? Enumerable.Repeat("", height)
// : Enumerable.Empty<String>();
// }
//
//
// public static TextBlock HSpace(Int32 width ) => new TextBlock(new []{"".PadRight(width)});
// public static TextBlock VSpace(Int32 height) => new TextBlock(Enumerable.Repeat("", height).ToArray(height));
//
// public static TextBlock Space(Int32 width, Int32 height)
// {
// var lines = Enumerable
// .Repeat("".PadRight(width), height)
// .ToArray(height);
//
// return new TextBlock(lines);
// }
//
// private TextBlock AlignHorizontal(Func<String, Int32, String> alignLine, Int32 width = -1)
// {
// if (!Lines.Any())
// return Empty;
//
// var strings = Lines
// .SelectMany(GetLines)
// .ToList();
//
// width = width < 0 ? strings.Max(l => l.Length) : width;
//
// var aligned = strings
// .Select(l => l.Length > width ? l.Substring(0, width) : l)
// .Select(l => alignLine(l, width))
// .ToArray(strings.Count);
//
// return new TextBlock(aligned);
// }
//
//
// private static IReadOnlyList<String> GetLines(Object l)
// {
// return l is TextBlock tb
// ? tb.Lines
// : l.ToString()?.SplitLines() ?? new[] { "<null>" };
// }
//
// public override String ToString() => String.Join(Environment.NewLine, Lines);
//
// public static implicit operator TextBlock(String[] lines) => new TextBlock(lines);
// }
public class TextBlock public class TextBlock
{ {
private readonly IReadOnlyList<String> _Lines; private readonly IReadOnlyList<String> _Lines;
@ -85,8 +8,7 @@ public class TextBlock
public override String ToString() => _Lines.JoinLines(); public override String ToString() => _Lines.JoinLines();
public static TextBlock AlignLeft(IReadOnlyList<Object> things)
public static TextBlock AlignLeft(params Object[] things)
{ {
var lines = things var lines = things
.SelectMany(GetLines) .SelectMany(GetLines)
@ -94,12 +16,14 @@ public class TextBlock
var width = lines.Max(l => l.Length); var width = lines.Max(l => l.Length);
var alignedLines = lines.Select(l => l.PadRight(width)).ToArray(lines.Count); var alignedLines = lines
.Select(l => l.PadRight(width))
.ToArray(lines.Count);
return new TextBlock(alignedLines); return new TextBlock(alignedLines);
} }
public static TextBlock AlignRight(params Object[] things) public static TextBlock AlignRight(IReadOnlyList<Object> things)
{ {
var lines = things var lines = things
.SelectMany(GetLines) .SelectMany(GetLines)
@ -107,12 +31,14 @@ public class TextBlock
var width = lines.Max(l => l.Length); var width = lines.Max(l => l.Length);
var alignedLines = lines.Select(l => l.PadLeft(width)).ToArray(lines.Count); var alignedLines = lines
.Select(l => l.PadLeft(width))
.ToArray(lines.Count);
return new TextBlock(alignedLines); return new TextBlock(alignedLines);
} }
public static TextBlock CenterHorizontal(IReadOnlyList<Object> things) public static TextBlock AlignCenterHorizontal(IReadOnlyList<Object> things)
{ {
var lines = things var lines = things
.SelectMany(GetLines) .SelectMany(GetLines)
@ -127,12 +53,9 @@ public class TextBlock
return new TextBlock(alignedLines); return new TextBlock(alignedLines);
} }
public static TextBlock CenterHorizontal(params Object[] things)
{
return CenterHorizontal((IReadOnlyList<Object>)things);
}
public static TextBlock AlignTop(params Object[] things)
public static TextBlock AlignTop(IReadOnlyList<Object> things)
{ {
var columns = things var columns = things
.Select(GetLines) .Select(GetLines)
@ -149,7 +72,7 @@ public class TextBlock
} }
public static TextBlock AlignBottom(params Object[] things) public static TextBlock AlignBottom(IReadOnlyList<Object> things)
{ {
var columns = things var columns = things
.Select(GetLines) .Select(GetLines)
@ -166,7 +89,7 @@ public class TextBlock
} }
public static TextBlock CenterVertical(params Object[] things) public static TextBlock AlignCenterVertical(IReadOnlyList<Object> things)
{ {
var columns = things var columns = things
.Select(GetLines) .Select(GetLines)
@ -182,7 +105,14 @@ public class TextBlock
return new TextBlock(alignedLines); return new TextBlock(alignedLines);
} }
public static TextBlock AlignLeft (params Object[] things) => AlignLeft ((IReadOnlyList<Object>) things);
public static TextBlock AlignRight (params Object[] things) => AlignRight ((IReadOnlyList<Object>) things);
public static TextBlock AlignTop (params Object[] things) => AlignTop ((IReadOnlyList<Object>) things);
public static TextBlock AlignBottom (params Object[] things) => AlignBottom ((IReadOnlyList<Object>) things);
public static TextBlock AlignCenterVertical (params Object[] things) => AlignCenterVertical ((IReadOnlyList<Object>) things);
public static TextBlock AlignCenterHorizontal(params Object[] things) => AlignCenterHorizontal((IReadOnlyList<Object>) things);
public static TextBlock FromString(String thing) => AlignLeft(thing);
public TextBlock Box() public TextBlock Box()
{ {
@ -229,9 +159,6 @@ public class TextBlock
return new TextBlock(lines); return new TextBlock(lines);
} }
public static TextBlock Spacer(Int32 n) public static TextBlock Spacer(Int32 n)
{ {
return new TextBlock(Enumerable.Repeat("".PadRight(n), n).ToArray(n)); return new TextBlock(Enumerable.Repeat("".PadRight(n), n).ToArray(n));