1
1
#!/usr/bin/env node
2
2
/**
3
- * blink1-server
3
+ * node- blink1-server
4
4
*
5
5
*
6
6
* @author Tod E. Kurt, http://todbot.com/blog
9
9
10
10
"use strict" ;
11
11
12
+ var debug = require ( 'debug' ) ( 'http' ) ;
12
13
var Blink1 = require ( 'node-blink1' ) ;
13
14
var parsecolor = require ( 'parse-color' ) ;
14
15
var express = require ( 'express' ) ;
16
+
15
17
var app = express ( ) ;
16
18
app . set ( 'json spaces' , 4 ) ;
17
-
18
- var port = 8080 ;
19
-
19
+
20
+ var port = 8080 ; // default, can be set as an argument
21
+
20
22
var devices = Blink1 . devices ( ) ; // returns array of serial numbers
21
23
var blink1 = null ;
22
24
if ( devices . length ) {
23
- blink1 = new Blink1 ( ) ;
25
+ blink1 = new Blink1 ( ) ; // gets first device found
24
26
}
25
-
27
+
26
28
var lastColor = '#000000' ;
27
29
var lastTime = 0 ;
28
30
var lastLedn = 0 ;
29
31
var lastRepeats = 0 ;
30
-
32
+
31
33
// rescan if we know we have no blink1
32
34
var blink1TryConnect = function ( ) {
33
35
if ( blink1 ) { return false ; }
37
39
}
38
40
return true ;
39
41
} ;
40
-
42
+
41
43
// Call blink1.setRGB while dealing with disconnect / reconnect of blink1
42
44
var blink1Set = function ( r , g , b ) {
43
45
blink1TryConnect ( ) ;
50
52
}
51
53
return "success" ;
52
54
} ;
53
-
55
+
54
56
// Call blink1.fadeToRGB while dealing with disconnect / reconnect of blink1
55
57
var blink1Fade = function ( millis , r , g , b , ledn ) {
56
58
blink1TryConnect ( ) ;
63
65
}
64
66
return "success" ;
65
67
} ;
66
-
68
+
67
69
var blink1Blink = function ( onoff , repeats , millis , r , g , b , ledn ) {
68
70
// console.log("blink1Blink:", onoff, repeats, millis, r, g, b, ledn );
69
71
if ( onoff ) {
79
81
} , millis ) ;
80
82
}
81
83
} ;
82
-
84
+
83
85
var blink1Pattern = function ( time , rgb , position ) {
84
86
blink1 . writePatternLine ( time * 1000 , rgb [ 0 ] , rgb [ 1 ] , rgb [ 2 ] , position ) ;
85
87
} ;
86
-
88
+
89
+ // parse the standard args into a data struct
90
+ var parseQueryArgs = function ( query ) {
91
+ var args = { } ;
92
+ args . color = parsecolor ( query . rgb ) ;
93
+ args . time = Number ( query . time ) || 0.1 ;
94
+ args . ledn = Number ( query . ledn ) || 0 ;
95
+ args . repeats = Number ( query . repeats ) || 3 ;
96
+ args . blink1_id = query . blink1_id ;
97
+ return args ;
98
+ } ;
99
+
87
100
app . get ( '/blink1' , function ( req , res ) {
88
- blink1TryConnect ( ) ;
89
- blink1 . rgb ( function ( r , g , b ) {
90
- var color = parsecolor ( "rgb(" + r + "," + g + "," + b + ")" ) ;
91
- var response = {
92
- blink1Connected : blink1 !== null ,
93
- blink1Serials : devices ,
94
- currentColor : color . hex ,
95
- lastColor : lastColor ,
96
- lastTime : lastTime ,
97
- lastLedn : lastLedn ,
98
- lastRepeats : lastRepeats ,
99
- cmd : "info" ,
100
- status : "success"
101
- } ;
102
- res . json ( response ) ;
103
- } ) ;
101
+ blink1TryConnect ( ) ;
102
+ var response = {
103
+ blink1Connected : blink1 !== null ,
104
+ blink1Serials : devices ,
105
+ currentColor : '#000000' ,
106
+ lastColor : lastColor ,
107
+ lastTime : lastTime ,
108
+ lastLedn : lastLedn ,
109
+ lastRepeats : lastRepeats ,
110
+ cmd : "info" ,
111
+ status : "success"
112
+ } ;
113
+ if ( blink1 == null ) { // in case no blink1 plugged in
114
+ res . json ( response ) ;
115
+ return ;
116
+ }
117
+ try {
118
+ blink1 . rgb ( function ( r , g , b ) {
119
+ var color = parsecolor ( "rgb(" + r + "," + g + "," + b + ")" ) ;
120
+ response . blink1Connected = true ;
121
+ response . currentColor = color . hex ;
122
+ res . json ( response ) ;
123
+ } ) ;
124
+ } catch ( err ) {
125
+ blink1 = null ;
126
+ res . json ( response ) ;
127
+ }
104
128
} ) ;
105
-
129
+
130
+ app . get ( '/blink1/:type(fadeToRGB|on|off|red|green|blue|yellow|cyan|magenta)' , function ( req , res ) {
131
+ if ( req . params . type == 'on' ) { req . query . rgb = '#FFFFFF' ; }
132
+ else if ( req . params . type == 'off' ) { req . query . rgb = '#000000' ; }
133
+ else if ( req . params . type == 'red' ) { req . query . rgb = '#FF0000' ; }
134
+ else if ( req . params . type == 'green' ) { req . query . rgb = '#00FF00' ; }
135
+ else if ( req . params . type == 'blue' ) { req . query . rgb = '#0000FF' ; }
136
+ else if ( req . params . type == 'yellow' ) { req . query . rgb = '#FFFF00' ; }
137
+ else if ( req . params . type == 'cyan' ) { req . query . rgb = '#00FFFF' ; }
138
+ else if ( req . params . type == 'magenta' ) { req . query . rgb = '#FF00FF' ; }
139
+ var args = parseQueryArgs ( req . query ) ;
140
+ var status = req . params . type ;
141
+
142
+ if ( typeof ( args . color . rgb ) != 'undefined' ) {
143
+ lastColor = args . color . hex ;
144
+ lastTime = args . time ;
145
+ lastLedn = args . ledn ;
146
+ var rgb = args . color . rgb ;
147
+ status = blink1Fade ( args . time * 1000 , rgb [ 0 ] , rgb [ 1 ] , rgb [ 2 ] , args . ledn ) ;
148
+ }
149
+ else {
150
+ status = "bad hex color specified '" + req . query . rgb + "'" ;
151
+ }
152
+
153
+ var response = {
154
+ blink1Connected : blink1 !== null ,
155
+ blink1Serials : devices ,
156
+ currentColor : lastColor ,
157
+ lastColor : lastColor ,
158
+ lastTime : lastTime ,
159
+ lastLedn : lastLedn ,
160
+ lastRepeats : lastRepeats ,
161
+ cmd : "fadeToRGB" ,
162
+ status : status
163
+ } ;
164
+ res . json ( response ) ;
165
+ } ) ;
166
+
106
167
app . get ( '/blink1/setRGB' , function ( req , res ) {
107
168
var color = parsecolor ( req . query . rgb ) ;
108
169
var time = Number ( req . query . time ) || 0.1 ;
109
170
var ledn = Number ( req . query . ledn ) || 0 ;
110
171
var status = "success" ;
111
172
var rgb = color . rgb ;
112
-
173
+
113
174
if ( rgb ) {
114
175
lastColor = color . hex ;
115
176
lastTime = time ;
132
193
} ;
133
194
res . json ( response ) ;
134
195
} ) ;
135
-
136
- app . get ( '/blink1/fadeToRGB' , function ( req , res ) {
137
- var color = parsecolor ( req . query . rgb ) ;
138
- var time = Number ( req . query . time ) || 0.1 ;
139
- var ledn = Number ( req . query . ledn ) || 0 ;
140
- var status = "success" ;
141
- var rgb = color . rgb ;
142
-
143
- if ( rgb ) {
144
- lastColor = color . hex ;
145
- lastTime = time ;
146
- lastLedn = ledn ;
147
- status = blink1Fade ( time * 1000 , rgb [ 0 ] , rgb [ 1 ] , rgb [ 2 ] , ledn ) ;
148
- }
149
- else {
150
- status = "bad hex color specified " + req . query . rgb ;
151
- }
152
- var response = {
153
- blink1Connected : blink1 !== null ,
154
- blink1Serials : devices ,
155
- currentColor : lastColor ,
156
- lastColor : lastColor ,
157
- lastTime : lastTime ,
158
- lastLedn : lastLedn ,
159
- lastRepeats : lastRepeats ,
160
- cmd : "fadeToRGB" ,
161
- status : status
162
- } ;
163
- res . json ( response ) ;
164
- } ) ;
165
-
166
- app . get ( '/blink1/off' , function ( req , res ) {
167
- lastColor = "#000000" ;
168
- blink1Fade ( 100 , 0 , 0 , 0 , 0 ) ;
169
- var response = {
170
- blink1Connected : blink1 !== null ,
171
- blink1Serials : devices ,
172
- currentColor : lastColor ,
173
- lastColor : lastColor ,
174
- lastTime : lastTime ,
175
- lastLedn : lastLedn ,
176
- lastRepeats : lastRepeats ,
177
- cmd : "off" ,
178
- status : "success"
179
- } ;
180
- res . json ( response ) ;
181
- } ) ;
182
-
183
- app . get ( '/blink1/on' , function ( req , res ) {
184
- lastColor = "#FFFFFF" ;
185
- blink1Fade ( 100 , 255 , 255 , 255 , 0 ) ;
186
- var response = {
187
- blink1Connected : blink1 !== null ,
188
- blink1Serials : devices ,
189
- currentColor : lastColor ,
190
- lastColor : lastColor ,
191
- lastTime : lastTime ,
192
- lastLedn : lastLedn ,
193
- lastRepeats : lastRepeats ,
194
- cmd : "on" ,
195
- status : "success"
196
- } ;
197
- res . json ( response ) ;
198
- } ) ;
199
-
196
+
200
197
app . get ( '/blink1/blink' , function ( req , res ) {
201
198
var color = parsecolor ( req . query . rgb ) ;
202
199
var time = Number ( req . query . time ) || 0.1 ;
227
224
} ;
228
225
res . json ( response ) ;
229
226
} ) ;
230
-
227
+
231
228
app . get ( '/blink1/pattern' , function ( req , res ) {
232
229
var colors = req . query . rgb . split ( ',' ) ;
233
230
var time = Number ( req . query . time ) || 0.1 ;
234
231
// var repeats = Number(req.query.repeats) || Number(req.query.count) || 3;
235
232
var repeats = parseInt ( req . query . repeats || req . query . count ) ;
236
233
repeats = ( repeats == NaN ) ? 3 : repeats ;
237
234
var status = "success" ;
238
-
235
+
239
236
blink1TryConnect ( ) ;
240
237
if ( blink1 ) {
241
238
for ( var i = 0 , len = colors . length ; i < len ; i ++ ) {
242
239
var rgb = parsecolor ( colors [ i ] ) . rgb ;
243
240
blink1Pattern ( time , rgb , i ) ;
244
241
}
245
-
242
+
246
243
blink1 . playLoop ( 0 , colors . length , repeats ) ;
247
-
244
+
248
245
if ( colors . length > 16 ) {
249
246
status = "can only display first 16 colors. " + colors . length + " colors specified"
250
247
}
251
248
}
252
249
else {
253
250
status = "no blink1 connected" ;
254
251
}
255
-
252
+
256
253
var response = {
257
254
blink1Connected : blink1 !== null ,
258
255
blink1Serials : devices ,
262
259
cmd : "pattern" ,
263
260
status : status
264
261
} ;
265
-
262
+
266
263
res . json ( response ) ;
267
264
} ) ;
268
-
265
+
269
266
// respond with "Hello World!" on the homepage
270
267
app . get ( '/' , function ( req , res ) {
271
268
res . send ( "<html>" +
274
271
"Supported URIs: <ul>\n" +
275
272
"<li> <code> /blink1 </code> " +
276
273
" -- status info\n" +
274
+ "<li> <code> /blink1/on </code> -- #FFFFFF full white" +
275
+ "<li> <code> /blink1/off </code> -- #000000 full dark" +
276
+ "<li> <code> /blink1/red </code> -- #FF0000 red " +
277
+ "<li> <code> /blink1/green </code> -- #00FF00 green " +
278
+ "<li> <code> /blink1/blue </code> -- #0000FF blue " +
279
+ "<li> <code> /blink1/yellow </code> -- #FFFF00 yellow " +
280
+ "<li> <code> /blink1/cyan </code> -- #00FF00 cyan " +
281
+ "<li> <code> /blink1/magenta </code> -- #FF00FF magenta " +
277
282
"<li> <code> /blink1/fadeToRGB?rgb=%23FF00FF&time=1.5&ledn=2 </code> " +
278
283
"-- fade to a RGB color over time for led\n" +
284
+ "<li> <code> /blink1/setRGB?rgb=%23FF00FF&ledn=2 </code> " +
285
+ "-- set a RGB color immediately for led\n" +
286
+ "<li> <code> /blink1/blink?rgb=%23FF00FF&time=0.5&repeats=5 </code> " +
287
+ "-- blink an RGB color over time for number of repeats\n" +
279
288
"<li> <code> /blink1/pattern?rgb=%23ff0000,%23ffffff,%230000ff&time=.2&repeats=8 </code> " +
280
289
"-- blink a sequence of colors\n" +
281
290
"</ul></p>\n" +
282
291
"When starting server, argument specified is port to run on, e.g.:" +
283
292
"<code> blink1-server 8080 </code>\n" +
284
293
"</html>" ) ;
285
294
} ) ;
286
-
287
-
295
+
296
+
288
297
// if we have args
289
298
if ( process . argv . length > 2 ) {
290
299
var p = Number ( process . argv [ 2 ] ) ;
291
300
port = ( p ) ? p : port ;
292
301
}
293
-
302
+
294
303
var server = app . listen ( port , function ( ) {
295
304
var host = server . address ( ) . address ;
296
305
var port = server . address ( ) . port ;
297
306
host = ( host === '::' ) ? "localhost" : host ;
298
-
307
+
299
308
console . log ( 'blink1-server listening at http://%s:%s/' , host , port ) ;
300
309
} ) ;
301
-
0 commit comments