Skip to content

Commit

Permalink
Merge pull request #4 from Automatic9045/fix_bug_of_epson.tml90
Browse files Browse the repository at this point in the history
Fix bug of PrinterPlugin.Epson.TML90
  • Loading branch information
automatic9045 authored Mar 23, 2021
2 parents 2dc9fed + 8c95ae5 commit a4895b8
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 13 deletions.
11 changes: 11 additions & 0 deletions PluginHost/MS-12.PluginHost/Static/LinqExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,16 @@ public static void ForEach<T>(this List<T> source, Action<T, int> selector)
selector(source[i], i);
}
}

public static List<TOutput> ConvertAll<T, TOutput>(this List<T> source, Func<T, int, TOutput> selector)
{
int i = 0;
return source.ConvertAll(e =>
{
TOutput result = selector(e, i);
i++;
return result;
});
}
}
}
129 changes: 116 additions & 13 deletions PrinterPlugins/Epson/TML90/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,97 @@ public void Initialize(string printerName)
posExplorer = new PosExplorer();

DeviceInfo deviceInfo = posExplorer.GetDevice(DeviceType.PosPrinter, printerName);
posPrinter = (PosPrinter)posExplorer.CreateInstance(deviceInfo);
if (deviceInfo is null)
{
PluginHost.ThrowWarning($"指定された論理デバイス名 \"{printerName}\" は不正です。OPOS ADK でこの名前のプリンターが登録されているか確認して下さい。", "プリンター GetDevice エラー");
return;
}

try
{
posPrinter = (PosPrinter)posExplorer.CreateInstance(deviceInfo);
}
catch (Exception ex)
{
PluginHost.ThrowWarning($"不明なエラーが発生しました: {ex.Message}", "プリンター CreateInstance エラー");
}

try
{
posPrinter.Open();
}
catch (PosControlException ex)
{
switch (ex.ErrorCode)
{
case ErrorCode.Illegal:
if (ex.Message.Contains("invalid parameter value"))
{
PluginHost.ThrowWarning($"指定された論理デバイス名 \"{printerName}\" は不正です。OPOS ADK でこの名前のプリンターが登録されているか確認して下さい。", "プリンター Open エラー");
}
else if (ex.Message.Contains("already open"))
{
PluginHost.ThrowWarning($"接続処理に失敗しました。プリンターが他のアプリケーションで使用されている可能性があります。", "プリンター Open エラー");
}
else
{
PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: Illegal】 {ex.Message}", "プリンター Open エラー");
}
break;

case ErrorCode.NoService:
PluginHost.ThrowWarning($"接続処理に失敗しました。お使いのプリンターの不具合の可能性があります。", "プリンター Open エラー");
break;

default:
PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: {ex.ErrorCode}{ex.Message}", "プリンター Open エラー");
break;
}
return;
}

try
{
posPrinter.Claim(5000);
}
catch (PosControlException ex)
{
switch (ex.ErrorCode)
{
case ErrorCode.Closed:
PluginHost.ThrowWarning($"ソフトウェアの不具合です。お手数ですが開発者へご連絡下さい。ご連絡の際にはこちらのエラーコードをお伝え下さい:【CA-CO】", "プリンター Claim エラー");
break;

case ErrorCode.Illegal:
PluginHost.ThrowWarning($"ソフトウェアの不具合です。お手数ですが開発者へご連絡下さい。ご連絡の際にはこちらのエラーコードをお伝え下さい:【CA-IL】", "プリンター Claim エラー");
break;

case ErrorCode.Timeout:
PluginHost.ThrowWarning($"時間内に接続出来ませんでした。プリンターが他のアプリケーションで使用されている可能性があります。", "プリンター Claim エラー");
break;

case ErrorCode.Failure:
PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: Failure】 {ex.Message}", "プリンター Claim エラー");
break;

default:
PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: {ex.ErrorCode}{ex.Message}", "プリンター Claim エラー");
break;
}
return;
}

posPrinter.Open();
posPrinter.Claim(1000);
posPrinter.DeviceEnabled = true;
try
{
posPrinter.DeviceEnabled = true;

posPrinter.MapMode = MapMode.Dots;
posPrinter.RecLetterQuality = true;
posPrinter.MapMode = MapMode.Dots;
posPrinter.RecLetterQuality = true;
}
catch (Exception ex)
{
PluginHost.ThrowWarning($"不明なエラーが発生しました:【{ex.GetType().Name}{ex.Message}", "プリンターセットアップエラー");
}
}

public void Dispose()
Expand All @@ -45,41 +128,52 @@ public void Dispose()
posPrinter.Close();
}

public void Print(List<TicketBase> tickets, int issueingNumber, Action<int> onPrint, Action<Exception, int> onError)
public void Print(List<TicketBase> tickets, int issuingNumber, Action<int> onPrint, Action<Exception, int> onError)
{
string tempDirectoryPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDirectoryPath);

try
{
posPrinter.PrintNormal(PrinterStation.Receipt, $"{issueingNumber} {tickets.Count}枚");
posPrinter.PrintNormal(PrinterStation.Receipt, $"{issuingNumber} {tickets.Count}枚");
}
catch (Exception ex)
{
onError(ex, 0);
DeleteTempFiles();
return;
}

List<(Bitmap, Bitmap)> bmps = tickets.ConvertAll(t =>
List<(string, string)> bmpPaths = tickets.ConvertAll((t, i) =>
{
Bitmap sourceBmp = (Bitmap)t.Bitmap.Clone();
sourceBmp.RotateFlip(RotateFlipType.Rotate270FlipNone);

Bitmap bmp1 = sourceBmp.Clone(new Rectangle((sourceBmp.Width - 364) / 2, 0, 364, 90), PixelFormat.Format1bppIndexed);
Bitmap bmp2 = sourceBmp.Clone(new Rectangle((sourceBmp.Width - 364) / 2, 90, 364, sourceBmp.Height - 90), PixelFormat.Format1bppIndexed);

return (bmp1, bmp2);
string bmp1Path = Path.Combine(tempDirectoryPath, $"{i}-1.bmp");
string bmp2Path = Path.Combine(tempDirectoryPath, $"{i}-2.bmp");

bmp1.Save(bmp1Path, ImageFormat.Bmp);
bmp2.Save(bmp2Path, ImageFormat.Bmp);

return (bmp1Path, bmp2Path);
});

bmps.ForEach((b, i) =>
bmpPaths.ForEach((b, i) =>
{
try
{
posPrinter.PrintNormal(PrinterStation.Receipt, "\u001b|45uF");
posPrinter.PrintMemoryBitmap(PrinterStation.Receipt, b.Item1, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2);
posPrinter.PrintBitmap(PrinterStation.Receipt, b.Item1, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2);
posPrinter.PrintNormal(PrinterStation.Receipt, "\u001b|P");
posPrinter.PrintMemoryBitmap(PrinterStation.Receipt, b.Item2, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2);
posPrinter.PrintBitmap(PrinterStation.Receipt, b.Item2, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2);
}
catch (Exception ex)
{
onError(ex, i);
DeleteTempFiles();
return;
}

Expand All @@ -94,8 +188,17 @@ public void Print(List<TicketBase> tickets, int issueingNumber, Action<int> onPr
catch (Exception ex)
{
onError(ex, tickets.Count - 1);
DeleteTempFiles();
return;
}

DeleteTempFiles();


void DeleteTempFiles()
{
Task.Run(() => Directory.Delete(tempDirectoryPath, true));
}
}
}
}

0 comments on commit a4895b8

Please sign in to comment.