-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
179 lines (147 loc) · 4.54 KB
/
index.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
require('dotenv').config({path: __dirname + '/.env'}); // Fetch local db environment vars from .env
var spawn = require('child_process').spawn;
var path = require('path');
var Doorlock = require('./doorlock.js');
var mainLock = new Doorlock();
var AlarmBuzzer = require('./alarm.js');
var alarmBuzzer = new AlarmBuzzer();
var User = require('doorlock-models').User;
var RfidReader = require('./rfid.js');
var rfidReader = new RfidReader();
var rfid = require('rc522-rfid');
// Register cardscan event
rfid(function(rfidSerNumber) {
rfidReader.cardScan(rfidSerNumber);
});
// Logger util function
var logger = function(msg) {
console.log('--------------------------------------------');
console.log(msg);
console.log(new Date());
}
// Log startup
logger('App started');
// Sound for user to know app has started
setTimeout(function() {
alarmBuzzer.verificationSequence();
}, 500);
// Socket.io stuff for getting new studentCardId to admin ui on registration
var io = require('socket.io')(8080, { serveClient: false });
var socketioJwt = require('socketio-jwt');
var secret = require('../config.js').secret;
var getId = io.of('/get-id');
var auth = io.of('/auth');
getId.on('connection', function (socket) {
logger('New connection on socket 8080, namespace /get-id');
socket.on('scanNewId', function(response) {
logger('Request to scan new card recieved');
rfidReader.setNewRegistration(true);
var waitForScantimeout = setTimeout(function() {
logger('Requester failed to scan card within timelimit');
alarmBuzzer.errorSequence();
response(false);
rfidReader.setNewRegistration(false);
socket.disconnect();
}, 10000);
rfidReader.once('newCardScanned', function(rfidSerialNumber) {
logger('New card scanned, id ' + rfidSerialNumber + ' returned');
alarmBuzzer.verificationSequence();
response(rfidSerialNumber);
rfidReader.setNewRegistration(false);
clearTimeout(waitForScantimeout);
socket.disconnect();
});
});
});
auth.on('connection', socketioJwt.authorize({
secret: secret,
timeout: 15000
}))
.on('authenticated', function(socket) {
// Authenticated socket
// Emit lockstatus on socket connection
socket.emit('lockStatus', {
isLocked: mainLock.IsLocked()
});
// Create a child process
var logTail = spawn('tail',
['-f', '-n', 12, path.resolve(__dirname, '../logs/doorlock-servo-out.log')]);
logTail.stdout.on('data', function (data) {
socket.emit('logTail', data.toString());
});
var lockStatusCb = function(newStatus) {
socket.emit('lockStatus', newStatus);
}
mainLock.on('lockStatusChanged', lockStatusCb);
socket.on('forceOpen', function(fn) {
if( mainLock.IsLocked() ) {
logger('Lock opened from admin UI');
mainLock.Unlock(function() {
if(fn && typeof fn === 'function') {
fn(true);
}
});
alarmBuzzer.openSequence();
}
else {
if(fn && typeof fn === 'function') {
fn(false);
}
}
});
socket.on('forceClose', function(fn) {
if( !mainLock.IsLocked() ) {
logger('Lock closed from admin UI');
mainLock.Lock(function() {
if(fn && typeof fn === 'function') {
fn(true);
}
});
alarmBuzzer.closeSequence();
}
else {
if(fn && typeof fn === 'function') {
fn(false);
}
}
});
socket.on('disconnect', function() {
logTail.kill();
mainLock.removeListener('lockStatusChanged', lockStatusCb);
});
});
// Handle lock/unlock door
rfidReader.on('cardScanned', function(rfidSerialNumber) {
User.findOne({
where: { studentCardId: rfidSerialNumber },
attributes: ['firstName', 'lastName']
}).then(function(user) {
if( !user ) {
logger('Unauthorized card: ' + rfidSerialNumber);
alarmBuzzer.errorSequence();
}
else {
if( mainLock.IsLocked() ) {
mainLock.Unlock();
logger('Lock opened for user ' + user.firstName + ' ' + user.lastName);
alarmBuzzer.openSequence();
}
else {
mainLock.Lock();
logger('Lock closed for user ' + user.firstName + ' ' + user.lastName);
alarmBuzzer.closeSequence();
}
}
});
});
// Force process exit to only listen for exit event.
var cleanExit = function() { process.exit() };
process.on('SIGINT', cleanExit); // catch ctrl-c
process.on('SIGTERM', function() { // catch kill
logger('Terminated by parent process');
cleanExit();
});
process.on('exit', function() {
logger('App closing down');
// All cleanup necessary on exit goes here
});