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
await DiscoverAndNotifyAsync();
// Scan once for now, then exit
// By Reini, because we are loosing connection on frequent scans
return;
// Then run periodically
while (!cancellationToken.IsCancellationRequested)
{

View File

@@ -34,7 +34,15 @@ var config = new EpsonPrintServiceConfiguration
Console.WriteLine($"Restaurant: {config.RestaurantId}");
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();
@@ -65,6 +73,9 @@ kernel.Bind<HeartbeatBackgroundTask>().ToSelf().InSingletonScope();
var printLoop = kernel.Get<PrintLoop>();
var printServer = kernel.Get<PrintServer>();
var discoveryTask = kernel.Get<PrinterDiscoveryBackgroundTask>();
var heartbeatTask = kernel.Get<HeartbeatBackgroundTask>();

View File

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

View File

@@ -112,6 +112,9 @@ public static class TestHelpers
},
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
_connection.On<PrintJobFromSignalR>("PrintJob", OnPrintJobReceived);
_connection.Reconnecting += OnReconnecting;
_connection.Reconnected += OnReconnected;
_connection.Closed += OnClosed;

View File

@@ -98,7 +98,7 @@ public class BarReceiptConverter
private static void PrintDish(Dish drink, List<PrintCommand> commands)
{
string drinkLine = $"{drink.Number}x {drink.Name}";
commands.Add(new PrintCommand(drinkLine));
commands.Add(new PrintCommand(drinkLine,isBig:true));
// Modifications
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 decimal Amount { get; set; }
public string Currency { get; set; }
public decimal? AmountInAlternateCurrency { get; set; }
public string AlternateCurrency { get; set; }
}
public class FinalReceiptItem

View File

@@ -64,6 +64,8 @@ public class ReceiptConverter
commands.Add(new PrintCommand("---------".PadLeft(_lineWidth)));
commands.Add(new PrintCommand("")); //Reini
// Total
string totalLine = $"Summe: {finalReceipt.Total:F2} {finalReceipt.Currency}";
commands.Add(new PrintCommand(Center(totalLine, true), true, true));
@@ -78,12 +80,12 @@ public class ReceiptConverter
}
// 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(""));
//}
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(""));
}
// Split payments
if (finalReceipt.SplitPayments != null && finalReceipt.SplitPayments.Count > 0)