Déclencher évenement sur PDA en fonction d'une position GPS

FranckBBG Messages postés 5 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 6 juin 2008 - 5 juin 2008 à 17:51
FranckBBG Messages postés 5 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 6 juin 2008 - 6 juin 2008 à 14:26
Bonjour,

J'ai récupéré le code source Lecteur GPS sur le site codePPC de stéphane Sibué, j'essaie d'y ajouter une procédure qui me permette de comparer latitude et longitude récupérée de la trame GPS avec latitude et longitude cible du point à atteindre. Si les coordonnées correspondent à un intervalle de tolérance près, on déclenche l'affichage d'une autre fenêtre (ici wTuBrules)
J'utilise VB.NET Compact Framework 2.0 qui ne me renvoie aucune erreur lors de la compilation, par contre qd je transfère sur le PDA et que je lance l'application, ça lance un message d'erreur.

Je pense que l'erreur provient de la logique de programmation, il y des notions de threads que je ne maîtrise pas par exemple...
N'hésitez pas à me demander des explications complémentaires.

Merci

Voilà ce que ça donne:

Public Class LectGPS

    Private Delegate Sub DelegateAjouterTrame(ByVal wTrame As String)
    Private pAjouterTrame As New DelegateAjouterTrame(AddressOf AjouterTrame)

    Private Delegate Sub DelegateAfficherGPRMC(ByVal wLatitude As String, ByVal wLongitude As String)
    Private pAfficherGPRMC As New DelegateAfficherGPRMC(AddressOf AfficherGPRMC)

    Private Sub BOU_Ouvrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOU_Ouvrir.Click

        TextBox1.Text = ListBox1.Items(0).ToString
        TextBox2.Text = ListBox1.Items(1).ToString

        SP_GPS.Open()

    End Sub

    Private Function TesterTrame(ByVal wTrame As String) As Boolean

        REM Une trame vide est forcément invalide
        If wTrame = "" Then Return False

        REM La trame doit commencer par $
        If wTrame.Chars(0) <> "$"c Then Return False

        REM Le *CS doit être présent
        If wTrame.Substring(wTrame.Length - 3, 1) <> "*" Then Return False

        REM Calcul du CheckSum
        Dim wCS As Integer
        For i As Integer = 1 To wTrame.Length - 4
            wCS = wCS Xor Asc(wTrame.Chars(i))
        Next
        Dim wHCS As String = Hex(wCS)
        If wHCS.Length < 2 Then wHCS = "0" & wHCS

        REM Si le CheckSum calculé est <> du CheckSum donné
        If wHCS <> wTrame.Substring(wTrame.Length - 2, 2) Then Return False

        REM Tout va bien
        Return True

    End Function

    Private Sub AjouterTrame(ByVal wTrame As String)

        REM On enlève le * CheckSum de la fin
        Dim wPos As Integer = wTrame.IndexOf("*"c)
        If wPos > -1 Then wTrame = wTrame.Substring(0, wPos)

        REM On ajoute la trame à la liste
        Dim wIndex As Integer = LST_Trames.Items.Add(wTrame)

        REM On sélectionne la nouvelle trame
        LST_Trames.SelectedIndex = wIndex

        REM Pour ne pas saturer la mémoire
        REM On limite le remplissage de la liste
        Do While LST_Trames.Items.Count > 50
            LST_Trames.Items.RemoveAt(0)
        Loop

    End Sub

    Private Sub SP_GPS_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SP_GPS.DataReceived

        Static wBuffer As String = ""

        Dim wCount As Integer = SP_GPS.BytesToRead
        Dim wData(wCount) As Char
        Dim wLen As Integer = SP_GPS.Read(wData, 0, wCount)
        wBuffer &= New String(wData, 0, wLen)

        Dim k As Integer

        Do

            k = wBuffer.IndexOf(vbCrLf)
            If k > -1 Then

                Dim wTrame As String = wBuffer.Substring(0, k)
                wBuffer = wBuffer.Substring(k + 2)
                If TesterTrame(wTrame) Then
                    Me.Invoke(pAjouterTrame, wTrame)
                    If wTrame.Substring(0, 7) = "$GPRMC," Then DecoderTrameGPRMC(wTrame)
                End If
            Else

                Exit Do
            End If

        Loop

    End Sub

    Private Sub AfficherGPRMC(ByVal wLatitude As String, ByVal wLongitude As String)

        TXT_Latitude.Text = wLatitude
        TXT_Longitude.Text = wLongitude

    End Sub

    Private Sub DecoderTrameGPRMC(ByVal wTrame As String)

        REM Liste des élements composant une trame RMC
        REM 00  GPRMC()
        REM 01  Heure du fix
        REM 02  Alerte (A=OK ; V=WARNIG)
        REM 03  Latitude au format ddmm.ss
        REM 04  Sens de la latitude (N=Nord=Positif, S=Sud=Négatif)
        REM 05  Longitude au format dddmm.ss
        REM 06  Sens de la longitude (E=Est=Positif, W=Ouest=Négatif)
        REM 07  Vitesse au sol en Knots (noeuds)
        REM 08  Cap vrai
        REM 09  Date du fix
        REM 10  Déclinaison magnétique
        REM 11  Sens de la déclinaison magnétique

        Dim wItems() As String
        Dim wLatitude As String = ""
        Dim wLongitude As String = ""

        REM On éclate les différents éléments de la trame
        wItems = wTrame.Split(",")

        REM La trame doit faire au moins 12 éléments
        If wItems.Length < 12 Then Throw New ArgumentException

        REM Le premier élement doit être "GPRMC", Sinon Erreur
        If wItems(0) <> "$GPRMC" Then Throw New ArgumentException

        REM Si alerte=A les données sont valables
        If wItems(2) = "A" Then
            wLatitude = wItems(3)
            wLongitude = wItems(5)
        End If

        If _
                wLatitude < ListBox1.Items(0) + 0.01 _
               And wLatitude > ListBox1.Items(0) - 0.01 _
               And wLongitude > ListBox1.Items(1) - 0.01 _
               And wLongitude < ListBox1.Items(1) + 0.01 Then

            Dim wTuBrules As New TuBrules
            wTuBrules.Show()
        ElseIf Me.Invoke(pAfficherGPRMC, wLatitude, wLongitude) Then
        End If

        REM Si alerte=A les données sont valables
        Me.Invoke(pAfficherGPRMC, wLatitude, wLongitude)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If SP_GPS.IsOpen Then SP_GPS.Close()
        Me.Close()

    End Sub
End Class

Franck

4 réponses

cs_Stephane33 Messages postés 630 Date d'inscription samedi 15 février 2003 Statut Modérateur Dernière intervention 9 octobre 2011 1
5 juin 2008 à 22:38
et le message d'erreur ?

Le savoir n'est que le filtre de l'experience
0
FranckBBG Messages postés 5 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 6 juin 2008
5 juin 2008 à 23:21
Bonsoir,

C'est un message d'erreur qui s'affiche sur le pda physique (je ne le teste pas sur l'émulateur du pc):

Voici l'enchaînement:
- j'appuie sur le boutton OUVRIR
- la cible s'affiche dans les 2 textBox (Latitude et Longitude provenant de la ListBox)
- quelques trames lues s'affichent dans la List_Trame
- PUIS ERREUR:
ANIO 1.0.exe (le nom de mon programme)
InvalidCastException

à
Microsoft.visualBasic.CompilerServices.Conversions.ToDouble()
à
Microsoft.VB..........................Conversions.ToDouble()
à
Microsoft.VB.CompilerServices.Operators.AddObject()
à
ANIO_1._0.LectGPS.DecoderTrameGPRMC()
à
ANIO_1._0.LectGPS.SP_GPS_dataReceived()
à
System.IO.Ports.SerialPort.CatchReceivedEvents()
at EventLoopRunner.CallReceivedEvents()
at WorkItem.doWork()
à System.Threading.timer.ring()

Voilà terminé il me propose de quitter puis il ferme l'application... J'espère que ça vous dira qqch. En tout cas merci d'avance.

Franck
0
cs_Stephane33 Messages postés 630 Date d'inscription samedi 15 février 2003 Statut Modérateur Dernière intervention 9 octobre 2011 1
6 juin 2008 à 14:05
tu as une erreur de conversion vers un double dans cette fonction
LectGPS.DecoderTrameGPRMC()
0
FranckBBG Messages postés 5 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 6 juin 2008
6 juin 2008 à 14:26
Alors j'ai déjà essayé de récupérer ma trame découpée, nettoyée et de convertir wTrame.Items(3) pour la latitude et wTrame.Items(5) pour la longitude et les convertir avec un CType (....., ToDouble) avant de faire mes calculs dessus mais il me renvoie toujours la même erreur...

C'est pour ça que je demandais du coup si c'était pas plus dans la construction du code que ça plantait, je veux dire dans l'utilisation de variabe bloquée, ou bien l'utilisation de thread pas très bien comprise. Plus dans la technique de programmation en fait...

Pour les conversions j'ai l'impression d'avoir essayé tout ce que je pouvais,

- créer une procédure dédiée à la comparaison
- faire un invoke sur cette procédure
- convertir en single en double, laisser en string, virer les virgules, virer les points....

Je bloque à présent alors que le code est vraiment pas compliqué! 

Franck
0
Rejoignez-nous