feat(ocp): printer cycling backend and frontend done :)

This commit is contained in:
2025-04-07 07:02:31 -05:00
parent 75f94eae14
commit dc5ee5b97a
14 changed files with 302 additions and 35 deletions

View File

@@ -4,13 +4,23 @@ import { settings } from "../../../../../database/schema/settings.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
import { createLog } from "../../../logger/logger.js";
import { getPrinters } from "./getPrinters.js";
import { printerStatus } from "./printerStatus.js";
import { autoLabelingStats, printerStatus } from "./printerStatus.js";
let isPrinterCycling = false;
let actualPrinterCycle: any;
export const printerCycle = async () => {
/**
* We will cycle through the printers to check there states.
*/
if (isPrinterCycling)
return {
success: false,
message: "Printers are already being cycled.",
};
createLog("info", "ocp", "ocp", "Printer cycle has started.");
// get the printers
const { data: s, error: se } = await tryCatch(
db.select().from(settings).where(eq(settings.name, "ocpCycleDelay"))
@@ -29,9 +39,9 @@ export const printerCycle = async () => {
}
const ocpDelay: any = s;
isPrinterCycling = true;
// start the actual printer cycle
const actualPrinterCycle = setInterval(async () => {
actualPrinterCycle = setInterval(async () => {
const { data, error } = await tryCatch(getPrinters());
if (error) {
@@ -51,10 +61,8 @@ export const printerCycle = async () => {
// only keep the assigned ones
printers = printers.filter((p: any) => p.assigned === true);
// for autolabelers like dayton and MCD we want to ignore them from the loop as well.
printers = printers.filter(
(p: any) => p.name != "Autolabeler" && !p.remark.includes("ignore")
);
// for printers we want to ignore there must be a remark stateing to ignore.
printers = printers.filter((p: any) => !p.remark.includes("ignore"));
printers.forEach(async (p: any) => {
/**
@@ -75,7 +83,31 @@ export const printerCycle = async () => {
return;
}
if (p.name === "Autolabeler") {
await autoLabelingStats(p);
return;
}
// for all other printers
await printerStatus(p);
});
}, parseInt(ocpDelay[0]?.value) * 1000);
return { success: true, message: "Printer cycle has been started." };
};
export const stopPrinterCycle = async () => {
/**
* We will stop the print cylce this is more an emergancy thing.
*/
if (actualPrinterCycle && !actualPrinterCycle._destroyed) {
createLog("info", "ocp", "ocp", "Printer cycle is being stopped.");
clearInterval(actualPrinterCycle);
isPrinterCycling = false;
return { success: true, message: "Printer cycle has been stopped." };
} else {
createLog("info", "ocp", "ocp", "Printer cycle is already stopped.");
isPrinterCycling = false;
return { success: true, message: "Printer cycle is already Stopped." };
}
};

View File

@@ -8,6 +8,7 @@ export const printStatus = [
{ code: 2, text: "Pending labels" },
{ code: 3, text: "Printing to fast" },
{ code: 4, text: "Creating label" },
{ code: 5, text: "Waiting" },
{ code: 6, text: "Printer Paused" },
{ code: 7, text: "Printer error" },
{

View File

@@ -68,9 +68,9 @@ export const printerStatus = async (p: any) => {
"debug",
"ocp",
"ocp",
`${p.name}: timeBetween: ${timeBetween}, delay ${
p.printDelay || 90
}, ${currentTime}... ${lastTime}`
`${p.name}: timeBetween: ${timeBetween}, delay ${parseInt(
p.printDelay
)}, ${currentTime}... ${lastTime}`
);
if (tmp[2] === "0" && tmp[4] !== "000") {
@@ -80,7 +80,7 @@ export const printerStatus = async (p: any) => {
"ocp",
"ocp",
`Unpaused and printing labels, time remaing ${differenceInSeconds(
p.printDelay || 90,
parseInt(p.printDelay),
timeBetween
)}`
);
@@ -96,7 +96,7 @@ export const printerStatus = async (p: any) => {
`${
p.name
} paused to soon, unpausing, remaining time: ${differenceInSeconds(
p.printDelay || 90,
parseInt(p.printDelay),
timeBetween
)}`
);
@@ -105,20 +105,20 @@ export const printerStatus = async (p: any) => {
printerUpdate(p, 2);
unPausePrinter(p);
} else if ((tmp[2] === "0" && timeBetween < p.printDelay) || 90) {
} else if (tmp[2] === "0" && timeBetween < parseInt(p.printDelay)) {
// was unpaused to soon so repause it
createLog(
"debug",
"ocp",
"ocp",
`${p.name} Unpaused before the time allowed, time left ${
differenceInSeconds(p.printDelay || 90, timeBetween) //seconds
differenceInSeconds(parseInt(p.printDelay), timeBetween) //seconds
}`
);
printerUpdate(p, 3);
pausePrinter(p);
} else if ((tmp[2] === "0" && timeBetween > p.printDelay) || 90) {
} else if (tmp[2] === "0" && timeBetween > parseInt(p.printDelay)) {
// its been long enough we can print a label
createLog(
"debug",
@@ -188,3 +188,68 @@ export const printerStatus = async (p: any) => {
});
});
};
export const autoLabelingStats = async (p: any) => {
/**
* Checks autolabeling printers just to see what they are doing.
*/
createLog("debug", "ocp", "ocp", `Printer cycling`);
const printer = new net.Socket();
return new Promise((resolve) => {
// connect to the printer, and check its status
printer.connect(p.port, p.ipAddress, async () => {
// write the message to the printer below gives us a feedback of the printer
printer.write("~HS");
});
// read the data from the printer
printer.on("data", async (data) => {
const res = data.toString();
// turn the data into an array to make it more easy to deal with
const tmp = res.split(",");
if (tmp[4] !== "000") {
// unpaused and printing labels - reset timer
createLog("debug", "ocp", "ocp", `Printing Labels`);
// update last time printed in the array
printerUpdate(p, 1);
}
if (tmp[4] === "000") {
// unpaused and printing labels - reset timer
createLog("debug", "ocp", "ocp", `Printing Labels`);
// update last time printed in the array
printerUpdate(p, 5);
}
});
printer.on("error", async (error) => {
// just going to say theres an error with the printer
if (!errorCheck) {
createLog(
"error",
"ocp",
"ocp",
`${p.name} encountered an error: ${error}`
);
}
await printerUpdate(p, 7);
errorCheck = true;
// send log data
// fake line
printer.end();
resolve({
success: false,
message: "There was an error with the printer.",
});
});
});
};

View File

@@ -57,6 +57,7 @@ export const updatePrinters = async () => {
port: prodPrinterInfo[i].port,
remark: prodPrinterInfo[i].remark,
upd_date: sql`NOW()`,
printDelay: "90", // need to remove in a couple weeks
},
})
);