Source: commands/equipment.js

/**
 * 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
};