using System.Text;
using Microsoft.Extensions.Logging;
namespace Inspectron.Epson;
///
/// Comprehensive diagnostics for Epson TM-m30III printer
///
public class EpsonDiagnostics
{
private readonly ILogger _logger;
///
/// Initialize a new instance of EpsonDiagnostics
///
/// Optional logger for diagnostic output
public EpsonDiagnostics(ILogger logger = null)
{
_logger = logger;
}
///
/// Run full diagnostic check and return formatted report
///
/// Printer IP address
/// Printer port (default 9100)
/// Connection timeout in seconds (default 5)
/// Formatted diagnostic report as string
public async Task RunFullDiagnosticsAsync(string ip, int port = 9100, int timeoutSeconds = 5)
{
var report = new StringBuilder();
var separator = new string('=', 70);
report.AppendLine();
report.AppendLine(separator);
report.AppendLine(" EPSON TM-m30III PRINTER DIAGNOSTICS");
report.AppendLine(separator);
report.AppendLine($" Printer IP: {ip}:{port}");
report.AppendLine($" Timestamp: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
report.AppendLine(separator);
_logger?.LogInformation("Starting diagnostics for printer at {Ip}:{Port}", ip, port);
await using var printer = new EpsonPrinter();
// Connect to printer
report.AppendLine();
report.AppendLine("⏳ Connecting to printer...");
try
{
await printer.ConnectAsync(ip, port, timeoutSeconds);
report.AppendLine("✅ Connection established");
}
catch (Exception ex)
{
report.AppendLine();
report.AppendLine("❌ DIAGNOSTIC FAILED: Cannot connect to printer");
report.AppendLine($" {ex.Message}");
report.AppendLine($" Make sure the printer is powered on and accessible at {ip}");
report.AppendLine();
report.AppendLine(separator);
report.AppendLine(" DIAGNOSTIC COMPLETE");
report.AppendLine(separator);
_logger?.LogError(ex, "Diagnostics failed - cannot connect to printer");
return report.ToString();
}
// Gather status information
report.AppendLine();
report.AppendLine("⏳ Retrieving printer information...");
report.AppendLine("⏳ Querying printer status...");
try
{
var overallStatus = await printer.GetOverallStatusAsync();
// Overall Status Section
PrintSectionHeader(report, "OVERALL STATUS");
report.AppendLine();
report.AppendLine($" {overallStatus.StatusIcon} {overallStatus.StatusText}");
report.AppendLine();
if (!string.IsNullOrEmpty(overallStatus.PrinterModel))
{
PrintStatusLine(report, "Printer Model", overallStatus.PrinterModel, "🖨️");
}
// General Printer Status Section
if (overallStatus.PrinterStatus != null)
{
var ps = overallStatus.PrinterStatus;
PrintSectionHeader(report, "GENERAL PRINTER STATUS");
PrintStatusLine(report, "Raw Status Byte", ps.Hex, "📊");
PrintStatusLine(report, "Binary", ps.Binary, "📊");
report.AppendLine();
PrintStatusLine(report, "Printer Online", ps.IsOnline);
PrintStatusLine(report, "Cover Closed", ps.IsCoverClosed);
PrintStatusLine(report, "Paper Feed Button Pressed", ps.PaperFeedButtonPressed);
PrintStatusLine(report, "Drawer Open Signal", ps.DrawerOpen);
}
// Offline Status Section
if (overallStatus.OfflineStatus != null)
{
var os = overallStatus.OfflineStatus;
PrintSectionHeader(report, "OFFLINE STATUS (Reasons for Offline)");
PrintStatusLine(report, "Raw Status Byte", os.Hex, "📊");
PrintStatusLine(report, "Binary", os.Binary, "📊");
report.AppendLine();
PrintStatusLine(report, "Cover Open", os.CoverOpen);
PrintStatusLine(report, "Paper Feed Button Active", os.PaperFeedButton);
PrintStatusLine(report, "Paper End Detected", os.PaperEnd);
PrintStatusLine(report, "Error Occurred", os.ErrorOccurred);
}
// Error Status Section
if (overallStatus.ErrorStatus != null)
{
var es = overallStatus.ErrorStatus;
PrintSectionHeader(report, "ERROR STATUS");
PrintStatusLine(report, "Raw Status Byte", es.Hex, "📊");
PrintStatusLine(report, "Binary", es.Binary, "📊");
report.AppendLine();
PrintStatusLine(report, "Recoverable Error", es.RecoverableError);
PrintStatusLine(report, "Auto-Cutter Error", es.AutoCutterError);
PrintStatusLine(report, "Unrecoverable Error", es.UnrecoverableError);
PrintStatusLine(report, "Auto-Recovery Error", es.AutoRecoveryError);
// Error guidance
if (es.UnrecoverableError)
{
report.AppendLine();
report.AppendLine(" ⚠️ UNRECOVERABLE ERROR DETECTED:");
report.AppendLine(" - Power cycle the printer");
report.AppendLine(" - Check for hardware failures");
report.AppendLine(" - Contact technical support if issue persists");
}
else if (es.RecoverableError)
{
report.AppendLine();
report.AppendLine(" ⚠️ RECOVERABLE ERROR DETECTED:");
report.AppendLine(" - Check for paper jams");
report.AppendLine(" - Ensure paper is loaded correctly");
report.AppendLine(" - Close the printer cover");
}
if (es.AutoCutterError)
{
report.AppendLine();
report.AppendLine(" ⚠️ AUTO-CUTTER ERROR DETECTED:");
report.AppendLine(" - Check for paper jams in cutter");
report.AppendLine(" - Remove any obstructions");
report.AppendLine(" - May require service");
}
}
// Paper Sensor Status Section
if (overallStatus.PaperStatus != null)
{
var pps = overallStatus.PaperStatus;
PrintSectionHeader(report, "PAPER SENSOR STATUS");
PrintStatusLine(report, "Raw Status Byte", pps.Hex, "📊");
PrintStatusLine(report, "Binary", pps.Binary, "📊");
report.AppendLine();
PrintStatusLine(report, "Paper Present", pps.PaperPresent);
PrintStatusLine(report, "Paper Near End", pps.PaperNearEnd);
if (!pps.PaperPresent)
{
report.AppendLine();
report.AppendLine(" ⚠️ NO PAPER DETECTED:");
report.AppendLine(" - Load paper roll");
report.AppendLine(" - Ensure paper is inserted correctly");
}
else if (pps.PaperNearEnd)
{
report.AppendLine();
report.AppendLine(" ⚠️ PAPER LOW:");
report.AppendLine(" - Replace paper roll soon to avoid interruption");
}
}
// Recommendations Section
PrintSectionHeader(report, "RECOMMENDATIONS");
if (overallStatus.Recommendations.Count == 0)
{
report.AppendLine();
report.AppendLine(" ✅ No issues detected - printer is ready for operation");
}
else
{
report.AppendLine();
for (int i = 0; i < overallStatus.Recommendations.Count; i++)
{
report.AppendLine($" {i + 1}. {overallStatus.Recommendations[i]}");
}
}
}
catch (Exception ex)
{
report.AppendLine();
report.AppendLine($"❌ Error during diagnostics: {ex.Message}");
_logger?.LogError(ex, "Error during diagnostics");
}
// Footer
report.AppendLine();
report.AppendLine(separator);
report.AppendLine(" DIAGNOSTIC COMPLETE");
report.AppendLine(separator);
report.AppendLine();
_logger?.LogInformation("Diagnostics completed");
return report.ToString();
}
private static void PrintSectionHeader(StringBuilder report, string title)
{
var separator = new string('=', 70);
report.AppendLine();
report.AppendLine(separator);
report.AppendLine($" {title}");
report.AppendLine(separator);
}
private static void PrintStatusLine(StringBuilder report, string label, bool value)
{
var icon = value ? "✅" : "❌";
var valueStr = value ? "YES" : "NO";
report.AppendLine($" {icon} {label,-35} {valueStr}");
}
private static void PrintStatusLine(StringBuilder report, string label, string value, string icon = "ℹ️")
{
report.AppendLine($" {icon} {label,-35} {value}");
}
}