import { get, readable, writable } from "svelte/store"; import { AppConfigSchema, CsvParamsSchema, UserFontSchema, UserIconSchema, type CsvParams, type UserFont, type UserIcon, type AppConfig, type AutomationProps, type ConnectionState, } from "$/types"; import { RequestCommandId, ResponseCommandId, Utils, instantiateClient, type HeartbeatData, type FicheroClient, type PrinterInfo, type PrinterModelMeta, type RfidInfo, } from "$/lib/fichero"; import { Toasts } from "$/utils/toasts"; import { tr } from "$/utils/i18n"; import { LocalStoragePersistence, writablePersisted } from "$/utils/persistence"; import { APP_CONFIG_DEFAULTS, CSV_DEFAULT, OBJECT_DEFAULTS_TEXT } from "$/defaults"; import z from "zod"; import { FileUtils } from "$/utils/file_utils"; export const fontCache = writable([OBJECT_DEFAULTS_TEXT.fontFamily]); export const appConfig = writablePersisted("config", AppConfigSchema, APP_CONFIG_DEFAULTS); export const userIcons = writablePersisted("user_icons", z.array(UserIconSchema), []); export const userFonts = writablePersisted("user_fonts", z.array(UserFontSchema), []); export const loadedFonts = writable([]); export const connectionState = writable("disconnected"); export const connectedPrinterName = writable(""); export const printerClient = writable(); export const heartbeatData = writable(); export const printerInfo = writable(); export const rfidInfo = writable(); export const ribbonRfidInfo = writable(); export const printerMeta = writable(); export const heartbeatFails = writable(0); export const csvData = writablePersisted("csv_params", CsvParamsSchema, { data: CSV_DEFAULT }); userFonts.subscribe(FileUtils.loadFonts); export const automation = readable( (() => { try { return LocalStoragePersistence.loadAutomation() ?? undefined; } catch (e) { console.error(e); } return undefined; })(), ); export const refreshRfidInfo = () => { const client = get(printerClient); if (!client) { return; } client.abstraction.rfidInfo().then(rfidInfo.set).catch(console.error); client.abstraction .rfidInfo2() .then(ribbonRfidInfo.set) .catch(() => {}); }; export const initClient = () => { printerClient.update((prevClient: FicheroClient) => { let newClient: FicheroClient = prevClient; if (prevClient !== undefined) { prevClient.disconnect(); } newClient = instantiateClient(); const conf = get(appConfig); if (conf.packetIntervalMs !== undefined) { newClient.setPacketInterval(conf.packetIntervalMs); } newClient.on("packetsent", (e) => { console.log(`>> ${Utils.bufToHex(e.packet.toBytes())} (${RequestCommandId[e.packet.command]})`); }); newClient.on("packetreceived", (e) => { console.log(`<< ${Utils.bufToHex(e.packet.toBytes())} (${ResponseCommandId[e.packet.command]})`); }); newClient.on("connect", (e) => { console.log("onConnect"); heartbeatFails.set(0); connectionState.set("connected"); connectedPrinterName.set(e.info.deviceName ?? "unknown"); }); newClient.on("printerinfofetched", (e) => { console.log("printerInfoFetched"); printerInfo.set(e.info); printerMeta.set(newClient.getModelMetadata()); }); newClient.on("disconnect", () => { console.log("onDisconnect"); connectionState.set("disconnected"); connectedPrinterName.set(""); printerInfo.set({}); printerMeta.set(undefined); }); newClient.on("heartbeat", (e) => { heartbeatFails.set(0); heartbeatData.update((prev) => { if ( prev?.paperRfidSuccess !== e.data?.paperRfidSuccess || prev?.ribbonRfidSuccess !== e.data?.ribbonRfidSuccess ) { refreshRfidInfo(); } return e.data; }); }); newClient.on("heartbeatfailed", (e) => { const maxFails = 5; heartbeatFails.set(e.failedAttempts); console.warn(`Heartbeat failed ${e.failedAttempts}/${maxFails}`); if (e.failedAttempts >= maxFails) { Toasts.error(get(tr)("connector.disconnect.heartbeat")); newClient.disconnect(); } }); return newClient; }); };