Setup initial server-side application structure
This commit is contained in:
parent
7e9e17cd23
commit
0eeeb06a80
5 changed files with 207 additions and 0 deletions
78
Helpers/Ansi.mjs
Normal file
78
Helpers/Ansi.mjs
Normal file
|
@ -0,0 +1,78 @@
|
|||
"use strict";
|
||||
|
||||
/**
|
||||
* Generates various VT100 ANSI escape sequences.
|
||||
* Ported from C#.
|
||||
* @licence MPL-2.0 <https://www.mozilla.org/en-US/MPL/2.0/>
|
||||
* @source https://gist.github.com/a4edd3204a03f4eedb79785751efb0f3#file-ansi-cs
|
||||
* @author Starbeamrainbowlabs
|
||||
* GitHub: @sbrl | Twitter: @SBRLabs | Reddit: u/Starbeamrainbowlabs
|
||||
***** Changelog *****
|
||||
* 27th March 2019:
|
||||
* - Initial public release
|
||||
*/
|
||||
class Ansi {
|
||||
constructor() {
|
||||
/**
|
||||
* Whether we should *actually* emit ANSI escape codes or not.
|
||||
* Useful when we want to output to a log file, for example
|
||||
* @type {Boolean}
|
||||
*/
|
||||
this.enabled = true;
|
||||
|
||||
this.escape_codes();
|
||||
}
|
||||
|
||||
escape_codes() {
|
||||
// Solution on how to output ANSI escape codes in C# from here:
|
||||
// https://www.jerriepelser.com/blog/using-ansi-color-codes-in-net-console-apps
|
||||
this.reset = this.enabled ? "\u001b[0m" : "";
|
||||
this.hicol = this.enabled ? "\u001b[1m" : "";
|
||||
this.locol = this.enabled ? "\u001b[2m" : "";
|
||||
this.underline = this.enabled ? "\u001b[4m" : "";
|
||||
this.inverse = this.enabled ? "\u001b[7m" : "";
|
||||
this.fblack = this.enabled ? "\u001b[30m" : "";
|
||||
this.fred = this.enabled ? "\u001b[31m" : "";
|
||||
this.fgreen = this.enabled ? "\u001b[32m" : "";
|
||||
this.fyellow = this.enabled ? "\u001b[33m" : "";
|
||||
this.fblue = this.enabled ? "\u001b[34m" : "";
|
||||
this.fmagenta = this.enabled ? "\u001b[35m" : "";
|
||||
this.fcyan = this.enabled ? "\u001b[36m" : "";
|
||||
this.fwhite = this.enabled ? "\u001b[37m" : "";
|
||||
this.bblack = this.enabled ? "\u001b[40m" : "";
|
||||
this.bred = this.enabled ? "\u001b[41m" : "";
|
||||
this.bgreen = this.enabled ? "\u001b[42m" : "";
|
||||
this.byellow = this.enabled ? "\u001b[43m" : "";
|
||||
this.bblue = this.enabled ? "\u001b[44m" : "";
|
||||
this.bmagenta = this.enabled ? "\u001b[45m" : "";
|
||||
this.bcyan = this.enabled ? "\u001b[46m" : "";
|
||||
this.bwhite = this.enabled ? "\u001b[47m" : "";
|
||||
}
|
||||
|
||||
// Thanks to http://ascii-table.com/ansi-escape-sequences.php for the following ANSI escape sequences
|
||||
up(lines = 1) {
|
||||
return this.enabled ? `\u001b[${lines}A` : "";
|
||||
}
|
||||
down(lines = 1) {
|
||||
return this.enabled ? `\u001b[${lines}B` : "";
|
||||
}
|
||||
right(lines = 1) {
|
||||
return this.enabled ? `\u001b[${lines}C` : "";
|
||||
}
|
||||
left(lines = 1) {
|
||||
return this.enabled ? `\u001b[${lines}D` : "";
|
||||
}
|
||||
|
||||
jump_to(x, y) {
|
||||
return this.enabled ? `\u001b[${y};${x}H` : "";
|
||||
}
|
||||
|
||||
cursor_pos_save() {
|
||||
return this.enabled ? `\u001b[s` : "";
|
||||
}
|
||||
cursor_pos_restore() {
|
||||
return this.enabled ? `\u001b[u` : "";
|
||||
}
|
||||
}
|
||||
|
||||
export default Ansi;
|
26
help.mjs
Normal file
26
help.mjs
Normal file
|
@ -0,0 +1,26 @@
|
|||
import path from 'path';
|
||||
|
||||
export default function(settings) {
|
||||
let ansi = settings.ansi;
|
||||
console.log(`${settings.program_name}, ${settings.version}
|
||||
${ansi.locol}By Starbeamrainbowlabs${ansi.reset}
|
||||
|
||||
${ansi.hicol}This program ${settings.description}.${ansi.reset}
|
||||
|
||||
${ansi.fblue}${ansi.hicol}Usage:${ansi.reset}
|
||||
node --experimental-modules ${path.relative(process.cwd(), process.argv[1])} {subcommand} {options}
|
||||
|
||||
${ansi.fblue}${ansi.hicol}Subcommands:${ansi.reset}
|
||||
${ansi.fyellow}ttn-app-server${ansi.reset} Starts the thing network application server
|
||||
${ansi.fyellow}process-data${ansi.reset} Consolidates collected data from the IoT device and the TTN app server
|
||||
${ansi.fyellow}train-ai${ansi.reset} Trains the AI on the consolidated data
|
||||
${ansi.fyellow}serve-map${ansi.reset} Serves the final output map using the trained AI
|
||||
|
||||
${ansi.fblue}${ansi.hicol}Options:${ansi.reset}
|
||||
${ansi.fyellow}-h --help ${ansi.reset}Show this message
|
||||
${ansi.fyellow}-v --version ${ansi.reset}Show the version of this program
|
||||
|
||||
${ansi.fblue}${ansi.hicol}Environment Variables:${ansi.reset}
|
||||
(none yet)
|
||||
`);
|
||||
};
|
68
index.mjs
Executable file
68
index.mjs
Executable file
|
@ -0,0 +1,68 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
// Requires Ansi.mjs, which can be found here: https://gist.github.com/8c0bb5e172438b6e62dd48587cfeba84#file-ansi-mjs
|
||||
|
||||
import Ansi from './Helpers/Ansi.mjs';
|
||||
|
||||
import show_help from './help.mjs';
|
||||
import TTNAppServer from './ttn-app-server/TTNAppServer.mjs';
|
||||
|
||||
// 1: Setup
|
||||
const ansi = new Ansi();
|
||||
|
||||
const settings = {
|
||||
program_name: "LoRaWAN Signal Mapper",
|
||||
version: "v0.1",
|
||||
description: "assists in mapping LoRaWAN signal coverage.",
|
||||
ansi
|
||||
};
|
||||
|
||||
// 2: CLI Argument Parsing
|
||||
let args = process.argv.slice(2); // Slice out the node binary name and the filename
|
||||
let extras = [];
|
||||
for(let i = 0; i < args.length; i++) {
|
||||
if(!args[i].startsWith("-")) {
|
||||
extras.push(args[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(args[i]) {
|
||||
case "--help":
|
||||
case "-h":
|
||||
show_help(settings);
|
||||
process.exit();
|
||||
break;
|
||||
|
||||
case "--version":
|
||||
case "-v":
|
||||
console.log(program.version);
|
||||
break;
|
||||
|
||||
// Add more arguments here
|
||||
}
|
||||
}
|
||||
|
||||
// 3: Environment Variable Parsing
|
||||
|
||||
// process.env.XYZ
|
||||
|
||||
// 4: Run
|
||||
if(extras.length < 1) {
|
||||
console.error(`${ansi.fred}${ansi.hicol}Error: No subcommand specified.${ansi.reset}`);
|
||||
show_help(settings);
|
||||
process.exit();
|
||||
}
|
||||
switch(extras[0]) {
|
||||
case "ttn-app-server":
|
||||
let app_server = new TTNAppServer(settings);
|
||||
app_server.run();
|
||||
break;
|
||||
|
||||
default:
|
||||
console.error(`${ansi.fred}${ansi.hicol}Error: Subcommand '${extras[0]}' not recognised.${ansi.reset}`);
|
||||
console.error( `${ansi.fred}Perhaps you mistyped it, or it hasn't been implemented yet?`);
|
||||
process.exit(1);
|
||||
break;
|
||||
}
|
||||
|
||||
// 5: Cleanup
|
21
package.json
Normal file
21
package.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "lorawan-signal-mapping",
|
||||
"version": "0.0.1",
|
||||
"description": "A LoRaWAN signal mapping system. Comprised of several distinct parts.",
|
||||
"main": "index.mjs",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://git.starbeamrainbowlabs.com/sbrl/Msc-Summer-Project/"
|
||||
},
|
||||
"keywords": [
|
||||
"lora",
|
||||
"ttn",
|
||||
"arduino",
|
||||
"mapping"
|
||||
],
|
||||
"author": "Starbeamrainbowlabs",
|
||||
"license": "MPL-2.0"
|
||||
}
|
14
ttn-app-server/TTNAppServer.mjs
Normal file
14
ttn-app-server/TTNAppServer.mjs
Normal file
|
@ -0,0 +1,14 @@
|
|||
"use strict";
|
||||
|
||||
class TTNAppServer {
|
||||
constructor(in_settings) {
|
||||
this.settings = in_settings;
|
||||
this.ansi = this.settings.ansi;
|
||||
}
|
||||
|
||||
run() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export default TTNAppServer;
|
Loading…
Reference in a new issue