artnet-usbdmx-converter/src/index.ts

115 lines
3.2 KiB
TypeScript
Raw Normal View History

2023-10-08 18:44:10 +02:00
import chalk from "chalk";
import ConvertHandler from "./ConvertHandler";
import renderStartupScreen from "./startupscreen";
import renderControlScreen from "./controlscreen";
import {clearInterval} from "timers";
import {exec} from "child_process";
2024-05-08 20:25:17 +02:00
import ConfigStorage from "./config/ConfigStorage";
import minimist from "minimist";
const argv = minimist(process.argv.slice(2));
2023-10-08 18:44:10 +02:00
export const defaultConvertHandler = new ConvertHandler();
2024-05-08 20:25:17 +02:00
export const defaultConfigStorage = new ConfigStorage();
let renderControlScreenTimer: NodeJS.Timeout;
/**
* Entry point of the program
*/
2023-10-08 18:44:10 +02:00
async function main() {
2024-05-08 20:25:17 +02:00
if (typeof argv["config"] === "string") {
defaultConfigStorage.loadConfig(argv["config"]);
}
2023-10-08 18:44:10 +02:00
setTerminalTitle("ArtNet => USBDMX")
2024-05-08 20:25:17 +02:00
defaultConvertHandler.scanForInterfaces();
const selectedInfo = defaultConfigStorage.getInterface() ?? await renderStartupScreen();
if (argv._.includes("outputconfig")) {
console.log(JSON.stringify(selectedInfo, null, 2));
2024-05-08 20:25:17 +02:00
return;
}
2023-10-08 18:44:10 +02:00
console.log(chalk.blueBright(
"Starting ArtNet..."
2023-10-08 18:44:10 +02:00
));
console.log(chalk.yellow(
2024-05-08 18:34:10 +02:00
"Please accept any firewall requests"
2023-10-08 18:44:10 +02:00
))
defaultConvertHandler.startArtNetReceiver();
console.log(
chalk.blueBright(
`Open ${selectedInfo.serial} using mode ${selectedInfo.mode}...`
2023-10-08 18:44:10 +02:00
)
);
const openInterfaceResponse = await defaultConvertHandler.openInterface(selectedInfo.serial, selectedInfo.mode, selectedInfo.manufacturer, selectedInfo.product);
if (openInterfaceResponse.length > 0) {
console.log(
chalk.red(
openInterfaceResponse
)
)
2024-05-08 20:25:17 +02:00
throw "MissingInterfaceError"
2023-10-08 18:44:10 +02:00
}
else {
console.log(
chalk.green("✅ System ready")
2023-10-08 18:44:10 +02:00
);
renderControlScreenTimer = setInterval(() => {
renderControlScreen();
2024-05-08 18:34:10 +02:00
}, 1000)
2023-10-08 18:44:10 +02:00
}
}
process.on('SIGINT', () => {
clearInterval(renderControlScreenTimer);
defaultConvertHandler.closeInterface();
process.exit(0);
}); // CTRL+C
process.on('SIGQUIT', () => {
clearInterval(renderControlScreenTimer);
defaultConvertHandler.closeInterface();
process.exit(0);
}); // Keyboard quit
process.on('SIGTERM', () => {
clearInterval(renderControlScreenTimer);
defaultConvertHandler.closeInterface();
process.exit(0);
}); // `kill` command
process.on('SIGHUP', () => {
clearInterval(renderControlScreenTimer);
defaultConvertHandler.closeInterface();
process.exit(0);
}); // close window
process.on('uncaughtException', (err) => {
clearInterval(renderControlScreenTimer);
console.log(
chalk.red(`⛔ A fatal error has occurred`)
2023-10-08 18:44:10 +02:00
);
console.log(err);
2024-05-08 20:25:17 +02:00
if (argv["autoretry"] === true) {
console.log("Auto-restart enabled, will restart now...")
setTimeout(() => {
main();
}, 2000);
} else {
exec("pause press [enter]");
process.exit(0);
}
2023-10-08 18:44:10 +02:00
})
2024-05-08 20:25:17 +02:00
2023-10-08 18:44:10 +02:00
main();
/**
* Sets the title of the terminal
* @param title new title
*/
2024-05-08 20:25:17 +02:00
function setTerminalTitle(title: string) {
2023-10-08 18:44:10 +02:00
process.stdout.write(
String.fromCharCode(27) + "]0;" + title + String.fromCharCode(7)
);
}