using arCtl; using SATOPrinterAPI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Project.Device { public class SATOPrinterAPI : IDisposable { private bool disposed = false; Printer SATOPrinter = null; public string LastPrintZPL = string.Empty; public string qrData = string.Empty; public string PortName { get; set; } public int BaudRate { get; set; } public string baseZPL { get { var fi = new System.IO.FileInfo(AR.SETTING.Data.baseZPLFile); if (fi.Exists) { return System.IO.File.ReadAllText(fi.FullName, System.Text.Encoding.Default); } else return Properties.Settings.Default.ZPL7; } } public SATOPrinterAPI() { SATOPrinter = new Printer(); SATOPrinter.Timeout = 2500; SATOPrinter.Interface = Printer.InterfaceType.COM; SATOPrinter.ByteAvailable += SATOPrinter_ByteAvailable; } bool _isopen = false; public bool Open() { try { SATOPrinter.COMPort = this.PortName; SATOPrinter.COMSetting.Baudrate = this.BaudRate; SATOPrinter.Connect(); _isopen = true; return _isopen; } catch { _isopen = false; return false; } } private string ControlCharReplace(string data) { Dictionary chrList = ControlCharList(); foreach (string key in chrList.Keys) { data = data.Replace(key, chrList[key].ToString()); } return data; } private Dictionary ControlCharList() { Dictionary ctr = new Dictionary(); ctr.Add("[NUL]", '\u0000'); ctr.Add("[SOH]", '\u0001'); ctr.Add("[STX]", '\u0002'); ctr.Add("[ETX]", '\u0003'); ctr.Add("[EOT]", '\u0004'); ctr.Add("[ENQ]", '\u0005'); ctr.Add("[ACK]", '\u0006'); ctr.Add("[BEL]", '\u0007'); ctr.Add("[BS]", '\u0008'); ctr.Add("[HT]", '\u0009'); ctr.Add("[LF]", '\u000A'); ctr.Add("[VT]", '\u000B'); ctr.Add("[FF]", '\u000C'); ctr.Add("[CR]", '\u000D'); ctr.Add("[SO]", '\u000E'); ctr.Add("[SI]", '\u000F'); ctr.Add("[DLE]", '\u0010'); ctr.Add("[DC1]", '\u0011'); ctr.Add("[DC2]", '\u0012'); ctr.Add("[DC3]", '\u0013'); ctr.Add("[DC4]", '\u0014'); ctr.Add("[NAK]", '\u0015'); ctr.Add("[SYN]", '\u0016'); ctr.Add("[ETB]", '\u0017'); ctr.Add("[CAN]", '\u0018'); ctr.Add("[EM]", '\u0019'); ctr.Add("[SUB]", '\u001A'); ctr.Add("[ESC]", '\u001B'); ctr.Add("[FS]", '\u001C'); ctr.Add("[GS]", '\u001D'); ctr.Add("[RS]", '\u001E'); ctr.Add("[US]", '\u001F'); ctr.Add("[DEL]", '\u007F'); return ctr; } private bool Query(string cmd, out string errmsg) { errmsg = string.Empty; if (string.IsNullOrEmpty(cmd)) { errmsg = "No Command"; return false; } try { byte[] cmddata = Utils.StringToByteArray(ControlCharReplace(cmd)); byte[] receiveData = SATOPrinter.Query(cmddata); if (receiveData != null) { errmsg = ControlCharConvert(Utils.ByteArrayToString(receiveData)); } return true; } catch (Exception ex) { errmsg = ex.Message; return false; } } private string ControlCharConvert(string data) { Dictionary chrList = ControlCharList().ToDictionary(x => x.Value, x => x.Key); foreach (char key in chrList.Keys) { data = data.Replace(key.ToString(), chrList[key]); } return data; } ~SATOPrinterAPI() { Dispose(disposing: false); } public void Dispose() { Dispose(disposing: true); // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SuppressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if (!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (disposing) { // Dispose managed resources. //component.Dispose(); } SATOPrinter.Disconnect(); // Note disposing has been done. disposed = true; } } public bool IsOpen { get { if (_isopen == false || SATOPrinter == null) return false; try { return true;// return SATOPrinter.IsBusy; //var prn = this.SATOPrinter.GetPrinterStatus(); //return prn.IsOnline; } catch { return false; } } } private void SATOPrinter_ByteAvailable(object sender, Printer.ByteAvailableEventArgs e) { byte[] rawData = e.Data; var msg = Utils.ByteArrayToString(rawData);// System.Text.Encoding.Default.GetString(rawData); PUB.log.Add($"SATO Recv : " + msg); } // private void SATOPrinter_ReceiveData_Raw(object sender, ReceiveDataEventArgs e) //{ // PUB.log.Add($"SATO Recv(RAW) : " + e.StrValue); //} //private void SATOPrinter_ReceiveData(object sender, ReceiveDataEventArgs e) //{ // PUB.log.Add($"SATO Recv : " + e.StrValue); //} public Boolean TestPrint(Boolean drawbox, string manu = "", string mfgdate = "") { var dtstr = DateTime.Now.ToShortDateString(); var printcode = "103077807;Z577603504;105-35282-1105;15000;RC00004A219001W;20210612"; var reel = new Class.Reel(printcode); //reel.id = "RLID" + DateTime.Now.ToString("MMHHmmssfff"); reel.sid = "103000000"; reel.partnum = "PARTNO".PadRight(20, '0'); //20자리 if (mfgdate == "") reel.mfg = dtstr; else reel.mfg = mfgdate; reel.lot = "LOT000000000"; if (manu == "") reel.manu = "ATK4EET1"; else reel.manu = manu; reel.qty = 15000; var rlt = Print(reel, true, drawbox); var fi = new System.IO.FileInfo(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp_zpl.txt")); System.IO.File.WriteAllText(fi.FullName, LastPrintZPL, System.Text.Encoding.Default); return rlt; } public Boolean Print(Class.Reel reel, Boolean display1drid, Boolean drawOUtBox) { string prtData; prtData = makeZPL_210908(reel, drawOUtBox, out qrData); return Print(prtData); } public bool Print(string _zpl) { this.LastPrintZPL = _zpl; //if (this.IsOpen == false) return false; try { byte[] cmddata = Utils.StringToByteArray(ControlCharReplace(_zpl)); SATOPrinter.Send(cmddata); return true; } catch (Exception ex) { return false; } } public string makeZPL_210908(Class.Reel reel, Boolean drawbox, out string qrData) { string m_strSend = string.Empty; qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum); var reeid = reel.id; if (reeid.Length > 20) reeid = "..." + reeid.Substring(reeid.Length - 20); m_strSend = this.baseZPL; m_strSend = m_strSend.Replace("{qrData}", qrData); m_strSend = m_strSend.Replace("{sid}", reel.sid); m_strSend = m_strSend.Replace("{lot}", reel.lot); m_strSend = m_strSend.Replace("{partnum}", reel.partnum); m_strSend = m_strSend.Replace("{rid}", reeid); m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString()); m_strSend = m_strSend.Replace("{mfg}", reel.mfg); m_strSend = m_strSend.Replace("{supply}", reel.manu); //줄바꿈제거 m_strSend = m_strSend.Replace("\r", "").Replace("\n", ""); return m_strSend; } } }