-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
146 lines (122 loc) · 3.96 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
'use strict';
const ElectronModule = require( 'electron' );
const ChildModule = require( 'child_process' );
const PathModule = require( 'path' );
const ReadlineModule = require( 'readline' );
const ExpressModule = require( 'express' );
const BodyparserModule = require( 'body-parser' );
const ExpressApp = ExpressModule( );
const DeviceDriver = { running: false };
let ReadyToGui = 0;
let EventSource;
let MainWindow;
let ExpressServer;
// Ejecutada cuando se crea el proceso hijo.
function onChildExec( error, stdout, stderr ) {
if( error ) {
// No se pudo lanzar el proceso hijo.
} else {
// Ok. Proceso lanzado.
}
}
function OnEventSource( req, res ) {
EventSource = res;
// Dejamos el socket abierto el maximo de tiempo posible.
req.socket.setTimeout( 2147483647 );
// Los sockets EventSource tienen un tipo mime concreto.
// Ademas, pedimos al navegador que no los cachee.
// Y que mantenga la conexion abierta.
res.writeHead( 200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
} );
res.write( '\n' );
}
// Peticion de 'pitido'.
function OnBeep( req, res ) {
if( ( 'hz' in req.body ) && ( 'ms' in req.body ) ) {
// Se nos esta pidiendo que pite.
if( DeviceDriver.running ) {
// Pitido.
// Comprobamos el rango de los hz.
if( req.body.hz < 1 ) req.body.hz = 1;
if( req.body.hz > 9 ) req.body.hz = 9;
// Y el de los ms.
if( req.body.ms < 1 ) req.body.hz = 1;
if( req.body.ms > 9 ) req.body.hz = 9;
res.writeHead( 200 );
res.end( );
DeviceDriver.child.stdin.write( `beep${req.body.hz}${req.body.ms}\n` );
} else {
res.writeHead( 500, 'Device driver not running' );
res.end( );
}
} else {
// Peticion incorrecta.
res.writeHead( '400' );
res.end( );
}
}
// Creamos la ventana del navegador.
function CreateWindow( ) {
console.log( 'CreateWindow( )' );
MainWindow = new ElectronModule.BrowserWindow( {
width: 800,
height: 600,
title: 'Concept Test',
// kiosk: true,
webPreferences: {
webSecurity: false,
preload: PathModule.join( __dirname, '/preload.js' ),
nodeIntegration: false,
allowRunningInsecureContent: true,
defaultEncoding: 'UTF-8',
}
} );
global.Indra = { DocumentRoot: 'http://127.0.0.1:' + ExpressServer.address( ).port + '/' };
MainWindow.setMenu( null );
MainWindow.loadFile( 'public/index.html' );
MainWindow.webContents.openDevTools( );
MainWindow.on( 'closed', function( ) {
MainWindow = null;
} );
}
// Respuesta a eventos de la ventana del navegador.
ElectronModule.app.on( 'window-all-closed', function ( ) {
if( process.platform !== 'darwin' ) ElectronModule.app.quit( );
} );
ElectronModule.app.on( 'activate', function( ) {
if( MainWindow === null ) {
CreateWindow( );
}
} );
ElectronModule.app.on( 'ready', function( ) {
console.log( 'ready( )' );
ReadyToGui |= 2;
if( ReadyToGui === 3 ) CreateWindow( );
} );
// Modulo para parsear los POST con datos JSON.
ExpressApp.use( BodyparserModule.json( ) );
ExpressApp.post( '/beep', OnBeep );
ExpressApp.get( '/events', OnEventSource );
// Lanzamos el controlador.
DeviceDriver.child = ChildModule.spawn( PathModule.join( __dirname, 'beep/beep.exe' ),
{
stdio: 'pipe',
windowsHide: true
} );
// Adaptador para poder comunicarnos con el controlador mediante su stdin / stdout.
DeviceDriver.stdio = ReadlineModule.createInterface( {
input: DeviceDriver.child.stdout,
terminal: false
} );
DeviceDriver.stdio.on( 'line', function( input ) {
EventSource.write( `data: ${input}\n\n` );
} );
DeviceDriver.running = true;
ExpressServer = ExpressApp.listen( null, '127.0.0.1', 511, function( ) {
console.log( 'listening event' );
ReadyToGui |= 1;
if( ReadyToGui === 3 ) setTimeout( CreateWindow, 0 );
} );