| ## 0.0.1 | ||
| * css color support | ||
| * on and off shortcuts | ||
| * version number detection |
+200
| // (c) Dean McNamee <dean@gmail.com>, 2012. | ||
| // | ||
| // https://github.com/deanm/css-color-parser-js | ||
| // | ||
| // Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| // of this software and associated documentation files (the "Software"), to | ||
| // deal in the Software without restriction, including without limitation the | ||
| // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
| // sell copies of the Software, and to permit persons to whom the Software is | ||
| // furnished to do so, subject to the following conditions: | ||
| // | ||
| // The above copyright notice and this permission notice shall be included in | ||
| // all copies or substantial portions of the Software. | ||
| // | ||
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| // IN THE SOFTWARE. | ||
| // http://www.w3.org/TR/css3-color/ | ||
| var kCSSColorTable = { | ||
| "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], | ||
| "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], | ||
| "aquamarine": [127,255,212,1], "azure": [240,255,255,1], | ||
| "beige": [245,245,220,1], "bisque": [255,228,196,1], | ||
| "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], | ||
| "blue": [0,0,255,1], "blueviolet": [138,43,226,1], | ||
| "brown": [165,42,42,1], "burlywood": [222,184,135,1], | ||
| "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], | ||
| "chocolate": [210,105,30,1], "coral": [255,127,80,1], | ||
| "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], | ||
| "crimson": [220,20,60,1], "cyan": [0,255,255,1], | ||
| "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], | ||
| "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], | ||
| "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], | ||
| "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], | ||
| "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], | ||
| "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], | ||
| "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], | ||
| "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], | ||
| "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], | ||
| "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], | ||
| "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], | ||
| "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], | ||
| "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], | ||
| "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], | ||
| "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], | ||
| "gold": [255,215,0,1], "goldenrod": [218,165,32,1], | ||
| "gray": [128,128,128,1], "green": [0,128,0,1], | ||
| "greenyellow": [173,255,47,1], "grey": [128,128,128,1], | ||
| "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], | ||
| "indianred": [205,92,92,1], "indigo": [75,0,130,1], | ||
| "ivory": [255,255,240,1], "khaki": [240,230,140,1], | ||
| "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], | ||
| "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], | ||
| "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], | ||
| "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], | ||
| "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], | ||
| "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], | ||
| "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], | ||
| "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], | ||
| "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], | ||
| "lightyellow": [255,255,224,1], "lime": [0,255,0,1], | ||
| "limegreen": [50,205,50,1], "linen": [250,240,230,1], | ||
| "magenta": [255,0,255,1], "maroon": [128,0,0,1], | ||
| "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], | ||
| "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], | ||
| "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], | ||
| "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], | ||
| "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], | ||
| "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], | ||
| "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], | ||
| "navy": [0,0,128,1], "oldlace": [253,245,230,1], | ||
| "olive": [128,128,0,1], "olivedrab": [107,142,35,1], | ||
| "orange": [255,165,0,1], "orangered": [255,69,0,1], | ||
| "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], | ||
| "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], | ||
| "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], | ||
| "peachpuff": [255,218,185,1], "peru": [205,133,63,1], | ||
| "pink": [255,192,203,1], "plum": [221,160,221,1], | ||
| "powderblue": [176,224,230,1], "purple": [128,0,128,1], | ||
| "red": [255,0,0,1], "rosybrown": [188,143,143,1], | ||
| "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], | ||
| "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], | ||
| "seagreen": [46,139,87,1], "seashell": [255,245,238,1], | ||
| "sienna": [160,82,45,1], "silver": [192,192,192,1], | ||
| "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], | ||
| "slategray": [112,128,144,1], "slategrey": [112,128,144,1], | ||
| "snow": [255,250,250,1], "springgreen": [0,255,127,1], | ||
| "steelblue": [70,130,180,1], "tan": [210,180,140,1], | ||
| "teal": [0,128,128,1], "thistle": [216,191,216,1], | ||
| "tomato": [255,99,71,1], "turquoise": [64,224,208,1], | ||
| "violet": [238,130,238,1], "wheat": [245,222,179,1], | ||
| "white": [255,255,255,1], "whitesmoke": [245,245,245,1], | ||
| "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} | ||
| function clamp_css_byte(i) { // Clamp to integer 0 .. 255. | ||
| i = Math.round(i); // Seems to be what Chrome does (vs truncation). | ||
| return i < 0 ? 0 : i > 255 ? 255 : i; | ||
| } | ||
| function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. | ||
| return f < 0 ? 0 : f > 1 ? 1 : f; | ||
| } | ||
| function parse_css_int(str) { // int or percentage. | ||
| if (str[str.length - 1] === '%') | ||
| return clamp_css_byte(parseFloat(str) / 100 * 255); | ||
| return clamp_css_byte(parseInt(str)); | ||
| } | ||
| function parse_css_float(str) { // float or percentage. | ||
| if (str[str.length - 1] === '%') | ||
| return clamp_css_float(parseFloat(str) / 100); | ||
| return clamp_css_float(parseFloat(str)); | ||
| } | ||
| function css_hue_to_rgb(m1, m2, h) { | ||
| if (h < 0) h += 1; | ||
| else if (h > 1) h -= 1; | ||
| if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; | ||
| if (h * 2 < 1) return m2; | ||
| if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; | ||
| return m1; | ||
| } | ||
| function parseCSSColor(css_str) { | ||
| // Remove all whitespace, not compliant, but should just be more accepting. | ||
| var str = css_str.replace(/ /g, '').toLowerCase(); | ||
| // Color keywords (and transparent) lookup. | ||
| if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. | ||
| // #abc and #abc123 syntax. | ||
| if (str[0] === '#') { | ||
| if (str.length === 4) { | ||
| var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. | ||
| if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. | ||
| return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), | ||
| (iv & 0xf) | ((iv & 0xf) << 4), | ||
| (iv & 0xf0) | ((iv & 0xf0) >> 4), | ||
| 1]; | ||
| } else if (str.length === 7) { | ||
| var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. | ||
| if (!(iv >= 0 && iv < 0xffffff)) return null; // Covers NaN. | ||
| return [(iv & 0xff0000) >> 16, | ||
| (iv & 0xff00) >> 8, | ||
| iv & 0xff, | ||
| 1]; | ||
| } | ||
| return null; | ||
| } | ||
| var op = str.indexOf('('), ep = str.indexOf(')'); | ||
| if (op !== -1 && ep + 1 === str.length) { | ||
| var fname = str.substr(0, op); | ||
| var params = str.substr(op+1, ep-(op+1)).split(','); | ||
| var alpha = 1; // To allow case fallthrough. | ||
| switch (fname) { | ||
| case 'rgba': | ||
| if (params.length !== 4) return null; | ||
| alpha = parse_css_float(params.pop()); | ||
| // Fall through. | ||
| case 'rgb': | ||
| if (params.length !== 3) return null; | ||
| return [parse_css_int(params[0]), | ||
| parse_css_int(params[1]), | ||
| parse_css_int(params[2]), | ||
| alpha]; | ||
| case 'hsla': | ||
| if (params.length !== 4) return null; | ||
| alpha = parse_css_float(params.pop()); | ||
| // Fall through. | ||
| case 'hsl': | ||
| if (params.length !== 3) return null; | ||
| var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 | ||
| // NOTE(deanm): According to the CSS spec s/l should only be | ||
| // percentages, but we don't bother and let float or percentage. | ||
| var s = parse_css_float(params[1]); | ||
| var l = parse_css_float(params[2]); | ||
| var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; | ||
| var m1 = l * 2 - m2; | ||
| return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), | ||
| clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), | ||
| clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), | ||
| alpha]; | ||
| default: | ||
| return null; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| try { exports.parseCSSColor = parseCSSColor } catch(e) { } |
| var blink = require('../'); | ||
| // get your blink(1) device | ||
| blink(function(err, b) { | ||
| var colors = ['cyan', 'yellow', 'magenta'], i = 0; | ||
| setInterval(function() { | ||
| if (++i > colors.length - 1) i = 0; | ||
| b.setRGB(colors[i]); | ||
| }, 1000); | ||
| }); |
| var blink = require('../'); | ||
| // get your blink(1) device | ||
| blink(function(err, b) { | ||
| b.setRGB('#ace'); | ||
| }); |
| var blink = require('../'); | ||
| // get your blink(1) device | ||
| blink(function(err, b) { | ||
| var angle = 0; | ||
| setInterval(function() { | ||
| if (++angle > 360) angle = 0; | ||
| b.setRGB('hsl(' + angle + ', 100%, 50%)'); | ||
| }, 100); | ||
| }); | ||
| var blink = require('../'); | ||
| // get your blink(1) device | ||
| blink(function(err, b) { | ||
| b.on(); | ||
| }); |
| var blink = require('../'); | ||
| blink(function(err, b) { | ||
| // set to #ff00ff instantly | ||
| b.setRGB([255,0,255]); | ||
| }); |
| var blink = require('../'); | ||
| // get your blink(1) device | ||
| blink(function(err, b) { | ||
| console.log(b.version()); | ||
| }); |
| // (c) Dean McNamee <dean@gmail.com>, 2012. | ||
| // | ||
| // https://github.com/deanm/css-color-parser-js | ||
| // | ||
| // Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| // of this software and associated documentation files (the "Software"), to | ||
| // deal in the Software without restriction, including without limitation the | ||
| // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
| // sell copies of the Software, and to permit persons to whom the Software is | ||
| // furnished to do so, subject to the following conditions: | ||
| // | ||
| // The above copyright notice and this permission notice shall be included in | ||
| // all copies or substantial portions of the Software. | ||
| // | ||
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| // IN THE SOFTWARE. | ||
| // http://www.w3.org/TR/css3-color/ | ||
| var kCSSColorTable = { | ||
| "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], | ||
| "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], | ||
| "aquamarine": [127,255,212,1], "azure": [240,255,255,1], | ||
| "beige": [245,245,220,1], "bisque": [255,228,196,1], | ||
| "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], | ||
| "blue": [0,0,255,1], "blueviolet": [138,43,226,1], | ||
| "brown": [165,42,42,1], "burlywood": [222,184,135,1], | ||
| "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], | ||
| "chocolate": [210,105,30,1], "coral": [255,127,80,1], | ||
| "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], | ||
| "crimson": [220,20,60,1], "cyan": [0,255,255,1], | ||
| "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], | ||
| "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], | ||
| "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], | ||
| "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], | ||
| "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], | ||
| "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], | ||
| "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], | ||
| "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], | ||
| "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], | ||
| "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], | ||
| "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], | ||
| "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], | ||
| "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], | ||
| "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], | ||
| "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], | ||
| "gold": [255,215,0,1], "goldenrod": [218,165,32,1], | ||
| "gray": [128,128,128,1], "green": [0,128,0,1], | ||
| "greenyellow": [173,255,47,1], "grey": [128,128,128,1], | ||
| "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], | ||
| "indianred": [205,92,92,1], "indigo": [75,0,130,1], | ||
| "ivory": [255,255,240,1], "khaki": [240,230,140,1], | ||
| "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], | ||
| "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], | ||
| "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], | ||
| "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], | ||
| "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], | ||
| "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], | ||
| "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], | ||
| "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], | ||
| "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], | ||
| "lightyellow": [255,255,224,1], "lime": [0,255,0,1], | ||
| "limegreen": [50,205,50,1], "linen": [250,240,230,1], | ||
| "magenta": [255,0,255,1], "maroon": [128,0,0,1], | ||
| "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], | ||
| "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], | ||
| "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], | ||
| "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], | ||
| "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], | ||
| "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], | ||
| "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], | ||
| "navy": [0,0,128,1], "oldlace": [253,245,230,1], | ||
| "olive": [128,128,0,1], "olivedrab": [107,142,35,1], | ||
| "orange": [255,165,0,1], "orangered": [255,69,0,1], | ||
| "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], | ||
| "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], | ||
| "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], | ||
| "peachpuff": [255,218,185,1], "peru": [205,133,63,1], | ||
| "pink": [255,192,203,1], "plum": [221,160,221,1], | ||
| "powderblue": [176,224,230,1], "purple": [128,0,128,1], | ||
| "red": [255,0,0,1], "rosybrown": [188,143,143,1], | ||
| "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], | ||
| "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], | ||
| "seagreen": [46,139,87,1], "seashell": [255,245,238,1], | ||
| "sienna": [160,82,45,1], "silver": [192,192,192,1], | ||
| "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], | ||
| "slategray": [112,128,144,1], "slategrey": [112,128,144,1], | ||
| "snow": [255,250,250,1], "springgreen": [0,255,127,1], | ||
| "steelblue": [70,130,180,1], "tan": [210,180,140,1], | ||
| "teal": [0,128,128,1], "thistle": [216,191,216,1], | ||
| "tomato": [255,99,71,1], "turquoise": [64,224,208,1], | ||
| "violet": [238,130,238,1], "wheat": [245,222,179,1], | ||
| "white": [255,255,255,1], "whitesmoke": [245,245,245,1], | ||
| "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} | ||
| function clamp_css_byte(i) { // Clamp to integer 0 .. 255. | ||
| i = Math.round(i); // Seems to be what Chrome does (vs truncation). | ||
| return i < 0 ? 0 : i > 255 ? 255 : i; | ||
| } | ||
| function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. | ||
| return f < 0 ? 0 : f > 1 ? 1 : f; | ||
| } | ||
| function parse_css_int(str) { // int or percentage. | ||
| if (str[str.length - 1] === '%') | ||
| return clamp_css_byte(parseFloat(str) / 100 * 255); | ||
| return clamp_css_byte(parseInt(str)); | ||
| } | ||
| function parse_css_float(str) { // float or percentage. | ||
| if (str[str.length - 1] === '%') | ||
| return clamp_css_float(parseFloat(str) / 100); | ||
| return clamp_css_float(parseFloat(str)); | ||
| } | ||
| function css_hue_to_rgb(m1, m2, h) { | ||
| if (h < 0) h += 1; | ||
| else if (h > 1) h -= 1; | ||
| if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; | ||
| if (h * 2 < 1) return m2; | ||
| if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; | ||
| return m1; | ||
| } | ||
| function parseCSSColor(css_str) { | ||
| // Remove all whitespace, not compliant, but should just be more accepting. | ||
| var str = css_str.replace(/ /g, '').toLowerCase(); | ||
| // Color keywords (and transparent) lookup. | ||
| if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. | ||
| // #abc and #abc123 syntax. | ||
| if (str[0] === '#') { | ||
| if (str.length === 4) { | ||
| var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. | ||
| if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. | ||
| return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), | ||
| (iv & 0xf) | ((iv & 0xf) << 4), | ||
| (iv & 0xf0) | ((iv & 0xf0) >> 4), | ||
| 1]; | ||
| } else if (str.length === 7) { | ||
| var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. | ||
| if (!(iv >= 0 && iv < 0xffffff)) return null; // Covers NaN. | ||
| return [(iv & 0xff0000) >> 16, | ||
| (iv & 0xff00) >> 8, | ||
| iv & 0xff, | ||
| 1]; | ||
| } | ||
| return null; | ||
| } | ||
| var op = str.indexOf('('), ep = str.indexOf(')'); | ||
| if (op !== -1 && ep + 1 === str.length) { | ||
| var fname = str.substr(0, op); | ||
| var params = str.substr(op+1, ep-(op+1)).split(','); | ||
| var alpha = 1; // To allow case fallthrough. | ||
| switch (fname) { | ||
| case 'rgba': | ||
| if (params.length !== 4) return null; | ||
| alpha = parse_css_float(params.pop()); | ||
| // Fall through. | ||
| case 'rgb': | ||
| if (params.length !== 3) return null; | ||
| return [parse_css_int(params[0]), | ||
| parse_css_int(params[1]), | ||
| parse_css_int(params[2]), | ||
| alpha]; | ||
| case 'hsla': | ||
| if (params.length !== 4) return null; | ||
| alpha = parse_css_float(params.pop()); | ||
| // Fall through. | ||
| case 'hsl': | ||
| if (params.length !== 3) return null; | ||
| var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 | ||
| // NOTE(deanm): According to the CSS spec s/l should only be | ||
| // percentages, but we don't bother and let float or percentage. | ||
| var s = parse_css_float(params[1]); | ||
| var l = parse_css_float(params[2]); | ||
| var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; | ||
| var m1 = l * 2 - m2; | ||
| return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), | ||
| clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), | ||
| clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), | ||
| alpha]; | ||
| default: | ||
| return null; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| try { exports.parseCSSColor = parseCSSColor } catch(e) { } |
| var blink = require('../'); | ||
| // get your blink(1) device | ||
| blink(function(err, b) { | ||
| // b.blink(); | ||
| // blink from #ff0000 to #000000 every 1000ms | ||
| // or 1s | ||
| b.blink([255, 0, 0], 1000, [0, 0, 0]); | ||
| }); |
+13
-3
| var blink = require('../'); | ||
| // Get your blink(1) device | ||
| blink(function(err, b) { | ||
| // start with pure white | ||
| var color = [255, 255, 255]; | ||
| // randomize colors, bounding them by 0->255 | ||
| function wander(x) { | ||
| return Math.min(255, | ||
| return Math.round( | ||
| // bound by 255 as the max | ||
| Math.min(255, | ||
| // bound by 0 as the min | ||
| Math.max(0, | ||
| x + (Math.random() - 0.5) * 50)) | 0; | ||
| // change the number by adding it to a random number from -128 to 128 | ||
| x + (Math.random() - 0.5) * 256))); | ||
| } | ||
| // Every second, wander to a new random color, having it fade | ||
| // for 1000ms - 1s | ||
| setInterval(function() { | ||
| // randomize colors | ||
| color = color.map(wander); | ||
| b.setRGB(color, 1000); | ||
| }, 100); | ||
| }, 1000); | ||
| }); |
+58
-34
@@ -1,21 +0,43 @@ | ||
| var HID = require('HID'); | ||
| var HID = require('HID'), | ||
| parseColor = require('./lib/colorparser').parseCSSColor; | ||
| var VENDOR_ID = 10168; | ||
| function blink(cb) { | ||
| var b = {}, | ||
| VENDOR_ID = 10168, | ||
| white = [255, 255, 255], | ||
| black = [0, 0, 0], | ||
| interval; | ||
| b.blink1_degamma_log2lin = function(n) { | ||
| // this mostly just from blink1-lib - converts colors into usable | ||
| // values for wRGB's message format | ||
| function degamma(n) { | ||
| return (((1<<(n/32))-1) + ((1<<(n/32))*((n%32)+1)+15)/32); | ||
| }; | ||
| } | ||
| // parse a color value if it needs parsing into a rgb 3-element array, | ||
| // and set the color to black if it cannot be parsed | ||
| function parseRgb(rgb) { | ||
| if (typeof rgb === 'object') return rgb; | ||
| if (typeof rgb === 'undefined') { | ||
| console.log('Color value undefined'); | ||
| return black; | ||
| } | ||
| var c = parseColor(rgb); | ||
| if (!c) { | ||
| console.log('Could not parse color', rgb); | ||
| return black; | ||
| } | ||
| return c; | ||
| } | ||
| // create a message that writes a certain rgb value to the blink | ||
| function wRGB(rgb, ms) { | ||
| var dms = ms/10; | ||
| var msg = new Buffer(9); | ||
| rgb = parseRgb(rgb); | ||
| msg[0] = 1; | ||
| msg[1] = 'c'.charCodeAt(0); | ||
| msg[2] = b.blink1_degamma_log2lin(rgb[0]) | 0; | ||
| msg[3] = b.blink1_degamma_log2lin(rgb[1]) | 0; | ||
| msg[4] = b.blink1_degamma_log2lin(rgb[2]) | 0; | ||
| msg[1] = (ms === 0 ? 'n' : 'c').charCodeAt(0); | ||
| msg[2] = degamma(rgb[0]) | 0; | ||
| msg[3] = degamma(rgb[1]) | 0; | ||
| msg[4] = degamma(rgb[2]) | 0; | ||
| msg[5] = dms >> 8; | ||
@@ -26,15 +48,4 @@ msg[6] = dms % 0xff; | ||
| function rRGB(rgb, ms) { | ||
| var msg = new Buffer(9); | ||
| msg[0] = 1; | ||
| msg[1] = 'R'.charCodeAt(0); | ||
| msg[2] = 0; | ||
| msg[3] = 0; | ||
| msg[4] = 0; | ||
| msg[5] = 0; | ||
| msg[6] = 0; | ||
| msg[7] = 0; | ||
| return msg; | ||
| } | ||
| // try to find and connect to a blink(1) device, returning an error | ||
| // if it is not accessible | ||
| function setup(b) { | ||
@@ -49,18 +60,28 @@ b.device = HID.devices().filter(function(d) { | ||
| // set an rgb value. if ms is not given or is 0, it is set immediately - | ||
| // otherwise it is faded two with the blink(1)'s internal functionality | ||
| b.setRGB = function(rgb, ms) { | ||
| b.connection.write(wRGB(rgb, ms || 100)); | ||
| b.connection.write(wRGB(rgb, ms || 0)); | ||
| return b; | ||
| }; | ||
| b.getRGB = function(rgb, ms) { | ||
| b.connection.read(function(err, res) { | ||
| console.log(arguments); | ||
| }); | ||
| b.connection.write(rRGB()); | ||
| // simple on & off shortcuts | ||
| b.on = function() { b.setRGB(white); }; | ||
| b.off = function() { b.setRGB(black); }; | ||
| // get the blink's version number. mine is 100. this bit of code | ||
| // is very directly inspired by node-blink1 | ||
| b.version = function() { | ||
| b.connection.sendFeatureReport([1, | ||
| 'v'.charCodeAt(0), 0, 0, 0, 0, 0, 0, 0]); | ||
| var response = b.connection.getFeatureReport(1, 9); | ||
| return ((response[3] - 0x30) * 100 + (response[4] - 0x30)); | ||
| }; | ||
| // a manual blink from one color to another | ||
| b.blink = function(on, ms, off) { | ||
| on = on || [255, 255, 255]; | ||
| b.stop(); | ||
| on = on || white; | ||
| ms = ms || 500; | ||
| off = off || [0, 0, 0]; | ||
| off = off || black; | ||
| var phase = true; | ||
@@ -74,4 +95,8 @@ interval = setInterval(function() { | ||
| // stop any currently running inverval | ||
| b.stop = function() { | ||
| if (interval) clearInterval(interval); | ||
| if (interval) { | ||
| clearInterval(interval); | ||
| interval = null; | ||
| } | ||
| }; | ||
@@ -81,6 +106,5 @@ | ||
| if (err) return cb(err); | ||
| else return cb(null, b); | ||
| return cb(err, b); | ||
| } | ||
| module.exports = blink; |
+1
-1
| { | ||
| "name": "node-blink", | ||
| "version": "0.0.0", | ||
| "version": "0.0.1", | ||
| "description": "blink(1) support for node", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
+42
-2
@@ -5,2 +5,4 @@ # node-blink | ||
| npm install node-blink | ||
| ```javascript | ||
@@ -11,11 +13,49 @@ var blink = require('../'); | ||
| blink(function(err, b) { | ||
| // blink on & off every second from #fff to #000 | ||
| b.blink(); | ||
| // or with specifics | ||
| b.blink([255, 0, 0], 1000, [0, 0, 0]); | ||
| // fade to an rgb color | ||
| b.setRGB(color, 1000); | ||
| b.setRGB([0, 10, 50], 1000); | ||
| // set an rgb color instantly | ||
| b.setRGB([255, 0, 100]); | ||
| // even use hex colors | ||
| b.setRGB('#ace'); | ||
| // named css colors | ||
| b.setRGB('cyan'); | ||
| // and hsl! | ||
| b.setRGB('hsl(35, 100%, 50%)'); | ||
| // just turn it on (white) | ||
| b.on(); | ||
| // and off (black) | ||
| b.off(); | ||
| // get your blink(1)'s version | ||
| console.log(b.version()); | ||
| // programatically change colors with setInterval | ||
| var angle = 0; | ||
| setInterval(function() { | ||
| if (++angle > 360) angle = 0; | ||
| b.setRGB('hsl(' + angle + ', 100%, 50%)'); | ||
| }, 100); | ||
| }); | ||
| ``` | ||
| Uses [node-hid](https://github.com/hanshuebner/node-hid) for most magic. | ||
| * Uses [node-hid](https://github.com/hanshuebner/node-hid) for most magic. | ||
| * Includes deanm's wonderful [css-color-parser-js](https://github.com/deanm/css-color-parser-js) for CSS color support | ||
| ## See Also | ||
| * [node-blink1](https://github.com/sandeepmistry/node-blink1) beat me by 23 hours | ||
| * [the official software for the blink1](https://github.com/todbot/blink1) |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
26524
462.31%15
150%533
512.64%60
200%1
Infinity%