Files
ATV_STDLabelAttach/Handler/Project/Device/SATOPrinterAPI.cs
atvstdla 7f18759004 ..
2025-09-23 17:17:49 +09:00

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;
}
}
}