/**
* Roboliq: Automation for liquid-handling robots
* @copyright 2017, ETH Zurich, Ellis Whitehead
* @license GPL-3.0
*/
/**
* Helper functions for evoware command handlers.
* @module
*/
import _ from 'lodash';
import assert from 'assert';
/**
* Create the Evoware token to execute an external command.
* @param {string} path - path to command to execute
* @param {array} args - array of arguments to pass
* @param {boolean} wait - true if evoware should wait for the command to complete execution
* @param {string} exitCodeVariableName - optional name of
* @return {string} a string representing an Evoware 'Execute' token.
*/
export function createExecuteLine(path, args, wait, exitCodeVariableName = "") {
const flag1 = ((wait) ? 2 : 0) + (_.isEmpty(exitCodeVariableName) ? 0 : 4);
return `Execute("${path} ${args.join(" ")}",${flag1},"${exitCodeVariableName}",2);`;
}
/**
* Create an Evoware FACTS token.
* @param {string} equipment - equipment ID for the FACTS command
* @param {string} variableName - variable name for the FACTS command
* @param {string} value - optional value of the variable
* @return {string} a string representing an Evoware 'FACTS' token.
*/
export function createFactsLine(equipment, variableName, value = "") {
const l = [
`"${equipment}"`,
`"${variableName}"`,
`"${value}"`,
`"0"`,
`""`
];
return `FACTS(${l.join(",")});`;
}
/**
* Create an 'If' token.
* @param {string} variable - name of the variable to test
* @param {string} test - one of "==", "!=", "<", ">"
* @param {string|number} value - value to compare to
* @param {string} target - target to jump to: an Evoware "Comment" token
* @return {string} - line for an "If" token
*/
export function createIfLine(variable, test, value, target) {
const cmps = ["==", "!-", ">", "<"];
const cmp = cmps.indexOf(test);
assert(cmp >= 0, `Unknown test: ${test}`);
return `If("${variable}",${cmp},"${value}","${target}");`
}
/**
* Create the Evoware 'StartScript' token.
* @param {string} path - path to the script to start
* @return {string} - line for a "StartScript" token
*/
export function createStartScriptLine(path) {
return `StartScript("${path}");`;
}
/**
* Create the Evoware token to prompt the user.
* @param {string} text - text to show the user
* @param {numeric} beep - 0: none, 1: beep once, 2: beep three times, 3: beep every 3 seconds
* @param {numeric} autoclose - number of second to leave the prompt open before autoclosing it and continuing operation (-1 means no autoclose)
*/
export function createUserPromptLine(text, beep = 0, autoclose = -1) {
return `UserPrompt("${text}",${beep},${autoclose});`;
}
/**
* Create the Evoware token to prompt the user.
* @param {string} text - text to show the user
* @param {numeric} beep - 0: none, 1: beep once, 2: beep three times, 3: beep every 3 seconds
* @param {numeric} autoclose - number of second to leave the prompt open before autoclosing it and continuing operation (-1 means no autoclose)
*/
export function createVariableLine(name, value) {
const min = "1.000000";
const max = "10.000000";
return `Variable(${name},"${value}",0,"",0,${min},${max},${(_.isNumber(value) ? 0 : 1)},2,0,0);`;
}
/**
* Put double-quotes around a string, if it doesn't already have them.
* @param {string} s - any input string
* @return {string} string with outer double-quotes.
*/
export function quote(s) {
return `"${stripQuotes(s)}"`;
}
/**
* If a string is surrounded by double-quotes, remove them.
* @param {string} s - a string, possible with outer double-quotes.
* @return {string} string with outer double-quotes removed.
*/
export function stripQuotes(s) {
return (_.startsWith(s, '"') && _.endsWith(s, '"'))
? s.substring(1, s.length - 1) : s;
}