{"version":3,"file":"legoino-util.min.js","sources":["../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../src/util/calculateCheckDigit.js","../src/util/checkCheckDigit.js","../src/util/hexToInt16.js","../node_modules/legoino-device-information/src/ensureAllParameters.js","../node_modules/legoino-device-information/src/devices/OpenBio6.js","../node_modules/legoino-device-information/src/index.js","../node_modules/legoino-device-information/src/devices/OpenBio.js","../node_modules/legoino-device-information/src/devices/OpenSpectro.js","../node_modules/legoino-device-information/src/devices/SimpleSpectro.js","../node_modules/legoino-device-information/src/devices/Solar2015.js","../node_modules/legoino-device-information/src/devices/Beemos.js","../node_modules/legoino-device-information/src/devices/Computer.js","../src/util/numberToLabel.js","../src/parser/parseParameters.js","../src/parser/parseMultilogLine.js","../src/parser/parseMultilog.js","../src/util/deviceIdNumberToString.js","../src/parser/parseCurrentSettings.js","../src/util/labelToNumber.js","../src/util/valueToRawNumber.js","../src/util/int16ToHex.js","../src/creator/createCompactLog.js","../src/creator/createMultiLog.js","../src/index.js","../src/util/deviceIdStringToNumber.js"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = function calculateCheckDigit(hexString) {\n  let checkDigit = 0;\n  for (let i = 0; i < hexString.length; i = i + 2) {\n    checkDigit ^= parseInt(`${hexString[i]}${hexString[i + 1]}`, 16);\n  }\n  // console.log(checkDigit.toString(16));\n  return checkDigit;\n};\n","'use strict';\n\nconst calculateCheckDigit = require('./calculateCheckDigit');\n\nmodule.exports = function checkCheckDigit(line) {\n  if (calculateCheckDigit(line) === 0) return true;\n  return false;\n};\n","'use strict';\n\nmodule.exports = function hexToInt16(hexa) {\n  let value = parseInt(`${hexa}`, 16);\n  if (value > 32767) {\n    return (65536 - value) * -1;\n  }\n  return value;\n};\n","'use strict';\n\n/**\n * add possibly missing parameters in the array\n * @param {*} device\n * @returns\n */\nfunction ensureAllParameters(device) {\n  const existingParameters = device.parameters;\n  let currentPosition = 0;\n  const parameters = [];\n  for (let parameter of existingParameters) {\n    if (!parameter.label) {\n      throw new Error(`missing label for ${JSON.stringify(parameter)}`);\n    }\n    const labelPosition = labelToNumber(parameter.label);\n    if (labelPosition < currentPosition) {\n      throw new Error(\n        `expectedPosition > currentPosition for ${JSON.stringify(parameter)}`,\n      );\n    }\n    while (labelPosition > currentPosition) {\n      parameters.push(undefined);\n      currentPosition++;\n    }\n    parameters.push(parameter);\n    currentPosition++;\n  }\n  device.parameters = parameters;\n  return device;\n}\n\nfunction labelToNumber(code) {\n  let value = 0;\n  for (let char of code) {\n    value *= 26;\n    value += char.charCodeAt(0) - 64;\n  }\n  return value - 1;\n}\n\nmodule.exports = ensureAllParameters;\n","'use strict';\n\nmodule.exports = {\n  name: 'Open bioreactor v6',\n  kind: 'OpenBio6',\n  description: '',\n  url: '',\n  id: '6',\n  numberParameters: 68,\n  numberLogParameters: 26,\n  parameters: [\n    {\n      label: 'A',\n      variable: 'externalTemperature1',\n      name: 'T° EXT 1',\n      description: 'External temperature 1',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'B',\n      variable: 'externalTemperature2',\n      name: 'T° EXT 2',\n      description: 'External temperature 2',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'C',\n      variable: 'pcbTemp',\n      name: 'T° PCB',\n      description: 'Temperature of the bioreactor circuit',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'D',\n      variable: 'pidTemp',\n      name: 'Pid',\n      description: 'PID absolute value',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'E',\n      variable: 'targetTemp',\n      name: 'T° target',\n      description: 'Target temperature',\n      factor: 100,\n      unit: '°C',\n      writable: true,\n    },\n\n    {\n      label: 'F',\n      variable: 'weight',\n      name: 'Weight',\n      description: 'Weight of the bioreactor tank, in internal value',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'G',\n      variable: 'grWeight',\n      name: 'Weight (g)',\n      description: 'Weight of the bioreactor tank, in gr if calibrated',\n      factor: 1,\n      unit: 'g',\n      writable: false,\n    },\n\n    {\n      label: 'H',\n      variable: 'weightLastEvent',\n      name: 'Weight since last event',\n      description: 'Save the last weight to avoid problems when there are power outages',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'I',\n      variable: 'maxWeight',\n      name: 'Weight max',\n      description: 'Weight max in internal unit',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'J',\n    },\n\n    {\n      label: 'K',\n    },\n\n    {\n      label: 'L',\n    },\n\n    {\n      label: 'M',\n    },\n\n    {\n      label: 'N',\n    },\n\n    {\n      label: 'O',\n    },\n\n    {\n      label: 'P',\n    },\n\n    {\n      label: 'Q',\n    },\n\n    {\n      label: 'R',\n    },\n\n    {\n      label: 'S',\n    },\n\n    {\n      label: 'T',\n    },\n\n    {\n      label: 'U',\n    },\n\n    {\n      label: 'V',\n    },\n\n    {\n      label: 'W',\n      variable: 'currentStep',\n      name: 'Current step',\n      description: 'Current step in the pipeline',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'X',\n      variable: 'currentWaitTime',\n      name: 'Current wait time',\n      description: 'Current step wait time',\n      factor: 1,\n      unit: 'min',\n      writable: false,\n    },\n\n    {\n      label: 'Y',\n      variable: 'error',\n      name: 'Error',\n      unit: '',\n      factor: 1,\n      description: `\n            bit 0: pcb probe, 1: liquid probe 1, 2: liquid probe 2, 3: pcb temperature, 4: liquid temperature 1, 5: liquid temperature 2, 6: target temp. range, 7: weight range`,\n      writable: true,\n      flags: {\n        0: 'Pcb probe failed (one wire not answering)',\n        1: 'Liquid probe in the top failed (one wire not answering)',\n        2: 'Liquid probe in the bottom failed (one wire not answering)',\n        3: 'Temperature of PCB is out of range',\n        4: 'Temperature of liquid in the top is out of range',\n        5: 'Temperature of liquid in the bottom is out of range',\n        6: 'Target temperature is out of range',\n        7: 'Weight out of range',\n      },\n    },\n\n    {\n      label: 'Z',\n      variable: 'status',\n      name: 'Status',\n      description: `Status of the Bioreactor, the bits of this integer code\n        for the state of specific elements of the reactor (eg. motor ON/OFF, PUMP ON/OFF etc.).\n        bits: 0: pid, 1: stepper, 2: pump 1, 3: pump 2, 4: pump 3, 5: pump 4, 6: ph, 7: gas, 8: sedimentation, 9: filling, 10: emptying, 11: ph calibration, 12: acid addition, 13: base addition`,\n      factor: 1,\n      unit: '',\n      writable: true,\n      flags: {\n        0: 'Heating control',\n        1: 'Agitation control',\n        2: 'Food control 1',\n        3: 'Food control 2',\n        4: 'Food control 3',\n        5: 'Food control 4',\n        6: 'pH control',\n        7: 'Gas control',\n        8: 'Sedimentation stage',\n        9: 'Filling pump',\n        10: 'Emptying pump',\n        11: 'pH calibration',\n        12: 'Acid addition',\n        13: 'Base addition',\n      },\n    },\n\n    {\n      label: 'AA',\n      variable: 'stepperSpeed',\n      name: 'Stepper speed',\n      description: '',\n      factor: 1,\n      unit: 'RPM',\n      writable: true,\n    },\n\n    {\n      label: 'AB',\n      variable: 'stepperSteps',\n      name: 'Stepper steps',\n      description:\n        'Number of step before changing direction. 1 tour = 200 steps',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'AC',\n      variable: 'stepperOffDelay',\n      name: 'Stepper off delay',\n      description: 'Time to wait in (s) before between stirring periods',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n\n    {\n      label: 'AD',\n      variable: 'weightFactor',\n      name: 'Weight factor',\n      description: 'Factor allowing to convert the internal weight value to g',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'AE',\n      variable: 'weightOffset',\n      name: 'Weight offset',\n      description: '',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'AF',\n      variable: 'sedimentationTime',\n      name: 'Sedimentation time',\n      description: 'Time to wait in (minutes) to wait without rotation before emptying',\n      factor: 1,\n      unit: 'min',\n      writable: false,\n    },\n\n    {\n      label: 'AG',\n      variable: 'fillingTime',\n      name: 'Filling time',\n      description: 'Time to wait in (minutes) to stay in the filled state',\n      factor: 1,\n      unit: 'min',\n      writable: false,\n    },\n\n    {\n      label: 'AH',\n    },\n\n    {\n      label: 'AI',\n    },\n\n    {\n      label: 'AJ',\n    },\n\n    {\n      label: 'AK',\n    },\n\n    {\n      label: 'AL',\n    },\n\n    {\n      label: 'AM',\n    },\n\n    {\n      label: 'AN',\n    },\n\n    {\n      label: 'AO',\n    },\n\n    {\n      label: 'AP',\n    },\n\n    {\n      label: 'AQ',\n    },\n\n    {\n      label: 'AR',\n    },\n\n    {\n      label: 'AS',\n    },\n\n    {\n      label: 'AT',\n    },\n\n    {\n      label: 'AU',\n    },\n\n    {\n      label: 'AV',\n    },\n\n    {\n      label: 'AW',\n    },\n\n    {\n      label: 'AX',\n    },\n\n    {\n      label: 'AY',\n    },\n\n    {\n      label: 'AZ',\n      variable: 'enable',\n      name: 'Enable',\n      description: 'bits: 0: pid, 1: stepper, 2: pump 1, 3: pump 2, 4: pumpo 3, 5: pump 4',\n      factor: 1,\n      unit: '',\n      writable: true,\n      flags: {\n        0: 'pid',\n        1: 'stepper',\n        2: 'output 1',\n        3: 'output 2',\n        4: 'output 3',\n        5: 'output 4',\n      },\n    },\n\n    {\n      label: 'BA',\n      variable: 'step01',\n      name: 'Step 1',\n      description: 'Step 1',\n    },\n\n    {\n      label: 'BB',\n      variable: 'step02',\n      name: 'Step 2',\n      description: 'Step 2',\n    },\n\n    {\n      label: 'BC',\n      variable: 'step03',\n      name: 'Step 3',\n      description: 'Step 3',\n    },\n\n    {\n      label: 'BD',\n      variable: 'step04',\n      name: 'Step 4',\n      description: 'Step 4',\n    },\n\n    {\n      label: 'BE',\n      variable: 'step05',\n      name: 'Step 5',\n      description: 'Step 5',\n    },\n\n    {\n      label: 'BF',\n      variable: 'step06',\n      name: 'Step 6',\n      description: 'Step 6',\n    },\n\n    {\n      label: 'BG',\n      variable: 'step07',\n      name: 'Step 7',\n      description: 'Step 7',\n    },\n\n    {\n      label: 'BH',\n      variable: 'step08',\n      name: 'Step 8',\n      description: 'Step 8',\n    },\n\n    {\n      label: 'BI',\n      variable: 'step09',\n      name: 'Step 9',\n      description: 'Step 9',\n    },\n\n    {\n      label: 'BJ',\n      variable: 'step10',\n      name: 'Step 10',\n      description: 'Step 10',\n    },\n\n    {\n      label: 'BK',\n      variable: 'step11',\n      name: 'Step 11',\n      description: 'Step 11',\n    },\n\n    {\n      label: 'BL',\n      variable: 'step12',\n      name: 'Step 12',\n      description: 'Step 12',\n    },\n\n    {\n      label: 'BM',\n      variable: 'step13',\n      name: 'Step 13',\n      description: 'Step 13',\n    },\n\n    {\n      label: 'BN',\n      variable: 'step14',\n      name: 'Step 14',\n      description: 'Step 14',\n    },\n\n    {\n      label: 'BO',\n      variable: 'step15',\n      name: 'Step 15',\n      description: 'Step 15',\n    },\n\n    {\n      label: 'BP',\n      variable: 'step16',\n      name: 'Step 16',\n      description: 'Step 16',\n    },\n  ],\n  events: [\n    {\n      id: 1,\n      name: 'Arduino boot',\n      description: '',\n    },\n    {\n      id: 2,\n      name: 'Set safe mode',\n      description: '',\n    },\n    {\n      id: 3,\n      name: 'Status enable',\n      description:\n        'bits: 0: pid, 1: stepper, 2: pump 1, 3: pump 2, 4: pumpo 3, 5: pump 4, 6: ph, 7: gas, 8: sedimentation, 9: filling, 10: emptying, 11: ph calibration, 12: acid addition, 13: base addition',\n      flags: {\n        0: 'Heating control',\n        1: 'Agitation control',\n        2: 'Food control 1',\n        3: 'Food control 2',\n        4: 'Food control 3',\n        5: 'Food control 4',\n        6: 'pH control',\n        7: 'Gas control',\n        8: 'Sedimentation stage',\n        9: 'Filling pump',\n        10: 'Emptying pump',\n        11: 'pH calibration',\n        12: 'Acid addition',\n        13: 'Base addition',\n      },\n    },\n    {\n      id: 4,\n      name: 'Status disable',\n      description:\n        'bits: 0: pid, 1: stepper, 2: pump 1, 3: pump 2, 4: pumpo 3, 5: pump 4, 6: ph, 7: gas, 8: sedimentation, 9: filling, 10: emptying, 11: ph calibration, 12: acid addition, 13: base addition',\n      flags: {\n        0: 'Heating control',\n        1: 'Agitation control',\n        2: 'Food control 1',\n        3: 'Food control 2',\n        4: 'Food control 3',\n        5: 'Food control 4',\n        6: 'pH control',\n        7: 'Gas control',\n        8: 'Sedimentation stage',\n        9: 'Filling pump',\n        10: 'Emptying pump',\n        11: 'pH calibration',\n        12: 'Acid addition',\n        13: 'Base addition',\n      },\n    },\n    {\n      id: 6,\n      name: 'Error: failed',\n      description: `\n            bit 0: pcb probe, 1: liquid probe 1, 2: liquid probe 2, 3: pcb temperature, 4: liquid temperature 1, 5: liquid temperature 2, 6: target temp. range, 7: weight range`,\n      writable: true,\n      flags: {\n        0: 'Pcb probe failed (one wire not answering)',\n        1: 'Liquid probe in the top failed (one wire not answering)',\n        2: 'Liquid probe in the bottom failed (one wire not answering)',\n        3: 'Temperature of PCB is out of range',\n        4: 'Temperature of liquid in the top is out of range',\n        5: 'Temperature of liquid in the bottom is out of range',\n        6: 'Target temperature is out of range',\n        7: 'Weight out of range',\n      },\n    },\n    {\n      id: 7,\n      name: 'Error: recover',\n      description: `\n            bit 0: pcb probe, 1: liquid probe 1, 2: liquid probe 2, 3: pcb temperature, 4: liquid temperature 1, 5: liquid temperature 2, 6: target temp. range, 7: weight range`,\n      writable: true,\n      flags: {\n        0: 'Pcb probe failed (one wire not answering)',\n        1: 'Liquid probe in the top failed (one wire not answering)',\n        2: 'Liquid probe in the bottom failed (one wire not answering)',\n        3: 'Temperature of PCB is out of range',\n        4: 'Temperature of liquid in the top is out of range',\n        5: 'Temperature of liquid in the bottom is out of range',\n        6: 'Target temperature is out of range',\n        7: 'Weight out of range',\n      },\n    },\n    {\n      id: 20,\n      name: 'Rotation start',\n      description: '',\n    },\n    {\n      id: 21,\n      name: 'Rotation stop',\n      description: '',\n    },\n    {\n      id: 150,\n      name: 'Not found log entry N',\n      description: '',\n    },\n    {\n      id: 255,\n      name: 'Save all parameters',\n      description: '',\n    },\n    {\n      id: 256,\n      name: 'Change value of A',\n      description: '',\n    },\n    {\n      id: 257,\n      name: 'Change value of B',\n      description: '',\n    },\n  ],\n};\n","'use strict';\n\nconst ensureAllParameters = require('./ensureAllParameters.js');\n\nlet devices = {\n  OpenBio: ensureAllParameters(require('./devices/OpenBio')),\n  OpenBio6: ensureAllParameters(require('./devices/OpenBio6')),\n  OpenSpectro: ensureAllParameters(require('./devices/OpenSpectro')),\n  SimpleSpectro: ensureAllParameters(require('./devices/SimpleSpectro')),\n  Solar2015: ensureAllParameters(require('./devices/Solar2015')),\n  Beemos: ensureAllParameters(require('./devices/Beemos')),\n  Computer: ensureAllParameters(require('./devices/Computer')),\n  fromDeviceID,\n};\n\n/**\n * Return a device information from the deviceID\n * @param {string|number} id\n * @returns\n */\nfunction fromDeviceID(id) {\n  if (typeof id === 'number') {\n    id = String.fromCharCode((id / 256) >> 0) + String.fromCharCode(id % 256);\n  }\n  if (typeof id !== 'string') {\n    throw Error('Device ID not a string or number');\n  }\n  if (id.length !== 2) {\n    throw Error(\n      `Device ID should be 2 character long and found: ${id.ldength}`,\n    );\n  }\n  const firstCharacter = id.substring(0, 1);\n  for (let key in devices) {\n    if (devices[key].id === firstCharacter) {\n      return ensureAllParameters(devices[key]);\n    }\n  }\n  return undefined;\n}\n\nmodule.exports = devices;\n","'use strict';\n\nmodule.exports = {\n  name: 'Open bioreactor',\n  kind: 'OpenBio',\n  description: '',\n  url: '',\n  id: '$',\n  numberParameters: 52,\n  numberLogParameters: 26,\n  parameters: [\n    {\n      label: 'A',\n      variable: 'liquidTemp',\n      name: 'T° LIQ',\n      description: 'Temperature of the bioreactor solution',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'B',\n      variable: 'pcbTemp',\n      name: 'T° PCB',\n      description: 'Temperature of the bioreactor circuit',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'C',\n      variable: 'pidTemp',\n      name: 'Pid',\n      description: 'PID absolute value',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'D',\n      variable: 'targetTemp',\n      name: 'T° target',\n      description: 'Target temperature',\n      factor: 100,\n      unit: '°C',\n      writable: true,\n    },\n\n    {\n      label: 'E',\n      variable: 'weight',\n      name: 'Weight',\n      description: 'Weight of the bioreactor tank, in internal value',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'F',\n      variable: 'grWeight',\n      name: 'Weight (g)',\n      description: 'Weight of the bioreactor tank, in gr if calibrated',\n      factor: 1,\n      unit: 'g',\n      writable: false,\n    },\n\n    {\n      label: 'G',\n      variable: 'waitSinceLast',\n      name: 'Time since last event',\n      description: 'Time in min since last weight event',\n      factor: 1,\n      unit: 'min',\n      writable: false,\n    },\n\n    {\n      label: 'H',\n      variable: 'minWeight',\n      name: 'Weight min',\n      description: 'Weight min in internal unit',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'I',\n      variable: 'maxWeight',\n      name: 'Weight max',\n      description: 'Weight max in internal unit',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'J',\n    },\n\n    {\n      label: 'K',\n    },\n\n    {\n      label: 'L',\n    },\n\n    {\n      label: 'M',\n    },\n\n    {\n      label: 'N',\n    },\n\n    {\n      label: 'O',\n    },\n\n    {\n      label: 'P',\n    },\n\n    {\n      label: 'Q',\n    },\n\n    {\n      label: 'R',\n    },\n\n    {\n      label: 'S',\n    },\n\n    {\n      label: 'T',\n    },\n\n    {\n      label: 'U',\n    },\n\n    {\n      label: 'V',\n    },\n\n    {\n      label: 'W',\n    },\n\n    {\n      label: 'X',\n    },\n\n    {\n      label: 'Y',\n      variable: 'error',\n      name: 'Error',\n      unit: '',\n      factor: 1,\n      description: `\n            bit 0: pcb probe, 1: liquid probe, 2: pcb temperature,\n            3: liquid temperature, 4: target temp. range, 5: weight range`,\n      writable: true,\n      flags: {\n        pcbProbe: {\n          bit: 0,\n          description: 'PCB temperature probe not responding',\n        },\n        liquidProbe: {\n          bit: 1,\n          description: 'Liquid temperature probe not responding',\n        },\n        pcbTemperature: {\n          bit: 2,\n          description: 'PCB temperature out of range',\n        },\n        liquidTemperature: {\n          bit: 3,\n          description: 'Liquid temperature out of range',\n        },\n        targetTemperature: {\n          bit: 4,\n          description: 'Target temperature out of range',\n        },\n        weight: {\n          bit: 5,\n          description: 'Weight out of range',\n        },\n      },\n    },\n\n    {\n      label: 'Z',\n      variable: 'status',\n      name: 'Status',\n      description: `Status of the Bioreactor, the bits of this integer code\n        for the state of specific elements of the reactor (eg. motor ON/OFF, PUMP ON/OFF etc.).\n        bits: 0: stepper, 1: weight, 2: pid, 7: sedimentation, 8: filling, 9: emptying\n        `,\n      factor: 1,\n      unit: '',\n      writable: true,\n      flags: {\n        stepper: {\n          bit: 0,\n          description: 'Stepper running',\n        },\n        food: {\n          bit: 1,\n          description: 'Food running',\n        },\n        pid: {\n          bit: 2,\n          description: 'PID running',\n        },\n        sedimentation: {\n          bit: 7,\n          description: 'Sedimentation running',\n        },\n        filling: {\n          bit: 8,\n          description: 'Filling tank',\n        },\n        emptying: {\n          bit: 9,\n          description: 'Emptying tank',\n        },\n      },\n    },\n\n    {\n      label: 'AA',\n      variable: 'stepperSpeed',\n      name: 'Stepper speed',\n      description: '',\n      factor: 1,\n      unit: 'RPM',\n      writable: true,\n    },\n\n    {\n      label: 'AB',\n      variable: 'stepperOnDelay',\n      name: 'Stepper on delay',\n      description: 'Time in (s) for which the stepper stays on',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n\n    {\n      label: 'AC',\n      variable: 'stepperOffDelay',\n      name: 'Stepper off delay',\n      description: 'Time to wait in (s) before between stirring periods',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n\n    {\n      label: 'AD',\n    },\n\n    {\n      label: 'AE',\n    },\n\n    {\n      label: 'AF',\n      variable: 'sedTime',\n      name: 'Sedimentation Time',\n      description:\n        'Sedimentation time in min after Semi-batch operation,' +\n        'corresponds to the waiting time without stirring before emptying the reactor to the minimum level',\n      min: 0,\n      max: 32767,\n      factor: 1,\n      unit: 'min',\n      writable: true,\n    },\n\n    {\n      label: 'AG',\n      variable: 'filledTime',\n      name: 'Filled Time',\n      description:\n        'Filled time in min after Semi-batch operation,' +\n        'corresponds to the total time with and without stirring before emptying the reactor to the minimum level' +\n        'must be set longer than the sedimentation time if stirring is desired',\n      min: 0,\n      max: 32767,\n      factor: 1,\n      unit: 'min',\n      writable: true,\n    },\n\n    {\n      label: 'AH',\n      variable: 'weightFactor',\n      name: 'Weight factor',\n      description: 'Factor allowing to convert the internal weight value to g',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'AI',\n      variable: 'weightOffset',\n      name: 'Weight offset',\n      description: '',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'AJ',\n    },\n\n    {\n      label: 'AK',\n    },\n\n    {\n      label: 'AL',\n    },\n\n    {\n      label: 'AM',\n    },\n\n    {\n      label: 'AN',\n    },\n\n    {\n      label: 'AO',\n    },\n\n    {\n      label: 'AP',\n    },\n\n    {\n      label: 'AQ',\n    },\n\n    {\n      label: 'AR',\n    },\n\n    {\n      label: 'AS',\n    },\n\n    {\n      label: 'AT',\n    },\n\n    {\n      label: 'AU',\n    },\n\n    {\n      label: 'AV',\n    },\n\n    {\n      label: 'AW',\n    },\n\n    {\n      label: 'AX',\n    },\n\n    {\n      label: 'AY',\n    },\n\n    {\n      label: 'AZ',\n      variable: 'enable',\n      name: 'Enable',\n      description: 'pid - food - stepper : ex. 1: only stepper',\n      factor: 1,\n      unit: '',\n      writable: true,\n      flags: {\n        stepper: {\n          bit: 0,\n          description: 'Stepper control',\n        },\n        food: {\n          bit: 1,\n          description: 'Food control',\n        },\n        pid: {\n          bit: 2,\n          description: 'PID control',\n        },\n      },\n    },\n  ],\n  events: [\n    {\n      id: 1,\n      name: 'Arduino boot',\n      description: '',\n    },\n    {\n      id: 2,\n      name: 'Set safe mode',\n      description: '',\n    },\n    {\n      id: 3,\n      name: 'Status enable',\n      description:\n        '0:stepper, 1:food, 2:pid, 7:sedimentation, 8:filling, 9:emptying',\n      flags: {\n        0: 'stepper',\n        1: 'food',\n        2: 'pid',\n        7: 'sedimentation',\n        8: 'filling',\n        9: 'emptying',\n      },\n    },\n    {\n      id: 4,\n      name: 'Status disable',\n      description:\n        '0:stepper, 1:food, 2:pid, 7:sedimentation, 8:filling, 9:emptying',\n      flags: {\n        0: 'stepper',\n        1: 'food',\n        2: 'pid',\n        7: 'sedimentation',\n        8: 'filling',\n        9: 'emptying',\n      },\n    },\n    {\n      id: 6,\n      name: 'Error: failed',\n      description:\n        '0:stepper, 1:food, 2:pid, 7:sedimentation, 8:filling, 9:emptying',\n      flags: {\n        0: 'pcb temperature probe',\n        1: 'liquid temperature probe',\n        2: 'pcb temperature range',\n        3: 'liquid temperature range',\n        4: 'target temperature range',\n        5: 'weight range',\n      },\n    },\n    {\n      id: 7,\n      name: 'Error: recover',\n      description:\n        '0:stepper, 1:food, 2:pid, 7:sedimentation, 8:filling, 9:emptying',\n      flags: {\n        0: 'pcb temperature probe',\n        1: 'liquid temperature probe',\n        2: 'pcb temperature range',\n        3: 'liquid temperature range',\n        4: 'target temperature range',\n        5: 'weight range',\n      },\n    },\n    {\n      id: 20,\n      name: 'Rotation start',\n      description: '',\n    },\n    {\n      id: 21,\n      name: 'Rotation stop',\n      description: '',\n    },\n    {\n      id: 150,\n      name: 'Not found log entry N',\n      description: '',\n    },\n    {\n      id: 255,\n      name: 'Save all parameters',\n      description: '',\n    },\n    {\n      id: 256,\n      name: 'Change value of A',\n      description: '',\n    },\n    {\n      id: 257,\n      name: 'Change value of B',\n      description: '',\n    },\n  ],\n};\n","'use strict';\n\nmodule.exports = {\n  name: 'Open spectrophotometer',\n  kind: 'OpenSpectro',\n  numberParameters: 26,\n  id: 'S',\n  description: '',\n  url: '',\n  parameters: [\n    {\n      label: 'A',\n      name: 'Red point',\n      description: 'which point of the linear detector is the maximum for red',\n      factor: 1,\n      unit: 'pixel#',\n      writable: false,\n    },\n\n    {\n      label: 'B',\n      name: 'Green point',\n      description:\n        'which point of the linear detector is the maximum for green',\n      factor: 1,\n      unit: 'pixel#',\n      writable: false,\n    },\n\n    {\n      label: 'C',\n      name: 'Blue point',\n      description: 'which point of the linear detector is the maximum for blue',\n      factor: 1,\n      unit: 'pixel#',\n      writable: false,\n    },\n\n    {\n      label: 'D',\n      name: 'Compression',\n      description: '0 means no compression, can be set',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n    {\n      label: 'E',\n      name: 'R-Intensity',\n      description: 'Red led intensity (0 to 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'F',\n      name: 'G-Intensity',\n      description: 'Green led intensity (0 to 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'G',\n      name: 'B-Intensity',\n      description: 'Blue led intensity (0 to 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'H',\n      name: 'Scan#',\n      description: 'Number of scans (maximum 64)',\n      factor: 1,\n      unit: '',\n      min: 1,\n      max: 64,\n      writable: true,\n    },\n\n    {\n      label: 'I',\n      name: 'DelayExp',\n      description: 'Delay between experiments in seconds',\n      factor: 1,\n      unit: 's',\n      writable: false,\n    },\n\n    {\n      label: 'J',\n      name: 'Acq Time',\n      description: 'Accumulation time in ms(in ms, good value=30)',\n      factor: 1,\n      unit: 'ms',\n      writable: true,\n    },\n\n    {\n      label: 'K',\n      name: 'lambda-R',\n      description: 'Red maximum wavelength (nm)',\n      factor: 1,\n      unit: 'nm',\n      writable: false,\n    },\n\n    {\n      label: 'L',\n      name: 'lambda-G',\n      description: 'Green maximum wavelength (nm)',\n      factor: 1,\n      unit: 'nm',\n      writable: false,\n    },\n\n    {\n      label: 'M',\n      name: 'lambda-M',\n      description: 'Blue maximum wavelength (nm)',\n      factor: 1,\n      unit: 'nm',\n      writable: false,\n    },\n\n    {\n      label: 'U',\n      name: 'red test',\n      description: 'Set intensity of red led for test (0 -> 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'V',\n      name: 'green test',\n      description: 'Set intensity of green led for test (0 -> 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'W',\n      name: 'blue test',\n      description: 'Set intensity of blue led for test (0 -> 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'X',\n      name: 'white test',\n      description: 'Set intensity of white led for test (0 -> 255)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'Y',\n    },\n    {\n      label: 'Z',\n    },\n  ],\n};\n","'use strict';\n\nmodule.exports = {\n  name: 'Simple spectrophotometer',\n  kind: 'SimpleSpectro',\n  numberParameters: 26,\n  description: '',\n  id: 'T',\n  url: '',\n  parameters: [\n    {\n      label: 'A',\n      name: 'Transmission of sample (Red)',\n      description: 'Frequency related to the energy of red led through sample',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'B',\n      name: 'Transmission of sample (Green)',\n      description:\n        'Frequency related to the energy of green led through sample',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'C',\n      name: 'Transmission of sample (Blue)',\n      description: 'Frequency related to the energy of blue led through sample',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'D',\n      name: 'Emission of sample (Blue)',\n      description:\n        'Frequency related to the energy of blue perpendicular led re-emitted by sample (fluorescence)',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'F',\n      name: 'Transmission of blank (Red)',\n      description: 'Frequency related to the energy of red led through blank',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'G',\n      name: 'Transmission of blank (Green)',\n      description: 'Frequency related to the energy of green led through blank',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'H',\n      name: 'Transmission of blank (Blue)',\n      description: 'Frequency related to the energy of blue led through blank',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'I',\n      name: 'Emission of blank (Blue)',\n      description:\n        'Frequency related to the energy of blue perpendicular led re-emitted by blank (fluorescence)',\n      factor: 1,\n      unit: 'Hz',\n      writable: false,\n    },\n\n    {\n      label: 'K',\n      name: 'Delay before blank',\n      description: 'Delay before the acquisition of the blank in seconds',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n\n    {\n      label: 'L',\n      name: 'Delay before sample',\n      description: 'Delay before the acquisition of the sample in seconds',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n\n    {\n      label: 'M',\n      name: 'Delay between experiments',\n      description:\n        'Delay between the acquisition of the experiments (kinetic) in seconds',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n\n    {\n      label: 'N',\n      name: 'Nb experiments',\n      description:\n        'Number of experiments for kinetic (max 240 / (number colors + 1))',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'O',\n      name: 'Next exp. number',\n      description: 'Number of the next experiment',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'P',\n      name: 'Waiting time',\n      description: 'Current waiting time before next experiment',\n      factor: 1,\n      unit: 's',\n      writable: false,\n    },\n\n    {\n      label: 'Q',\n      name: 'Nb sampling',\n      description:\n        'Number of acquisitions of 100ms that will be taken (default 10). This value could be reduced for fast kinetic',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'R',\n      name: 'Invert rotary',\n      description: ' Invert the rotary button direction',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'S',\n      name: 'Battery voltage',\n      description: 'Current battery voltage',\n      factor: 100,\n      unit: 'V',\n      writable: true,\n    },\n\n    {\n      label: 'T',\n      name: 'Temperature',\n      description: 'Current temperature',\n      factor: 100,\n      unit: '°C',\n      writable: true,\n    },\n\n    {\n      label: 'V',\n      name: 'Active channels',\n      description:\n        'Active leds and other. A number between 0 and 63. Each bit represents a function (Red, Green, Blue, UV, Voltage, Temperature). 5 would correspond to Red and Blue (binary combination).',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'W',\n      name: 'Error',\n      description: 'Error',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'X',\n      name: 'Result channel',\n      description: 'Value of the channel that will be displayed in the result',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'Y',\n      name: 'Status',\n      description: 'Status',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n\n    {\n      label: 'Z',\n      name: 'Current menu',\n      description: 'Current menu',\n      factor: 1,\n      unit: '',\n      writable: true,\n    },\n  ],\n};\n","'use strict';\n\nmodule.exports = {\n  name: 'Solar decathlon 2015',\n  kind: 'Solar',\n  numberParameters: 4,\n  numberLogParameters: 4,\n  id: '#',\n  description: '',\n  url: '',\n  parameters: [\n    {\n      label: 'A',\n      name: 'Temperature',\n      description: '',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'B',\n      name: 'Light',\n      description: '',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'C',\n      name: 'Pressure',\n      description: '',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'D',\n      name: 'Humidity',\n      description: '',\n      factor: 10,\n      unit: '%',\n      writable: false,\n    },\n  ],\n};\n","'use strict';\n\nmodule.exports = {\n  name: 'Bee Monistoring System',\n  kind: 'Beemos',\n  numberParameters: 52,\n  numberLogParameters: 26,\n  id: 'B',\n  description: 'Bee Monitoring System data result',\n  url: '',\n  parameters: [\n    {\n      label: 'A',\n      variable: 'externalTemperature',\n      name: 'Ext temperature',\n      description: 'External temperature',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n    {\n      label: 'B',\n      variable: 'externalHumidity',\n      name: 'Ext humidity',\n      description: 'External humidity',\n      factor: 100,\n      unit: '%',\n      writable: false,\n    },\n    {\n      label: 'C',\n      variable: 'pressure',\n      name: 'Pressure',\n      description: 'Press',\n      factor: 10,\n      unit: 'mbar',\n      writable: false,\n    },\n    {\n      label: 'D',\n      variable: 'luminosity',\n      name: 'Luminosity',\n      description: 'Luminosity (Arbitrary unit)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'E',\n      variable: 'red',\n      name: 'Red',\n      description: 'Red luminosity (Arbitrary unit)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'F',\n      variable: 'green',\n      name: 'Green',\n      description: 'Green luminosity (Arbitrary unit)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'G',\n      variable: 'blue',\n      name: 'Blue',\n      description: 'Blue luminosity (Arbitrary unit)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'H',\n      variable: 'infrared',\n      name: 'Infrared',\n      description: 'Infrared luminosity (Arbitrary unit)',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'I',\n      variable: 'latitude',\n      name: 'Latitude',\n      description: 'Latitude',\n      factor: 100,\n      unit: '°',\n      writable: false,\n    },\n    {\n      label: 'J',\n      variable: 'longitude',\n      name: 'Longitude',\n      description: 'Longitude',\n      factor: 100,\n      unit: '°',\n      writable: false,\n    },\n    {\n      label: 'K',\n      variable: 'internalTemperature',\n      name: 'Int temperature',\n      description: 'Internal temperature',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n    {\n      label: 'L',\n      variable: 'internalHumidity',\n      name: 'Int humidity',\n      description: 'Internal humidity',\n      factor: 100,\n      unit: '%',\n      writable: false,\n    },\n    {\n      label: 'M',\n      variable: 'internalTemperatureA',\n      name: 'Int temperature A',\n      description: 'Internal temperature A',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n    {\n      label: 'N',\n      variable: 'internalTemperatureB',\n      name: 'Int temperature B',\n      description: 'Internal temperature B',\n      factor: 100,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'O',\n      variable: 'weightInternalUnit',\n      name: 'Weight internal unit',\n      description: 'Weight in internal unit',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'P',\n      variable: 'weight',\n      name: 'Weight',\n      description: 'Weight',\n      factor: 100,\n      unit: 'kg',\n      writable: false,\n    },\n    {\n      label: 'W',\n      variable: 'battery',\n      name: 'Battery',\n      description: 'Battery voltage',\n      factor: 1000,\n      unit: 'V',\n      writable: false,\n    },\n    {\n      label: 'X',\n      variable: 'charging',\n      name: 'Charging',\n      description: 'Indication showing if the battery is charging',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'Y',\n      variable: 'rssi',\n      name: 'Wifi RSSI',\n      description: 'Power of Wifi signal',\n      factor: 1,\n      unit: 'dB',\n      writable: false,\n    },\n    {\n      label: 'Z',\n      variable: 'error',\n      name: 'Error',\n      description: 'Current error code',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'AA',\n      variable: 'loggingInterval',\n      name: 'Logging interval',\n      description: 'Interval in seconds between logs',\n      factor: 1,\n      unit: 's',\n      writable: true,\n    },\n    {\n      label: 'AB',\n      variable: 'weightOffset',\n      name: 'Weight offset',\n      description: 'Offset to convert weight from internal unit',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AC',\n      variable: 'weightFactor',\n      name: 'Weight factor',\n      description: 'Factor to convert the weight from internal unit',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n\n    {\n      label: 'AK',\n      variable: 'gate1In',\n      name: 'Gate 1 IN',\n      description: 'Number of input on gate 1',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AL',\n      variable: 'gate1Out',\n      name: 'Gate 1 OUT',\n      description: 'Number of output on gate 1',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AM',\n      variable: 'gate2In',\n      name: 'Gate 2 IN',\n      description: 'Number of input on gate 2',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AN',\n      variable: 'gate2Out',\n      name: 'Gate 2 OUT',\n      description: 'Number of output on gate 2',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AO',\n      variable: 'gate3In',\n      name: 'Gate 3 IN',\n      description: 'Number of input on gate 3',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AP',\n      variable: 'gate3Out',\n      name: 'Gate 3 OUT',\n      description: 'Number of output on gate 3',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AQ',\n      variable: 'gate4In',\n      name: 'Gate 4 IN',\n      description: 'Number of input on gate 4',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AR',\n      variable: 'gate4Out',\n      name: 'Gate 4 OUT',\n      description: 'Number of output on gate 4',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AS',\n      variable: 'gate5In',\n      name: 'Gate 5 IN',\n      description: 'Number of input on gate 5',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AT',\n      variable: 'gate5Out',\n      name: 'Gate 5 OUT',\n      description: 'Number of output on gate 5',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AU',\n      variable: 'gate6In',\n      name: 'Gate 6 IN',\n      description: 'Number of input on gate 6',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AV',\n      variable: 'gate6Out',\n      name: 'Gate 6 OUT',\n      description: 'Number of output on gate 6',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AW',\n      variable: 'gate7In',\n      name: 'Gate 7 IN',\n      description: 'Number of input on gate 7',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AX',\n      variable: 'gate7Out',\n      name: 'Gate 7 OUT',\n      description: 'Number of output on gate 7',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AY',\n      variable: 'gate8In',\n      name: 'Gate 8 IN',\n      description: 'Number of input on gate 8',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n    {\n      label: 'AZ',\n      variable: 'gate8Out',\n      name: 'Gate 8 OUT',\n      description: 'Number of output on gate 8',\n      factor: 1,\n      unit: '',\n      writable: false,\n    },\n  ],\n};\n","'use strict';\n\nmodule.exports = {\n  name: 'Computer monitoring',\n  kind: 'Computer',\n  numberParameters: 16,\n  numberLogParameters: 16,\n  description: '',\n  id: 'C',\n  url: '',\n  parameters: [\n    {\n      label: 'A',\n      variable: 'cpuTemperature',\n      name: 'CPU Temperature',\n      description: '',\n      factor: 1,\n      unit: '°C',\n      writable: false,\n    },\n\n    {\n      label: 'B',\n      variable: 'memFree',\n      name: 'Free memory',\n      description: 'Free memory in percent',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'C',\n      variable: 'swapFree',\n      name: 'Free swap',\n      description: 'Free swap in percent',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'D',\n      variable: 'fsRead',\n      name: 'FS Read',\n      description: 'File system read in kb',\n      factor: 1,\n      unit: 'kb',\n      writable: false,\n    },\n\n    {\n      label: 'E',\n      variable: 'fsWrite',\n      name: 'FS Write',\n      description: 'File system read in kb',\n      factor: 1,\n      unit: 'kb',\n      writable: false,\n    },\n\n    {\n      label: 'F',\n      variable: 'networkRead',\n      name: 'Network Read',\n      description: 'File system read in kb',\n      factor: 1,\n      unit: 'kb',\n      writable: false,\n    },\n\n    {\n      label: 'G',\n      variable: 'networkWrite',\n      name: 'Network Write',\n      description: 'File system read in kb',\n      factor: 1,\n      unit: 'kb',\n      writable: false,\n    },\n\n    {\n      label: 'H',\n      variable: 'load',\n      name: 'Load',\n      description: 'Total load',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'I',\n      variable: 'userLoad',\n      name: 'User load',\n      description: 'Load from user',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'J',\n      variable: 'systemLoad',\n      name: 'System load',\n      description: 'Load from system',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'K',\n      variable: 'niceLoad',\n      name: 'Nice load',\n      description: 'Load for Nice',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'L',\n      variable: 'idleLoad',\n      name: 'Idle load',\n      description: 'Idle percent of time',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'M',\n      variable: 'irqLoad',\n      name: 'IRQ load',\n      description: 'Load due to IRQ',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n\n    {\n      label: 'N',\n      variable: 'fsMinimalUse',\n      name: 'FS minimal use',\n      description: 'Minimal percent spaced used in a filesystem',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n    {\n      label: 'O',\n      variable: 'fsMaximalUse',\n      name: 'FS maximal use',\n      description: 'Maximal percent spaced used in a filesystem',\n      factor: 1,\n      unit: '%',\n      writable: false,\n    },\n    {\n      label: 'P',\n    },\n  ],\n};\n","'use strict';\n\nmodule.exports = function numberToLabel(value) {\n  if (value < 26) {\n    return String.fromCharCode(65 + value);\n  } else {\n    return String.fromCharCode(Math.floor(value / 26) + 64, 65 + (value % 26));\n  }\n};\n","'use strict';\n\nconst DeviceInformation = require('legoino-device-information');\n\nconst hexToInt16 = require('../util/hexToInt16');\nconst numberToLabel = require('../util/numberToLabel');\n\n/**\n * Parse a buffer (String) containing 4 hexadecimal symbols per parameter\n * @param {string} buffer\n * @param {object} [options={}]\n * @param {boolean} [options.parameterLabel=false] Use the variable name of device info as property name\n * @param {boolean} [options.parameterInfo=false] Show all the information about the parameter in the value\n * @param {boolean} [options.flagInfo=false] Show all the information about the flags, can only be true if `options.parameterInfo=true`!\n * @param {string} [options.kind=undefined] Specify a device type from those that exist in `legoino-device-information`\n * @param {object} [options.deviceInformation=undefined] Pass information for a device that does not exist in `legoino-device-information`. To use if `options.kind` is undefined.\n * @return {object} The parsed parameters\n */\n\nmodule.exports = function parseParameters(buffer, options = {}) {\n  let {\n    parameterLabel = false,\n    parameterInfo = false,\n    flagInfo = false,\n    kind = undefined,\n    deviceInformation = DeviceInformation[kind],\n  } = options;\n\n  if (parameterInfo === false && flagInfo === true) {\n    throw new Error('parameterInfo must be true when flagInfo is true');\n  }\n\n  let parameters = {};\n  let parametersArray = [];\n\n  let numberParameters = buffer.length / 4;\n  if (\n    deviceInformation &&\n    numberParameters !== deviceInformation.numberParameters &&\n    numberParameters !== deviceInformation.numberLogParameters\n  ) {\n    throw new Error(\n      `The number of parameters is not equal to the one described in the deviceInformation. ${buffer} ${kind} ${deviceInformation.numberParameters} != ${deviceInformation.numberLogParameters}`,\n    );\n  }\n\n  if (!deviceInformation) deviceInformation = { parameters: [] };\n\n  for (let i = 0; i < numberParameters; i++) {\n    if (!deviceInformation.parameters[i]) {\n      deviceInformation.parameters[i] = {\n        variable: numberToLabel(i),\n        label: numberToLabel(i),\n        factor: 1,\n      };\n    }\n\n    let valueNumber = hexToInt16(buffer.substring(i * 4, i * 4 + 4));\n    if (valueNumber === -32768) valueNumber = undefined;\n    let label = parameterLabel\n      ? deviceInformation.parameters[i].variable ||\n        deviceInformation.parameters[i].name\n      : numberToLabel(i);\n    if (label === undefined) continue;\n\n    let value;\n    if (parameterInfo) {\n      value = Object.assign({}, deviceInformation.parameters[i], {\n        index: i,\n        originalValue: valueNumber,\n        value:\n          valueNumber === undefined\n            ? valueNumber\n            : valueNumber / (deviceInformation.parameters[i].factor || 1),\n      });\n      if (flagInfo) {\n        let flags = deviceInformation.parameters[i].flags;\n\n        if (flags !== undefined) {\n          for (let key in flags) {\n            flags[key].value =\n              (value.value & (1 << flags[key].bit)) >> flags[key].bit;\n          }\n          value.flags = flags;\n        }\n      }\n    } else {\n      value =\n        valueNumber === undefined\n          ? valueNumber\n          : valueNumber / (deviceInformation.parameters[i].factor || 1);\n    }\n    if (value !== undefined) parameters[label] = value;\n    parametersArray.push(value);\n  }\n  return { parameters, parametersArray };\n};\n","'use strict';\n\nconst debug = require('debug')('legoino:parser:processMultilogLine');\n\nconst checkCheckDigit = require('../util/checkCheckDigit');\nconst hexToInt16 = require('../util/hexToInt16');\n\nconst parseParameters = require('./parseParameters');\n\n/**\n * Parse a multilog line.\n * @param {string} line\n * @param {object} [options={}]\n * @param {boolean} [options.hasEvent=true] Specify wether the log contains an event\n * @param {boolean} [options.flatten=false] The parsed log will have all properties at the same level (no sub-object for the parameters)\n * @param {boolean} [options.parametersArray=false] Add an array with all the parameters to the result\n * @param {boolean} [options.parameterLabel=false] Use the variable property of device info as property name\n * @param {boolean} [options.parameterInfo=false] Show all the information about the parameter in the value\n * @param {string} [options.kind=undefined] Specify a device type from those that exist in `legoino-device-information`\n * @param {object} [options.deviceInformation=undefined] Pass information for a device that does not exist in `legoino-device-information`. To use if `options.kind` is undefined.\n * @return {object} The parsed line.\n *\n * Warning: parameters that are undefined are not returned!\n */\nmodule.exports = function parseMultilogLine(line, options) {\n  let { hasEvent = true, flatten = false, parametersArray = false } = options;\n\n  // keep only valid characters\n  line = line.replace(/[^0-9A-F]/gi, '');\n\n  const entry = {};\n\n  if (checkCheckDigit(line)) {\n    entry.id = parseInt(`${line.substr(0, 8)}`, 16);\n    entry.epoch = parseInt(`${line.substr(8, 8)}`, 16) * 1000;\n    let parseResult = parseParameters(\n      line.substring(16, line.length - 6 - (hasEvent ? 8 : 0)),\n      options,\n    );\n    if (flatten) {\n      Object.assign(entry, parseResult.parameters);\n    } else {\n      entry.parameters = parseResult.parameters;\n    }\n    if (parametersArray) {\n      entry.parametersArray = parseResult.parametersArray;\n    }\n\n    if (hasEvent) {\n      entry.eventId = hexToInt16(line.substr(line.length - 14, 4));\n      entry.eventValue = hexToInt16(line.substr(line.length - 10, 4));\n    }\n\n    entry.deviceId = hexToInt16(line.substr(line.length - 6, 4));\n    if (!entry.deviceId) {\n      throw new Error('Could not parse device id in processMultilogLine');\n    }\n  } else {\n    debug('Check digit error', line);\n    throw new Error('Check digit error');\n  }\n  return entry;\n};\n","'use strict';\n\nconst debug = require('debug')('legoino:parser:parseMutilog');\n\nconst parseMultilogLine = require('./parseMultilogLine');\n\n/**\n * Parse a multilog string\n * @param {*} buffer\n * @param {object} [options={}]\n */\n\nmodule.exports = function parseMultiLog(buffer, options = {}) {\n  let lines = buffer.split(/[\\r\\n]+/).filter((line) => line);\n  let entries = [];\n  for (let line of lines) {\n    let entry = parseMultilogLine(line, options);\n    if (entry) entries.push(entry);\n  }\n  // Check that all entries come from the same device!!\n  if (entries.length > 0) {\n    let deviceId = entries[0].deviceId;\n    for (let i = 1; i < entries.length; i++) {\n      if (entries[i].deviceId !== deviceId) {\n        debug(\n          `checkdigit is ok but all lines did not come from the same device. There are at least 2 device ids: ${entries[0].deviceId}, ${entries[i].deviceId}`,\n        );\n        throw new Error('all lines do not have the same id');\n      }\n    }\n  }\n  return entries;\n};\n","'use strict';\n\nmodule.exports = function deviceIdNumberToString(idNumber) {\n  return (\n    String.fromCharCode((idNumber / 256) | 0) +\n    String.fromCharCode(idNumber % 256)\n  );\n};\n","'use strict';\n\nconst debug = require('debug')('legoino:parser:parseCurrentSettings');\n\nconst calculateCheckDigit = require('../util/calculateCheckDigit');\nconst checkCheckDigit = require('../util/checkCheckDigit');\nconst deviceIdNumberToString = require('../util/deviceIdNumberToString');\nconst hexToInt16 = require('../util/hexToInt16');\n\nconst parseParameters = require('./parseParameters');\n\n/**\n * Parse a current settings log.\n * @param {string} line\n * @param {object} [options={}]\n * @param {boolean} [options.flatten=false] The parsed log will have all properties at the same level (no sub-object for the parameters)\n * @param {boolean} [options.parametersArray=false] Add an array with all the parameters to the result\n * @param {boolean} [options.parameterLabel=false] Use the variable property of device info as property name\n * @param {boolean} [options.parameterInfo=false] Show all the information about the parameter in the value\n * @param {string} [options.kind=undefined] Specify a device type from those that exist in `legoino-device-information`\n * @param {object} [options.deviceInformation=undefined] Pass information for a device that does not exist in `legoino-device-information`. To use if `options.kind` is undefined.\n * @return {object} The parsed settings.\n *\n * Warning: parameters that are undefined are not returned!\n */\nmodule.exports = function parseCurrentSettings(line, options) {\n  let { flatten = false, parametersArray = false } = options;\n\n  // keep only valid characters\n  line = line.replace(/[^0-9A-F]/gi, '');\n\n  let entry = {};\n  let parseResult;\n  if (checkCheckDigit(line)) {\n    entry.epoch = parseInt(line.substring(0, 8), 16) * 1000;\n    parseResult = parseParameters(line.substring(8, line.length - 6), options);\n    entry.deviceId = hexToInt16(\n      line.substring(line.length - 6, line.length - 2),\n    );\n    entry.deviceCode = deviceIdNumberToString(entry.deviceId);\n  } else {\n    debug('Check digit error', line);\n    throw new Error(\n      `Check digit error. Should be: ${calculateCheckDigit(line).toString(16)}`,\n    );\n  }\n\n  if (flatten) {\n    Object.assign(entry, parseResult.parameters);\n  } else {\n    entry.parameters = parseResult.parameters;\n  }\n  if (parametersArray) {\n    entry.parametersArray = parseResult.parametersArray;\n  }\n  return entry;\n};\n","'use strict';\n\nmodule.exports = function labelToNumber(code) {\n  let value = 0;\n  for (let char of code) {\n    value *= 26;\n    value += char.charCodeAt(0) - 64;\n  }\n  return value - 1;\n};\n","'use strict';\n\nconst DeviceInformation = require('legoino-device-information');\n\nconst labelToNumber = require('./labelToNumber');\n\nmodule.exports = function valueToRawNumber(label, value, kind) {\n  const deviceInformation = DeviceInformation[kind];\n  return (\n    value * (deviceInformation.parameters[labelToNumber(label)].factor || 1)\n  );\n};\n","'use strict';\n\nmodule.exports = function int16ToHex(value = null) {\n  if (value > 32767 || value < -32767 || value === null) value = -32768;\n  if (value < 0) {\n    value += 65536;\n  }\n  return Number(value).toString(16).padStart(4, '0').toUpperCase();\n};\n","'use strict';\n\n/**\n * A log entry is a hexadecimal line composed of :\n * - epoch (8)\n * - a list of parameters values (n * 4)\n * - a device ID (4)\n * - a checkdigit (2)\n *\n * This means that for 26 parameters, the length of a log is 134 hexadecimal characters.\n */\n\nconst calculateCheckDigit = require('../util/calculateCheckDigit');\nconst int16ToHex = require('../util/int16ToHex');\nconst numberToLabel = require('../util/numberToLabel');\n\nmodule.exports = function createCompactLog(data = {}, numberParameters = 26) {\n  if (!data.parameters) data.parameters = [];\n  let result = '';\n  result += Number(data.epoch | 0)\n    .toString(16)\n    .padStart(8, '0');\n  for (let i = 0; i < numberParameters; i++) {\n    let label = numberToLabel(i);\n    result += int16ToHex(data.parameters[label]);\n  }\n  result += int16ToHex(data.deviceId);\n  result += calculateCheckDigit(result).toString(16).padStart(2, '0');\n  return result.toUpperCase();\n};\n","'use strict';\n\n/**\n * A log entry is a hexadecimal line composed of :\n * - a sequential ID (8)\n * - epoch (8)\n * - a list of parameters values (n * 4)\n * - a log event value (4)\n * - a device ID (4)\n * - a check digit (2)\n *\n * This means that for 26 parameters, the length of a log is 134 hexadecimal characters.\n */\n\nconst calculateCheckDigit = require('../util/calculateCheckDigit');\nconst int16ToHex = require('../util/int16ToHex');\nconst numberToLabel = require('../util/numberToLabel');\n\nmodule.exports = function createCompactLog(data = {}, numberParameters = 26) {\n  if (!data.parameters) data.parameters = [];\n  let result = '';\n  result += Number(data.id | 0)\n    .toString(16)\n    .padStart(8, '0');\n  result += Number(data.epoch | 0)\n    .toString(16)\n    .padStart(8, '0');\n  for (let i = 0; i < numberParameters; i++) {\n    let label = numberToLabel(i);\n    result += int16ToHex(data.parameters[label]);\n  }\n  result += int16ToHex(data.eventId);\n  result += int16ToHex(data.eventValue);\n  result += int16ToHex(data.deviceId);\n  result += calculateCheckDigit(result).toString(16).padStart(2, '0');\n  return result.toUpperCase();\n};\n","'use strict';\n\nmodule.exports = {\n  parseMultilog: require('./parser/parseMultilog'),\n  parseMultilogLine: require('./parser/parseMultilogLine'),\n  parseCurrentSettings: require('./parser/parseCurrentSettings'),\n  deviceIdNumberToString: require('./util/deviceIdNumberToString'),\n  deviceIdStringToNumber: require('./util/deviceIdStringToNumber'),\n  calculateCheckDigit: require('./util/calculateCheckDigit'),\n  valueToRawNumber: require('./util/valueToRawNumber'),\n  createCompactLog: require('./creator/createCompactLog'),\n  createMultiLog: require('./creator/createMultiLog'),\n  DevicesInfo: require('legoino-device-information'),\n  labelToNumber: require('./util/labelToNumber'),\n  numberToLabel: require('./util/numberToLabel'),\n};\n","'use strict';\n\nmodule.exports = function deviceIdStringToNumber(idString) {\n  if (idString === undefined) return undefined;\n\n  if (idString.length === 2) {\n    return idString.charCodeAt(0) * 256 + idString.charCodeAt(1);\n  } else {\n    throw new Error('Id does not have the expected 2 char format');\n  }\n  // return idString;\n};\n"],"names":["s","m","h","d","w","y","ms","val","options","type","length","str","String","match","exec","n","parseFloat","toLowerCase","parse","isFinite","long","msAbs","Math","abs","plural","fmtLong","round","fmtShort","Error","JSON","stringify","name","isPlural","common","env","createDebug","namespace","prevTime","namespacesCache","enabledCache","enableOverride","debug","_len","arguments","args","Array","_key","enabled","self","curr","Number","Date","diff","prev","coerce","unshift","index","replace","format","formatter","formatters","call","splice","formatArgs","logFn","log","apply","useColors","color","selectColor","extend","destroy","Object","defineProperty","enumerable","configurable","get","namespaces","set","v","init","delimiter","newDebug","this","toNamespace","regexp","toString","substring","default","stack","message","disable","names","map","skips","join","enable","i","save","split","len","push","RegExp","slice","test","humanize","require$$0","console","warn","keys","forEach","key","hash","charCodeAt","colors","load","exports","module","c","lastC","storage","setItem","removeItem","error","r","getItem","process","DEBUG","window","__nwjs","navigator","userAgent","document","documentElement","style","WebkitAppearance","firebug","exception","table","parseInt","$1","localStorage","localstorage","warned","j","calculateCheckDigit","hexString","checkDigit","checkCheckDigit","line","hexToInt16","hexa","value","labelToNumber","code","char","OpenBio6","kind","description","url","id","numberParameters","numberLogParameters","parameters","label","variable","factor","unit","writable","flags","events","ensureAllParameters","device","existingParameters","currentPosition","parameter","labelPosition","undefined","devices","OpenBio","pcbProbe","bit","liquidProbe","pcbTemperature","liquidTemperature","targetTemperature","weight","stepper","food","pid","sedimentation","filling","emptying","min","max","require$$2","OpenSpectro","SimpleSpectro","Solar2015","Beemos","Computer","fromDeviceID","fromCharCode","ldength","firstCharacter","src","numberToLabel","floor","DeviceInformation","require$$1","parseParameters","buffer","parameterLabel","parameterInfo","flagInfo","deviceInformation","parametersArray","valueNumber","assign","originalValue","require$$3","parseMultilogLine","hasEvent","flatten","entry","substr","epoch","parseResult","eventId","eventValue","deviceId","deviceIdNumberToString","idNumber","require$$4","require$$5","int16ToHex","padStart","toUpperCase","parseMultilog","lines","filter","entries","parseCurrentSettings","deviceCode","deviceIdStringToNumber","idString","valueToRawNumber","createCompactLog","data","result","createMultiLog","DevicesInfo","require$$9","require$$10","require$$11"],"mappings":"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"}