{"version":3,"sources":["jsdelivr-header.js","/npm/brickpi-coffeescript@0.1.0/lib/brickpi/BrickPi.js"],"names":[],"mappings":"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","file":"/npm/brickpi-coffeescript@0.1.0/lib/brickpi/BrickPi.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/brickpi-coffeescript@0.1.0/lib/brickpi/BrickPi.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// Generated by CoffeeScript 1.7.0\n(function() {\n  var BIT_I2C_MID, BIT_I2C_SAME, BYTE_MSG_TYPE, BYTE_NEW_ADDRESS, BYTE_SENSOR_1_TYPE, BYTE_SENSOR_2_TYPE, BYTE_TIMEOUT, BrickPi, BrickPiError, INDEX_BLANK, INDEX_BLUE, INDEX_GREEN, INDEX_RED, MASK_9V, MASK_D0_M, MASK_D0_S, MASK_D1_M, MASK_D1_S, MSG_TYPE_CHANGE_ADDR, MSG_TYPE_E_STOP, MSG_TYPE_SENSOR_TYPE, MSG_TYPE_TIMEOUT_SETTINGS, MSG_TYPE_VALUES, PORT_1, PORT_2, PORT_3, PORT_4, PORT_A, PORT_B, PORT_C, PORT_D, Promise, SerialPort, SerialPortError, TYPE_MOTOR_POSITION, TYPE_MOTOR_PWM, TYPE_MOTOR_SPEED, TYPE_SENSOR_COLOR_BLUE, TYPE_SENSOR_COLOR_FULL, TYPE_SENSOR_COLOR_GREEN, TYPE_SENSOR_COLOR_NONE, TYPE_SENSOR_COLOR_RED, TYPE_SENSOR_I2C, TYPE_SENSOR_I2C_9V, TYPE_SENSOR_LIGHT_OFF, TYPE_SENSOR_LIGHT_ON, TYPE_SENSOR_RAW, TYPE_SENSOR_RCX_LIGHT, TYPE_SENSOR_TOUCH, TYPE_SENSOR_ULTRASONIC_CONT, TYPE_SENSOR_ULTRASONIC_SS, clamp, limit, replicate, sign, sum, _ref,\n    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n  SerialPort = require('serialport').SerialPort;\n\n  Promise = require('bluebird');\n\n  BrickPiError = require('./BrickPiError');\n\n  SerialPortError = require('./SerialPortError');\n\n  _ref = require('./utils'), replicate = _ref.replicate, sum = _ref.sum, clamp = _ref.clamp, sign = _ref.sign, limit = _ref.limit;\n\n  PORT_A = 0;\n\n  PORT_B = 1;\n\n  PORT_C = 2;\n\n  PORT_D = 3;\n\n  PORT_1 = 0;\n\n  PORT_2 = 1;\n\n  PORT_3 = 2;\n\n  PORT_4 = 3;\n\n  MASK_D0_M = 0x01;\n\n  MASK_D1_M = 0x02;\n\n  MASK_9V = 0x04;\n\n  MASK_D0_S = 0x08;\n\n  MASK_D1_S = 0x10;\n\n  BYTE_MSG_TYPE = 0;\n\n  MSG_TYPE_CHANGE_ADDR = 1;\n\n  MSG_TYPE_SENSOR_TYPE = 2;\n\n  MSG_TYPE_VALUES = 3;\n\n  MSG_TYPE_E_STOP = 4;\n\n  MSG_TYPE_TIMEOUT_SETTINGS = 5;\n\n  BYTE_NEW_ADDRESS = 1;\n\n  BYTE_SENSOR_1_TYPE = 1;\n\n  BYTE_SENSOR_2_TYPE = 2;\n\n  BYTE_TIMEOUT = 1;\n\n  TYPE_MOTOR_PWM = 0;\n\n  TYPE_MOTOR_SPEED = 1;\n\n  TYPE_MOTOR_POSITION = 2;\n\n  TYPE_SENSOR_RAW = 0;\n\n  TYPE_SENSOR_LIGHT_OFF = 0;\n\n  TYPE_SENSOR_LIGHT_ON = MASK_D0_M | MASK_D0_S;\n\n  TYPE_SENSOR_TOUCH = 32;\n\n  TYPE_SENSOR_ULTRASONIC_CONT = 33;\n\n  TYPE_SENSOR_ULTRASONIC_SS = 34;\n\n  TYPE_SENSOR_RCX_LIGHT = 35;\n\n  TYPE_SENSOR_COLOR_FULL = 36;\n\n  TYPE_SENSOR_COLOR_RED = 37;\n\n  TYPE_SENSOR_COLOR_GREEN = 38;\n\n  TYPE_SENSOR_COLOR_BLUE = 39;\n\n  TYPE_SENSOR_COLOR_NONE = 40;\n\n  TYPE_SENSOR_I2C = 41;\n\n  TYPE_SENSOR_I2C_9V = 42;\n\n  BIT_I2C_MID = 0x01;\n\n  BIT_I2C_SAME = 0x02;\n\n  INDEX_RED = 0;\n\n  INDEX_GREEN = 1;\n\n  INDEX_BLUE = 2;\n\n  INDEX_BLANK = 3;\n\n  module.exports = BrickPi = (function() {\n    function BrickPi() {\n      this._handleDataReceived = __bind(this._handleDataReceived, this);\n      var _i, _j, _k, _l, _m, _n, _o, _p, _q;\n      this.address = [1, 2];\n      this.timeout = 0;\n      this.motorSpeed = replicate(0, 4);\n      this.motorEnable = replicate(0, 4);\n      this.encoderOffset = Array(4);\n      this.encoder = Array(4);\n      this.sensor = Array(4);\n      for (_i = 1; _i <= 4; _i++) {\n        this.sensorArray = Array(4);\n      }\n      this.sensorType = replicate(0, 4);\n      for (_j = 1; _j <= 4; _j++) {\n        this.sensorSettings = Array(8);\n      }\n      this.sensorI2CDevices = Array(4);\n      this.sensorI2CSpeed = Array(4);\n      for (_k = 1; _k <= 4; _k++) {\n        this.sensorI2CAddr = Array(8);\n      }\n      for (_l = 1; _l <= 4; _l++) {\n        this.sensorI2CWrite = Array(8);\n      }\n      for (_m = 1; _m <= 4; _m++) {\n        this.sensorI2CRead = Array(8);\n      }\n      for (_n = 1; _n <= 4; _n++) {\n        for (_o = 1; _o <= 8; _o++) {\n          this.sensorI2COut = Array(16);\n        }\n      }\n      for (_p = 1; _p <= 4; _p++) {\n        for (_q = 1; _q <= 8; _q++) {\n          this.sensorI2CIn = Array(16);\n        }\n      }\n      this.zeroFlags();\n      this.retried = 0;\n      this.serialPort = Promise.promisifyAll(new SerialPort('/dev/ttyAMA0', {\n        baudrate: 500000\n      }, false));\n      this.receiveBuffer = [];\n    }\n\n    BrickPi.prototype.zeroFlags = function() {\n      this.flags = replicate(0, 256);\n      return this.bitOffset = 0;\n    };\n\n    BrickPi.prototype.setFlags = function(inputFlags) {\n      var flag, i, _i, _len, _results;\n      _results = [];\n      for (i = _i = 0, _len = inputFlags.length; _i < _len; i = ++_i) {\n        flag = inputFlags[i];\n        _results.push(this.flags[i] = flag);\n      }\n      return _results;\n    };\n\n    BrickPi.prototype.changeAddress = function(oldAddress, newAddress) {\n      this.flags[BYTE_MSG_TYPE] = MSG_TYPE_CHANGE_ADDR;\n      this.flags[BYTE_NEW_ADDRESS] = newAddress;\n      return this.send(oldAddress, 2, this.flags).then((function(_this) {\n        return function() {\n          return _this.receive(5);\n        };\n      })(this)).then((function(_this) {\n        return function(inputflags) {\n          if (!(inputflags.length === 1 && _this.flags[BYTE_MSG_TYPE] === MSG_TYPE_CHANGE_ADDR)) {\n            throw new BrickPiError(\"Incorrect message received while changing address\");\n          }\n          return _this.setFlags(inputFlags);\n        };\n      })(this));\n    };\n\n    BrickPi.prototype._getBits = function(byteOffset, bitOffset, bits) {\n      var i, offset, result, _i;\n      result = 0;\n      for (i = _i = bits; bits <= 0 ? _i < 0 : _i > 0; i = bits <= 0 ? ++_i : --_i) {\n        result <<= 1;\n        offset = bitOffset + this.bitOffset + i - 1;\n        result |= this.flags[byteOffset + Math.floor(offset / 8)] >> (offset % 8) & 0x01;\n      }\n      this.bitOffset += bits;\n      return result;\n    };\n\n    BrickPi.prototype._addBits = function(byteOffset, bitOffset, bits, value) {\n      var i, offset, _i;\n      for (i = _i = 0; 0 <= bits ? _i < bits : _i > bits; i = 0 <= bits ? ++_i : --_i) {\n        if (value & 0x01) {\n          offset = bitOffset + this.bitOffset + i;\n          this.flags[byteOffset + Math.floor(offset / 8)] |= 0x01 << (offset % 8);\n        }\n        value = Math.floor(value / 2);\n      }\n      return this.bitOffset += bits;\n    };\n\n    BrickPi.prototype._bitsNeeded = function(value) {\n      var i, _i;\n      for (i = _i = 0; _i < 32; i = ++_i) {\n        if (value === 0) {\n          break;\n        }\n        value = Math.floor(value / 2);\n      }\n      return i;\n    };\n\n    BrickPi.prototype._readBits = function(bits) {\n      return this._getBits(1, 0, bits);\n    };\n\n    BrickPi.prototype.setupSensors = function() {\n      var device, i, j, messageLength, out_byte, port, sensorTypeFlag, _i, _j, _k, _l, _len, _len1, _ref1, _ref2, _ref3, _ref4, _results;\n      _ref1 = [0, 1];\n      _results = [];\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        i = _ref1[_i];\n        this.zeroFlags();\n        this.flags[BYTE_MSG_TYPE] = MSG_TYPE_SENSOR_TYPE;\n        this.flags[BYTE_SENSOR_1_TYPE] = this.sensorType[PORT_1 + i * 2];\n        this.flags[BYTE_SENSOR_2_TYPE] = this.sensorType[PORT_2 + i * 2];\n        _ref2 = [0, 1];\n        for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {\n          j = _ref2[_j];\n          port = i * 2 + j;\n          sensorTypeFlag = this.flags[BYTE_SENSOR_1_TYPE + j];\n          if (sensorTypeFlag === TYPE_SENSOR_I2C || sensorTypeFlag === TYPE_SENSOR_I2C_9V) {\n            this._addBits(3, 0, 8, this.sensorI2CSpeed[port]);\n            clamp(this.sensorI2CDevices, port, 1, 8);\n            this._addBits(3, 0, 3, this.sensorI2CDevices[port] - 1);\n            for (device = _k = 0, _ref3 = this.sensorI2CDevices[port]; 0 <= _ref3 ? _k < _ref3 : _k > _ref3; device = 0 <= _ref3 ? ++_k : --_k) {\n              this._addBits(3, 0, 7, this.sensorI2CAddr[port][device] >> 1);\n              this._addBits(3, 0, 2, this.sensorSettings[port][device]);\n              if (this.sensorSettings[port][device] & BIT_I2C_SAME) {\n                this._addBits(3, 0, 4, this.sensorI2CWrite[port][device]);\n                this._addBits(3, 0, 4, this.sensorI2CRead[port][device]);\n                for (out_byte = _l = 0, _ref4 = this.sensorI2CWrite[port][device]; 0 <= _ref4 ? _l < _ref4 : _l > _ref4; out_byte = 0 <= _ref4 ? ++_l : --_l) {\n                  this._addBits(3, 0, 8, this.sensorI2COut[port][device][out_byte]);\n                }\n              }\n            }\n          }\n        }\n        messageLength = Math.floor((this.bitOffset + 7) / 8) + 3;\n        _results.push(this.send(this.address[i], messageLength, this.flags).then((function(_this) {\n          return function() {\n            return _this.receive(500);\n          };\n        })(this)).then((function(_this) {\n          return function(inputflags) {\n            if (!(inputflags.length === 1 && _this.flags[BYTE_MSG_TYPE] === MSG_TYPE_SENSOR_TYPE)) {\n              throw new BrickPiError(\"Incorrect message received while changing address\");\n            }\n            return _this.setFlags(inputFlags);\n          };\n        })(this)));\n      }\n      return _results;\n    };\n\n    BrickPi.prototype._speedVector = function(speed) {\n      var direction, _ref1;\n      _ref1 = sign(speed), direction = _ref1[0], speed = _ref1[1];\n      return [direction, limit(speed, 255)];\n    };\n\n    BrickPi.prototype.updateValues = function() {\n      var device, direction, i, j, messageLength, out_byte, port, ret, speed, tempBitsNeeded, tempEncoderDirection, tempValue, _i, _j, _k, _l, _len, _len1, _len2, _len3, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _results;\n      ret = false;\n      _ref1 = [0, 1];\n      _results = [];\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        i = _ref1[_i];\n        if (!ret) {\n          this.retried = 0;\n        }\n        this.zeroFlags();\n        this.flags[BYTE_MSG_TYPE] = MSG_TYPE_VALUES;\n        _ref2 = [0, 1];\n        for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {\n          j = _ref2[_j];\n          port = i * 2 + j;\n          if (this.encoderOffset[port]) {\n            this._addBits(1, 0, 1, 1);\n            _ref3 = sign(this.encoderOffset[port]), tempEncoderDirection = _ref3[0], tempValue = _ref3[1];\n            tempBitsNeeded = this._bitsNeeded(tempValue) + 1;\n            this._addBits(1, 0, 5, tempBitsNeeded);\n            this._addBits(1, 0, tempBitsNeeded, tempValue << 1 | tempEncoderDirection);\n          } else {\n            this._addBits(1, 0, 1, 0);\n          }\n        }\n        _ref4 = [0, 1];\n        for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {\n          j = _ref4[_k];\n          port = i * 2 + j;\n          _ref5 = _speedVector(this.motorSpeed[port]), direction = _ref5[0], speed = _ref5[1];\n          this._addBits(1, 0, 10, speed << 2 | direction << 1 | this.motorEnable[port]);\n        }\n        _ref6 = [0, 1];\n        for (_l = 0, _len3 = _ref6.length; _l < _len3; _l++) {\n          j = _ref6[_l];\n          port = i * 2 + j;\n          if ((_ref7 = this.sensorType[port]) === TYPE_SENSOR_I2C || _ref7 === TYPE_SENSOR_I2C_9V) {\n            for (device = _m = 0, _ref8 = this.sensorI2CDevices[port]; 0 <= _ref8 ? _m < _ref8 : _m > _ref8; device = 0 <= _ref8 ? ++_m : --_m) {\n              if (!(this.sensorSettings[port][device] & BIT_I2C_SAME)) {\n                this._addBits(1, 0, 4, this.sensorI2CWrite[port][device]);\n                this._addBits(1, 0, 4, this.sensorI2CRead[port][device]);\n                for (out_byte = _n = 0, _ref9 = this.sensorI2CWrite[port][device]; 0 <= _ref9 ? _n < _ref9 : _n > _ref9; out_byte = 0 <= _ref9 ? ++_n : --_n) {\n                  this._addBits(1, 0, 8, this.sensorI2COut[port][device][out_byte]);\n                }\n              }\n              device += 1;\n            }\n          }\n        }\n        messageLength = Math.floor((this.bitOffset + 7) / 8) + 1;\n        _results.push(this.send(this.address[i], messageLength, this.flags).then((function(_this) {\n          return function() {\n            return _this.receive(8);\n          };\n        })(this)).then(function(inputFlags) {\n          this.setFlags(inputFlags);\n          this.encoderOffset[i * 2 + PORT_A] = 0;\n          this.encoderOffset[i * 2 + PORT_B] = 0;\n          if (this.flags[BYTE_MSG_TYPE] !== MSG_TYPE_VALUES) {\n            throw new SerialPortError(\"Incorrect returned message type\");\n          }\n        })[\"catch\"](SerialPortError, (function(_this) {\n          return function() {\n            if (_this.retried < 2) {\n              ret = true;\n              return _this.retried++;\n            } else {\n              throw new BrickPiError(\"Failed retry\");\n            }\n          };\n        })(this)).then((function(_this) {\n          return function() {\n            var colorSensorValues, in_byte, sensorType, tempBitsUsed, tempEncoderVal, _len4, _len5, _o, _p, _ref10, _ref11, _results1;\n            ret = false;\n            _this.bitOffset = 0;\n            tempBitsUsed = [];\n            tempBitsUsed.append(_this._readBits(5));\n            tempBitsUsed.append(_this._readBits(5));\n            _ref10 = [0, 1];\n            for (_o = 0, _len4 = _ref10.length; _o < _len4; _o++) {\n              j = _ref10[_o];\n              tempEncoderVal = _this._readBits(tempBitsUsed[j]);\n              direction = tempEncoderVal & 0x01 ? -1 : 1;\n              _this.encoder[j + i * 2] = direction * (Math.floor(tempEncoderVal / 2));\n            }\n            _ref11 = [0, 1];\n            _results1 = [];\n            for (_p = 0, _len5 = _ref11.length; _p < _len5; _p++) {\n              j = _ref11[_p];\n              port = j + i * 2;\n              sensorType = _this.sensorType[port];\n              if (sensorType === TYPE_SENSOR_TOUCH) {\n                _results1.push(_this.sensor[port] = _this._readBits(1));\n              } else if (sensorType === TYPE_SENSOR_ULTRASONIC_CONT || sensorType === TYPE_SENSOR_ULTRASONIC_SS) {\n                _results1.push(_this.sensor[port] = _this._readBits(8));\n              } else if (sensorType === TYPE_SENSOR_COLOR_FULL) {\n                _this.sensor[port] = _this._readBits(3);\n                colorSensorValues = _this.sensorArray[port];\n                colorSensorValues[INDEX_BLANK] = _this._readBits(10);\n                colorSensorValues[INDEX_RED] = _this._readBits(10);\n                colorSensorValues[INDEX_GREEN] = _this._readBits(10);\n                _results1.push(colorSensorValues[INDEX_BLUE] = _this._readBits(10));\n              } else if (sensorType === TYPE_SENSOR_I2C || sensorType === TYPE_SENSOR_I2C_9V) {\n                _this.sensor[port] = _this._readBits(_this.sensorI2CDevices[port]);\n                _results1.push((function() {\n                  var _q, _ref12, _results2;\n                  _results2 = [];\n                  for (device = _q = 0, _ref12 = this.sensorI2CDevices[port]; 0 <= _ref12 ? _q < _ref12 : _q > _ref12; device = 0 <= _ref12 ? ++_q : --_q) {\n                    if (this.sensor[port] & 0x01 << device) {\n                      _results2.push((function() {\n                        var _r, _ref13, _results3;\n                        _results3 = [];\n                        for (in_byte = _r = 0, _ref13 = this.sensorI2CRead[port][device]; 0 <= _ref13 ? _r < _ref13 : _r > _ref13; in_byte = 0 <= _ref13 ? ++_r : --_r) {\n                          _results3.push(this.sensorI2CIn[port][device][in_byte] = this._readBits(8));\n                        }\n                        return _results3;\n                      }).call(this));\n                    } else {\n                      _results2.push(void 0);\n                    }\n                  }\n                  return _results2;\n                }).call(_this));\n              } else {\n                _results1.push(_this.sensor[j + i * 2] = _this._readBits(10));\n              }\n            }\n            return _results1;\n          };\n        })(this)));\n      }\n      return _results;\n    };\n\n    BrickPi.prototype.setup = function() {\n      this.serialPort.on('error', function(error) {\n        return console.log(\"Serial port error: \" + error);\n      });\n      this.serialPort.on('close', function() {\n        return console.log(\"Serial port closed\");\n      });\n      this.serialPort.on('data', this._handleDataReceived);\n      return this.serialPort.openAsync();\n    };\n\n    BrickPi.prototype.destroy = function() {\n      return this.serialPort.closeAsync();\n    };\n\n    BrickPi.prototype.checksum = function(data, dest) {\n      if (dest == null) {\n        dest = 0;\n      }\n      return (dest + data.length + sum(data)) % 256;\n    };\n\n    BrickPi.prototype.send = function(dest, byteCount, outputFlags) {\n      var checksum, trimmedOutputFlags;\n      trimmedOutputFlags = outputFlags.slice(0, byteCount);\n      checksum = this.checksum(trimmedOutputFlags, dest);\n      return this.serialPort.writeAsync([dest, checksum, byteCount].concat(trimmedOutputFlags)).then(this.serialPort.drainAsync());\n    };\n\n    BrickPi.prototype.receive = function(timeout) {\n      return new Promise((function(_this) {\n        return function(resolve, reject) {\n          var buffer, start;\n          start = +(new Date);\n          buffer = [];\n          return _this.serialPort.on('data', function(data) {\n            var i, inputFlags, _i, _len;\n            if (+(new Date) - timeout > start) {\n              reject(new SerialPortError(\"Timeout\"));\n            }\n            for (_i = 0, _len = data.length; _i < _len; _i++) {\n              i = data[_i];\n              buffer.push(i);\n            }\n            if (buffer.length >= buffer[1]) {\n              inputFlags = buffer.slice(2);\n              if (buffer[0] !== _this.checksum(inputFlags)) {\n                reject(new SerialPortError(\"Corrupted data\"));\n              }\n              return resolve(inputFlags);\n            }\n          });\n        };\n      })(this));\n    };\n\n    BrickPi.prototype._handleDataReceived = function(data) {\n      var i, _i, _len, _results;\n      _results = [];\n      for (_i = 0, _len = data.length; _i < _len; _i++) {\n        i = data[_i];\n        _results.push(this.receiveBuffer.push(i));\n      }\n      return _results;\n    };\n\n    return BrickPi;\n\n  })();\n\n  module.exports = {\n    BrickPi: BrickPi,\n    PORT_A: PORT_A,\n    PORT_B: PORT_B\n  };\n\n}).call(this);\n"]}