UNPKG

opniz-cli

Version:

opniz CLIは[opniz Arduino Library](https://github.com/miso-develop/opniz-arduino-m5atom)の[Basicスケッチ](https://github.com/miso-develop/opniz-arduino-m5atom/blob/main/examples/Basic/Basic.ino)を、コマンドから簡単に書き込めるCLIツールです。 [Arduino CLI](https://github.com/arduin

199 lines (198 loc) 8.38 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.monitorPrompt = exports.uploadPrompt = void 0; require("zx/globals"); const inquirer_1 = __importDefault(require("inquirer")); const node_wifi_1 = __importDefault(require("node-wifi")); const util_js_1 = require("./util.js"); const config_js_1 = require("../config.js"); const type_js_1 = require("../type.js"); $.verbose = false; process.chdir(__dirname + "/../../"); const deviceList = Object.keys(type_js_1.Device); const uploadPrompt = (options) => __awaiter(void 0, void 0, void 0, function* () { const questions = yield setUploadQuestions(options); const answers = yield runPrompt(questions); const mergedAnswers = mergeAnswers(options, answers); // console.log(mergedAnswers) // DEBUG: return mergedAnswers; }); exports.uploadPrompt = uploadPrompt; const monitorPrompt = (options) => __awaiter(void 0, void 0, void 0, function* () { const questions = yield setMonitorQuestions(options); const answers = yield runPrompt(questions); const mergedAnswers = Object.assign(Object.assign({}, options), answers); // console.log(mergedAnswers) // DEBUG: return mergedAnswers; }); exports.monitorPrompt = monitorPrompt; const getPortList = () => __awaiter(void 0, void 0, void 0, function* () { const result = (yield (0, util_js_1.arduinoCliExec)(`board list`)).stdout.replace(/(\n\n)+/, ""); const portList = result .split("\n") .map(line => line.split(" ")[0]) .filter((element, index) => index > 0); return portList; }); const getSsidList = () => __awaiter(void 0, void 0, void 0, function* () { const networks = yield new Promise((resolve) => { node_wifi_1.default.init(); node_wifi_1.default.scan((error, networks) => resolve(error ? [] : networks)); }); const ssidList = networks .map(network => network.ssid) .filter(ssid => ssid !== "") .reverse(); return [...ssidList, "Other"]; }); const getAddressList = () => __awaiter(void 0, void 0, void 0, function* () { const addressList = Object.values(os.networkInterfaces()) .flat() .filter((networkInterface) => networkInterface.family === "IPv4") .map(networkInterface => networkInterface.address) .filter(address => address !== "127.0.0.1") .sort() .reverse(); return [...addressList, "Other"]; }); const validPortNumber = (value) => { const portNumber = Number(value); if (!portNumber) return false; if (portNumber < 1024) return false; if (portNumber > 65535) return false; return portNumber; }; const validPromptPortNumber = (value) => { const errorMessage = "1024から65535までの数値を入力してください!"; return !!validPortNumber(value) || errorMessage; }; const validDeviceName = (deviceName) => deviceList.includes(deviceName.toLowerCase()); const setUploadQuestions = (options) => __awaiter(void 0, void 0, void 0, function* () { const [ssidList, addressList] = yield Promise.all([ getSsidList(), getAddressList(), ]); const questions = []; if (!options.devicePort) questions.push({ name: "devicePort", type: "list", choices: yield (0, util_js_1.spinnerWrap)("Loading serial port", getPortList), message: "デバイスのシリアルポートを選択してください:", }); if (!options.ssid && ssidList.length > 1) questions.push({ name: "ssid", type: "list", choices: ssidList, message: "デバイスを接続するWi-FiのSSIDを選択してください:", }, { name: "ssidInput", type: "input", message: "デバイスを接続するWi-FiのSSIDを入力してください:", validate: input => input !== "" || "値を入力してください!", when: (answers) => answers.ssid === "Other", }); if (!options.ssid && ssidList.length === 1) questions.push({ name: "ssidInput", type: "input", message: "デバイスを接続するWi-FiのSSIDを入力してください:", validate: input => input !== "" || "値を入力してください!", }); if (!options.password) questions.push({ name: "password", type: "password", mask: "*", message: "デバイスを接続するWi-Fiのパスワードを入力してください:", validate: input => input !== "" || "値を入力してください!", }); if (!options.address) questions.push({ name: "address", type: "list", choices: addressList, message: "opnizプログラム実行マシンのIPアドレスを選択してください:", }, { name: "addressInput", type: "input", message: "opnizプログラム実行マシンのIPアドレスまたはホスト名、ドメイン名を入力してください:", validate: input => input !== "" || "値を入力してください!", when: (answers) => answers.address === "Other", }); if (!options.device || !validDeviceName(options.device)) questions.push({ name: "device", type: "list", choices: deviceList, default: config_js_1.defaultDevice, message: "デバイスを選択してください:", }); if (!options.port || !validPortNumber(options.port)) questions.push({ name: "port", type: "input", default: config_js_1.defaultPort, message: "opnizプログラムの通信ポート番号を入力してください:", validate: validPromptPortNumber, }); // MEMO: ユースケースが限られるので対話モードからは除外 // if (!options.id) questions.push({ // name: "id", // type: "input", // default: "\"\"", // message: "opniz IDを入力してください:", // }) return questions; }); const setMonitorQuestions = (options) => __awaiter(void 0, void 0, void 0, function* () { const questions = []; yield (0, util_js_1.spinnerWrap)("Loading serial port", () => __awaiter(void 0, void 0, void 0, function* () { if (!options.devicePort) questions.push({ name: "devicePort", type: "list", choices: yield getPortList(), message: "デバイスのシリアルポートを選択してください:", }); })); return questions; }); const runPrompt = (questions) => __awaiter(void 0, void 0, void 0, function* () { const answers = yield inquirer_1.default.prompt(questions); if (answers.ssidInput) { answers.ssid = answers.ssidInput; delete answers.ssidInput; } if (answers.addressInput) { answers.address = answers.addressInput; delete answers.addressInput; } if (answers.id === "\"\"") answers.id = ""; return answers; }); const mergeAnswers = (options, answers) => { const mergedAnswers = Object.assign(Object.assign({}, options), answers); mergedAnswers.device = mergedAnswers.device.toLowerCase(); mergedAnswers.port = Number(mergedAnswers.port); if (!mergedAnswers.id) mergedAnswers.id = ""; return mergedAnswers; };