-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnfc-demo.js
More file actions
195 lines (171 loc) · 5.84 KB
/
nfc-demo.js
File metadata and controls
195 lines (171 loc) · 5.84 KB
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
'use strict';
var contracts = require('eris-contracts');
var fs = require('fs');
var http = require('http');
var url = require('url')
var address = require('./nfc_simple/epm.json').nfc_simpleK;
var abi = JSON.parse(fs.readFileSync('./nfc_simple/abi/' + address, 'utf8'));
var accounts = require('./nfc_simple/accounts.json');
var manager
, chainUrl = 'http://127.0.0.1:1337/rpc'
, contract
, server;
var nfc = require('./node_modules/nfc/index').nfc
, util = require('util')
, version = nfc.version()
, devices = nfc.scan()
, fs = require('fs')
, http = require('http')
;
var deviceID
, program_mode=false
, uid, m_uid=''
, exists
, oldTime = Date.now()
, permissions = 0;
;
var exec = require('child_process').exec
, cmd = '/opt/vc/bin/vcmailbox 0x00038041 8 8 130 ' //On-board LEDs are not in GPIO in RaPi3
, interval_flag100=0
, interval_flag500=0
;
function read(deviceID) {
var nfcdev = new nfc.NFC();
nfcdev.on('read', function(tag) {
var nowTime = Date.now()
, permissions =0;
uid=tag.uid;
//console.log("\n============CARD UID:", uid);
var f = function common(error, result) {
if (error) {
bc_result = -1;
} else {
bc_result = result;
}
};
if (nowTime > oldTime + 1000) { //wait 1 second to avoid double tap
oldTime=nowTime;
//uid=uid.replace(/:/g, "");
contract.get_perms(uid.replace(/:/g, ""), function (err, result) {
if (err) {
result = -1;
//console.log(err);
}
permissions = result.toString();
console.log("perms:", permissions);
if (permissions == 127) {
m_uid=uid;
program_mode=!program_mode;
if (program_mode) {
//m_uid = uid;
//Set led to slow blinking
//interval_flag500=0;
blink500(500);
console.log("Program mode enabled, Master:", uid);
}
else {
m_uid = '';
//Set led to solid (normal mode)
interval_flag500=1; //stop blinking and set led to solid
exec(cmd+'1', function(error, stdout, stderr) { });
//exec(cmd+'1', function(error, stdout, stderr) { });
console.log("Program mode disabled, Master:", uid);
}
}
if (program_mode && (uid != m_uid)){
exists = (permissions == 1);
if (exists) {
contract.del_user(uid.replace(/:/g, ""), m_uid.replace(/:/g, ""), function (err, result) {
//led_off_t(1600);
//blink500(500);
if (! err)
console.log("UID deleted:", uid);
else
console.log("UID NOT deleted:", err);
});
//else send_http_req("adduser", uid, 1, function (err, result) {
}
else contract.add_user(uid.replace(/:/g, ""), m_uid.replace(/:/g, ""), 1, function (err, result) {
//interval_flag500=1;
//blink100(100);
//interval_flag500=0;
//led_off_t(800);
//blink500(500);
if (! err)
console.log("UID added:", uid);
else
console.log("UID NOT added:", err);
});//1= basic access permissions
}
if (!program_mode) {
if (permissions == 1) {
//led blinks 5 times and then it stays solid. Unlock!
// interval_flag100=0;
blink100(100);
console.log("Access granted to UID:", uid);
}
else {
//Turn led off for 0.5 s, then after sets solid led
led_off_t(1000);
console.log("Not valid for access UID:", uid);
//Set led to red
}
}
});
}//only do all of the above if there is no double tap
else {
//console.log("Ignoring consecutive tap for UID:", uid);
}
}); //end of read event
nfcdev.on('error', function(err) {
console.log(util.inspect(err, { depth: null }));
});
nfcdev.on('stopped', function() {
console.log('***** Stopped');
});
console.log(nfcdev.start(deviceID));
} //end of read(device)
function blink100(timer) {
interval_flag100=0;
var led_status=1;
var i_id = setInterval(function() {
exec(cmd+led_status, function(error, stdout, stderr) { });
led_status = +!led_status;
interval_flag100 ++;
if (interval_flag100>8) {
//exec(cmd+'1', function(error, stdout, stderr) { });
clearInterval(i_id);
//interval_flag100=0;
//exec(cmd+'1', function(error, stdout, stderr) { });
}
}, timer);
}
function blink500(timer) {
interval_flag500=0;
var led_status=1;
var i_id = setInterval(function() {
exec(cmd+led_status, function(error, stdout, stderr) { });
led_status = +!led_status;
if (interval_flag500) {
//exec(cmd+'1', function(error, stdout, stderr) { });
clearInterval(i_id);
}
}, timer);
}
function led_off_t(t) {
exec(cmd+'0', function(error, stdout, stderr) { });
var timerId = setTimeout(function() {
exec(cmd+'1', function(error, stdout, stderr) { });
}, t)
}
///****Main
//
// Instantiate the contract object manager using the chain URL and the account
// data.
manager = contracts.newContractManagerDev(chainUrl,
accounts.demo_full_000); //Account must be passed as argument, not being hardcoded
// Instantiate the contract object using the ABI and the address.
contract = manager.newContractFactory(abi).at(address);
exec(cmd+'1', function(error, stdout, stderr) { });//display (normal) mode
deviceID=Object.keys(devices)[0];
read(deviceID);