From 6c9b19ba914b176661e90d6505c10b1d75a50b7f Mon Sep 17 00:00:00 2001 From: Matthew Connelly Date: Mon, 30 Sep 2019 13:51:15 +0100 Subject: [PATCH] Replace LogBridge with more generic liblogtiny (ILogTiny), allowing the log context to be passed to libraries without needing them to understand how to windows --- liblogtiny/ILogTiny.cs | 28 +++++++++++++++++++++++++ liblogtiny/Interfaces/LConsole.cs | 20 ++++++++++++++++++ liblogtiny/liblogtiny.csproj | 7 +++++++ libpaperang/Main/Paperang.cs | 24 ++++++++++++++++----- libpaperang/libpaperang.csproj | 4 ++++ sharperang.sln | 6 ++++++ sharperang/LUITextbox.cs | 31 +++++++++++++++++++++++++++ sharperang/LogBridge.cs | 29 ------------------------- sharperang/MainWindow.xaml.cs | 35 +++++++++++++------------------ sharperang/sharperang.csproj | 6 +++++- 10 files changed, 135 insertions(+), 55 deletions(-) create mode 100644 liblogtiny/ILogTiny.cs create mode 100644 liblogtiny/Interfaces/LConsole.cs create mode 100644 liblogtiny/liblogtiny.csproj create mode 100644 sharperang/LUITextbox.cs delete mode 100644 sharperang/LogBridge.cs diff --git a/liblogtiny/ILogTiny.cs b/liblogtiny/ILogTiny.cs new file mode 100644 index 0000000..d352bd7 --- /dev/null +++ b/liblogtiny/ILogTiny.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace liblogtiny { + public partial class LogTiny { + public enum LogLevel { + Trace, + Debug, + Verbose, + Info, + Warn, + Error, + Critical + }; + } + public interface ILogTiny { + void Trace(string msg); + void Debug(string msg); + void Verbose(string msg); + void Info(string msg); + void Warn(string msg); + void Error(string msg); + void Critical(string msg); + void Log(LogTiny.LogLevel level, string msg); + void Raw(string msg); + } +} diff --git a/liblogtiny/Interfaces/LConsole.cs b/liblogtiny/Interfaces/LConsole.cs new file mode 100644 index 0000000..085021b --- /dev/null +++ b/liblogtiny/Interfaces/LConsole.cs @@ -0,0 +1,20 @@ +using System; + +namespace liblogtiny.Interfaces { + public class LConsole : ILogTiny { + public void Trace(string msg) => Log(LogTiny.LogLevel.Trace, msg); + public void Debug(string msg) => Log(LogTiny.LogLevel.Debug, msg); + public void Verbose(string msg) => Log(LogTiny.LogLevel.Verbose, msg); + public void Info(string msg) => Log(LogTiny.LogLevel.Info, msg); + public void Warn(string msg) => Log(LogTiny.LogLevel.Warn, msg); + public void Error(string msg) => Log(LogTiny.LogLevel.Error, msg); + public void Critical(string msg) => Log(LogTiny.LogLevel.Critical, msg); + public void Log(LogTiny.LogLevel level, string msg) { + if(level >= LogTiny.LogLevel.Warn) + Console.Error.WriteLine($"{level}: {msg}"); + else + Raw($"{level}: {msg}"); + } + public void Raw(string msg) => Console.Out.WriteLine(msg); + } +} diff --git a/liblogtiny/liblogtiny.csproj b/liblogtiny/liblogtiny.csproj new file mode 100644 index 0000000..dbdcea4 --- /dev/null +++ b/liblogtiny/liblogtiny.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.0 + + + diff --git a/libpaperang/Main/Paperang.cs b/libpaperang/Main/Paperang.cs index adc0513..1841444 100644 --- a/libpaperang/Main/Paperang.cs +++ b/libpaperang/Main/Paperang.cs @@ -1,6 +1,6 @@ -using libpaperang; -using libpaperang.Helpers; +using libpaperang.Helpers; using libpaperang.Interfaces; +using liblogtiny; using System.Linq; using System.Collections.Generic; @@ -9,6 +9,7 @@ namespace libpaperang.Main { public IPrinter Printer; public Transforms Transform; public CRC Crc; + public ILogTiny logger; private const uint MagicValue = 0x35769521u; public Paperang(BaseTypes.Connection connection, BaseTypes.Model model) { @@ -30,9 +31,12 @@ namespace libpaperang.Main { throw new PrinterConnectionNotSupportedException(); } } + public void SetLogContext(ILogTiny logger) => this.logger = logger; public void Initialise() { + logger?.Trace($"Initialising libpaperang with {Printer.AvailablePrinters.Count} device(s) connected"); Printer.OpenPrinter(Printer.AvailablePrinters.First()); Printer.Initialise(); + logger?.Trace("Initialised, sending handshake"); Handshake(); } public void Handshake() { @@ -45,19 +49,29 @@ namespace libpaperang.Main { Feed(0); NoOp(); } - public void Feed(uint ms) => Printer.WriteBytes( + public void WriteBytes(byte[] packet) { + logger?.Trace($"Writing packet with length {packet.Length} to printer"); + _ = Printer.WriteBytes(packet); + } + public void WriteBytes(byte[] packet, int ms) { + logger?.Trace($"Writing packet with length {packet.Length} to printer with delay of {ms}ms"); + _ = Printer.WriteBytes(packet, ms); + } + public void Feed(uint ms) => WriteBytes( Transform.Packet(BaseTypes.Operations.LineFeed, Transform.Arg(BaseTypes.Operations.LineFeed, ms), Crc)); - public void NoOp() => Printer.WriteBytes( + public void NoOp() => WriteBytes( Transform.Packet(BaseTypes.Operations.NoOp, new byte[] { 0, 0 }, Crc)); public void PrintBytes(byte[] data, bool autofeed = true) { + logger?.Trace($"PrintBytes() invoked with data length of {data.Length}"); List segments = data .Select((b,i) => new {Index=i,Value=b }) .GroupBy(b=>b.Index/1008) .Select(b=>b.Select(bb=>bb.Value).ToArray()) .ToList(); - segments.ForEach(b => Printer.WriteBytes( + logger?.Trace($"data split into {segments.Count} segment(s)"); + segments.ForEach(b => WriteBytes( Transform.Packet( Transform.Arg(BaseTypes.Operations.Print, (uint)b.Length), b, diff --git a/libpaperang/libpaperang.csproj b/libpaperang/libpaperang.csproj index 9e3f545..7e6ce12 100644 --- a/libpaperang/libpaperang.csproj +++ b/libpaperang/libpaperang.csproj @@ -9,4 +9,8 @@ + + + + diff --git a/sharperang.sln b/sharperang.sln index 6aa777d..03734d1 100644 --- a/sharperang.sln +++ b/sharperang.sln @@ -12,6 +12,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "libsharperang", "libsharper EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "libpaperang", "libpaperang\libpaperang.csproj", "{A429CCEB-9331-4CD9-B3C0-A8F736732DEA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "liblogtiny", "liblogtiny\liblogtiny.csproj", "{B7D242A8-F9DE-450B-9C87-5519CA782193}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -30,6 +32,10 @@ Global {A429CCEB-9331-4CD9-B3C0-A8F736732DEA}.Debug|Any CPU.Build.0 = Debug|Any CPU {A429CCEB-9331-4CD9-B3C0-A8F736732DEA}.Release|Any CPU.ActiveCfg = Release|Any CPU {A429CCEB-9331-4CD9-B3C0-A8F736732DEA}.Release|Any CPU.Build.0 = Release|Any CPU + {B7D242A8-F9DE-450B-9C87-5519CA782193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7D242A8-F9DE-450B-9C87-5519CA782193}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7D242A8-F9DE-450B-9C87-5519CA782193}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7D242A8-F9DE-450B-9C87-5519CA782193}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/sharperang/LUITextbox.cs b/sharperang/LUITextbox.cs new file mode 100644 index 0000000..fc94554 --- /dev/null +++ b/sharperang/LUITextbox.cs @@ -0,0 +1,31 @@ +using liblogtiny; +using System.ComponentModel; + +namespace sharperang { + class LUITextbox : ILogTiny, INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string propertyName) => + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + private string _LogBuffer = ""; + public string LogBuffer { + //get { return _LogBuffer; } + get => _LogBuffer; + set { + if (value == _LogBuffer) return; + if (value == "!clearlog") _LogBuffer = ""; + else _LogBuffer = value + "\n" + _LogBuffer; + OnPropertyChanged("LogBuffer"); + } + } + public void ClearBuffer() => LogBuffer="!clearlog"; + public void Trace(string msg) => Log(LogTiny.LogLevel.Trace, msg); + public void Debug(string msg) => Log(LogTiny.LogLevel.Debug, msg); + public void Verbose(string msg) => Log(LogTiny.LogLevel.Verbose, msg); + public void Info(string msg) => Log(LogTiny.LogLevel.Info, msg); + public void Warn(string msg) => Log(LogTiny.LogLevel.Warn, msg); + public void Error(string msg) => Log(LogTiny.LogLevel.Error, msg); + public void Critical(string msg) => Log(LogTiny.LogLevel.Critical, msg); + public void Log(LogTiny.LogLevel level, string msg) => LogBuffer=$"{level}: {msg}"; + public void Raw(string msg) => LogBuffer=msg; + } +} diff --git a/sharperang/LogBridge.cs b/sharperang/LogBridge.cs deleted file mode 100644 index 7530256..0000000 --- a/sharperang/LogBridge.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.ComponentModel; - -namespace sharperang { - class LogBridge : INotifyPropertyChanged { - public event PropertyChangedEventHandler PropertyChanged; - protected void OnPropertyChanged(string propertyName) => - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - private string _LogBuffer = ""; - public string LogBuffer { - //get { return _LogBuffer; } - get => _LogBuffer; - set { - if (value == _LogBuffer) return; - if (value == "!clearlog") _LogBuffer = ""; - else _LogBuffer = value + "\n" + _LogBuffer; - OnPropertyChanged("LogBuffer"); - } - } - - public void ClearBuffer() => LogBuffer="!clearlog"; - public void Trace(string line) => LogBuffer="TRCE: "+line; - public void Debug(string line) => LogBuffer="DEBG: "+line; - public void Verbose(string line) => LogBuffer="VERB: "+line; - public void Info(string line) => LogBuffer="INFO: "+line; - public void Warn(string line) => LogBuffer="WARN: "+line; - public void Err(string line) => LogBuffer="ERR!: "+line; - public void Critical(string line) => LogBuffer="CRIT: "+line; - } -} diff --git a/sharperang/MainWindow.xaml.cs b/sharperang/MainWindow.xaml.cs index 4058c00..919e78a 100644 --- a/sharperang/MainWindow.xaml.cs +++ b/sharperang/MainWindow.xaml.cs @@ -1,6 +1,5 @@ -//using libsharperang; +using liblogtiny; using libpaperang; -using libpaperang.Interfaces; using libpaperang.Main; using System; using System.Windows; @@ -12,42 +11,38 @@ using System.IO; namespace sharperang { public partial class MainWindow : Window { - private LogBridge logger; + private ILogTiny logger; private BaseTypes.Connection mmjcx=BaseTypes.Connection.USB; private BaseTypes.Model mmjmd=BaseTypes.Model.T1; private Paperang mmj; - //private USBPrinter printer=new USBPrinter(48); private Bitmap bimg; public MainWindow() { InitializeComponent(); - logger = new LogBridge(); - gMain.DataContext = logger; + logger = new LUITextbox(); + gMain.DataContext = (LUITextbox)logger; logger.Info("Application started"); } private void BtClearLog_Click(object sender, RoutedEventArgs e) => - logger.ClearBuffer(); - private void BtSetP1_Click(object sender, RoutedEventArgs e) => mmjmd = BaseTypes.Model.P1; - private void BtSetP2_Click(object sender, RoutedEventArgs e) => mmjmd = BaseTypes.Model.P2; + logger.Raw("!clearlog"); + private void BtSetP1_Click(object sender, RoutedEventArgs e) { + mmjmd = BaseTypes.Model.P1; + logger.Info("Model type set to P1"); + } + private void BtSetP2_Click(object sender, RoutedEventArgs e) { + mmjmd = BaseTypes.Model.P2; + logger.Info("Model type set to P2"); + } private void BtInitUSB_Click(object sender, RoutedEventArgs e) { mmj = new Paperang(mmjcx, mmjmd); + mmj.SetLogContext(logger); logger.Verbose("# printers found: " + mmj.Printer.AvailablePrinters.Count); if(!mmj.Printer.PrinterAvailable) { - logger.Err("Couldn't initialise printer as none is connected"); + logger.Error("Couldn't initialise printer as none is connected"); return; } logger.Info("USB Initialising"); mmj.Initialise(); - //printer = new LibSharperang(logger); - /* - logger.Debug("IsPrinterPresent => "+printer.IsPrinterPresent()); - logger.Debug("FoundPrinterGuids => "+printer.FoundPrinterGuids()); - printer?.IDs?.ForEach(p => logger.Debug("FoundPrinterGuidAddrs "+p.ToString()+" => "+printer?.FoundPrinterGuidAddrs(p))); - logger.Debug("Open => "+printer?.Open()); - logger.Debug("Claim => " + printer?.Claim()); - logger.Debug("Init => "+BitConverter.ToString(printer.builder.BuildTransmitCrc()).Replace('-', ' ')); - printer.InitPrinter(); - */ logger.Debug("PrinterInitialised? " + mmj.Printer.PrinterInitialised); logger.Debug("Printer initialised and ready"); } diff --git a/sharperang/sharperang.csproj b/sharperang/sharperang.csproj index a69682c..48c0ce9 100644 --- a/sharperang/sharperang.csproj +++ b/sharperang/sharperang.csproj @@ -155,7 +155,7 @@ App.xaml Code - + MainWindow.xaml Code @@ -189,6 +189,10 @@ + + {b7d242a8-f9de-450b-9c87-5519ca782193} + liblogtiny + {a429cceb-9331-4cd9-b3c0-a8f736732dea} libpaperang