Lire / Ecrire fichier Garmin GPI

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Motard84
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 03 sept. 2024 19:21
Localisation : vaucluse
Status : Hors ligne

Lire / Ecrire fichier Garmin GPI

#1

Message par Motard84 »

Bonjour,

Débutant, pour mon projet j'aurais besoin de lire (et si possible d'écrire) des fichiers au format Garmin GPI (GPS).

D’après le document qui décrit le format , j'ai essayer de lire le fichier et de le 'traduire" en texte.

Voici mon bout de code de test:
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>


$sFileGPI="test.gpi"
$h=FileOpen($sFileGPI,$FO_BINARY )
$content=FileRead($h)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $content = ' & $content & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
FileClose($h)

$type=VarGetType($content)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $type = ' & $type & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console


;~ $ToString=BinaryToString($content)
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ToString = ' & $ToString & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;~ ConsoleWrite(@CRLF  & @CRLF)

$content=StringTrimLeft($content,2) ; cut off the leading "0x"
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $content = ' & $content & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

;lit Record type 0: Header1
$next=StringMid($content,9,6)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :     $next = ' &     $next & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$Chr=BinaryToString($next)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :     $Chr = ' &  $Chr & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite(@CRLF & "---" & @CRLF)

ci_joint format du fichier (PDF) et fichier exemple (à renommer en "test.gpi")
test.gpi.txt
(52 Octets) Téléchargé 86 fois
Garmin_GPI_Format.pdf
(138.84 Kio) Téléchargé 88 fois
Merci d'avance pour vos conseils.
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 118
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: Lire / Ecrire fichier Garmin GPI

#2

Message par Nine »

Au lieu de convertir en texte, tu serais bien mieux de prendre le contenu du fichier et le traiter comme une structure (qui va suivre précisément le format précisé dans le pdf)

Voici un exemple qui lit le header1 :

Code : Tout sélectionner

#include <Constants.au3>
#include <WinAPIDiag.au3>

Local $hFile = FileOpen("test.gpi", $FO_BINARY)
Local $dContent = FileRead($hFile)
FileClose($hFile)

Local $tFile = DllStructCreate("byte data[" & BinaryLen($dContent) & "]")
$tFile.data = $dContent
Local $tagHeader1 = "align 1;ushort type;ushort flags;uint length;char string[6];char format[2];uint gdate;" & _
  "byte flags1;byte obfuscation;ushort lenPstring;"
Local $tHeader1 = DllStructCreate($tagHeader1, DllStructGetPtr($tFile))
$tHeader1 = DllStructCreate($tagHeader1 & "char filename[" & $tHeader1.lenPstring & "]", DllStructGetPtr($tFile))
_WinAPI_DisplayStruct($tHeader1, $tagHeader1 & "char filename[" & $tHeader1.lenPstring & "]")
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2278
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Lire / Ecrire fichier Garmin GPI

#3

Message par jchd »

Tout à fait de l'avis de Nine.
Je suis allé un peu plus loin, mais il reste énormément de travail pour en faire quelquechose de robuste et complet.
Je n'ai pas traité les "extra data".
Il faut coder pour tous les types manquants.
Il faut réorganiser la structure pour lire les "subrecords" récursivement.
Etc.

Code : Tout sélectionner

#include <FileConstants.au3>
#include <Date.au3>

Local $aRecTypes = [ _
	[ 0, "Header1", Decode_0], _
	[ 1, "Header2", Decode_1], _
	[ 2, "Waypoint", Decode_2], _
	[ 3, "Alert", Decode_3], _
	[ 4, "Bitmap reference", Decode_4], _
	[ 5, "Bitmap", Decode_5], _
	[ 6, "Category reference", Decode_6], _
	[ 7, "Category", Decode_7], _
	[ 8, "Area", Decode_8], _
	[ 9, "POI Group", Decode_9], _
	[10, "Comment", Decode_10], _
	[11, "Address", Decode_11], _
	[12, "Contact", Decode_12], _
	[13, "Image", Decode_13], _
	[14, "Description", Decode_14], _
	[15, "Product info", Decode_15], _
	[16, "Alert circles", Decode_16], _
	[17, "Copyright", Decode_17], _
	[18, "Media", Decode_18], _
	[19, "Safety camera", Decode_19], _
	[20, "Type 20 ???", Decode_Unknown], _
	[21, "Additions", Decode_21], _
	[22, "Type 22 ???", Decode_Unknown], _
	[23, "Type 23 ???", Decode_Unknown], _
	[24, "Type 24 ???", Decode_Unknown], _
	[25, "Type 25 ???", Decode_Unknown], _
	[26, "Type 26 ???", Decode_Unknown], _
	[27, "Alert trigger options", Decode_27], _
	[0xFFFF, "End", Decode_End] _
]

Local $tRecHeader = DllStructCreate("ushort rectype;ushort flags;uint size")
Local $tRecHeader_ = DllStructCreate("byte header[" & DllStructGetSize($tRecHeader) & "]", DllStructGetPtr($tRecHeader))

; lecture du fichier binaire
Local $hFile = FileOpen("test.gpi", $FO_BINARY)
Local $vData = FileRead($hfile)
FileClose($hfile)
Local $iDataSize = BinaryLen($vData)

Local $iIndex = 1
Local $vHeader
Local $iSize
Local $iType
Local $iIndent

; tant qu'on n'a pas fini de tout décoder
While $iIndex < $iDataSize
	; lecture de l'en-tête du prochain record
	$iSize = DllStructGetSize($tRecHeader)
	$tRecHeader_.header = BinaryMid($vData, $iIndex, $iSize)
	$iIndex += $iSize
	$iType = $tRecHeader.rectype
	$iIndent = 0
	Print($aRecTypes[$iType][1])
	$iIndent = 1
	$aRecTypes[$iType][2]()
	$iIndent = 0
WEnd


Func Decode_0()
	Local Static $t = DllStructCreate("align 1;char mark[6];char version[2];uint gdate; byte flags1;byte obfusc;ushort size")
	Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
	$iSize = DllStructGetSize($t)
	$t_.header = BinaryMid($vData, $iIndex, $iSize)
	$iIndex += $iSize
	Print("Marqueur : " & $t.mark)
	Print("Version  : " & $t.version)
	Print("Date     : " & Decode_Gdate($t.gdate))
	Print("Flags    : 0x" & Hex($t.flags, 2))
	Print("Obfusc.  : 0x" & Hex($t.obfusc, 2))
	$iSize = $t.size
	Print("Nom      : " & BinaryToString(BinaryMid($vData, $iIndex, $iSize)))
	$iIndex += $iSize
EndFunc

Func Decode_1()
	Local Static $t = DllStructCreate("align 1;char mark[3]; byte[3];char version[2];ushort cp; ushort flags")
	Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
	Local Static $mCP[]
	$mCP[0x036A] = "Windows Thai"
	$mCP[0x03B6] = "Big5 Traditional Chinese"
	$mCP[0x04E2] = "Windows Central Europe"
	$mCP[0x04E3] = "Windows Cyrillic"
	$mCP[0x04E4] = "Windows Latin"
	$mCP[0xFDE9] = "UTF-8"

	$iSize = DllStructGetSize($t)
	$t_.header = BinaryMid($vData, $iIndex, $iSize)
	$iIndex += $iSize
	Print("Marqueur : " & $t.mark)
	Print("Version  : " & $t.version)
	Print("Codepage : " & $mCP[$t.cp])
	Print("Flags    : 0x" & Hex($t.flags, 4))
EndFunc

Func Decode_2()
	Print()
EndFunc

Func Decode_3()
	Print()
EndFunc

Func Decode_4()
	Print()
EndFunc

Func Decode_5()
	Print()
EndFunc

Func Decode_6()
	Print()
EndFunc

Func Decode_7()
	Print()
EndFunc

Func Decode_8()
	Print()
EndFunc

Func Decode_9()
	Print()
EndFunc

Func Decode_10()
	Print()
EndFunc

Func Decode_11()
	Print()
EndFunc

Func Decode_12()
	Print()
EndFunc

Func Decode_13()
	Print()
EndFunc

Func Decode_14()
	Print()
EndFunc

Func Decode_15()
	Print()
EndFunc

Func Decode_16()
	Print()
EndFunc

Func Decode_17()
	Print()
EndFunc

Func Decode_18()
	Print()
EndFunc

Func Decode_19()
	Print()
EndFunc

Func Decode_21()
	Print()
EndFunc

Func Decode_27()
	Print()
EndFunc

Func Decode_End()
	Print()
EndFunc

Func Decode_Unknown()
	Print("Type inconnu " & $iType & " : décalage probable dans les données !")
EndFunc


Func Decode_Gdate($n)
	; $n est le nombre de secondes depuis 1989-12-31 00:00:00 (un format alakon !)
	; la valeur de unixepoch('2000-01-01 00:00:00') - unixepoch('1989-12-31 00:00:00') est 315619200 (secondes)
	; car notre _DateAdd ne fonctionne qu'à partir de 2000-01-01 00:00:00
	Return StringReplace(_DateAdd("s", $n - 315619200, "2000-01-01 00:00:00"), "/", "-")
EndFunc


Func Print($s)
	For $i = 1 To $iIndent
		ConsoleWrite(@TAB)
	Next
	ConsoleWrite($s & @CRLF)
EndFunc
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Motard84
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 03 sept. 2024 19:21
Localisation : vaucluse
Status : Hors ligne

Re: Lire / Ecrire fichier Garmin GPI

#4

Message par Motard84 »

Bonjour @Nine et @jchd,

Merci pour vos codes.

Je vais étudier cela de prêt , j'ai oublié de préciser que le principal est que je puisse récupérer les valeurs Latitude (block2), Longitude(block2), Comment (block10), Adresse (block11) et Contact (block12).

Je reviendrais vers vous si question / publier le code pour vos conseils.
Merci.
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 118
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: Lire / Ecrire fichier Garmin GPI

#5

Message par Nine »

Si la disposition de tes variables est toujours la même, tu peux sauter tous les bytes précédents avec byte[xxx]. Mais si la disposition varie parce qu'il y des valeurs extra dans certaines occasions, alors tu vas devoir décoder chaque structure individuellement.
Avatar du membre
Motard84
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 03 sept. 2024 19:21
Localisation : vaucluse
Status : Hors ligne

Re: Lire / Ecrire fichier Garmin GPI

#6

Message par Motard84 »

Bonjour,
suite à de nombreux tests avec les 2 versions, je n'arrive pas à obtenir les infos .

Méthode de @jchd : Les headers ne corresponde pas (mon code test):

#include <FileConstants.au3>
#include <Date.au3>
#include <Array.au3>


Local $aRecTypes = [ _
    [ 0, "Header1", Decode_0], _
    [ 1, "Header2", Decode_1], _
    [ 2, "Waypoint", Decode_2], _
    [ 3, "Alert", Decode_3], _
    [ 4, "Bitmap reference", Decode_4], _
    [ 5, "Bitmap", Decode_5], _
    [ 6, "Category reference", Decode_6], _
    [ 7, "Category", Decode_7], _
    [ 8, "Area", Decode_8], _
    [ 9, "POI Group", Decode_9], _
    [10, "Comment", Decode_10], _
    [11, "Address", Decode_11], _
    [12, "Contact", Decode_12], _
    [13, "Image", Decode_13], _
    [14, "Description", Decode_14], _
    [15, "Product info", Decode_15], _
    [16, "Alert circles", Decode_16], _
    [17, "Copyright", Decode_17], _
    [18, "Media", Decode_18], _
    [19, "Safety camera", Decode_19], _
    [20, "Type 20 ???", Decode_Unknown], _
    [21, "Additions", Decode_21], _
    [22, "Type 22 ???", Decode_Unknown], _
    [23, "Type 23 ???", Decode_Unknown], _
    [24, "Type 24 ???", Decode_Unknown], _
    [25, "Type 25 ???", Decode_Unknown], _
    [26, "Type 26 ???", Decode_Unknown], _
    [27, "Alert trigger options", Decode_27], _
   [65535, "End", Decode_End] _ ;~     [0xFFFF, "End", Decode_End] _
   ]

;~ _ArrayDisplay($aRecTypes)

Local $tRecHeader = DllStructCreate("ushort rectype;ushort flags;uint size")
Local $tRecHeader_ = DllStructCreate("byte header[" & DllStructGetSize($tRecHeader) & "]", DllStructGetPtr($tRecHeader))


; lecture du fichier binaire
Local $hFile = FileOpen($sfile , $FO_BINARY)
Local $vData = FileRead($hfile)
FileClose($hfile)
Local $iDataSize = BinaryLen($vData)

Local $iIndex = 1
Local $vHeader
Local $iSize
Local $iType
Local $iIndent

; tant qu'on n'a pas fini de tout décoder
While $iIndex < $iDataSize
    ; lecture de l'en-tête du prochain record
    $iSize = DllStructGetSize($tRecHeader)
    $tRecHeader_.header = BinaryMid($vData, $iIndex, $iSize)
    $iIndex += $iSize
    $iType = $tRecHeader.rectype
    $iIndent = 0
    ConsoleWrite("+ Type = " & $iType & @crlf)
    if $iType <=28 then
        Print($aRecTypes[$iType][1])
        $iIndent = 1
        $aRecTypes[$iType][2]()
        $iIndent = 0
    endif
WEnd


Func Decode_0()
    Local Static $t = DllStructCreate("align 1;char mark[6];char version[2];uint gdate; byte flags1;byte obfusc;ushort size")
    Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
    $iSize = DllStructGetSize($t)
    $t_.header = BinaryMid($vData, $iIndex, $iSize)
    Print("$iIndex before   : " & $iIndex)
   Print("$iSize   : " & $iSize)
   $iIndex += $iSize
    $iSize = $t.size
    Local $sNom = BinaryToString(BinaryMid($vData, $iIndex, $iSize))
   Print("Marqueur : " & $t.mark)
    Print("Version  : " & $t.version)
    Print("Date     : " & Decode_Gdate($t.gdate))
    Print("Flags    : 0x" & Hex($t.flags, 2))
    Print("Obfusc.  : 0x" & Hex($t.obfusc, 2))
   Print("Nom      : " & $sNom)
   $isize += StringLen($sNom)
   Print("$iIndex after   : " & $iIndex)


EndFunc

Func Decode_1()
    Local Static $t = DllStructCreate("align 1;char mark[3]; byte[3];char version[2];ushort cp; ushort flags")
    Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
    Local Static $mCP[]
    $mCP[0x036A] = "Windows Thai"
    $mCP[0x03B6] = "Big5 Traditional Chinese"
    $mCP[0x04E2] = "Windows Central Europe"
    $mCP[0x04E3] = "Windows Cyrillic"
    $mCP[0x04E4] = "Windows Latin"
    $mCP[0xFDE9] = "UTF-8"

    $iSize = DllStructGetSize($t)
    $t_.header = BinaryMid($vData, $iIndex, $iSize)
   Print("$iIndex before   : " & $iIndex)
   Print("$iSize   : " & $iSize)
    $iIndex += $iSize
    Print("Marqueur : " & $t.mark)
    Print("Version  : " & $t.version)
    Print("Codepage : " & $mCP[$t.cp])
    Print("Flags    : 0x" & Hex($t.flags, 4))
   Print("$iIndex    : " & $iIndex)
EndFunc

Func Decode_2()
    Print("! ============================== GPS coordonnees ======================================")
    Local Static $t = DllStructCreate("align 1;int lat;int long;ushort Unknow4;byte Unknow5;ushort size;")
    Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
    $iSize = DllStructGetSize($t)
    $t_.header = BinaryMid($vData, $iIndex, $iSize)
    Print("$iIndex before   : " & $iIndex)
   Print("$iSize   : " & $iSize)
   $iIndex += $iSize
   $iSize = $t.size
   Local $sShortname = BinaryToString(BinaryMid($vData, $iIndex, $iSize))
   $isize += StringLen($sShortname)
    Print("lat : " & $t.lat)
    Print("lon  : " & $t.lon)
   Print("Shortname : " & $sShortname)
    Print("! ============================== GPS coordonnees ======================================")
   Print("$iIndex after   : " & $iIndex)
   exit
EndFunc

Func Decode_3()
    Print("3")
    Local Static $t = DllStructCreate("align 1;ushort Proximity; ushort Speed; ushort Unkonw6;ushort Unkonw7; byte Alert; byte TypeAlert; byte Sound;byte Audio;")
    Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
    $iSize = DllStructGetSize($t)
    $t_.header = BinaryMid($vData, $iIndex, $iSize)
    $iIndex += $iSize
   MsgBox(64,"3",$iSize)

EndFunc

Func Decode_4()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_5()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 36
EndFunc

Func Decode_6()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 2
EndFunc

Func Decode_7()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 23
EndFunc

Func Decode_8()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_9()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_10()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_11()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 2
EndFunc

Func Decode_12()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 2
EndFunc

Func Decode_13()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 5
EndFunc

Func Decode_14()
    Print("! ============================== Description ======================================")
    Local Static $t = DllStructCreate("align 1;byte Unknow16;uint size;")
    Local Static $t_ = DllStructCreate("byte header[" & DllStructGetSize($t) & "]", DllStructGetPtr($t))
    $iSize = DllStructGetSize($t)
    $t_.header = BinaryMid($vData, $iIndex, $iSize)
   Print("$iSize   : " & $iSize)
   $iIndex += $iSize
   $iSize = $t.size
    Print("Description : " & BinaryToString(BinaryMid($vData, $iIndex, $iSize)))
    Print("! ============================== Description ======================================")
   Print("$iIndex    : " & $iIndex)
EndFunc

Func Decode_15()
   Print("15")

EndFunc

Func Decode_16()
   Print("16")
EndFunc

Func Decode_17()
   Print("17")
EndFunc

Func Decode_18()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 3
EndFunc

Func Decode_19()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_21()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_27()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_End()
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc

Func Decode_Unknown()
    Print("Type inconnu " & $iType & " : décalage probable dans les données !")
   Print("$iIndex before   : " & $iIndex)
   $iIndex += 4
EndFunc


Func Decode_Gdate($n)
    ; $n est le nombre de secondes depuis 1989-12-31 00:00:00 (un format alakon !)
    ; la valeur de unixepoch('2000-01-01 00:00:00') - unixepoch('1989-12-31 00:00:00') est 315619200 (secondes)
    ; car notre _DateAdd ne fonctionne qu'à partir de 2000-01-01 00:00:00
    Return StringReplace(_DateAdd("s", $n - 315619200, "2000-01-01 00:00:00"), "/", "-")
EndFunc


Func Print($s)
    For $i = 1 To $iIndent
        ConsoleWrite(@TAB)
    Next
    ConsoleWrite($s & @CRLF)
EndFunc
Methode de @Nine : J'arrive à décoder les 1ere coordonnées mais pas le texte
Local $sfile = "test.gpi"

;////////////////////
#include <Constants.au3>
#include <WinAPIDiag.au3>

Local $hFile = FileOpen($sfile , $FO_BINARY)
Local $dContent = FileRead($hFile)
FileClose($hFile)

Local $tFile = DllStructCreate("byte data[" & BinaryLen($dContent) & "]")
$tFile.data = $dContent

Local $tagHeader1 = "align 1;ushort type;ushort flags;uint length;char string[6];char format[2];uint gdate;" & _
  "byte flags1;byte obfuscation;ushort lenPstring;"
Local $tHeader1 = DllStructCreate($tagHeader1, DllStructGetPtr($tFile))
$tHeader1 = DllStructCreate($tagHeader1 & "char filename[" & $tHeader1.lenPstring & "]", DllStructGetPtr($tFile))
;~ _WinAPI_DisplayStruct($tHeader1, $tagHeader1 & "char filename[" & $tHeader1.lenPstring & "]")

Local $tagHeader2 = "align 1;ushort type;ushort flags;uint length;char string[6];char format[2];uint gdate;" & _
  "byte flags1;byte obfuscation;ushort lenPstring;" & _
  "char filename[" & $tHeader1.lenPstring & "];char Nul[8];char POI[3];char Nul[3];char version[2];ushort cp; ushort flags;"
Local $tHeader2 = DllStructCreate($tagHeader2 , DllStructGetPtr($tFile))
$tHeader2 = DllStructCreate($tagHeader2 , DllStructGetPtr($tFile))
;~ _WinAPI_DisplayStruct($tHeader2 , $tagHeader2 )


;~ Local $tagWaypoint = "align 1;ushort type;ushort flags;uint length;char string[6];char format[2];uint gdate;" & _
;~   "byte flags1;byte obfuscation;ushort lenPstring;" & _
;~   "char declage[16];char POI[3];char Nul[3];char version[2];ushort cp; ushort flags;" & _
;~   "int Lat;int Lon;ushort Unknow4;byte Unknow5;ushort size;" ;char declage[936];

;~ Local $tWaypoint = DllStructCreate($tagWaypoint , DllStructGetPtr($tFile))
;~ $tWaypoint = DllStructCreate($tagWaypoint & "char filename[" & $tWaypoint.lenPstring & "]", DllStructGetPtr($tFile))
;~ _WinAPI_DisplayStruct($tWaypoint & "char filename[" & $tWaypoint.lenPstring & "]", $tagWaypoint )

Local $tagWaypoint = "align 1;ushort type;ushort flags;uint length;char string[6];char format[2];uint gdate;" & _
  "byte flags1;byte obfuscation;ushort lenPstring;" & _
  "char filename[" & $tHeader1.lenPstring & "];char Nul[8];char POI[3];char Nul[3];char version[2];ushort cp; ushort flags;" & _
  "int Lat;int Lon;ushort Unknow4;byte Unknow5;uint LString;"

Local $tWaypoint = DllStructCreate($tagWaypoint  , DllStructGetPtr($tFile))
$tWaypoint = DllStructCreate($tagWaypoint , DllStructGetPtr($tFile))
_WinAPI_DisplayStruct($tWaypoint , $tagWaypoint   )


Local $sLat = ($tWaypoint.Lat * 360) / (2 ^ 32)
$sLat = Round($sLat,6)

Local $sLon = ($tWaypoint.Lon * 360) / (2 ^ 32)
$sLon = round($sLon,6)
ConsoleWrite("GPS : Lat = " & $sLat & " Lon = " & $sLon & @crlf)
Me suis attaqué à un gros morceau... pas encore le niveau.... :cry:
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2278
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Lire / Ecrire fichier Garmin GPI

#7

Message par jchd »

Désolé, il faut juste modifier la définition de la fonction Print($s) en Print($s = "")
A part ça, ça fonctionne sur le fichier fourni.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre