[TRIXI] Implementation C#

Fazit:
TRIXI lebt und läuft.

Anbei C# Code, mal eben schnell zusammengeklöppelt, man möge mir die Unordnung verzeihen, aber wir haben Besuch… :smiley:

Wenn mehr gewünscht ist, bitte melden.

Update 2010-11-22:
Die Callbacks gehen jetzt mit TRIXI 0.13.2. Beispiel hängt dran. Wer eine fertige TRIXIAccess mit C# Delegates will die man nur noch aufrufen braucht, bitte melden.

TRIXIAccess.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace IPS
{
	class TRIXIAccess
	{
		[DllImport("TRIXI.dll")]
		static extern bool Connect(String IP, int Port);

		[DllImport("TRIXI.dll")]
		static extern bool Disconnect();

		[DllImport("TRIXI.dll")]
		static extern int GetScriptIDByName(String Script, int ParentID);

		[DllImport("TRIXI.dll")]
		static extern int GetVariableIDByName(String Variable, int ParentID);

		[DllImport("TRIXI.dll")]
		static extern bool IsOnline();

		[DllImport("TRIXI.dll")]
		static extern bool ReadBoolean(int VariableID);

		[DllImport("TRIXI.dll")]
		static extern double ReadFloat(int VariableID);

		[DllImport("TRIXI.dll")]
		static extern int ReadInteger(int VariableID);

		[DllImport("TRIXI.dll")]
		static extern String ReadString(int VariableID);

		[DllImport("TRIXI.dll")]
		static extern int RunScript(int ScriptID);

		[DllImport("TRIXI.dll")]
		static extern bool ScriptExists(int ScriptID);

		[DllImport("TRIXI.dll", CallingConvention = CallingConvention.StdCall)]
		static extern void SetSimpleVarCallback(SimpleVarCallback svc);

		[DllImport("TRIXI.dll", CallingConvention = CallingConvention.StdCall)]
		static extern void SetVarChangeCallback(VarCallback vc);

		[DllImport("TRIXI.dll", CallingConvention = CallingConvention.StdCall)]
		static extern void SetVarUpdateCallback(VarCallback vc);

		[DllImport("TRIXI.dll")]
		static extern bool VariableExists(int VariableID);

		[DllImport("TRIXI.dll")]
		static extern int WriteBoolean(int VariableID, bool Value);

		[DllImport("TRIXI.dll")]
		static extern void WriteDebugFile(String LogFile, bool MsgSink);

		[DllImport("TRIXI.dll")]
		static extern int WriteFloat(int VariableID, double Value);

		[DllImport("TRIXI.dll")]
		static extern int WriteInteger(int VariableID, int Value);

		[DllImport("TRIXI.dll")]
		static extern int WriteString(int VariableID, String Value);

		//Intern
		private String destIP;
		private int destPort;
		private bool isConnected;

		//Delegates
		public delegate void SimpleVarCallback(int ID);
		public delegate void VarCallback(int ID, double Time, String Value);
		private static SimpleVarCallback mySimpleVarCallback;
		private static VarCallback myVarUpdateCallback;
		private static VarCallback myVarChangeCallback;

		// ***************************************************************
		// * CONSTRUCTOR / DECONSTRUCTOR
		// ***************************************************************
		public TRIXIAccess(String IP, int Port)
		{
			//Merken
			destIP = IP;
			destPort = Port;

			//Connect
			isConnected = Connect(destIP, destPort);

			AddDelegate();
		}

		~TRIXIAccess()
		{
			Disconnect();
		}

		// ***************************************************************
		// * ONLINE
		// ***************************************************************
		public bool TRIXIIsOnline()
		{
			return (IsOnline());
		}

		// ***************************************************************
		// * Callbacks
		// ***************************************************************
		public void AddDelegate()
		{
			//Delegates anlegen
			mySimpleVarCallback = new SimpleVarCallback(SimpleVarCallbackImpl);
			myVarUpdateCallback = new VarCallback(VarUpdateCallbackImpl);
			myVarChangeCallback = new VarCallback(VarChangeCallbackImpl);

			//Zuweisen
			SetSimpleVarCallback(mySimpleVarCallback);
			SetVarUpdateCallback(myVarUpdateCallback);
			SetVarChangeCallback(myVarChangeCallback);
		}

		public void SimpleVarCallbackImpl(int ID)
		{
			Console.Out.WriteLine("Variable [" + ID + "] changed!!!");
		}

		public void VarUpdateCallbackImpl(int ID, double Time, String Value)
		{
			DateTime changeTime = DateTime.FromOADate(Time);
			Console.Out.WriteLine("Variable [" + ID + "] was updated to [" + Value + "] on [" + changeTime + "]");
		}

		public void VarChangeCallbackImpl(int ID, double Time, String Value)
		{
			DateTime changeTime = DateTime.FromOADate(Time);
			Console.Out.WriteLine("Variable [" + ID + "] changed to [" + Value + "] on [" + changeTime + "]");
		}

		// ***************************************************************
		// * IDs
		// ***************************************************************
		public int TRIXIGetScriptIDByName(String Script, int ParentID)
		{
			int ScriptID = -1;

			try
			{
				ScriptID = GetScriptIDByName(Script, ParentID);
			}
			catch (Exception hell)
			{
				//Exception wird von TRIXI geworfen wenn Script nicht gefunden
			}

			return (ScriptID);
		}

		public int TRIXIGetVariableIDByName(String Variable, int ParentID)
		{
			int VariableID = -1;

			try
			{
				VariableID = GetVariableIDByName(Variable, ParentID);
			}
			catch (Exception hell)
			{
				//Exception wird von TRIXI geworfen wenn Variable nicht gefunden
			}

			return (VariableID);
		}


		// ***************************************************************
		// * Exists?
		// ***************************************************************
		public bool TRIXIScriptExists(int VariableID)
		{
			bool RetVal = ScriptExists(VariableID);
			return (RetVal);
		}

		public bool TRIXIVariableExists(int VariableID)
		{
			bool RetVal = VariableExists(VariableID);
			return (RetVal);
		}

		// ***************************************************************
		// * Scripts
		// ***************************************************************
		public int TRIXIRunScript(int ScriptID)
		{
			return (RunScript(ScriptID));
		}

		// ***************************************************************
		// * GETTER / SETTER
		// ***************************************************************
		public bool TRIXIReadBoolValue(int VariableID)
		{
			bool RetVal = ReadBoolean(VariableID);
			return (RetVal);
		}
		public int TRIXIWriteBoolValue(int VariableID, bool Value)
		{
			int RetVal = WriteBoolean(VariableID, Value);
			return (RetVal);
		}

		public double TRIXIReadFloatValue(int VariableID)
		{
			double RetVal = ReadFloat(VariableID);
			return (RetVal);
		}
		public int TRIXIWriteFloatValue(int VariableID, double Value)
		{
			int RetVal = WriteFloat(VariableID, Value);
			return (RetVal);
		}

		public int TRIXIReadIntValue(int VariableID)
		{
			int RetVal = ReadInteger(VariableID);
			return (RetVal);
		}
		public int TRIXIWriteIntValue(int VariableID, int Value)
		{
			int RetVal = WriteInteger(VariableID, Value);
			return (RetVal);
		}

		public String TRIXIReadStringValue(int VariableID)
		{
			String RetVal = ReadString(VariableID);
			return (RetVal);
		}
		public int TRIXIWriteStringValue(int VariableID, String Value)
		{
			int RetVal = WriteString(VariableID, Value);
			return (RetVal);
		}

		// ***************************************************************
		// * GETTER / SETTER
		// ***************************************************************
		public void TRIXIWriteDebugFile(String LogFile, bool MsgSink)
		{
			WriteDebugFile(LogFile, MsgSink);
		}

	}
}

Testaufrufe


		public void TRIXITest()
		{
			//IPS Daten
			String ipsIP = "192.168.1.211";
			int ipsTestResult = -1;
			int ipsPort = 3773;

			//StringVars
			String scriptName    = "Testscript";
			String variableName  = "trixiTestBool";

			//IDs
			int ipsTestIDScripts = 43758;  /*[Skripte\Scripts]*/
			int ipsTestIDVars    = 33390;  /*[Skripte\Variablenbaum]*/
			int ipsTestIDScript  = 16013;  /*[Skripte\Scripts\Testscript]*/
			int ipsTestIDBool    = 13090;  /*[Skripte\Variablenbaum	rixiTestBool]*/
			int ipsTestIDFloat   = 12441;  /*[Skripte\Variablenbaum	rixiTestFloat]*/
			int ipsTestIDInt     = 39108;  /*[Skripte\Variablenbaum	rixiTestInt]*/
			int ipsTestIDString  = 18939;  /*[Skripte\Variablenbaum	rixiTestString]*/

			IPS.TRIXIAccess ta = new IPS.TRIXIAccess(ipsIP, ipsPort);

			//Start Tests
			bool isOnline = ta.TRIXIIsOnline();
			ipsTestResult = ta.TRIXIRunScript(ipsTestIDScript);
			ta.TRIXIWriteDebugFile("c:\	emp\	rixi.log", false);

			//Get IDs
			int ipsScriptID = ta.TRIXIGetScriptIDByName(scriptName, ipsTestIDScripts);
			int ipsScriptID2 = ta.TRIXIGetScriptIDByName("GibbetNed", ipsTestIDScripts);
			int ipsVarID = ta.TRIXIGetVariableIDByName(variableName, ipsTestIDVars);
			int ipsVarID2 = ta.TRIXIGetVariableIDByName("GibbetNed", ipsTestIDVars);

			//Exists?
			bool varExists1 = ta.TRIXIVariableExists(ipsVarID);
			bool varExists2 = ta.TRIXIVariableExists(08154711);
			bool scriptExists1 = ta.TRIXIScriptExists(ipsScriptID);
			bool scriptExists2 = ta.TRIXIScriptExists(08154711);

			//Tests bool
			bool oldBoolVal = ta.TRIXIReadBoolValue(ipsTestIDBool);
			ipsTestResult = ta.TRIXIWriteBoolValue(ipsTestIDBool, !oldBoolVal);

			//Tests float
			double oldFloatVal = ta.TRIXIReadFloatValue(ipsTestIDFloat);
			ipsTestResult = ta.TRIXIWriteFloatValue(ipsTestIDFloat, oldFloatVal + 0.1);

			//Tests int
			int oldIntVal = ta.TRIXIReadIntValue(ipsTestIDInt);
			ipsTestResult = ta.TRIXIWriteIntValue(ipsTestIDInt, oldIntVal + 1);

			//Tests String
			String oldStrVal = ta.TRIXIReadStringValue(ipsTestIDString);
			ipsTestResult = ta.TRIXIWriteStringValue(ipsTestIDString, oldStrVal + ".");
		}

Yes, sehr geil…

Vielen Dank fürs posten.

Toni

Bin gerade dran. Der Callback wird auch aufgerufen, nur kriege ich komische Werte raus. Beim Suchen bin ich dann hierdrüber gestolpert.

Inside a c# application a c#-method with parameter is to be called from a delphi dll: The C# method gets called, but the int param is not transfered correctly: some „random“ value arrives.

found the error:
forgot „stdcall“ in Delphi:
type TCallback = procedure(val: integer); stdcall;

Und die wenn ich mir den TRIXI Quellcode so anschaue, dann ist das kein Standard-Call:


// --- Professional implementation -------------------------------------------
type
  TSimpleVarCallback = procedure(ID: Integer);
  TVarCallback = procedure(ID: Integer; Time: Double; Value: PAnsiChar);

@Toni: Könnte du das bitte mal so einbauen und mir ne neue Version zukommen lassen?

Im Gegenzug poste ich dann hier den Code, dann kann man das sicher auch in VB.net oder so verwenden. :smiley:

Äh… Klingt, so wie du es vorschlägst erschreckend logisch. Im ersten Moment dachte ich, ich hätts einfach vergessen. Aber da war was. Da gabs ein Problem…

Ich geb dir ne Info wenn ichs geprüft hab.

Toni

Super, danke schön. Wenn es da Probs gab, dann kannste ja auch einfach 2 neue Callbacks anlegen, meinetwegen mit StdCall Endung:


procedure SetSimpleVarStdCallback(Value: TSimpleVarStdCallback); stdcall external 'TRIXI.DLL';
procedure SetVarUpdateStdCallback(Value: TVarStdCallback); stdcall external 'TRIXI.DLL';
procedure SetVarChangeStdCallback(Value: TVarStdCallback); stdcall external 'TRIXI.DLL';
....
type TSimpleVarStdCallback = procedure(ID: Integer); stdcall;
type TVarStdCallback = procedure(ID: Integer; Time: Double; Value: PAnsiChar); stdcall;

(ob mein Delphi-Code jetzt richtig ist kann ich nicht beurteilen… :D)

Nö… wenns nicht überall gleich funktioniert ist irgendwas falsch. Hab ja eigentlich extra stdcall als Basis verwendet. Hier nicht. Muss ich schauen ob ich mir da wirklich was bei gedacht hab oder doch nur versehen.

Toni

Naja, ich leg dann die Schnittstelle erstmal auf Eis, bis ich weitere Infos von dir habe… :slight_smile:

Sag mir Bescheid wenn du was neues hast.

Grobe Richtung: Morgen.

Grobe Rückfrage… :wink:

Grob vergessen. grobe PM. :wink:

Toni

Funkioniert grob. Ich werde mal den ersten Beiträg grob ändern. :smiley:

Bei mir ist die Callback auch noch grob auf der To/Do !!
Hab im VB.net Beispiel alles von der v0.13 verbaut. -> Bis auf die CallBack.

Böte, Böte… :stuck_out_tongue:

Erster Post ist aktualisiert. Viel Spaß.
Geht aber erst mit der .2, davor kamen ziemliche Mondwerte :smiley:

Hallo Toni,

kanst Du die 0.13.2 noch einstellen?

So ganz grob. :wink:

Jetzt wo das grob funktioniert werd ich sie mal grob hochladen. Geb euch bescheit wenns grob soweit ist. :smiley:

Toni

Ach was solls… Dann hab ichs vom Tisch.

BESCHEIT!

Toni

Besten Dank Groooog. Habs gerade als VB-Beispiel eingestellt.