294 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			294 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using AR;
 | |
| 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 ZPLFileName { get; set; } = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "zpl.txt");
 | |
|         public string baseZPL
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 var fi = new System.IO.FileInfo(ZPLFileName);
 | |
|                 if (fi.Exists == false || fi.Length == 0)
 | |
|                 {
 | |
|                     PUB.log.AddE($"{ZPLFileName} does not exist or has no data. Changed to default zpl.txt");
 | |
|                     fi = new System.IO.FileInfo(UTIL.MakePath("Data", "zpl.txt"));
 | |
|                     if (fi.Exists == false) PUB.log.AddE("Print template file (zpl.txt) does not exist");
 | |
|                 }
 | |
|                 if (fi.Exists && fi.Length > 1)
 | |
|                     return System.IO.File.ReadAllText(fi.FullName, System.Text.Encoding.Default);
 | |
|                 else
 | |
|                 {
 | |
|                     PUB.log.AddAT("No ZPL file found, using ZPL code from settings");
 | |
|                     return string.Empty;
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         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<string, char> chrList = ControlCharList();
 | |
|             foreach (string key in chrList.Keys)
 | |
|             {
 | |
|                 data = data.Replace(key, chrList[key].ToString());
 | |
|             }
 | |
|             return data;
 | |
|         }
 | |
|         private Dictionary<string, char> ControlCharList()
 | |
|         {
 | |
|             Dictionary<string, char> ctr = new Dictionary<string, char>();
 | |
|             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<char, string> 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.PartNo = "PARTNO".PadRight(20, '0'); //20자리
 | |
| 
 | |
|             if (mfgdate == "") reel.mfg = dtstr;
 | |
|             else reel.mfg = mfgdate;
 | |
| 
 | |
|             reel.venderLot = "LOT000000000";
 | |
|             if (manu == "") reel.venderName = "ATK4EET1";
 | |
|             else reel.venderName = 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.venderLot, reel.venderName, reel.qty, reel.id, reel.mfg, reel.PartNo);
 | |
| 
 | |
|             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.venderLot);
 | |
|             m_strSend = m_strSend.Replace("{partnum}", reel.PartNo);
 | |
|             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.venderName);
 | |
| 
 | |
|             //줄바꿈제거
 | |
|             m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
 | |
|             return m_strSend;
 | |
|         }
 | |
|     }
 | |
| } | 
