Gambas France BETA


Pas de compte ? Incription

Interfacer une librairie avec Gambas 3...

12
AuteurMessages
spheris#1 Posté le 22/9/2022 à 15:17:37
Bonjour,
Je vais ouvrir un sujet qui, je l'espère , succitera plein de réactions de votre part, un sujet qui est passionant, certe, mais qui me pose plein de problèmes de compréhension:

L'INTERFACAGE DE GAMBAS AVEC DES BIBLIOHEQUES EXTERIEURES

C'est pourquoi je fais appel à vous ne connaissant pas très bien le C ou le c++.

J'ai pris un exemple phare de Tatoeblue (que je salue bien au passage) qui interface GB3 et la bibliothèqe K8055 programmée en C, la fameuse carte de Velleman que j'ai beaucoup utilisé dans mes applications.

le lien de son appli ICI

Je cherche à comprendre par un exemple de code comment cela peut fonctionner.
Il écrit dans son code les lignes suivantes :

1
2
3
4
5
6
EXTERN OpenDevice(CardAdress AS LONG) AS LONG IN "libk8055"
EXTERN CloseDevice() IN "libk8055"
EXTERN WriteAllDigital(Data AS LONG) IN "libk8055"
EXTERN SetDigitalChannel(channel AS LONG) IN "libk8055"
EXTERN ClearDigitalChannel(channel AS LONG) IN "libk8055"
'etc...

Prenons un exemple de fonction dans le fichier des sources de la librairie lib8055.c disponible sur le net :

int ClearDigitalChannel(long Channel)
{.........ducode ducode
else
return K8055_ERROR;
}


Ce que je comprends dans la ligne gambas :

1
EXTERN ClearDigitalChannel(channel AS LONG) IN "libk8055"


A) Extern : fait référence à une librairie externe, en l'occurence ici la libk8055
B) channel as long = le long Channel entre parenthèse, variable passée à la méthode
C) Int : type de valeur qui est retournée par la fonction ClearDigitalChannel (ici aucune valeur retournée)
D) "libk8055" : le nom de la librairie externe. ( bizarre une librairie est toujours du type lenom.lib.so ou un truc comme ça
une remarque : ClearDigitalChannel doit utiliser exactement la même casse dans le fichier source C et le code gambas sinon cela ne fonctionne pas.


Mes questions sont les suivantes :
1) Dans le code source de la librairie, quels sont les fonctions (methode en gambas) que je dois utiliser? toutes ou que quelques unes? Comment savoir lequelles prendre?

pour reprendre son exemple il a déclaré toutes ces fonctions C :
1
2
3
4
5
6
7
8
9
10
11
12
EXTERN OpenDevice(CardAdress AS LONG) AS LONG IN "libk8055"
EXTERN CloseDevice() IN "libk8055"
EXTERN WriteAllDigital(Data AS LONG) IN "libk8055"
EXTERN SetDigitalChannel(channel AS LONG) IN "libk8055"
EXTERN ClearDigitalChannel(channel AS LONG) IN "libk8055"
EXTERN ReadAllDigital() AS LONG IN "libk8055"
EXTERN ReadAnalogChannel(Channel AS LONG) AS LONG IN "libk8055"
EXTERN ReadAllAnalog(Data1 AS LONG, Data2 AS LONG) IN "libk8055"
EXTERN OutputAnalogChannel(Channel AS LONG, Data AS LONG) IN "libk8055"
EXTERN OutputAllAnalog(Data1 AS LONG, Data2 AS LONG) IN "libk8055"
EXTERN ResetCounter(CounterNumber AS LONG) IN "libk8055"
EXTERN ReadCounter(CounterNumber AS LONG) AS LONG IN "libk8055"


cela semble être toutes celles qui lui sont utiles pour piloter la carte.
par contre pour mon modbus TCP/IP, c'est une autre affaire, la bibliothèque est fouillie.

2) Je suis confronté à une autre librairie modbustcp avec la fonction C suivante:

modbus_t* modbus_new_tcp_pi(const char *node, const char *service)
{
modbus_t *ctx;
modbus_tcp_pi_t *ctx_tcp_pi;
size_t dest_size;
ducode ducode...
}

que veut dire : const char *node ? de quel type, int, long?

3) Du C, je comprends (un peu) ,mais comment pourrions-nous utiliser une librairie créée en C++? (et là je rebondis sur cet extraordinaire projet qu'une ame charitable pourrait vraiment mettre au point le gb.fltk qui nous affranchirait des différents couacs entre les qt3,4,5 et les gtk2,3 et autres bilvesées parce que le fltk, c'est fiable, rapide et ça n'evolue pas ou peu, et puis surtout parce que les basic concurents sur linux et même windows utilisent le fltk) :P


Voilà bien des questions que je me pose sans pouvoir trouver de réponses claires sur le net.
Merci à tous pour votre participation, car de toutes vos réponses, je ferai un condensé sur gambaslinux pour un tuto clair, imagé, et simple.
;)



vuott#2 Posté le 23/9/2022 à 07:19:16
Ne cedere ineluctabili possimusBonjour spheris.

Bonjour,
que veut dire : const char *node ? de quel type, int, long?

"const char * node" est une Constante de type Pointeur vers caractère.
En Gambas, elle doit être traduite avec le type de données "String".
En fait, dans la page spécifique du Wiki officiel de Gambas (https://gambaswiki.org/wiki/doc/extern), nous lisons que :
«If an argument is a const char *, then you can declare it as a String.»

Par conséquent, la déclaration en langage C de la fonction externe:
modbus_t* modbus_new_tcp_pi(const char *node, const char *service)
doit être traduit en Gambas comme suit:
1
PRIVATE EXTERN modbus_new_tcp_pi(node AS STRING, service AS STRING) AS POINTER


3) Du C, je comprends (un peu) ,mais comment pourrions-nous utiliser une librairie créée en C++?

Comme le dit B. Minisini dans son message sur la liste de diffusion officielle de Gambas (https://lists.gambas-basic.org/pipermail/user/2017-May/060315.html):
«You usually can't use C++ exported functions from Gambas.»
En effet, bien que pas impossible, il est extrêmement complexe et fatigant de gérer les ressources externes du langage C++ en Gambas.
Vous pouvez voir quelques tentatives que j'ai faites et rapportées dans cette page du wiki du forum italien :
Richiamare funzioni esterne di librerie scritte in C++
spheris#3 Posté le 23/9/2022 à 07:44:30
Merci vuott,
je comprends mieux maintenant pour la question 1.

Mais pour la question 3, comment benoit a-t-il fait pour interfacer la librairie qt sur gambas? la librairie qt est bien programmée en cpp?
vuott#4 Posté le 23/9/2022 à 07:54:23
Ne cedere ineluctabili possimusPour interfacer la librairie QT, écrite en C++, sur Gambas, Minisini n'a pas utilisé la ressource "Extern", mais a créé un "Component", entièrement écrit en langage C++.
Vous pouvez voir, en fait, que les sources de nombreux composants Gambas sont écrites directement en C ou C++ (jamais en utilisant "Extern" qui est une ressource Gambas).
https://gambaswiki.org/wiki/comp?l=fr
spheris#5 Posté le 23/9/2022 à 08:19:07
Merci vuott,
mais alors comment traduire cela en gambas :

modbus_t *mb;

uint16_t tab_reg[32];

mb = modbus_new_tcp("127.0.0.1", 1502);
modbus_connect(mb);

/* Read 5 registers from the address 0 */
modbus_read_registers(mb, 0, 5, tab_reg);

modbus_close(mb);
modbus_free(mb);

?
vuott#6 Posté le 23/9/2022 à 08:31:26
Ne cedere ineluctabili possimus
mais alors comment traduire cela en gambas :

modbus_t *mb;

uint16_t tab_reg[32];

Si les deux déclarations sont "locales" (on utilise donc "Dim") :

1
2
DIM mb AS POINTER
DIM tab_reg AS NEW SHORT[32]

En fait, "uint16_t" est un type de donnée "unsigned short int"; bref, un Short sans signe, mais dans Gambas - comme vous le savez - il n’existe pas : nous avons un Short avec signe.
J'ai confirmé dans Gambas le type de données du "short" ; mais il y a un risque que si le tableau recevait une valeur supérieure à celle supportée par le Short (par Gambas), il ne serait pas capable de la représenter correctement.
Pour éviter cette éventualité, le tableau doit être déclaré comme "Integer[]", mais à l'inverse il faut dire que, si dans la fonction ou dans la suite du programme, un type de données de 16 bit est absolument requis, l'entier sera créer évidemment de gros problèmes.


Concernant les fonctions externes spécifiques elles seront reportées dans Gambas telles que vous les avez transcrites (évidemment sans le caractère final ";" ).
spheris#7 Posté le 23/9/2022 à 09:00:19
Merci vuott,
avec toutes ces informations, je vais pouvoir avancer.
vuott#8 Posté le 23/9/2022 à 15:04:08
Ne cedere ineluctabili possimusJe signale les pages, écrites par moi, du wifi du forum italien concernant la gestion des fonctions externes, écrites en langage C, et plus généralement des ressources externes à Gambas:

https://www.gambas-it.org/wiki/index.php/Guide_della_comunit%C3%A0#Interfacciare_Gambas_con_librerie_dinamiche_esterne_.so

ciao.
linuxos#9 Posté le 23/9/2022 à 19:57:48
Un peu de sel, de poivre et la crevette sera... Bonjour Spheris,

Tu peux jeter un œil sur le composant gb.sshclient que j'ai écrit il y a longtemps. Il y a une version de 2016 disponible sur la Ferme de Gambas.

Cela te donnera une idée de comment interfacer une librairie C en Gambas.

N'hésite à revenir vers moi si tu bloques quelque part.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
spheris#10 Posté le 24/9/2022 à 10:48:59
LinuxOS, vuott,
Merci, je vous posterai mon travail.
Je suis entrain d'interfacer la bibliotheque modbusTCPIP avec GB.
vuott#11 Posté le 24/9/2022 à 19:59:47
Ne cedere ineluctabili possimusMa suggestion est de trouver un programme C, avec des ressources modbusTCPIP, qui fait le travail dont vous avez besoin.
Il faut donc vérifier si ce programme fonctionne en C (parfois les exemples de codes ne fonctionnent plus car ils sont trop anciens).
Une fois que vous avez vérifié que ce programme fonctionne régulièrement, vous pouvez vous essayer à le traduire en Gambas.
spheris#12 Posté le 25/9/2022 à 19:52:41
merci,
J'ai trouvé une librairie en C excellente à porter sous gb.
Il s'agit de la librairie OPEN MOTIF le toolkit graphique moyenageux.
Qui veut s'y frotter pour essayer?
Linuxos, vuot, valaquarus foromus et les autres?
:tongue: :tongue: :tongue:

on appellera cela gb.motif, un composant à ajouter à notre gb favori.
spheris#13 Posté le 26/9/2022 à 19:16:50
LinuxOs,
Je ne trouve pas le fichier gb.sshclient dans la forge. Où l'as-tu mis? catégorie réseau ou système?
linuxos#14 Posté le 28/9/2022 à 23:42:24
Un peu de sel, de poivre et la crevette sera... Spheris,

Elle est dans 'Bibliothèques'

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
valaquarus#15 Posté le 29/9/2022 à 07:27:55
-- Unus Ex Altera --Elle est exactement dans Composants.
Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
12