IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windev Mobile Discussion :

Difficulté au niveau de l'utilisation de l'API windows GPSGetPosition. Convertir une enumeration C en WLangage


Sujet :

Windev Mobile

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 35
    Points : 35
    Points
    35
    Par défaut Difficulté au niveau de l'utilisation de l'API windows GPSGetPosition. Convertir une enumeration C en WLangage
    Bonjour,

    après avoir essayé en vain les différents exemples d'utilisation du GPS, je me suis tourné vers l'API windows permettant de le faire.

    Mon idée est d'utiliser la fonction GPSGetPosition pour récupérer les coordonnées GPS. Cette fonction prend comme paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HANDLE hGPSDevice,
    GPS_POSITION *pGPSPosition,
    DWORD dwMaximumAge,
    DWORD dwFlags
    Le handle hGPSDevice pouvant être récupéré a partir d'une autre fonction la GPSOpenDevice.
    Tout se passe bien avec le GPSOpenDevice, et j'obtiens mon handle.

    La structure GPS_Position est définie sur le site de microsoft et j'ai essayé tant bien que mal de la convertir en langage Windev. Et c'est de ce coté que semblent venir les pépins puisque ma tentative d'utiliser la fonction GPSGetPosition me retourne un code d'erreur 87: INVALID PARAMETER.


    Voila donc pour commencer les lignes du code dans lequel j'essaie d'obtenir les coordonnées GPS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    gnHGPSDevice=API("gpsapi.dll","GPSOpenDevice",Null,Null,Null,0)
     
    // initialisation de gMaGPSPosition comme demandee dans le mode d'emploi de microsoft
     
    gMaGPSPosition:nSize=Dimension(gMaGPSPosition)
    gMaGPSPosition:nVersion=1
    Resultat est un entier
    Resultat=API("gpsapi.dll","GPSGetPosition",gnHGPSDevice,Null,100,0)
     
    IF Resultat=1 THEN
    Info("ERROR_SUCCESS")
    ELSE
    Info("Error Code:"+Resultat)
    END
    Info("Latitude="+gMaGPSPosition:Latitude+" ; Longitude=" + gMaGPSPosition:rRlLongitude)

    La fonction GPSGetPosition est supposée remplir les champs de la structure GPS_POSITION
    J'obtiens a tous les coups "Error Code 87"

    J'ai l'impression d'avoir des erreurs au niveau de ma traduction des enumerations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GPS_FIX_QUALITY FixQuality;
    GPS_FIX_TYPE FixType;
    GPS_FIX_SELECTION SelectionType
    ;

    Voila donc la definition du GPS_Position made in Microsoft:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    typedef struct _GPS_POSITION {
    DWORD dwVersion;
    DWORD dwSize;
    DWORD dwValidFields;
    DWORD dwFlags;
    SYSTEMTIME stUTCTime;
    double dblLatitude;
    double dblLongitude;
    float flSpeed;
    float flHeading;
    double dblMagneticVariation;
    float flAltitudeWRTSeaLevel;
    float flAltitudeWRTEllipsoid;
    GPS_FIX_QUALITY FixQuality;
    GPS_FIX_TYPE FixType;
    GPS_FIX_SELECTION SelectionType;
    float flPositionDilutionOfPrecision;
    float flHorizontalDilutionOfPrecision;
    float flVerticalDilutionOfPrecision;
    DWORD dwSatelliteCount;
    DWORD rgdwSatellitesUsedPRNs[GPS_MAX_SATELLITES];
    DWORD dwSatellitesInView;
    DWORD rgdwSatellitesInViewPRNs[GPS_MAX_SATELLITES];
    DWORD rgdwSatellitesInViewElevation[GPS_MAX_SATELLITES];
    DWORD rgdwSatellitesInViewAzimuth[GPS_MAX_SATELLITES];
    DWORD rgdwSatellitesInViewSignalToNoiseRatio[GPS_MAX_SATELLITES];
    } GPS_POSITION, *PGPS_POSITION;

    Voila ma traduction en WLangage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    GPS_POSITION est une structure
    nVersion est un entier sans signe sur 4 octets
    nSize est un entier sans signe sur 4 octets
    nValidFields est un entier sans signe sur 4 octets
    nFlags est un entier sans signe sur 4 octets
    dhUTCTIME est une SYSTEMTIME
     
    Latitude est un réel sur 8 octets
    rRlLongitude est un réel sur 8 octets
    rRlSpeed est un réel sur 4 octets
    rRlHeading est un réel sur 4 octets
    rRlMagneticVaraition est un réel sur 8 octets
    rRlAltitudeWRTSeaLevel est un réel sur 4 octets
    rRlAltitudeEllipsoid est un réel sur 4 octets
     
    nFixQuality est un entier
    nFixType est un entier
    nSelectionType est un entier
     
    rRlPositionDilutionOfPrecision est un réel sur 4 octets
    rRlHzDilutionOfPrecision est un réel sur 4 octets
    rRlVerticalDilutionOfPrecision est un réel sur 4 octets
     
    nEnSatelliteCount est un entier sans signe sur 4 octets
    tabTblenSatelliteUsedPRNs est un tableau fixe de 1 par 16 entiers sans signe sur 4 octets
    nEnSatelliteInView est un entier sans signe sur 4 octets
    tabTabenSatelliteInViewPRNs est tableau fixe de 1 par 16 entiers sans signe sur 4 octets
    tabTblenSatellitesInViewElevation est un tableau fixe de 1 par 16 entier sans signe sur 4 octets
    tabTblenSatellitesInViewAzimuth est un tableau fixe de 1 par 16 entiers sans signe sur 4 octets
    tabTableenSatellitesInViewSignalToNoiseRatio est un tableau fixe de 1 par 16 entiers sans signe sur 4 octets
     
    FIN

    D'après vous, ou se situe le bug de mon programme et comment le corriger ?

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 157
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    Ce post date. Mais je me trouve dans la même situation.

    Avez-vous résolu le problème ?

    Merci

  3. #3
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Bonjour

    J'ai eu récemment à traiter un problème similaire sur WINCE avec un driver BLE ..... qui me renvoyait une structure. J'ai l'impression que c'est la même chose....

    Dans ce type de cas, WM n'est pas très fort ... et avec l'aide de l'Assistance Directe de PCSOFT, j'ai pu me débrouiller. Le problème vient du fait que ce n'est pas une adresse que l'on récupère mais la structure elle-même !!! Comme les clients ayant ce souci deviennent assez rares (les appels à des API DLL ....) je ne pense pas que PCSOFT fasse évoluer son code.

    En fait, il faut :
    - créer une procédure qui va réserver en mémoire dans les paramètres d'appel la taille en octets nécessaire correspondant à la taille de la structure (n1, ...etc ..), pour éviter que la structure qui est présentée ne soit écrasée
    - on va ensuite "désérialiser" la structure,
    - on va faire un transfert en parcourant "à la main" les octets et en les transférant dans la structure Windev ("Transfert")

    C'est assez bricolo mais ce la marche. ....

    Ci-après le code brut de ma procédure callback BLE.

    PS : ne pas oublier de plusser mon post s'il vous convient ... merci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    // Résumé : <indiquez ici ce que fait la procédure>
    // Syntaxe :
    //Callback_Device_Recovery (<bIsFinish> est booléen, <n1> est entier système, <n2> est entier système, <n3> est entier système, <n4> est entier système, <n5> est entier système, <n6> est entier système, <n7> est entier système, <n8> est entier système, <n9> est entier système, <n10> est entier système, <n11> est entier système, <n12> est entier système, <n13> est entier système, <n14> est entier système, <n15> est entier système, <n16> est entier système, <n17> est entier système, <n18> est entier système, <n19> est entier système, <n20> est entier système, <n21> est entier système, <n22> est entier système, <n23> est entier système, <n24> est entier système, <n25> est entier système, <n26> est entier système, <n27> est entier système, <n28> est entier système, <n29> est entier système, <n30> est entier système, <n31> est entier système, <n32> est entier système, <n33> est entier système, <n34> est entier système)
    //
    // Paramètres :
    //	bIsFinish (booléen) : <indiquez ici le rôle de bIsFinish>
    //	n1 (entier système) : <indiquez ici le rôle de n1>
    //	n2 (entier système) : <indiquez ici le rôle de n2>
    //	n3 (entier système) : <indiquez ici le rôle de n3>
    //	n4 (entier système) : <indiquez ici le rôle de n4>
    //	n5 (entier système) : <indiquez ici le rôle de n5>
    //	n6 (entier système) : <indiquez ici le rôle de n6>
    //	n7 (entier système) : <indiquez ici le rôle de n7>
    //	n8 (entier système) : <indiquez ici le rôle de n8>
    //	n9 (entier système) : <indiquez ici le rôle de n9>
    //	n10 (entier système) : <indiquez ici le rôle de n10>
    //	n11 (entier système) : <indiquez ici le rôle de n11>
    //	n12 (entier système) : <indiquez ici le rôle de n12>
    //	n13 (entier système) : <indiquez ici le rôle de n13>
    //	n14 (entier système) : <indiquez ici le rôle de n14>
    //	n15 (entier système) : <indiquez ici le rôle de n15>
    //	n16 (entier système) : <indiquez ici le rôle de n16>
    //	n17 (entier système) : <indiquez ici le rôle de n17>
    //	n18 (entier système) : <indiquez ici le rôle de n18>
    //	n19 (entier système) : <indiquez ici le rôle de n19>
    //	n20 (entier système) : <indiquez ici le rôle de n20>
    //	n21 (entier système) : <indiquez ici le rôle de n21>
    //	n22 (entier système) : <indiquez ici le rôle de n22>
    //	n23 (entier système) : <indiquez ici le rôle de n23>
    //	n24 (entier système) : <indiquez ici le rôle de n24>
    //	n25 (entier système) : <indiquez ici le rôle de n25>
    //	n26 (entier système) : <indiquez ici le rôle de n26>
    //	n27 (entier système) : <indiquez ici le rôle de n27>
    //	n28 (entier système) : <indiquez ici le rôle de n28>
    //	n29 (entier système) : <indiquez ici le rôle de n29>
    //	n30 (entier système) : <indiquez ici le rôle de n30>
    //	n31 (entier système) : <indiquez ici le rôle de n31>
    //	n32 (entier système) : <indiquez ici le rôle de n32>
    //	n33 (entier système) : <indiquez ici le rôle de n33>
    //	n34 (entier système) : <indiquez ici le rôle de n34>
    // Valeur de retour :
    // 	Aucune
    //
    // Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE Callback_Device_Recovery(bIsFinish est un booléen <utile>,...
    n1  est un entier système <utile>, n2  est un entier système <utile>, n3  est un entier système <utile>, n4  est un entier système <utile>, n5  est un entier système <utile>,...
    n6  est un entier système <utile>, n7  est un entier système <utile>, n8  est un entier système <utile>, n9  est un entier système <utile>, n10 est un entier système <utile>,...
    n11 est un entier système <utile>, n12 est un entier système <utile>, n13 est un entier système <utile>, n14 est un entier système <utile>, n15 est un entier système <utile>,...
    n16 est un entier système <utile>, n17 est un entier système <utile>, n18 est un entier système <utile>, n19 est un entier système <utile>, n20 est un entier système <utile>,...
    n21 est un entier système <utile>, n22 est un entier système <utile>, n23 est un entier système <utile>, n24 est un entier système <utile>, n25 est un entier système <utile>,...
    n26 est un entier système <utile>, n27 est un entier système <utile>, n28 est un entier système <utile>, n29 est un entier système <utile>, n30 est un entier système <utile>,...
    n31 est un entier système <utile>, n32 est un entier système <utile>, n33 est un entier système <utile>, n34 est un entier système <utile>)
     
     
    nEntierAdresse est un entier
    sChaineAdresse est une chaîne
     
    stDeviceInfo est STBCESDK_DeviceInfoStru
     
    SI PAS bIsFinish  ALORS         
    	SI FenEtat (FEN_ApiBluetooth) = Actif ALORS
    		FEN_ApiBluetooth.LIB_INFO = FEN_ApiBluetooth.LIB_INFO + RC+  "BT trouvé" +RC 
    		//Trace("Recherche Bluetooth terminé")	
    	FIN
     
    	//Normalement dans ce cas les autres paramètres contiennent les info des périphérique Bluetooth trouvés	
    	nTailleARecuperer est un entier
    	nTailleDejaRecuperee est un entier
    	nTailleProchaneRecuperation est un entier
     
    	//--------------Le premier membre (bufbd_addr) est sur 6 (BCESDK_BDADDR_LEN)
    	nTailleARecuperer=BCESDK_BDADDR_LEN //6
    	nTailleDejaRecuperee=0
    	//Calcul de la taille a récupérer
    	nTailleProchaneRecuperation=Dimension(n1)
    	//Récupération
    	Transfert(&stDeviceInfo.bufbd_addr,&n1,nTailleProchaneRecuperation)
    	//MAJ de la taille récupérée
    	nTailleDejaRecuperee+=nTailleProchaneRecuperation
     
    	//Calcul de la taille a récupérer
    	nTailleProchaneRecuperation=2 // Max(Dimension(n2),(nTailleDejaRecuperee-Dimension(n2)))
    	//Récupération
    	Transfert(&stDeviceInfo.bufbd_addr+nTailleDejaRecuperee,&n2,nTailleProchaneRecuperation)
    	//MAJ de la taille récupérée
    	nTailleDejaRecuperee+=nTailleProchaneRecuperation
    	//--------------
     
     
    	/////////////////////////////////////////////////////////////////////////////////////
    	SI FenEtat (FEN_ApiBluetooth) = Actif ALORS
    	//	FEN_ApiBluetooth.LIB_INFO = FEN_ApiBluetooth.LIB_INFO+"bufbd_addr : "+stDeviceInfo.bufbd_addr+RC
    		POUR i = 6 _A_ 2 PAS -1
    			Transfert (&nEntierAdresse,&stDeviceInfo.bufbd_addr+(i-1),1)
    			sChaineAdresse = sChaineAdresse + EntierVersHexa(nEntierAdresse) + ":"					
    		FIN
    		Transfert (&nEntierAdresse,&stDeviceInfo.bufbd_addr,1)
    		sChaineAdresse = sChaineAdresse + EntierVersHexa(nEntierAdresse) 				
     
    		FEN_ApiBluetooth.LIB_INFO = FEN_ApiBluetooth.LIB_INFO+"bufbd_addr : "+sChaineAdresse+RC
    	FIN
    	//////////////////////////////////////////////////////////////////////////////////////
     
     
    	//--------------Le deuxième membre (sName) est sur 128 : 64x2 (BCESDK_DEVNAME_LEN x 2 car unicode)
    	nTailleARecuperer=BCESDK_DEVNAME_LEN*2 //64x2
    	nTailleDejaRecuperee=0
    	// cas particulier du premier car il restait 2 sur le membre précédent
    	nTailleProchaneRecuperation=2
    	//Récupération
    	Transfert(&stDeviceInfo.sName,&n2+2,2)		
    	//MAJ de la taille récupérée
    	nTailleDejaRecuperee+=nTailleProchaneRecuperation
     
    	//Calcul de la taille a récupérer
    	nTailleProchaneRecuperation=Dimension(n3)
    	POUR i=3 _A_ 33
    		//Récupération
    		Transfert(&stDeviceInfo.sName+nTailleDejaRecuperee,&{"n"+i,indVariable},nTailleProchaneRecuperation)
    		//MAJ de la taille récupérée
    		nTailleDejaRecuperee+=nTailleProchaneRecuperation	
    	FIN
    	// cas particulier du dernier car il reste 2 (2 + 32=4 = 126, hors la taille est de 128, ou Max(Dimension(n34),(nTailleDejaRecuperee-Dimension(n34))) )	 
    	Transfert(&stDeviceInfo.sName+nTailleDejaRecuperee,&n34,2)	
     
    	//--------------
    	//	trace("bufbd_addr : "+stDeviceInfo.bufbd_addr)
    	//	trace("sName : "+stDeviceInfo.sName)
    	SI FenEtat (FEN_ApiBluetooth) = Actif ALORS
    //		FEN_ApiBluetooth.LIB_INFO = FEN_ApiBluetooth.LIB_INFO+"bufbd_addr : "+stDeviceInfo.bufbd_addr+RC
    		FEN_ApiBluetooth.LIB_INFO = FEN_ApiBluetooth.LIB_INFO+"sName : "+stDeviceInfo.sName+RC
     
    	FIN
     
    SINON
    	//	Trace("Recherche Bluetooth  en cours...")
    	SI FenEtat (FEN_ApiBluetooth) = Actif ALORS
    		FEN_ApiBluetooth.LIB_INFO = FEN_ApiBluetooth.LIB_INFO+ "Fin Recherche Bluetooth ....."+RC
    	FIN
     
    FIN

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 157
    Points : 84
    Points
    84
    Par défaut
    Bonjour,
    désolé pour le retard.

    Merci pour ta réponse courdi95,mais je ne comprends pas ton explication. Je ne vois pas le lien avec le GPS ?

Discussions similaires

  1. [Débutant] Utilisation de l'API Windows pour personnaliser des contrôles
    Par noftal dans le forum VB.NET
    Réponses: 10
    Dernier message: 12/11/2013, 23h21
  2. Comment extraire une ressource de votre exe, en utilisant que les API windows ?
    Par DelphiCool dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 31/01/2013, 22h22
  3. [MySQL] Différence mysql_error/mysql_num_rows(au niveau de l'utilisation)
    Par guipe dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/04/2010, 08h02
  4. Réponses: 7
    Dernier message: 19/03/2008, 16h37
  5. Architecture d'un serveur multijoueurs niveau emmission avec utilisation thread
    Par goof_22 dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 22/04/2006, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo