/** * Roboliq: Automation for liquid-handling robots * @copyright 2017, ETH Zurich, Ellis Whitehead * @license GPL-3.0 */ /** * Namespace for the ``equipment`` commands. * @namespace equipment * @version v1 */ /** * Equipment commands module. * @module commands/equipment * @return {Protocol} * @version v1 */ var _ = require('lodash'); var jmespath = require('jmespath'); import yaml from 'yamljs'; var commandHelper = require('../commandHelper.js'); var expect = require('../expect.js'); var misc = require('../misc.js'); function closeAll(params, data, effects) { expect.paramsRequired(params, ["equipment"]); var equipmentData = expect.objectsValue({}, params.equipment, data.objects); // Close equipment effects[params.equipment+".open"] = false; // Indicate that all internal sites are closed _.forEach(equipmentData.sitesInternal, function(site) { effects[site+".closed"] = true; }); } /** * Handlers for {@link equipment} commands. * @static */ var commandHandlers = { "equipment._run": function(params, parsed, data) { return {}; }, "equipment.close": function(params, parsed, data) { var sitesInternal = commandHelper.getParsedValue(parsed, data, "equipment", "sitesInternal"); var expansion = [{ command: "equipment.close|"+parsed.objectName.agent+"|"+parsed.objectName.equipment, agent: parsed.objectName.agent, equipment: parsed.objectName.equipment }]; var effects = {}; // Close equipment effects[parsed.objectName.equipment+".open"] = false; // Indicate that the internal sites are closed _.forEach(sitesInternal, function(site) { effects[site+".closed"] = true; }); return { expansion: expansion, effects: effects }; }, "equipment.open": function(params, parsed, data) { var expansion = [{ command: "equipment.open|"+parsed.objectName.agent+"|"+parsed.objectName.equipment, agent: parsed.objectName.agent, equipment: parsed.objectName.equipment }]; return { expansion: expansion, effects: {[parsed.objectName.equipment+".open"]: true} }; }, "equipment.openSite": function(params, parsed, data) { // console.log("equipment.openSite:"); console.log(JSON.stringify(parsed, null, '\t')) var sitesInternal = parsed.value.equipment.sitesInternal; expect.truthy({paramName: "site"}, sitesInternal.indexOf(parsed.objectName.site) >= 0, `site ${parsed.objectName.site} must be in \`${parsed.objectName.equipment}.sitesInternal\; \`${parsed.objectName.equipment}.sitesInternal\` = ${sitesInternal}`); var expansion = [{ command: "equipment.openSite|"+parsed.objectName.agent+"|"+parsed.objectName.equipment, agent: parsed.objectName.agent, equipment: parsed.objectName.equipment, site: parsed.objectName.site }]; //console.log(JSON.stringify(expansion, null, '\t')) var effects = {}; // Open equipment effects[parsed.objectName.equipment+".open"] = true; // Indicate that the given site is open and the other internal sites are closed _.forEach(sitesInternal, function(site) { effects[site+".closed"] = (site != parsed.objectName.site); }); //console.log(JSON.stringify(effects, null, '\t')) return { expansion: expansion, effects: effects }; }, "equipment.start": function(params, parsed, data) { var expansion = [_.defaults({ command: "equipment.start|"+parsed.objectName.agent+"|"+parsed.objectName.equipment, agent: parsed.objectName.agent, equipment: parsed.objectName.equipment }, parsed.orig)]; var effects = { [parsed.objectName.equipment+".running"]: true }; return { expansion, effects }; }, "equipment.stop": function(params, parsed, data) { var expansion = [_.defaults({ command: "equipment.stop|"+parsed.objectName.agent+"|"+parsed.objectName.equipment, agent: parsed.objectName.agent, equipment: parsed.objectName.equipment }, parsed.orig)]; var effects = { [parsed.objectName.equipment+".running"]: false }; return { expansion, effects }; }, }; /** * Plan handler to allow other modules to use `equipment._close` and * `equipment._openSite` as planning actions. * @static */ var planHandlers = { "equipment._close": function(params, parentParams, data) { return [{ command: "equipment.close", agent: params.agent, equipment: params.equipment }]; }, "equipment._openSite": function(params, parentParams, data) { return [{ command: "equipment.openSite", agent: params.agent, equipment: params.equipment, site: params.site }]; } }; module.exports = { roboliq: "v1", schemas: yaml.load(__dirname+"/../schemas/equipment.yaml"), commandHandlers, planHandlers };