This commit is contained in:
EugeneTes
2026-02-02 12:50:00 +01:00
parent 10c0ca20da
commit e90465e286
9 changed files with 109 additions and 33 deletions

View File

@@ -44,6 +44,10 @@ public class PrinterDiscoveryBackgroundTask
// Run immediately on start // Run immediately on start
await DiscoverAndNotifyAsync(); await DiscoverAndNotifyAsync();
// Scan once for now, then exit
// By Reini, because we are loosing connection on frequent scans
return;
// Then run periodically // Then run periodically
while (!cancellationToken.IsCancellationRequested) while (!cancellationToken.IsCancellationRequested)
{ {

View File

@@ -34,7 +34,15 @@ var config = new EpsonPrintServiceConfiguration
Console.WriteLine($"Restaurant: {config.RestaurantId}"); Console.WriteLine($"Restaurant: {config.RestaurantId}");
Console.WriteLine($"API URL: {config.ApiUrl}"); Console.WriteLine($"API URL: {config.ApiUrl}");
kernel.Bind<IDiscoveryService>().To<DiscoveryService>().InSingletonScope(); //kernel.Bind<IDiscoveryService>().To<DiscoveryService>().InSingletonScope();
var discovery = new PreconfiguredDiscoveryService();
discovery.AddPrinter("192.168.50.176", "TM-T30III", port: 9100);
discovery.AddPrinter("192.168.50.60", "TM-T30III", port: 9100);
discovery.AddPrinter("192.168.50.61", "TM-T30III", port: 9100);
discovery.AddPrinter("192.168.50.80", "TM-U220II", port: 9100);
kernel.Bind<IDiscoveryService>().ToConstant(discovery);
kernel.Bind<HttpClient>().ToConstant(new HttpClient { Timeout = TimeSpan.FromSeconds(30) }).InSingletonScope(); kernel.Bind<HttpClient>().ToConstant(new HttpClient { Timeout = TimeSpan.FromSeconds(30) }).InSingletonScope();
@@ -65,6 +73,9 @@ kernel.Bind<HeartbeatBackgroundTask>().ToSelf().InSingletonScope();
var printLoop = kernel.Get<PrintLoop>(); var printLoop = kernel.Get<PrintLoop>();
var printServer = kernel.Get<PrintServer>(); var printServer = kernel.Get<PrintServer>();
var discoveryTask = kernel.Get<PrinterDiscoveryBackgroundTask>(); var discoveryTask = kernel.Get<PrinterDiscoveryBackgroundTask>();
var heartbeatTask = kernel.Get<HeartbeatBackgroundTask>(); var heartbeatTask = kernel.Get<HeartbeatBackgroundTask>();

View File

@@ -10,19 +10,19 @@ using System.Text.Json;
// ============================================================================ // ============================================================================
// FINAL RECEIPT - HTML PRINTER // FINAL RECEIPT - HTML PRINTER
// ============================================================================ // ============================================================================
//var receipt = TestHelpers.BuildSampleFinalReceipt(true); var receipt = TestHelpers.BuildSampleFinalReceipt(true);
//var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true });
//var converter = new FinalReceiptConverter(lineWidth: 48, bigFontLineWidth: 24); var converter = new FinalReceiptConverter(lineWidth: 48, bigFontLineWidth: 24);
//var printCommands = converter.Convert(serializedReceipt); var printCommands = converter.Convert(serializedReceipt);
//TestHelpers.PrintCommandsToConsole(printCommands); TestHelpers.PrintCommandsToConsole(printCommands);
//var printer = await TestHelpers.CreateHtmlPrinterAsync(); var printer = await TestHelpers.CreateHtmlPrinterAsync();
//await TestHelpers.PrintCommandsToHtmlPrinterAsync( await TestHelpers.PrintCommandsToHtmlPrinterAsync(
// printer, printer,
// printCommands, printCommands,
// logoPath: "ristorante-klinglers.ch-logo_white_bg.png"); logoPath: "ristorante-klinglers.ch-logo_white_bg.png");
// ============================================================================ // ============================================================================
@@ -43,20 +43,20 @@ using System.Text.Json;
// ============================================================================ // ============================================================================
// INVOICE RECEIPT - HTML PRINTER // INVOICE RECEIPT - HTML PRINTER
// ============================================================================ // ============================================================================
var receipt = TestHelpers.BuildSampleInvoiceReceipt(); //var receipt = TestHelpers.BuildSampleInvoiceReceipt();
//var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); ////var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true });
var fileContent = File.ReadAllText("invoice.json"); //var fileContent = File.ReadAllText("invoice.json");
var serializedReceipt = JsonSerializer.Deserialize<string>(fileContent); //var serializedReceipt = JsonSerializer.Deserialize<string>(fileContent);
var converter = new InvoiceReceiptConverter(lineWidth: 48, bigFontLineWidth: 24); //var converter = new InvoiceReceiptConverter(lineWidth: 48, bigFontLineWidth: 24);
var printCommands = converter.Convert(serializedReceipt); //var printCommands = converter.Convert(serializedReceipt);
TestHelpers.PrintCommandsToConsole(printCommands); //TestHelpers.PrintCommandsToConsole(printCommands);
var printer = await TestHelpers.CreateHtmlPrinterAsync(); //var printer = await TestHelpers.CreateHtmlPrinterAsync();
await TestHelpers.PrintCommandsToHtmlPrinterAsync( //await TestHelpers.PrintCommandsToHtmlPrinterAsync(
printer, // printer,
printCommands, // printCommands,
logoPath: "ristorante-klinglers.ch-logo_white_bg.png"); // logoPath: "ristorante-klinglers.ch-logo_white_bg.png");
// ============================================================================ // ============================================================================

View File

@@ -112,6 +112,9 @@ public static class TestHelpers
}, },
DiscountInfo = new DiscountInfo() DiscountInfo = new DiscountInfo()
{ {
Amount = -50.00m,
Currency = "CHF",
Description = "Fine Dine",
} }
}; };

View File

@@ -0,0 +1,56 @@
namespace Inspectron.Epson;
/// <summary>
/// Discovery service that returns preconfigured printers instead of performing network discovery
/// </summary>
public class PreconfiguredDiscoveryService : IDiscoveryService
{
private readonly List<DiscoveredPrinter> _printers = new();
public void AddPrinter(string ipAddress, string? modelName = null, int port = 9100)
{
_printers.Add(new DiscoveredPrinter
{
IPAddress = ipAddress,
ModelName = modelName ?? "Unknown",
Port = port,
DiscoveredAt = DateTime.UtcNow
});
}
public void RemovePrinter(string ipAddress)
{
_printers.RemoveAll(p => p.IPAddress == ipAddress);
}
public void ClearPrinters()
{
_printers.Clear();
}
public Task<List<DiscoveredPrinter>> DiscoverPrintersAsync(
TimeSpan? timeout = null,
Action<DiscoveredPrinter>? onPrinterDiscovered = null)
{
var results = _printers.Select(p => new DiscoveredPrinter
{
IPAddress = p.IPAddress,
ModelName = p.ModelName,
Port = p.Port,
MACAddress = p.MACAddress,
ServiceUrl = p.ServiceUrl,
ServiceType = p.ServiceType,
Lifetime = p.Lifetime,
RawResponse = p.RawResponse,
DiscoveredAt = DateTime.UtcNow
}).ToList();
if (onPrinterDiscovered != null)
{
foreach (var printer in results)
onPrinterDiscovered(printer);
}
return Task.FromResult(results);
}
}

View File

@@ -28,6 +28,7 @@ public class SignalRPrintJobSource: IPrintJobSource
// Register handlers BEFORE starting connection // Register handlers BEFORE starting connection
_connection.On<PrintJobFromSignalR>("PrintJob", OnPrintJobReceived); _connection.On<PrintJobFromSignalR>("PrintJob", OnPrintJobReceived);
_connection.Reconnecting += OnReconnecting; _connection.Reconnecting += OnReconnecting;
_connection.Reconnected += OnReconnected; _connection.Reconnected += OnReconnected;
_connection.Closed += OnClosed; _connection.Closed += OnClosed;

View File

@@ -98,7 +98,7 @@ public class BarReceiptConverter
private static void PrintDish(Dish drink, List<PrintCommand> commands) private static void PrintDish(Dish drink, List<PrintCommand> commands)
{ {
string drinkLine = $"{drink.Number}x {drink.Name}"; string drinkLine = $"{drink.Number}x {drink.Name}";
commands.Add(new PrintCommand(drinkLine)); commands.Add(new PrintCommand(drinkLine,isBig:true));
// Modifications // Modifications
if (drink.Modifications != null && (drink.Modifications.Removed.Any() || drink.Modifications.Added.Any())) if (drink.Modifications != null && (drink.Modifications.Removed.Any() || drink.Modifications.Added.Any()))
{ {

View File

@@ -35,8 +35,7 @@ public class DiscountInfo
public string Description { get; set; } public string Description { get; set; }
public decimal Amount { get; set; } public decimal Amount { get; set; }
public string Currency { get; set; } public string Currency { get; set; }
public decimal? AmountInAlternateCurrency { get; set; }
public string AlternateCurrency { get; set; }
} }
public class FinalReceiptItem public class FinalReceiptItem

View File

@@ -64,6 +64,8 @@ public class ReceiptConverter
commands.Add(new PrintCommand("---------".PadLeft(_lineWidth))); commands.Add(new PrintCommand("---------".PadLeft(_lineWidth)));
commands.Add(new PrintCommand("")); //Reini commands.Add(new PrintCommand("")); //Reini
// Total // Total
string totalLine = $"Summe: {finalReceipt.Total:F2} {finalReceipt.Currency}"; string totalLine = $"Summe: {finalReceipt.Total:F2} {finalReceipt.Currency}";
commands.Add(new PrintCommand(Center(totalLine, true), true, true)); commands.Add(new PrintCommand(Center(totalLine, true), true, true));
@@ -78,12 +80,12 @@ public class ReceiptConverter
} }
// Discount // Discount
//if (finalReceipt.DiscountInfo != null && finalReceipt.DiscountInfo.Amount > 0) if (finalReceipt.DiscountInfo != null)
//{ {
// commands.Add(new PrintCommand(finalReceipt.DiscountInfo.Description.PadLeft(_lineWidth/2))); commands.Add(new PrintCommand(finalReceipt.DiscountInfo.Description.PadRight(_lineWidth / 2) + (finalReceipt.DiscountInfo.Amount.ToString("F2") + " " + finalReceipt.DiscountInfo.Currency).PadLeft(_lineWidth / 2)));
// commands.Add(new PrintCommand("")); commands.Add(new PrintCommand(""));
//} }
// Split payments // Split payments
if (finalReceipt.SplitPayments != null && finalReceipt.SplitPayments.Count > 0) if (finalReceipt.SplitPayments != null && finalReceipt.SplitPayments.Count > 0)