var ble = require('./ble') var http = require('../utils/request') var syncing = false function commandPayload(command) { return command.payload || {} } function execute(command) { var payload = commandPayload(command) switch (Number(command.opcode)) { case ble.CMD.SET_PARAMS: return ble.setParams({ region_mask: payload.region_mask, wavelength: payload.wavelength, brightness: payload.brightness, duration_ms: payload.duration_ms, mode: payload.mode }) case ble.CMD.START: return ble.startTreatment(payload.region_mask) case ble.CMD.STOP: return ble.stopTreatment() case ble.CMD.QUERY_STATUS: return ble.queryStatus() default: return Promise.reject({ error_code: 0xFE, error_msg: 'unsupported opcode' }) } } function report(command, success, result) { return http.post('/api/v1/device/command/result', { command_id: command.seq || command.command_id, seq: command.seq || command.command_id, success: success, opcode: command.opcode, result: result || null }).catch(function () {}) } function runOne(command) { return execute(command).then(function (result) { return report(command, true, result) }).catch(function (err) { return report(command, false, err) }) } function sync(deviceId) { if (syncing || !deviceId || !ble.isConnected()) return Promise.resolve() syncing = true return http.get('/api/v1/device/command/pending', { device_id: deviceId }).then(function (data) { var chain = Promise.resolve() var commands = data.commands || [] commands.forEach(function (command) { chain = chain.then(function () { return runOne(command) }) }) return chain }).catch(function () {}).then(function () { syncing = false }) } module.exports = { sync: sync, execute: execute }