Example: Custom EZ-Script Function
The EZ-Script engine has two event to add your own custom EZ-Script functions for users to use. The two different events will call before (Override) and after (Additional) the EZ-Script executor. That means you can either override existing commands or add new commands.
Additional Commands Adding a command extends the existing commandset of EZ-Script. The example below demonstrates adding a new command to EZ-Script called "SetColor()".
SetColor(20, 100, 20)
The ExpressionEvaluation.FunctionEval.AdditionalFunctionEvent event is raised. Your plugin may attach to this event and process functions for the script.
Here is an example plugin that creates a user defined function called SetColor(): https://synthiam.com/Software/Manual/User-Defined-Function-Example-15864
using System;
using System.Drawing;
using System.Windows.Forms;
namespace User_Defined_Function_Example {
public partial class FormMaster : EZ_Builder.UCForms.FormPluginMaster {
public FormMaster() {
InitializeComponent();
}
private void FormMaster_Load(object sender, EventArgs e) {
// Intercept all unknown functions called from any EZ-Script globally.
// If a function is called that doesn't exist in the EZ-Script library, this event will execute
ExpressionEvaluation.FunctionEval.AdditionalFunctionEvent += FunctionEval_AdditionalFunctionEvent;
}
private void FormMaster_FormClosing(object sender, FormClosingEventArgs e) {
// Disconnect from the function event
ExpressionEvaluation.FunctionEval.AdditionalFunctionEvent -= FunctionEval_AdditionalFunctionEvent;
}
///
/// This is executed when a function is specified in any ez-scripting that isn't a native function.
/// You can check to see if the function that was called is your function.
/// If it is, do something and return something.
/// If you don't return something, a default value of TRUE is returned.
/// If you throw an exception, the EZ-Script control will receive the exception and present the error to the user.
///
private void FunctionEval_AdditionalFunctionEvent(object sender, ExpressionEvaluation.AdditionalFunctionEventArgs e) {
// Check if the function is our function (SetColor)
if (!e.Name.Equals("setcolor", StringComparison.InvariantCultureIgnoreCase))
return;
// Check if the correct number of parameters were passed to this function
if (e.Parameters.Length != 3)
throw new Exception("Expects 3 parameters. Usage: SetColor(red [0-255], green [0-255], blue [0-255]). Example: SetColor(20, 200,100)");
// Convert the parameters to datatypes
byte red = Convert.ToByte(e.Parameters[0]);
byte green = Convert.ToByte(e.Parameters[1]);
byte blue = Convert.ToByte(e.Parameters[2]);
// Do something
EZ_Builder.Invokers.SetBackColor(label1, Color.FromArgb(red, green, blue));
// Return something. Good idea to return TRUE if your function isn't meant to return anything
e.ReturnValue = true;
}
}
}
Override Commands Override commands will replace the existing EZ-Script command with your own version. This means you can intercept the command and handle the logic yourself. An example of this functionality is in the Ultrasonic Ping Sensor control, which replaces the GetPing() command with it's own version.
*Note: This event has OverrideFunctionEventArgs() which has a IsHandled(bool) that must be set if you hanlded the return object.
The ExpressionEvaluation.FunctionEval.OverrideFunctionEvent event and your logic must exist in there to override the existing command. If you expect a different number of parameters, you can still return and let the main EZ-Script handle it by not setting IsHandled in the OverrideFunctionEventArgs.
using ExpressionEvaluation;
using EZ_B;
using EZ_Builder.Config;
using EZ_Builder.Scripting;
namespace EZ_Builder.UCForms {
public partial class FormPing : FormMaster {
public FormPing() {
InitializeComponent();
progressBar1.Maximum = EZ_B.HC_SR04.MAX_VALUE;
// Set the override event
ExpressionEvaluation.FunctionEval.OverrideFunctionEvent += FunctionEval_OverrideFunctionEvent;
}
private void FormPing_FormClosing(object sender, FormClosingEventArgs e) {
// detach from the override event
ExpressionEvaluation.FunctionEval.OverrideFunctionEvent -= FunctionEval_OverrideFunctionEvent;
}
private void FunctionEval_OverrideFunctionEvent(object sender, ExpressionEvaluation.OverrideFunctionEventArgs e) {
if (e.Name.Equals(OpCodeReadEnum.getping.ToString(), StringComparison.InvariantCultureIgnoreCase)) {
FunctionEval.CheckParamCount(e.Name, e.Parameters, 2);
string triggerStr = e.Parameters[0].ToString();
string echoStr = e.Parameters[1].ToString();
HelperPortParser cmdTrig = new HelperPortParser(triggerStr);
HelperPortParser cmdEcho = new HelperPortParser(echoStr);
if (cmdTrig.DigitalPort != _cf.Ping.PingTriggerPort ||
cmdTrig.BoardIndex != _cf.Ping.EZBIndex ||
cmdEcho.DigitalPort != _cf.Ping.PingEchoPort ||
cmdEcho.BoardIndex != _cf.Ping.EZBIndex)
return;
if (!Invokers.GetCheckedValue(cbPause))
return;
if (cmdTrig.BoardIndex != cmdEcho.BoardIndex)
throw new Exception("Trigger and Echo ports must be on the same EZ-B");
if (!EZBManager.EZBs[cmdTrig.BoardIndex].IsConnected)
throw new Exception(string.Format("Not connected to EZ_B {0}", cmdTrig.BoardIndex));
int value = EZBManager.EZBs[cmdTrig.BoardIndex].HC_SR04.GetValue(cmdTrig.DigitalPort, cmdEcho.DigitalPort);
updateDisplayData(value);
e.ReturnValue = value;
e.IsHandled = true;
return;
}
}
}
}
Is this out of date? There doesn't seem to be a GetConfiguration function within EZ_Builder.Config.Sub.PluginV1
Look at the tutorial step titled Code: Saving/Loading Configuration
The get and set configuration methods are overrides of the form. There’s a great video on the first step of this tutorial that demonstrates the step by step of building a plugin. I recommend watching that because it helps fill in any steps that were missed.
When you’ve done it once, it makes sense and voila, you can rinse and repeat
Excellent, thanks - I will do. I really must learn not to just jump ahead in the process
Hey no problem - I do it all the time, and end up frustrated because I dont know what it was that I missed. Excitement gets the best of me
Trying to follow the tutorials but can't find where the plugin page has gone. How do I add a new plugin to the ez-robot / Synthiam site to get the XML?
Never mind. Just found the "Create skill control" link
I am trying to follow the instructions for adding my own plugin but I cannot seem to find the place to register the plugin based on the instructions.
Any help is appreciated.
Thanks
The new button to create a plugin skill control is less than an inch below the button you pressed to create this question.