Sioc et programmation Pascal

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Silverstar a dit:
In'air a dit:
Pour ceux qui utilise des cartes Sioc ,rien de plus simple => un fichier de définition de variables (numéros et affectations sans code de traitement) => une simple boucle "for next" en 3 lignes dans le code Pascal pour lire les valeurs des variables IOCP et c'est tout.

Montre un exemple

Voilou

Code Sioc :
Code:
[== Indéfini ==]
// *****************************************************************************
// * Config_SIOC ver 5.1   -     By Manuel Velez    -    www.opencockpits.com
// *****************************************************************************
// * FileName : sioc.txt
// * Date : 22/01/2018

Var 0100, name Out1, Link IOCARD_OUT, Output 11

Var 0101, name Out2, Link IOCARD_OUT, Output 12

Var 0102, name Out3, Link IOCARD_OUT, Output 13

Var 0103, name Out4, Link IOCARD_OUT, Output 14

Code Pascal :
Code:
[== Indéfini ==]
unit InAir;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls, ScktComp ,ShellApi ,
  Tlhelp32 ,Sockets ;

Const

  //Sorties Sioc1
      Out1     = 100;
      Out2     = 101;
      Out3     = 102;
      Out4     = 103;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    StatusBar1: TStatusBar;
    Button1: TButton;

  function  RechercheIp : String;
  procedure ConnectSioc();
  procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
  procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  procedure WriteSioc(Variable ,Valeur : String);
  procedure MajOutput();
  procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ConnectSioc();
end;

function TForm1.RechercheIp : String;
begin
  With TCustomIpClient.Create(Nil) do
       begin
         Result := LocalHostAddr;
         Free;
       end;
end;

procedure TForm1.ConnectSioc();
begin
  ClientSocket1.Port := 8092;
  ClientSocket1.Host := RechercheIp;
  ClientSocket1.Open;
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;Socket: TCustomWinSocket);
begin // Se produit quand la connection est établie avec Sioc
  StatusBar1.Panels[0].Text := Connecté avec Sioc;
end;

procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode : Integer);
begin // Gestion des différentes erreur de connection et de déconnection
  if ErrorEvent=eeConnect then
     StatusBar1.Panels[0].Text := Erreur de connection avec Sioc;
  if ErrorEvent=eeSend then
     Form1.StatusBar1.Panels[0].Text := Erreur lors de lenvoit de données vers Sioc;
  if ErrorEvent=eeReceive then
     StatusBar1.Panels[0].Text := Erreur lors de la réception de données Sioc;
  if ErrorEvent=eeDisconnect then
     StatusBar1.Panels[0].Text := Erreur lors de la déconnection Sioc;
  ErrorCode := 0;
end;

procedure TForm1.WriteSioc(Variable ,Valeur : String);
begin
  Form1.ClientSocket1.Socket.SendText(Arn.Resp: + Variable + = + Valeur + : + chr($0D) + chr($0A));
end;

procedure TForm1.MajOutput;
Var i : Byte;
begin
  For i := 100 to 103 do
      WriteSioc(inttostr(i),inttostr(1));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MajOutput();
end;

end.

Resultat après click sur le Bp



JeanMi
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Lu Windy ,
Ben comme chez Sismo.
C'est la même chose.
Essaye de regarder la doc en Pdf de chez Sismo et télécharge le compilateur qu'ils fournissent.
JeanMi
 

Silverstar

MODERATEUR
Messages
22 055
Réactions
2 282
Points
4 642
J'ai déja lu la doc de Sismo, le compilateur transforme le code en Tonscript.exe
Le script fait le lien en P3D et Prosim (simconnect et IOCP)....toi tu fais le lien uniquement avec SIOC.

Vu que Prosim est un serveur IOCP, tu n'as pas besoin de lancer SIOC.exe?
 

Silverstar

MODERATEUR
Messages
22 055
Réactions
2 282
Points
4 642
En faite je veux faire comme avec Sismo pour mes cartes EFDE.

Je cable mes cartes EFDE, je fais un Xml que jinjecte dans Prosim
Je creer un script.exe en Pascal avec les memes attributions que mon Xml

Ensuite plus besoin de Sioc, le lance le script.exe et c'est tout.

Faisable ou pas?
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Bon je vais expliquer une routine type unit quelconque de chez sismo.
Je regarde et je poste.
JeanMi
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Silverstar a dit:
J'ai déja lu la doc de Sismo, le compilateur transforme le code en Tonscript.exe
Le script fait le lien en P3D et Prosim (simconnect et IOCP)....toi tu fais le lien uniquement avec SIOC.

Vu que Prosim est un serveur IOCP, tu n'as pas besoin de lancer SIOC.exe?

Je fais le lien avec ce que je veux ,c'est juste un socket dans lapplic

voila comment par exemple ,je connect lapplic à  FSUIPC :

Code:
[== Indéfini ==]
procedure TForm1.ConnectionFsuiPc();
var  dwResult : DWORD;
begin
  if FSUIPC_Open(SIM_ANY, dwResult) then //FsUipc Running avec WideClient ou Fs
     begin
       if HandleWideClient = 0 then //Recherche Handle WideClient
          begin
            NomApplic := wideclient;
            EnumWindows(Addr(EnumWindowsCallback),0);// Si WideClient ,on cherche le Handle
          end;
        StatusBar1.Panels.Items[1].Text := Connecté à  FsUipc;
        StaticText1.Visible := False;
        ScanEventTQ.Enabled := True;
        Cursor := crDefault;
        Exit;
     end;
  //FsUipc Not running
   NomApplic := wideclient;
   if HandleWideClient = 0 then //Recherche Handle WideClient
      begin
        NomApplic := wideclient;
        EnumWindows(Addr(EnumWindowsCallback),0);// On cherche le Handle
      end;
   if HandleWideClient = 0 then //WideClient pas démarré
      begin
        StaticText1.Caption := Recherche de lexécutable WideClient;
        NomApplic := ;
        NomApplic := RechercheApplic(C:,wideclient.exe);
        if NomApplic <>  then // Application trouvée ,NomApplic contient le chemin et le nom de l'application
           begin
             StaticText1.Caption := Démarrage WideClient;
             if ShellExecute(0,Nil,PChar(NomApplic),nil,nil,Sw_ShowMinimized) <= 32 then
                begin
                  StaticText1.Caption := (SysErrorMessage(GetLastError));
                  Cursor := crDefault;
                  Exit;
                end
                else
                begin
                  StaticText1.Caption := WideClient recherche la connection FsUipc;
                  Sleep(5000);
                  ConnectionFsuiPc();
                end;
           end
           else
             StaticText1.Caption := Exécutable WideClient pas trouvé;
      end
      else //WideClient Running mais pas connecté
      begin
        StaticText1.Caption := WideClient en exécution mais n'est pas connecté avec FsUipc;
        StatusBar1.Panels[1].Text := ResultText[dwResult];
        Sleep(5000);
        SendMessage(HandleWideClient,WM_CLOSE,0,0); // Envoie du message WM_CLOSE à  WideClient
        HandleWideClient := 0;
        StaticText1.Visible := False;
        Cursor := crDefault;
      end;
end;
JeanMi
 

Silverstar

MODERATEUR
Messages
22 055
Réactions
2 282
Points
4 642
Par contre sur leur documentation ils disent que leur logiciel SC-Pascal n'est compatible qu'avec leur carte d'interface.
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Silverstar a dit:
Par contre sur leur documentation ils disent que leur logiciel SC-Pascal n'est compatible qu'avec leur carte d'interface.

Parce que pour le commun des mortels qui ne programme pas en Pascal ils fixent les valeurs dans leurs Unit.
Exemple :

Code:
Procedure Main;
begin
//Connecting to FS (Socket 0)
debug(OK);
  ConnectTOIocp(1, 192.168.1.39, 8092); 
  debug(OK2);
End;

lip est fixée ainsi que le port.

autre exemple :
Code:
//IOCP CHANGE EVENT
Procedure OnIOCPChange(socket:integer;offset:integer;value:integer);
Begin
  if (offset = 3001) or (offset = 3002) then begin 
    //Debug: see the values of the offsets 3001 and 3002
    Debug(offset: +inttostr(offset)+value: +inttostr(value));
  end;  
End;

Ici ,c'est identique à  mon code à  savoir la ligne " Debug(offset: +inttostr(offset)+value: +inttostr(value));"
ils envois aussi la chaîne de Caractères que le serveur IOCP demande soit ,sous la forme "$OD,$OA(CR+LF)"
La fonction "inttostr" comme son nom lindique ,modifie une valeur numérique en chaîne de caractères.
Pour envoyer un nombre réel avec virgule ,on utilise la fonction "Floattostr".

JeanMi
 

fab

MODERATEUR
Messages
5 553
Réactions
817
Points
2 038
Ben moi j'aime mieux SIOC :rolleyes:

Tinquiètes Jean-Mi, je comprends tout ce que tu décris mais pour monsieur toulemonde ça fait pas mal de chose à  intégrer avant de programmer et de comprendre

Il faudrait peut être prendre un exemple simple en partant de zéro avec un exemple concret en SIOC comme allumer une LED avec un interrupteur ... :)

Fabien
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
J'ai modifier le code Sismo pour connecter Sioc sur ma machine.
Pas eu de souci.





JeanMi
 

stephanev

BUSH FLYING
Messages
1 367
Réactions
48
Points
353
Silverstar a dit:
Ensuite plus besoin de Sioc, le lance le script.exe et c'est tout.

Windy, par curiosité, pourquoi tu veux remplacer Sioc ?
Si tu veux taffranchir de tout programme/script intermédiaire je comprends mais tu veux remplacer du script Sioc par du Pascal ? Pourquoi ?
En plus avec Prosim 2 qui communique directement avec le serveur sioc sans script (ou presque), quel est lintérêt ?
Juste pour comprendre ;)
 

fab

MODERATEUR
Messages
5 553
Réactions
817
Points
2 038
Même avec Prosim1.xx, SIOC ne me sert que de serveur IOCP, il n'y a pas réellement de programmation, juste des déclarations de variables dans les scripts pour que Prosim sache sur quoi agir ...

Donc je m'interroge aussi sur le passage à  SCpascal à  la place de SIOC ? A part l'utilisation de lethernet que propose Sismo à  la place de lUSB que propose OpenCockpit
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Je fais comme Fab ,déclaration de variables point barre O:)
Par contre je script en Pascal .Sinon ,rien en Sioc comme code de traitement.

J'utilise l'électronique OC ,mais à  ma sauce.Disons pas des cartes Oc alors
Oc utilise une électronique de base ,facile , efficace ,fiable et d'une rapidité redoutable.
Alors pour faire simple ,plus il y a de com entre les périphérique et plus sa rame.Je reste alors dans ma logique de traitement.

Ah ,joubliai j'ai testé le Pascal de Sismo pendant 2 heures.Ben il ont oublié de rendre la main de temps en temps pour exécuter les thread de Windows et des autres applic.Ca rammmmmmmmmmmmmmmme et en sortie sa Buggggggggg.
Je pourrais peut être leur suggérer d'utiliser la fonction "Application Process Message" dans leur code et vider les buffers en sortie ?
Alala pourquoi ai je encore été jouer avec ça moi ...
++
JeanMi
 

Silverstar

MODERATEUR
Messages
22 055
Réactions
2 282
Points
4 642
L'idée c'est d interfacer directement le matériel via le logiciel avionique (Prosim, Aérowinx...) sans passer par des programme/script intermédiaire.

Pour le Pascal, c'est juste une idée comme ça pour comprendre comment ça marche!
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Windy ,c'est justement la qu'est le Hic.
Tout le matos passe par un script intermédiaire pour être utilisé par Prosim.
Et donc tu sais pas ben tu control pas non plus.C'est cette dernière solution qui amène les problèmes.
Si tu veux contrôler ,il faut demander à  Prosim les fonctions dentrées/sortie des Dll et les paramètres à  passer avec les fonctions.
Utiliser un compilateur comme le Pascal et faire tes routines denvois et de réception des valeurs.
La tu auras le control et un seul module qui tournera entre Prosim et tes périphériques.
JeanMi
 

fab

MODERATEUR
Messages
5 553
Réactions
817
Points
2 038
InAir a dit:
.... Tout le matos passe par un script intermédiaire pour être utilisé par Prosim.....

Je pense que tu te trompes Jean-mi, avec Prosim, on ne fait que des déclarations de variables avec SIOC, et aucune programmation ! Déclarations que tu fais aussi avec tes programmes en Pascal ! Toute la logique est faite par Prosim et envoyée en IOCP vers le serveur IOCP de SIOC.

Exemple : Le switch "test lamp" qui est chiant à  programmer en SIOC, avec Prosim, rien à  faire !
 

mameloose

MEMBRE
Messages
3 753
Réactions
1
Points
0
fab a dit:
InAir a dit:
.... Tout le matos passe par un script intermédiaire pour être utilisé par Prosim.....

Je pense que tu te trompes Jean-mi, avec Prosim, on ne fait que des déclarations de variables avec SIOC, et aucune programmation ! Déclarations que tu fais aussi avec tes programmes en Pascal ! Toute la logique est faite par Prosim et envoyée en IOCP vers le serveur IOCP de SIOC.

Exemple : Le switch "test lamp" qui est chiant à  programmer en SIOC, avec Prosim, rien à  faire !

Exact c'est l'avantage des systèmes avionique prosim ou aerowinx encore plus développé..
Je me trompe peut-être mais ton futur simu Jean mi c'est un big automate fait par tes propre script....
Tu n'utilise pas encore d'avionique ?
 

InAir

CAPTAIN
Messages
911
Réactions
76
Points
153
Greg ,Pas d'avionique pour le moment ,j'attends le dégrossissage de prosim.Ensuite je testerai plus en profondeur.
Fab ,c'est parce que Prosim a intégrer du code pour ce faire.Et le code est dans les DLL adhoc en fonction de ce que tu utilses ,c'est du code ,c'est juste sous la form "DLL"

un exemple concret que j'ai fait pour donner la méthode :
Le fichier Dll :
Code:
[== Indéfini ==]
uses
  SysUtils,
  Classes ,
  Dialogs;
{$R *.res}
procedure un ; export;
begin
  showmessage(un);
end;
procedure deux ; export;
begin
  showmessage(deux);
end;
procedure trois ; export;
begin
  showmessage(trois);
end;
exports
  un   index 1,
  deux index 2,
  trois name nom;
end.

le code appelant la dll :
Code:
[== Indéfini ==]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function liredllVal1 : dword ;external project1.dll index 1;
function liredllVal2 : dword ;external project1.dll index 2;
function liredllVal3 : dword ;external project1.dll nam'enom;

procedure TForm1.Button1Click(Sender: TObject);
begin
  liredllVal1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  liredllVal2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  liredllVal3;
end;

end.

Fab ,IOcp doit tourner pour la com, c'est du code aussi.
Comment veux tu que je fasse avec Prosim pour lui dire que je lui connecte 9 servos moteur avec encodeur au cul et 4000 points/par tour moteur ?
Tu crois que si prosim pourrait le faire ,il est capable de me stopper les moteurs au pas près ?
Je préfère dans mon cas ,coder en pascal ,implanter le socket IOCP dans mon code principale ,utiliser des cartes avec cpu , ram et flash intégrée qui tourne de façon autonome et que je sais aussi programmer parce que j'ai la liste des fonctions et paramètres pour travailler avec la carte et les DLL qui lui sont dédiées.
Le soft est résident sur les cartes.
Si prosim pouvait nous donner la liste des fonctions et les paramètres pour communiquer avec leurs DLL ,alors la , on n'aurait plus besoin de rien sauf coder en Pascal.

Fab ,pour le sw du test lampe il fallait y penser quand tu as allouer tes sorties ,parce que dans mon cas il n'y à  rien de plus simple ,c'est juste une boucle for next en 3 lignes ! Et en vitesse ,en Pascal ,je vais 10x plus vite pour mettre à  jour 4 master que la console sioc !!
JeanMi
 
Haut