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