const { SerialPort } = require('serialport');
const { ReadlineParser } = require('@serialport/parser-readline');

( async( ) => {
	console.log( await SerialPort.list() );


	let port = new SerialPort( { path: '/dev/ttyS11', baudRate: 9600 } );

	/*port.on('data', function (data) {
		console.log('Data:', data.toString())

	})*/

	port.close()

	let callbacks = {};

	function request()
	{
		return new Promise((resolve, reject) => {
			let id = makeid(8);
			console.log(id);

			let req = {
				id: id,
				type: "REQUEST",
				data: "1,2"
			}

			callbacks[req.id] = resolve;

			let done = false;

			setTimeout( () => {
				if( !done )
					reject("Request with id " + id + " timed out");
			}, 15000 );

			port.write(JSON.stringify(req) + "\r", "utf-8");
		});

	}

	const parser = port.pipe(new ReadlineParser({ delimiter: '\r' }))

	parser.on('data', (data) => {
		/*let req = {
			id: id,
			type: "ACK",
			data: "1,2"
		}*/

		data = data.toString().trim();
		let json = JSON.parse(data);

		console.log("GOT: " + data );
		callbacks[json.id]();

	});

	try {
		await request();
		console.log("FUNCTION RESOLVED YAY!");
	} catch( e )
	{
		console.error(e);
	}
} )();

function makeid(length) {
	var result           = '';
	var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
	var charactersLength = characters.length;
	for ( var i = 0; i < length; i++ ) {
		result += characters.charAt(Math.floor(Math.random() * charactersLength));
	}
	return result;
}