ardupilot/Tools/ArdupilotMegaPlanner/Script.cs

170 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IronPython.Hosting;
namespace ArdupilotMega
{
public class Script
{
DateTime timeout = DateTime.Now;
List<string> items = new List<string>();
static Microsoft.Scripting.Hosting.ScriptEngine engine;
static Microsoft.Scripting.Hosting.ScriptScope scope;
// keeps history
MAVLink.__mavlink_rc_channels_override_t rc = new MAVLink.__mavlink_rc_channels_override_t();
public Script()
{
Dictionary<string, object> options = new Dictionary<string, object>();
options["Debug"] = true;
if (engine != null)
engine.Runtime.Shutdown();
engine = Python.CreateEngine(options);
scope = engine.CreateScope();
scope.SetVariable("cs", MainV2.cs);
scope.SetVariable("Script", this);
engine.CreateScriptSourceFromString("print 'hello world from python'").Execute(scope);
engine.CreateScriptSourceFromString("print cs.roll").Execute(scope);
object thisBoxed = MainV2.cs;
Type test = thisBoxed.GetType();
foreach (var field in test.GetProperties())
{
// field.Name has the field's name.
object fieldValue;
try
{
fieldValue = field.GetValue(thisBoxed, null); // Get value
}
catch { continue; }
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
items.Add(field.Name);
}
}
public void Sleep(int ms) {
System.Threading.Thread.Sleep(ms);
}
public void runScript(string script)
{
try
{
engine.CreateScriptSourceFromString(script).Execute(scope);
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show("Error running script " + e.Message);
}
}
public enum Conditional
{
NONE = 0,
LT,
LTEQ,
EQ,
GT,
GTEQ,
NEQ
}
public bool ChangeParam(string param, float value)
{
return MainV2.comPort.setParam(param, value);
}
public float GetParam(string param)
{
if (MainV2.comPort.param[param] != null)
return (float)MainV2.comPort.param[param];
return 0.0f;
}
public bool ChangeMode(string mode)
{
MainV2.comPort.setMode(mode);
return true;
}
public bool WaitFor(string message, int timeout)
{
int timein = 0;
while (!MainV2.cs.message.Contains(message)) {
System.Threading.Thread.Sleep(5);
timein += 5;
if (timein > timeout)
return false;
}
return true;
}
public bool SendRC(int channel, ushort pwm,bool sendnow)
{
switch (channel)
{
case 1:
MainV2.cs.rcoverridech1 = pwm;
rc.chan1_raw = pwm;
break;
case 2:
MainV2.cs.rcoverridech2 = pwm;
rc.chan2_raw = pwm;
break;
case 3:
MainV2.cs.rcoverridech3 = pwm;
rc.chan3_raw = pwm;
break;
case 4:
MainV2.cs.rcoverridech4 = pwm;
rc.chan4_raw = pwm;
break;
case 5:
MainV2.cs.rcoverridech5 = pwm;
rc.chan5_raw = pwm;
break;
case 6:
MainV2.cs.rcoverridech6 = pwm;
rc.chan6_raw = pwm;
break;
case 7:
MainV2.cs.rcoverridech7 = pwm;
rc.chan7_raw = pwm;
break;
case 8:
MainV2.cs.rcoverridech8 = pwm;
rc.chan8_raw = pwm;
break;
}
rc.target_component = MainV2.comPort.compid;
rc.target_system = MainV2.comPort.sysid;
if (sendnow)
{
MainV2.comPort.sendPacket(rc);
System.Threading.Thread.Sleep(20);
MainV2.comPort.sendPacket(rc);
MainV2.comPort.sendPacket(rc);
}
return true;
}
}
}