If this is your first visit, be sure to
check out the FAQ by clicking the
link above. You may have to register
before you can post: click the register link above to proceed. To start viewing messages,
select the forum that you want to visit from the selection below.
Il s'agit de ce qu'on appelle un Port série (COM) virtuel. Cela nécessite un driver spécifique (FTDI dans le cas de la carte Arduino).
Ounet,
Ayant commencé le C et les plugins il y a deux semaines, j'ai d'abord dû lire de nombreux documents et sites, d'où mon silence radio depuis jeudi.
Je pense avoir trouvé ce qui pose problème dans la version Windows de ton plugin.
Il semble que FOPEN soit réservée au traitement de fichiers et ne puisse plus être utilisée pour communiquer avec un port série depuis Windows98!
Il faut donc remplacer les instructions :
Fopen par CreateFile (c'est la philosophie, il faut évidemment des paramètres adéquats)
Fprintf par WriteFile (même remarque)
Pour lire on utilise ReadFile.
J'ai également trouvé un moyen simple pour imposer les paramètres standard 9600, n 8, 1, ainsi qu'une routine pour tester les paramètres complets actuels et les modifier (Windows only).
J'ai modifié le plugin mais n'ayant pas encore installé Visual C++ Express et ni acheté de composants (écran, LED), je n'ai encore rien testé.
J'ai une grosse surcharge de travail pour le moment (et c'est ma première priorité :D ), mais je mettrai le code source en ligne jeudi soir.
Je proposerai également une autre façon de nommer les variables qui permet de raccourcir le programme et de simplifier sa mise à jour (ajout d'une variable), mais avec une légère perte de lisibilité.
J'ai examiné avec intérêt ta routine Arduino.
Ta routine est une boucle qui lit un caractère à chaque passage.
Je suis parti sur une idée différente (je n'ai pas dit meilleure) qui consiste à lire une ligne complète à chaque passage dans la boucle (le premier caractère est stocké dans test puis je réalise une boucle pour lire tous les caractères de la ligne et les mettre dans indata). Ceci permet de simplifier un peu les routines pour chaque cas. Ce sera plus compréhensible quand tu verras la routine.
Pourquoi proposer un nouveau code alors que le tien fonctionne? Parce que nous n'avons pas encore parlé des performances mais il faudra bien le faire pour ne pas trop nous pénaliser en FPS.
En vérifiant les performances des deux codes, nous parviendrons probablement à un troisième code encore plus rapide.
Je suggère d'ailleurs de passer directement à une vitesse de transmission de 115200 bps (au lieu de 9600) pour ne pas perdre des caractères en route.
Calcul rapide : 100 caractères envoyés par frame * 60 frames par seconde * 2 boucles de calcul par cycle d'affichage = 12000 caractères par cycle d'affichage = environ 100 kbps (8 bits + 1 stop bit)
Nous devrons peut-être envisager de ne pas envoyer les caractères à chaque frame mais tous les dixièmes de seconde par exemple.
Nous pourrions également limiter au maximum les opérations du plugin (comme par exemple, la composition du message à afficher) et laisser le boulot à la carte Arduino.
J'ai également essayé de rédiger une version linux. Il me semble que celle-ci pourrait être proche de la version mac (fopen, ...) avec quelques headers spécifiques, comme termio.h
Je me réjouis déjà de tester la commande de servos, l'utilisation de deux cartes, ...
Ce serait bien de réussir à faire un fat plugin (compatible mac, win et linux) mais cela dépasse largement mes compétences pour le moment.
...Pourquoi proposer un nouveau code alors que le tien fonctionne? Parce que nous n'avons pas encore parlé des performances mais il faudra bien le faire pour ne pas trop nous pénaliser en FPS....
Ce qui pénalise les FPSs est ce qui se trouve dans ce qui est exécuté par X-Plane durant sa boucle de rendu, par exemple dans le flight loop callback. Tout ce qui est là dedans doit être le plus rapide possible, d'où l'idée de déporter ce qui prend du temps à l'extérieur de cette zone. Il ne devrait-y avoir que les accès aux variables X-Plane dans cette zone, tout le traitement transformant ces valeurs en chaines de caractères devrait-être extérieur. Je vais voir ce soir pour écrire un exemple à partir du code que tu m'as envoyé.
...Pourquoi proposer un nouveau code alors que le tien fonctionne? Parce que nous n'avons pas encore parlé des performances mais il faudra bien le faire pour ne pas trop nous pénaliser en FPS....
Ce qui pénalise les FPSs est ce qui se trouve dans ce qui est exécuté par X-Plane durant sa boucle de rendu, par exemple dans le flight loop callback. Tout ce qui est là dedans doit être le plus rapide possible, d'où l'idée de déporter ce qui prend du temps à l'extérieur de cette zone. Il ne devrait-y avoir que les accès aux variables X-Plane dans cette zone, tout le traitement transformant ces valeurs en chaines de caractères devrait-être extérieur. Je vais voir ce soir pour écrire un exemple à partir du code que tu m'as envoyé.
PhM
Oui tu me l'avais deja dis, mais comme je n'ai pas trouver le moyen de faire mon traitement en dehors de cette boucle, j'ai tout mis dedans. Un exemple sera le bienvenu.
Pour ce qui est de la refonte du programe, il serait bien de mettre les indications de qui à fait quoi afin de mieux comprendre.
...Pour ce qui est de la refonte du programe, il serait bien de mettre les indications de qui à fait quoi afin de mieux comprendre.
Il faudrait que l'on utilise un système comme SVN par exemple. Il va falloir que je regarde comment ça marche à distance car pour l'instant je n'ai qu'une installation en local sur un de mes disques.
Il s'agit de ce qu'on appelle un Port série (COM) virtuel. Cela nécessite un driver spécifique (FTDI dans le cas de la carte Arduino).
Ounet,
Ayant commencé le C et les plugins il y a deux semaines, j'ai d'abord dû lire de nombreux documents et sites, d'où mon silence radio depuis jeudi.
Je pense avoir trouvé ce qui pose problème dans la version Windows de ton plugin.
Il semble que FOPEN soit réservée au traitement de fichiers et ne puisse plus être utilisée pour communiquer avec un port série depuis Windows98!
Il faut donc remplacer les instructions :
Fopen par CreateFile (c'est la philosophie, il faut évidemment des paramètres adéquats)
Fprintf par WriteFile (même remarque)
Pour lire on utilise ReadFile.
J'ai également trouvé un moyen simple pour imposer les paramètres standard 9600, n 8, 1, ainsi qu'une routine pour tester les paramètres complets actuels et les modifier (Windows only).
J'ai modifié le plugin mais n'ayant pas encore installé Visual C++ Express et ni acheté de composants (écran, LED), je n'ai encore rien testé.
J'ai une grosse surcharge de travail pour le moment (et c'est ma première priorité :D ), mais je mettrai le code source en ligne jeudi soir.
Je proposerai également une autre façon de nommer les variables qui permet de raccourcir le programme et de simplifier sa mise à jour (ajout d'une variable), mais avec une légère perte de lisibilité.
J'ai examiné avec intérêt ta routine Arduino.
Ta routine est une boucle qui lit un caractère à chaque passage.
Je suis parti sur une idée différente (je n'ai pas dit meilleure) qui consiste à lire une ligne complète à chaque passage dans la boucle (le premier caractère est stocké dans test puis je réalise une boucle pour lire tous les caractères de la ligne et les mettre dans indata). Ceci permet de simplifier un peu les routines pour chaque cas. Ce sera plus compréhensible quand tu verras la routine.
Pourquoi proposer un nouveau code alors que le tien fonctionne? Parce que nous n'avons pas encore parlé des performances mais il faudra bien le faire pour ne pas trop nous pénaliser en FPS.
En vérifiant les performances des deux codes, nous parviendrons probablement à un troisième code encore plus rapide.
Je suggère d'ailleurs de passer directement à une vitesse de transmission de 115200 bps (au lieu de 9600) pour ne pas perdre des caractères en route.
Calcul rapide : 100 caractères envoyés par frame * 60 frames par seconde * 2 boucles de calcul par cycle d'affichage = 12000 caractères par cycle d'affichage = environ 100 kbps (8 bits + 1 stop bit)
Nous devrons peut-être envisager de ne pas envoyer les caractères à chaque frame mais tous les dixièmes de seconde par exemple.
Nous pourrions également limiter au maximum les opérations du plugin (comme par exemple, la composition du message à afficher) et laisser le boulot à la carte Arduino.
J'ai également essayé de rédiger une version linux. Il me semble que celle-ci pourrait être proche de la version mac (fopen, ...) avec quelques headers spécifiques, comme termio.h
Je me réjouis déjà de tester la commande de servos, l'utilisation de deux cartes, ...
Ce serait bien de réussir à faire un fat plugin (compatible mac, win et linux) mais cela dépasse largement mes compétences pour le moment.
A jeudi...
Dominique
Dominique si hervé et phm son dispo jeudi soir on peut faire un skype meeting.
Bonsoir m essieux les programmeurs :mrgreen: :mrgreen:
La lecture de vos post me réjouis, malgré que je ne suive pas tous :roll:
Envoyé par FlyingBaldy
Il faut donc remplacer les instructions :
Fopen par CreateFile (c'est la philosophie, il faut évidemment des paramètres adéquats)
Fprintf par WriteFile (même remarque)
Pour lire on utilise ReadFile.
J'ai également trouvé un moyen simple pour imposer les paramètres standard 9600, n 8, 1, ainsi qu'une routine pour tester les paramètres complets actuels et les modifier (Windows only).
J'ai modifié le plugin mais n'ayant pas encore installé Visual C++ Express et ni acheté de composants (écran, LED), je n'ai encore rien testé.
J'ai une grosse surcharge de travail pour le moment (et c'est ma première priorité :D ), mais je mettrai le code source en ligne jeudi soir.
Si tu peut faire un petit code test, je peut le compiler et l'essayer.
Si vous le désirez, je peut vous ouvrir un compte sue le wiki pour déposer vos beta a tester.
Je suis dispo jeudi soir.
Hervé
La lecture des manuels, tutos, docs ... libère le pilote de la machine :-)
X -plane 12 Win 11 Pro Gigabyte Z690 I7 12700K 64DDR5 5600Mhz RTX 3090 24Go
Je suis disponible jeudi soir mais il faut que j'installe skype (son uniquement?) dont je ne me sers jamais (j'espère que ce n'est pas trop compliqué)
Pour lire la suite je vous conseille d'imprimer les listings en petits caractères (taille 8).
6. Arduino (je sais c'est mon premier point dans ce post-ci mais je préfère garder des numéros différents pour chaque idée).
La boucle gère à chaque passage la lecture d'une ligne complète, en lisant d'abord le caractère de contrôle/commande/test puis la valeur du paramètre. Cela simplifie également l'écriture de chaque routine correspondant à un cas (voir cas '1'.
Voici les premières instructions de la boucle:
void loop()
{
while (Serial.available() > 0) // le test If était inutile car couvert par le While
{
incomingByte = Serial.read (); // read first digit, which is the test (=command) value
test = incomingByte ;
if (incomingByte != '\n') // loop not executed if first character was ‘\n’ (empty string)
{
count = 0 ;
do while (incomingByte != '\n') // read the value of the parameter
{
incomingByte = Serial.read ();
indata[count] = incomingByte; // indata contient maintenant la valeur du paramètre uniquement
count ++;
}
count = count - 1
indata[count] = ‘\0’ // add a end of line escape character
i=0; // if a counter is used in one of the following routines
switch (test)
{
case '1': // heading select
{
lcd1.setCursor(0,1);
lcd1.print(indata);
break;
}
case '2': // ft select
{
lcd1.setCursor(8,1);
lcd1.print(" "); // clear lcd area beforehand to clear prior text if longer
lcd1.setCursor(8,1);
lcd1.print(indata);
break;
}
7. Pour le plugin lui-même, j'ai réécrit la partie de déclaration, de lecture et d'envoi des éléments à afficher par l'Arduino.
Cela paraît compliqué, surtout pour les déclarations mais en fait, cela simplifie grandement l'écriture de toutes les routines ainsi que l'ajout d'une nouvelle variable: il suffit d'ajouter le nom dans la liste des DataRefString, d'ajouter un code (test) dans la liste des DataRefIndex, pas nécessairement dans l'ordre alphabétique, et d'incrémenter d'une unité le nombre total d'éléments défini dans MAXINT_ITEMS ou MAX_FLOAT_ITEMS. Plus aucune modification n'est nécessaire dans le corps du plugin.
Le plugin ne fait plus que lire les variables et les imprimer une par une (s'il y a eu un changement par rapport au cycle précédent) précédées de la valeur DataRefIndex (1,2 ,3 ..., a , b ,c...).
J'ai essayé de conserver les mêmes codes test. Cette partie du plugin ne correspond plus à la routine Arduino. Tout le travail de mise en forme doit être fait dans la routine Arduino.
Allons-y:
7.1. Déclarations (références des commandes utilisées):
Remplacer tous les XPLMDataRef par ce qui suit:
#Define MAX_INT_ITEMS 16
#Define MAX_FLOAT_ITEMS 8
XPLMDataRef gIntGetDataRef[MAX_INT_ITEMS] // pour les variables Int
XPLMDataRef gLandingGearStatusXDataref = NULL; // séparé car DataRef est un vecteur
XPLMDataRef gFloatSetDataRef[MAX_FLOAT_SET_ITEMS] // pour les commandes uniquement (pas d’envoi vers Arduino)
7.2. Dans XPluginStart - Utilise la DataRef et associe aux valeurs : remplacer toutes les lignes XPLMFindDataRef par:
for (int Item=0 ;Item<MAX_INT_ITEMS ; Item++)
{
gIntDataRef[Item] = XPLMFindDataRef(IntDataRefString[Item]);
}
for (int Item=0 ;Item<MAX_FLOAT_ITEMS ; Item++)
{
gFloatDataRef[Item] = XPLMFindDataRef(FloatDataRefString[Item]);
}
7.3. Dans le SendSimDataFlightCallBack (corps du plugin):
L'impression consiste uniquement à envoyer une ligne composée de ce que j'appelle l'index (=test dans la routine Arduino) suivi de la valeur du paramètre.
Il faut tout remplacer par ce qui suit:
int IntValue
int OldIntValue[MAX_INT_ITEMS] = NULL
float FloatValue
float OldFloatValue[MAX_FLOAT_ITEMS] = NULL
char Msg[254]
int i
for (i=0 ; i<MAX_INT_ITEMS ; i++)
{
IntValue= XPLMGetDatai(gIntDataRef[i]);
If ( IntValue !=OldIntValue[i]) // supprimer si un test est plus lent qu’une transmission
{ // supprimer si un test est plus lent qu’une transmission
sprintf(Msg,"%c%i\n\r", IntDataRefIndex[i], IntValue);
fprintf(fd, Msg);
fflush(fd);
OldIntValue[i]=IntValue ; // supprimer si un test est plus lent qu’une transmission
}
}
for (i=0 ; i<MAX_FLOAT_ITEMS ; i++)
{
FloatValue= XPLMGetDataf(gGetDataRef[i]);
If ( FloatValue !=OldFloatValue[i]) // supprimer si un test est plus lent qu’une transmission
{ // supprimer si un test est plus lent qu’une transmission
sprintf(Msg,"%c%f\n\r", FloatDataRefIndex[i], FloatValue);
fprintf(fd, Msg);
fflush(fd);
OldFloatValue[i]=FloatValue ; // supprimer si un test est plus lent qu’une transmission
}
}
/* Voyant des trains d'atterrissage */ // Spécifique car vecteur (ici de longueur 10)
XPLMGetDatavf(gLandingGearStatusXDataref, LandingGearDeployRatio, 0, 10);
sprintf(Msg,"c%f %f %f\n\r", LandingGearDeployRatio[0], LandingGearDeployRatio[1], LandingGearDeployRatio[2]);
fprintf(fd, Msg); // regroupe c, d et e pour gain de temps
fflush(fd);
return 0.5f;
Voilà, c'est tout pour aujourd'hui.
Si vous m'avez lu jusqu'ici, vous avez mérité une bonne bière, sur mon compte naturellement.
Bonne nuit.
Dominique si hervé et phm son dispo jeudi soir on peut faire un skype meeting.
Sans oublier que je suis à l'heure côte est :lol: Donc le soir chez moi ça fait un petit minuit au moins en France. C'est plus simple en fin de semaine.
8. Je t'ai préparé deux fichiers de test, un pour le plugin Windows, l'autre pour la carte Arduino.
Le plugin ouvre le port COM8, lit la fréquence NAV1 et l'envoie sur le port USB.
En cas d'erreur, différents messages peuvent être affichés.
La routine Arduino lit le port USB et affiche la valeur brute (donc sans texte ni format tel que point décimal).
J'ai supposé qu'un afficheur LCD de 2*20 caractères est connecté en tant que LCD2. Vérifie et modifie les numéros des pins si nécessaire.
Peux-tu nous dire si tout est ok ou quel message d'erreur est affiché?
Je croise les doigts...
PLUGIN_API int XPluginStart(
char * outName,
char * outSig,
char * outDesc)
{
strcpy(outName, "SerialPortAccess");
strcpy(outSig, "FB.arduino.SerialPortAccess");
strcpy(outDesc, "Test communication USB Windows avec Arduino");
je te remercie de ton aide cependant je mettrais un bémol sur la modification complète de mon programme.
En effet, pour l'instant je souhaite que nous trouvions la façon d'adapter le programme que j'ai fait afin qu'il puisse fonctionner sous PC.
Je pense que tu as raison sur le fait, que le problème vient de l'envoie des données.
Lorsque cela fonctionnera, nous pourrons lors de séance de discussion ensemble apporter des modifications.
De plus je pense que dans un premier temps, nous pourions mettre les codes sur le wiki d'hervé fait pour l'occasion et pas sur le site d'x-plane.fr.
Ou nous pouvons echanger via MP.
De plus, j'ai tester ton code de l'arduino et il ne fonctionne pas. Pour le moment.
J'espere qu'hervé et toi seront dispo jeudi, moi aussi d'ailleur. afin de fiare un point de situation.
Je sais que phm dû au décalage ne pourra pas y participe nous lui ferrons un résumé.
Commentaire