{"version":3,"sources":["webpack:///./src/examples/sensor-tag.tsx","webpack:///./src/models/sensor-tag-manager.ts"],"names":[],"mappings":"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","file":"examples/sensor-tag.js","sourcesContent":["import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { App } from \"../components/app\";\nimport { SensorTagManager } from \"../models/sensor-tag-manager\";\n\nlet sensorManager = new SensorTagManager();\n\n// We should add the connect button above the App\n// Button was: className=\"zero-button side-panel-item\"\nReactDOM.render(\n ,\n document.getElementById(\"app\")\n);\n\n\n\n// WEBPACK FOOTER //\n// ./src/examples/sensor-tag.tsx","import { SensorConfiguration } from \"./sensor-configuration\";\nimport { SensorManager,\n NewSensorData, ConnectableSensorManager } from \"./sensor-manager\";\nimport { ISensorConfig } from \"./sensor-connector-interface\";\nimport { cloneDeep } from \"lodash\";\n\nconst tagIdentifier = 0xaa80;\ninterface ISensorAddrs {\n service: string;\n data: string;\n config: string;\n}\n\nconst tagAddrs: { [index:string] : ISensorAddrs } = {\n luxometer: {\n service: 'f000aa70-0451-4000-b000-000000000000',\n data: 'f000aa71-0451-4000-b000-000000000000',\n config: 'f000aa72-0451-4000-b000-000000000000'\n },\n humidity: {\n service: 'f000aa20-0451-4000-b000-000000000000',\n data: 'f000aa21-0451-4000-b000-000000000000', // TempLSB:TempMSB:HumidityLSB:HumidityMSB\n config: 'f000aa22-0451-4000-b000-000000000000'\n },\n IRTemperature: {\n service: 'f000aa00-0451-4000-b000-000000000000',\n data: 'f000aa01-0451-4000-b000-000000000000', // ObjectLSB:ObjectMSB:AmbientLSB:AmbientMSB\n config: 'f000aa02-0451-4000-b000-000000000000'\n },\n IO: {\n service: 'f000aa64-0451-4000-b000-000000000000',\n data: 'f000aa65-0451-4000-b000-000000000000',\n config: 'f000aa66-0451-4000-b000-000000000000'\n }\n};\n\n// http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User%27s_Guide\nconst IR_SCALE_LSB = 0.03125;\n\nconst sensorDescriptions = {\n luxometer: {\n sensorName: \"luxometer\",\n values: [\n {\n columnID: \"101\",\n convertFunct: (byteArray:DataView) => {\n const rawData = byteArray.getUint16(0, true),\n m = rawData & 0x0FFF;\n let e = (rawData & 0xF000) >> 12;\n\n /** e on 4 bits stored in a 16 bit unsigned => it can store 2 << (e - 1) with e < 16 */\n e = (e == 0) ? 1 : 2 << (e - 1);\n\n return m * (0.01 * e);\n }\n }\n ]\n },\n IRTemperature: {\n sensorName: \"IRTemperature\",\n values: [\n {\n columnID: \"102\", // ambient\n convertFunct: (byteArray: DataView) => {\n const rawTemp = byteArray.getUint16(2, true);\n return (rawTemp >> 2) * IR_SCALE_LSB;\n }\n },\n {\n columnID: \"103\", // object temperature\n convertFunct: (byteArray: DataView) => {\n const rawTemp = byteArray.getUint16(0, true);\n return (rawTemp >> 2) * IR_SCALE_LSB;\n }\n }\n ]\n },\n humidity: {\n sensorName: \"humidity\",\n values: [\n {\n columnID: \"104\", // humidity\n convertFunct: (byteArray: DataView) => {\n let rawHum = byteArray.getUint16(2, true);\n rawHum &= ~0x0003; // remove status bits\n return (rawHum / 65536)*100;\n }\n },\n {\n columnID: \"105\", // ambient temperature\n convertFunct: (byteArray: DataView) => {\n const rawTemp = byteArray.getInt16(0, true);\n return (rawTemp / 65536)*165 - 40;\n }\n }\n ]\n }\n}\n\n// Helper function for debugging\nfunction toPaddedHexString(num:number) : string {\n let str = num.toString(16);\n return \"0\".repeat(2 - str.length) + str;\n}\n\nexport class SensorTagManager extends SensorManager implements ConnectableSensorManager {\n supportsDualCollection = false;\n\n private sensorConfig: SensorConfiguration;\n private internalConfig: ISensorConfig;\n private hasData: boolean = false;\n private stopRequested: boolean = false;\n private device: any;\n private server: any;\n\n constructor() {\n super();\n\n // create fake SensorConfiguration\n // This should be improved, we don't need all of these properties when making\n // a new sensor manager. The SensorConfiguration class could be have an\n // interface so then sensor managers can provide their own implementation\n this.internalConfig = {\n collection:{ canControl:true, isCollecting:false },\n columnListTimeStamp: new Date(),\n columns:{\n \"100\": {\n id: \"100\",\n setID: \"100\",\n position: 0,\n name: \"Time\",\n units: \"s\",\n liveValue: \"NaN\",\n liveValueTimeStamp: new Date(),\n valueCount: 0,\n valuesTimeStamp: new Date()\n },\n \"101\": {\n id: \"101\",\n setID: \"100\",\n position: 1,\n name: \"Light\",\n units: \"lux\",\n liveValue: \"NaN\",\n liveValueTimeStamp: new Date(),\n valueCount: 0,\n valuesTimeStamp: new Date()\n },\n \"102\": {\n id: \"102\",\n setID: \"100\",\n position: 1,\n name: \"Temperature\",\n units: \"degC\",\n liveValue: \"NaN\",\n liveValueTimeStamp: new Date(),\n valueCount: 0,\n valuesTimeStamp: new Date()\n },\n \"103\": {\n id: \"103\",\n setID: \"100\",\n position: 1,\n name: \"IR Temperature\",\n units: \"degC\",\n liveValue: \"NaN\",\n liveValueTimeStamp: new Date(),\n valueCount: 0,\n valuesTimeStamp: new Date()\n },\n \"104\": {\n id: \"104\",\n setID: \"100\",\n position: 1,\n name: \"Humidity\",\n units: \"%RH\",\n liveValue: \"NaN\",\n liveValueTimeStamp: new Date(),\n valueCount: 0,\n valuesTimeStamp: new Date()\n },\n \"105\": {\n id: \"105\",\n setID: \"100\",\n position: 1,\n name: \"Temperature\",\n units: \"degC\",\n liveValue: \"NaN\",\n liveValueTimeStamp: new Date(),\n valueCount: 0,\n valuesTimeStamp: new Date()\n }\n },\n currentInterface: \"SensorTag\",\n currentState: \"unknown\",\n os: { name: \"Fake\", version: \"1.0.0\"},\n requestTimeStamp: new Date(),\n server: { arch: \"Fake\", version: \"1.0.0\" },\n sessionDesc: \"Fake\",\n sessionID: \"1234\",\n sets:{\n \"100\": {\n name: \"Run 1\",\n // colIDs: [100, 102, 103]\n // colIDs: [100, 101]\n colIDs: [100, 104, 105]\n }\n }\n };\n this.sensorConfig = new SensorConfiguration(this.internalConfig);\n }\n\n sendSensorConfig(includeOnConnect:boolean) {\n let sensorConfig = new SensorConfiguration(this.internalConfig);\n if(includeOnConnect) {\n this.onSensorConnect(sensorConfig);\n }\n this.onSensorStatus(sensorConfig);\n }\n\n startPolling() {\n setTimeout(() => {\n this.sendSensorConfig(true);\n }, 10);\n setInterval(() => {\n // resend the sensorConfig so we will know if the device is disconnected\n // This could be smarter if it keeps track of which sensors have been\n // enabled on the device\n this.sendSensorConfig(false);\n }, 1000);\n }\n\n hasSensorData() {\n return this.hasData;\n }\n\n requestStart() {\n // cloneDeep is used because we are saving the dataCharacteristic on this object\n // and that will change after the device is disconnected and reconnected\n\n // const activeSensors = [ cloneDeep(sensorDescriptions.IRTemperature) ];\n // const activeSensors = [ cloneDeep(sensorDescriptions.luxometer) ];\n const activeSensors = [ cloneDeep(sensorDescriptions.humidity) ];\n\n // For each one get its valueCharacteristic\n activeSensors.forEach((sensor) => {\n this.setupSensor(sensor);\n });\n\n let startCollectionTime = Date.now();\n\n const readData = async () => {\n // collect all of the promises\n const readSensorPromises = activeSensors.map((sensor) => {\n return this.readSensor(startCollectionTime, sensor);\n });\n\n // wait for all active sensors to be read\n await Promise.all(readSensorPromises);\n\n if(!this.stopRequested) {\n // Repeat\n setTimeout(readData, 10);\n } else {\n this.onSensorCollectionStopped();\n this.stopRequested = false;\n }\n }\n\n readData();\n }\n\n printByteArray(byteArray:DataView) {\n let hex:string = \"\";\n for(let i=0; i < byteArray.byteLength; i++) {\n hex += toPaddedHexString(byteArray.getUint8(i));\n }\n console.log(`read bytes: ${hex}`);\n }\n\n async readSensor(startCollectionTime:number, sensor:any) {\n if(!sensor.dataCharacteristic) {\n // The dataCharacteristic hasn't been setup yet\n return;\n }\n\n // Step 7: Read bytes\n const byteArray = await sensor.dataCharacteristic.readValue();\n this.printByteArray(byteArray);\n\n const time = Date.now() - startCollectionTime;\n\n sensor.values.forEach((valueDesc:any) => {\n // Step 8: convert value and notify listeners\n // This would be better if the SensorManager interface supported\n // the ability to send multiple values for a single time value\n this.updateSensorValue(valueDesc.columnID, time / 1000,\n valueDesc.convertFunct(byteArray));\n });\n }\n\n requestStop() {\n this.stopRequested = true;\n }\n\n async connectToDevice() {\n // Step 1: ask for a device\n this.device = await navigator.bluetooth.requestDevice({\n filters: [{ services: [tagIdentifier] }],\n optionalServices: [tagAddrs.luxometer.service,\n tagAddrs.humidity.service,\n tagAddrs.IRTemperature.service,\n tagAddrs.IO.service]\n });\n // Step 2: Connect to device\n this.server = await this.device.gatt.connect();\n\n // Resend the sensorconfig so the UI udpates after the connection\n this.sendSensorConfig(true);\n\n // Make the green led go solid so we know we are connected\n this.turnOnGreenLED();\n }\n\n async turnOnGreenLED() {\n if(!this.server) {\n return;\n }\n\n // Get the IO service\n const service =\n await this.server.getPrimaryService(tagAddrs.IO.service);\n\n // The order is important, by default the data value is 0x7F which\n // is enables flashing lights and beep. Not fun!\n // So we set the data first before turning on remote control\n\n // Set data so the green led will turn on when remote control is set\n const dataChar =\n await service.getCharacteristic(tagAddrs.IO.data);\n await dataChar.writeValue(new Uint8Array([0x02]));\n\n // Enable Remote IO control\n const configChar =\n await service.getCharacteristic(tagAddrs.IO.config);\n await configChar.writeValue(new Uint8Array([0x01]));\n }\n\n get deviceConnected() {\n if(!this.device) {\n return false\n }\n return this.device.gatt.connected;\n }\n\n async disconnectFromDevice() {\n if(!this.deviceConnected){\n return;\n }\n\n await this.device.gatt.disconnect();\n\n // Resend the sensorconfig so the UI udpates after the disconnection\n this.sendSensorConfig(true);\n }\n\n updateSensorValue(ID:string, time:number, value:number) {\n this.internalConfig.columns[ID].liveValue = value.toString();\n this.hasData = true;\n\n this.onSensorStatus(new SensorConfiguration(this.internalConfig));\n const data:NewSensorData = {};\n data[ID] = [[time, value]];\n this.onSensorData(data);\n }\n\n async setupSensor(sensorDescription:any) {\n const sensorAddrs = tagAddrs[sensorDescription.sensorName];\n\n // Step 3: Get the Service\n const service = await this.server.getPrimaryService(sensorAddrs.service);\n\n // Step 4: Enable Sensor\n const configChar = await service.getCharacteristic(sensorAddrs.config);\n await configChar.writeValue(new Uint8Array([0x01]));\n\n // Step 5: Get and save data characteristic\n sensorDescription.dataCharacteristic =\n await service.getCharacteristic(sensorAddrs.data);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/models/sensor-tag-manager.ts"],"sourceRoot":""}