From c22d5d753e0cdbb4d4ca5224327ad2e0601c7d78 Mon Sep 17 00:00:00 2001 From: Matthew Connelly Date: Mon, 30 Sep 2019 14:20:38 +0100 Subject: [PATCH] rename base namespace and classes, completely remove old libsharperang (can get back from git history if necessary), remove unnecessary deps from UI test app --- sharperang.sln => libpaperang.sln | 8 +- libpaperang/libpaperang.csproj | 2 +- libsharperang/Base.cs | 21 -- libsharperang/CRC32.cs | 48 ----- libsharperang/DataTransforms.cs | 34 --- libsharperang/IPrinter.cs | 12 -- libsharperang/libsharperang.csproj | 15 -- libsharperang/usb.cs | 204 ------------------ sharperang/App.xaml | 4 +- sharperang/App.xaml.cs | 2 +- sharperang/LUITextbox.cs | 2 +- sharperang/MainWindow.xaml | 6 +- sharperang/MainWindow.xaml.cs | 2 +- sharperang/Properties/AssemblyInfo.cs | 4 +- sharperang/Properties/Resources.Designer.cs | 46 ++-- sharperang/Properties/Settings.Designer.cs | 22 +- sharperang/packages.config | 8 +- .../{sharperang.csproj => paperangapp.csproj} | 15 +- 18 files changed, 51 insertions(+), 404 deletions(-) rename sharperang.sln => libpaperang.sln (76%) delete mode 100644 libsharperang/Base.cs delete mode 100644 libsharperang/CRC32.cs delete mode 100644 libsharperang/DataTransforms.cs delete mode 100644 libsharperang/IPrinter.cs delete mode 100644 libsharperang/libsharperang.csproj delete mode 100644 libsharperang/usb.cs rename sharperang/{sharperang.csproj => paperangapp.csproj} (95%) diff --git a/sharperang.sln b/libpaperang.sln similarity index 76% rename from sharperang.sln rename to libpaperang.sln index 03734d1..a2c607f 100644 --- a/sharperang.sln +++ b/libpaperang.sln @@ -3,13 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29215.179 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "sharperang", "sharperang\sharperang.csproj", "{677A8867-809E-4476-A9AE-7BEB5CE02F96}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "paperangapp", "sharperang\paperangapp.csproj", "{677A8867-809E-4476-A9AE-7BEB5CE02F96}" ProjectSection(ProjectDependencies) = postProject {A429CCEB-9331-4CD9-B3C0-A8F736732DEA} = {A429CCEB-9331-4CD9-B3C0-A8F736732DEA} EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "libsharperang", "libsharperang\libsharperang.csproj", "{93203F87-29D0-4CDE-B2EE-156488E30186}" -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}" @@ -24,10 +22,6 @@ Global {677A8867-809E-4476-A9AE-7BEB5CE02F96}.Debug|Any CPU.Build.0 = Debug|Any CPU {677A8867-809E-4476-A9AE-7BEB5CE02F96}.Release|Any CPU.ActiveCfg = Release|Any CPU {677A8867-809E-4476-A9AE-7BEB5CE02F96}.Release|Any CPU.Build.0 = Release|Any CPU - {93203F87-29D0-4CDE-B2EE-156488E30186}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93203F87-29D0-4CDE-B2EE-156488E30186}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93203F87-29D0-4CDE-B2EE-156488E30186}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93203F87-29D0-4CDE-B2EE-156488E30186}.Release|Any CPU.Build.0 = Release|Any CPU {A429CCEB-9331-4CD9-B3C0-A8F736732DEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {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 diff --git a/libpaperang/libpaperang.csproj b/libpaperang/libpaperang.csproj index 7e6ce12..900247a 100644 --- a/libpaperang/libpaperang.csproj +++ b/libpaperang/libpaperang.csproj @@ -6,7 +6,7 @@ - + diff --git a/libsharperang/Base.cs b/libsharperang/Base.cs deleted file mode 100644 index 2c5d0cb..0000000 --- a/libsharperang/Base.cs +++ /dev/null @@ -1,21 +0,0 @@ - -namespace libsharperang { - public abstract class Base { - public enum ConnectionType { - None, - UART, - USB, - Bluetooth - } - internal DataTransforms transform=new DataTransforms(); - public string Model { get; internal set; } - public string FirmwareVer { get; internal set; } - public int Battery { get; internal set; } - public int ImageWidth { get; internal set; } - public ConnectionType ActiveConnectionType { get; internal set; } = ConnectionType.None; - internal bool InitialiseConnection() => false; - internal bool DestroyConnection() => false; - public Base() => InitialiseConnection(); - ~Base() => DestroyConnection(); - } -} diff --git a/libsharperang/CRC32.cs b/libsharperang/CRC32.cs deleted file mode 100644 index e04dbf5..0000000 --- a/libsharperang/CRC32.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace libsharperang { - public class CRC32 { - private uint _Initial = 0xFFFFFFFF; - public uint Initial { get => ~_Initial; private set => _Initial=~value; } - private uint Polynomial = 0xedb88320; - private uint[] Table; - public bool Initialised=false; - public CRC32(uint Initial) => this.Initial=Initial; - public CRC32() { } - public void Initialise() { - Table=Enumerable.Range(0, 256).Select(i => { - uint e=(uint)i; - for (ushort eb = 0; eb<8; ++eb) { - e=((e&1)!=0) - ? (Polynomial^(e>>1)) - : (e>>1); - } - return e; - }).ToArray(); - Initialised=true; - } - public uint Reflect(uint iv) { - uint ivr=0; - for (int i = 0; i<32; i++) { - uint bit=(iv>>i)&1; - ivr |= (bit<<(31-i)); - } - return ~ivr; - } - public uint GetChecksum(IEnumerable bytes) { - if (!Initialised) Initialise(); - try { - return ~bytes.Aggregate(_Initial, - (csR, cB) => Table[(csR & 0xFF) ^ Convert.ToByte(cB)] ^ (csR>>8)); - } catch (FormatException e) { - throw new Exception("Could not read stream as bytes", e); - } catch (InvalidCastException e) { - throw new Exception("Could not read stream as bytes", e); - } catch (OverflowException e) { - throw new Exception("Could not read stream as bytes", e); - } - } - } -} diff --git a/libsharperang/DataTransforms.cs b/libsharperang/DataTransforms.cs deleted file mode 100644 index 5c49415..0000000 --- a/libsharperang/DataTransforms.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; - -namespace libsharperang { - public class DataTransforms { - public CRC32 hasher; - private uint MagicNumber=0x35769521; - public bool IsCrcInitialised() => (hasher!=null && hasher.Initialised); - public void InitialiseCrc(uint Key = 0x35769521) { - if (hasher==null || (hasher.Initialised && hasher.Initial != Key)) hasher=new CRC32(Key); - hasher.Initialise(); - } - public byte[] GetHashSum(byte[] data) { - if (!IsCrcInitialised()) InitialiseCrc(); - return BitConverter.GetBytes(hasher.GetChecksum(data)); - } - public uint GetCrcKey() { - if (!IsCrcInitialised()) InitialiseCrc(); - return hasher.Initial == MagicNumber ? hasher.Initial : hasher.Initial ^ MagicNumber; - } - public byte[] GetCrcKeyBytes() { - if (!IsCrcInitialised()) InitialiseCrc(); - return BitConverter.GetBytes(GetCrcKey()); - } - public byte[] GeneratePrintOpcode(byte[] data) => BitConverter.GetBytes(SwapEndianness( - 0x00010000 | ((((( - (uint)data.Length & 0xFFU) << 16) | - (uint)data.Length) & 0xFFFF00U) >> 8))); - public uint SwapEndianness(uint value) => ( - (value & 0x000000FFU) << 24) | - ((value & 0x0000FF00U) << 8) | - ((value & 0x00FF0000U) >> 8) | - ((value & 0xFF000000U) >> 24); - } -} diff --git a/libsharperang/IPrinter.cs b/libsharperang/IPrinter.cs deleted file mode 100644 index ae66c44..0000000 --- a/libsharperang/IPrinter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using LibUsbDotNet; - -namespace libsharperang { - interface IPrinter { - UsbDevice uDv { get; set; } - UsbEndpointWriter uWr { get; set; } - UsbEndpointReader uRd { get; set; } - bool Initialised(); - bool WriteBytes(byte[]Frame); - byte[] ReadBytes(); - } -} diff --git a/libsharperang/libsharperang.csproj b/libsharperang/libsharperang.csproj deleted file mode 100644 index 18b1ef7..0000000 --- a/libsharperang/libsharperang.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - netstandard2.0 - - - - - - - - - - - diff --git a/libsharperang/usb.cs b/libsharperang/usb.cs deleted file mode 100644 index db1fe0a..0000000 --- a/libsharperang/usb.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using LibUsbDotNet; -using LibUsbDotNet.Main; - - -/* - * - 12 bytes is the minimum size of a payload, and 1018 bytes is the maximum - * - all frames sent to the printer follow the structure of: - * -- Frame.Begin (1 byte) - * -- PrinterCmd.* (4 bytes) - * -- Data (min. 2 bytes? max. 1008 bytes) - * -- CRC32 sum of the Data block (4 bytes) - * -- Frame.End (1 byte) - */ - -namespace libsharperang { - public class Frame { - public DataTransforms transformer=new DataTransforms(); - - public enum Opcode { - SessionBegin = 10, - Feed, - PrintBegin = 20, - PrintContinue, - CrcTransmit = 30 - } - private byte FrameStart = 0x02; - private byte FrameEnd = 0x03; - private byte[] ResolveOpcode(Opcode opcode) { - switch (opcode) { - case Opcode.SessionBegin: return new byte[] { 0x06, 0x00, 0x02, 0x00 }; - case Opcode.Feed: return new byte[] { 0x1a, 0x00, 0x02, 0x00 }; - case Opcode.CrcTransmit: return new byte[] { 0x18, 0x01, 0x04, 0x00 }; - default: throw new NullReferenceException(); - } - } - public byte[] Build(Opcode opcode, byte[] data) => Build(ResolveOpcode(opcode), data, transformer); - public byte[] Build(byte[] opcode, byte[] data) => Build(opcode, data, transformer); - public byte[] Build(Opcode opcode, byte[] data, DataTransforms transformer) => Build(ResolveOpcode(opcode), data, transformer); - public byte[] Build(byte[] opcode, byte[] data, DataTransforms transformer) { - byte[] result=new byte[data.Length+10]; - result[0]=FrameStart; - result[result.Length-1]=FrameEnd; - Buffer.BlockCopy(opcode, 0, result, 1, 4); - Buffer.BlockCopy(data, 0, result, 5, data.Length); - Buffer.BlockCopy(transformer.GetHashSum(data), 0, result, result.Length-5, 4); - return result; - } - public byte[] BuildTransmitCrc() { - if (!transformer.IsCrcInitialised()) transformer.InitialiseCrc(0x77c40d4d^0x35769521); - DataTransforms _=new DataTransforms(); - _.InitialiseCrc(); - return Build(Opcode.CrcTransmit, transformer.GetCrcKeyBytes(), _); - } - } - public class USBPrinter : Base, IPrinter { - // TODO - work out if it's possible to get this working with the default usbprint.inf driver Windows uses on plugging in - // otherwise any user would have to first use Zadig to change the driver to WinUSB - private UsbDevice _uDv; - private UsbEndpointWriter _uWr; - private UsbEndpointReader _uRd; - UsbDevice IPrinter.uDv { get => _uDv; set { } } - UsbEndpointWriter IPrinter.uWr { get => _uWr; set { } } - UsbEndpointReader IPrinter.uRd { get => _uRd; set { } } - - private ushort idVendor=0x4348; - private ushort idProduct=0x5584; - public Frame builder=new Frame(); - public List IDs; - public List Devices; - - public USBPrinter() { - ActiveConnectionType = ConnectionType.USB; - ImageWidth = 72; - } - public USBPrinter(int w) { - ActiveConnectionType = ConnectionType.USB; - ImageWidth = w; - } - ~USBPrinter() { - Close(); - ActiveConnectionType=ConnectionType.None; - } - - public void Initialise() { - if (UsbDevice.AllDevices.Count == 0) throw new KeyNotFoundException("No WinUSB or LibUSB devices found"); - Devices=(from d in UsbDevice.AllDevices - where d.Vid == idVendor && d.Pid == idProduct - select d) - .ToList(); - if (Devices.Count == 0) throw new KeyNotFoundException("No supported devices found!"); - IDs=(from d in Devices - select d.DeviceInterfaceGuids[0]) - .Distinct() - .ToList(); - } - - public List GetAddressesFromGuid(Guid deviceId) => (from d in UsbDevice.AllDevices - where d.DeviceInterfaceGuids.Contains(deviceId) - select d.DeviceProperties - .Where(k => k.Key=="Address") - .FirstOrDefault().Value) - .ToList().ConvertAll(v => (int)v); - public string FoundPrinterGuids() => IDs? - .ConvertAll(p => p.ToString()) - .Aggregate((a, b) => a+","+b); - public string FoundPrinterGuidAddrs(Guid deviceId) => GetAddressesFromGuid(deviceId) - .ConvertAll(a => a.ToString()) - .Aggregate((a, b) => a+","+b); - public string FoundProdIds() => _uDv?.Info.ProductString; - public bool Open() { - return UsbDevice.AllDevices.Count == 0 || - !IsPrinterPresent() - ? false - : Open(IDs.FirstOrDefault()); - } - public bool Open(Guid deviceId) => Open(deviceId, - GetAddressesFromGuid(deviceId).FirstOrDefault()); - public bool Open(Guid deviceId, int deviceIndex) { - if (!IsPrinterPresent()) return false; - //first thought is to say "forgive me lord for i have sinned" but i am absolutely not repentant for this - bool OpenResult = (from d in UsbDevice.AllDevices - where d.DeviceInterfaceGuids.Contains(deviceId) && - d.DeviceProperties.Where(k=>k.Key=="Address" && (int)k.Value==deviceIndex).Count() > 0 - select d) - .FirstOrDefault() - .Open(out UsbDevice handle); - _uDv=handle; - return OpenResult; - } - public bool Claim() { - if (!IsPrinterPresent() || - _uDv is null || - !_uDv.IsOpen) { - return false; - } - - IUsbDevice p = _uDv as IUsbDevice; - p?.SetConfiguration(1); - p?.ClaimInterface(0); - return true; - } - public void Close() { - _uWr?.Dispose(); - _uRd?.Dispose(); - IUsbDevice p=_uDv as IUsbDevice; - _=p?.ReleaseInterface(0); - _=p?.Close(); - _uDv?.Close(); - } - public void TransmitCrcKey() => WriteBytes(builder.BuildTransmitCrc()); - public void StartSession() => StartSession(new byte[2] { 0, 0 }); - public void StartSession(byte[] data) => WriteBytes(builder.Build(Frame.Opcode.SessionBegin, data)); - public void InitPrinter() { - TransmitCrcKey(); - NoOp(); - PollPrinter(); - } - public void PollPrinter() { - StartSession(); - NoOp(); - } - public void Feed() => Feed(100); - //Feed 0 is equivalent to a no-op, though on the P2 model it appears to engage the roller even though it doesn't ultimately result in any rotation - public void NoOp() => Feed(0); - public void Feed(int milliseconds) => WriteBytes( - builder.Build(Frame.Opcode.Feed, BitConverter.GetBytes( - transform.SwapEndianness(0x00000000 | ((((( - (uint)milliseconds & 0xFFU) << 16) | - (uint)milliseconds) & 0xFFFF00U) >> 8))).Skip(2).ToArray())); - public void PrintBytes(byte[] data, bool autofeed=true) { - List datas = data - .Select((b, i) => new {Index = i, Value = b }) - .GroupBy(b => b.Index/1008) - .Select(b => b.Select(bb => bb.Value).ToArray()) - .ToList(); - datas.ForEach(b => WriteBytes(builder.Build(transform.GeneratePrintOpcode(b), b))); - if (autofeed) Feed(200); - } - public bool IsPrinterPresent() => (Devices != null && Devices.Count > 0); - bool IPrinter.Initialised() => Initialised(); - byte[] IPrinter.ReadBytes() => ReadBytes(); - bool IPrinter.WriteBytes(byte[] Frame) => WriteBytes(Frame); - public bool Initialised() => (_uDv!=null); - public byte[] ReadBytes() { - if (_uRd==null) _uRd=_uDv?.OpenEndpointReader(ReadEndpointID.Ep01); - byte[] bRead=new byte[1024]; - _=_uRd.Read(bRead, 100, out int _); - return bRead; - } - public bool WriteBytes(byte[] Frame) { - return WriteBytes(Frame, ImageWidth*3); - } - public bool WriteBytes(byte[] Frame, int milliseconds) { - if (_uWr==null) _uWr=_uDv?.OpenEndpointWriter(WriteEndpointID.Ep02); - bool result = _uWr.Write(Frame, 500, out int _) == ErrorCode.None; - Thread.Sleep(milliseconds); - return result; - } - } -} \ No newline at end of file diff --git a/sharperang/App.xaml b/sharperang/App.xaml index a8bc715..1748407 100644 --- a/sharperang/App.xaml +++ b/sharperang/App.xaml @@ -1,7 +1,7 @@ - diff --git a/sharperang/App.xaml.cs b/sharperang/App.xaml.cs index b3977a9..a5e8eab 100644 --- a/sharperang/App.xaml.cs +++ b/sharperang/App.xaml.cs @@ -1,6 +1,6 @@ using System.Windows; -namespace sharperang { +namespace paperangapp { /// /// Interaction logic for App.xaml /// diff --git a/sharperang/LUITextbox.cs b/sharperang/LUITextbox.cs index fc94554..04e879a 100644 --- a/sharperang/LUITextbox.cs +++ b/sharperang/LUITextbox.cs @@ -1,7 +1,7 @@ using liblogtiny; using System.ComponentModel; -namespace sharperang { +namespace paperangapp { class LUITextbox : ILogTiny, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) => diff --git a/sharperang/MainWindow.xaml b/sharperang/MainWindow.xaml index 7304bf5..ebc4d66 100644 --- a/sharperang/MainWindow.xaml +++ b/sharperang/MainWindow.xaml @@ -1,9 +1,9 @@ - @@ -12,7 +12,7 @@ - +