Avatar billede baltazar_ Nybegynder
17. januar 2003 - 21:13 Der er 41 kommentarer

vindue Kordinat ?

Jeg sidder med en kode som jeg gerne vil modificere en anelse. Er der en der kan fortælle mig hvordan jeg trækker et x,y kordinat ud af denne kode
Således at jeg får det horisontale og vertikale kordinat henholdsvis som x,y

void CScrollBitmapDlg::OnShow2()
{
    // TODO: Add your control notification handler code here
    CString    file;
    file.Empty();
    m_com.ShowOpen();
    file=m_com.GetFileName();
    file.TrimRight();
    if(m_hBmpNew != NULL )
        DeleteObject(m_hBmpNew);
    sourcex=sourcey=0;//
    if(file.IsEmpty())
AfxMessageBox("Please Select a waypoint file");
        else{
            if(file.Right(3)!="txtf")
                AfxMessageBox("Please Select a .txt file");
            else
            {
    m_hBmpNew =    (HBITMAP) LoadImage(
    AfxGetInstanceHandle(),  // handle to instance
    file,  // name or identifier of the image (root is where project is)
    IMAGE_BITMAP,        // image types
    0,    // desired width
    0,    // desired height
    LR_LOADFROMFILE);
    if( m_hBmpNew == NULL ){
    AfxMessageBox("Load of waypoints Failed");}
   
  // put the HBITMAP info into the CBitmap (but not the bitmap itself)
  else{
    m_st1.GetClientRect( &rectStaticClient );
    rectStaticClient.NormalizeRect();
    m_size.cx=rectStaticClient.Size().cx;
    m_size.cy=rectStaticClient.Size().cy;
  m_size.cx = rectStaticClient.Width();    // zero based
    m_size.cy = rectStaticClient.Height();    // zero based

    // Convert to screen coordinates using static as base,
    // then to DIALOG (instead of static) client coords
    // using dialog as base
  m_st1.ClientToScreen( &rectStaticClient );
  ScreenToClient( &rectStaticClient);
       
    m_pt.x = rectStaticClient.left;
    m_pt.y = rectStaticClient.top;
  GetObject( m_hBmpNew , sizeof(BITMAP), &m_bmInfo );
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(m_dcMem, m_hBmpNew )  );

  offsetx= m_pt.x;
  offsety=m_pt.y;
m_vbar.MoveWindow(offsetx+m_size.cx,offsety,18,m_size.cy);
m_hbar.MoveWindow(offsetx,offsety+m_size.cy,m_size.cx,18);
horz.cbSize = sizeof(SCROLLINFO);
horz.fMask = SIF_ALL;
horz.nMin = 0;
horz.nMax = m_bmInfo.bmWidth-m_size.cx;
horz.nPage =0;
horz.nPos = 0;
horz.nTrackPos=0;
if(m_bmInfo.bmWidth<=m_size.cx)
{
    if((m_size.cx-m_bmInfo.bmWidth)==0)
        offsetx= m_pt.x;
    else
        offsetx= m_pt.x+((m_size.cx-m_bmInfo.bmWidth)/2);
    m_vbar.MoveWindow(offsetx+m_bmInfo.bmWidth,offsety,18,m_size.cy);
    m_hbar.ShowWindow(false);
}
else
m_hbar.ShowWindow(true);
m_hbar.SetScrollInfo(&horz);
vert.cbSize = sizeof(SCROLLINFO);
vert.fMask = SIF_ALL;
vert.nMin = 0;
vert.nMax = m_bmInfo.bmHeight-(m_size.cy);
vert.nPage = 0;
vert.nTrackPos=0;
if(m_bmInfo.bmHeight<=m_size.cy)
{
    if((m_size.cy-m_bmInfo.bmHeight)==0)
        offsety= m_pt.y;
    else
        offsety= m_pt.y+((m_size.cy-m_bmInfo.bmHeight)/2);
    m_hbar.MoveWindow(offsetx,offsety+m_bmInfo.bmHeight,m_size.cx,18);
    m_vbar.ShowWindow(false);
}
else
m_vbar.ShowWindow(true);
m_vbar.SetScrollInfo(&vert);

  InvalidateRect(&rectStaticClient);
        }
            }
        }

}
Avatar billede jpk Nybegynder
20. januar 2003 - 08:50 #1
Den horisontale og vertikale position på hvad..?
Hvis det er cursoren, kan du bruge GetCursorPos.
Avatar billede baltazar_ Nybegynder
21. januar 2003 - 09:13 #2
ok jeg kan se jeg fik forklaret mig uklart, det jeg mener er  hvordan for jeg indelt dette bitmap i små kvadrater som jeg kan navngive med id numre alla  zone1,zone2, osv.

Kan du hjælpe med det ?
Avatar billede baltazar_ Nybegynder
21. januar 2003 - 09:16 #3
glemte at tilføje at det er selve bitmappet der skal inddeles og ikke det statiske vindue :)
Avatar billede jpk Nybegynder
21. januar 2003 - 09:28 #4
Jeg skal lige være helt med her, passer følgende?
1) Du har en dialog, hvorpå du viser en billede
2) Du kan scrolle billedet op/ned side/side
3) Du vil lave noget rutebeskrivelse eller ruteberegning..? (udfra kommentaren: "Select a waypoint file")

Er dit problem at tegne kvadranterne på billedet? (skal de i det hele taget tegnes?)

Jo mere information, jo lettere at løse opgaven...
Avatar billede baltazar_ Nybegynder
21. januar 2003 - 09:43 #5
du er helt med kan jeg høre,
meningen er at man ligesom kraks vejviser skal kunne finde rundt og søge efter postitioner i kortet. Jeg vil så til hvert kort tildele en fil hvor filnavn passer sammen med kortnavn og deri definere hvilket felt der er hvilket "waypoint" og evt med en beskrivelse, og kvadrant id,

således at jeg laver en slags layer som er identisk med hvert kort
indeholde informatiner
ja der skal også tegnes kvadranterne med tynde streg
Avatar billede jpk Nybegynder
21. januar 2003 - 11:25 #6
Det står desværre stadig ikke særlig klart for mig. Jeg forstår din generelle problemstilling, men hvilken del er det præcist du ønsker hjælp til?
Avatar billede baltazar_ Nybegynder
21. januar 2003 - 14:36 #7
Det er til at starte med at få lavet ovenstående kode om til at vise kordinat linier også, som skal være der ( 1*1 cm kvadrater ) og navnegive de kvadrater med  eks. kvadrat[100]
Avatar billede jpk Nybegynder
21. januar 2003 - 15:30 #8
Det er jo et større projekt at lave det på en fornuftig måde...
Med den funktionalitet du ønsker, er det utrolig vigtigt at have en solid datamodel, altså vil jeg anbefalde dig at få det på plads først!

Nu ved jeg jo overhovedet ikke hvilke tanker du har gjort dig, så det er jo ret svært at kommentere din kode og sine hensigter...
Har du lavet nogen form for dokumentation eller analysedokumenter du kan/vil dele?

Har alle dine kortfiler samme height/width-perspektiv?
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 08:45 #9
nu er jeg ikke vant til datamodeler. har du et eksempel på hvordan man laver en sådan. Indhold osv. jeg er ikke professinel programmør men kan godt høre at det er noget man nok skal lave så man har nogle retningslinier.
Avatar billede jpk Nybegynder
22. januar 2003 - 09:09 #10
Okay, lige endnu et par spørgsmål (der er grundlæggende for hvordan datamodellen kommer til at se ud):

1) Skal der kunne sættes flere kort sammen, eller består dit kort på dialogen kun af 1 billede?

2) Skal man kunne zoome ind/ud på kortet?

3) Hvad er formatet på dine waypoint filer?
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 11:28 #11
1) ja
2)ja
3) formatet er almindelige textfiler som er udformet således

textfil.txt:

waypoint::
Amager
nextwaypoint goes her

Kordinat::
2323,3342 N // tilhører destination amager
2323,3342 E // // tilhører destination amager
next cordainate goes here
Rute::
rute1 // tilhører destination amager
rute1 // tilhører destination amager
Next rute goes here
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 11:36 #12
sorry    mangler noget i textfilen
den ser således ud

textfil.txt:

waypoint::
id1:Amager // programmets navn for punkt
nextwaypoint goes her

Kordinat::
idn1: 2323,3342 N: // tilhører destination amager
ide1: 2323,3342 E // // tilhører destination amager
next cordainate goes here
Rute::
idrute1:rute1 // brugerens navn for punktet
Next userdefined name goes here
Avatar billede jpk Nybegynder
22. januar 2003 - 11:40 #13
Prøv lige at læse spørgsmål 1 igen...
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 12:41 #14
sorry læste det vist for hurtigt igennem
Selve dialogen loader kun et bitmap, Hvis man vil have et andet kort må man loade det manuelt.
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 12:49 #15
Selvfølgelig ville det være fedt at den selv kunne finde ud af at hente det næste, men det er nok endnu mere kompliceret
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 13:03 #16
medmindre man kunne lave et stort transperrent bitmap layer indeholdende 9 små felter og definere hvilket kort der hører til hvertfelt og den så skal hente det tilhørende bitmap hvori der er focus på felt

alla
if OnMouseDown(felt1) bla bla  ...loadBitmap(kort1)

(-) tom bitmap

--------------------
-kort1,kort2,kort3 -
-kort4,kort5,kort6 -
-kort7,kort8,kort9 -
--------------------

det var bare en tanke
Avatar billede jpk Nybegynder
22. januar 2003 - 13:27 #17
Det er stadig en MEGET sparsom mængde information du giver!
Prøv at være lidt mere beskrivende...

Er det et format du skal overholde eller ét du selv har defineret og som du kan ændre?

Jeg går ud fra at fx:
idn1: 2323,3342 N:
betyder:
23 grader, 23.3342 minutter nord

Forudsat at ovenstående er sandt, ville det fx være en stor fordel at udskifte , med . som separator, idét tallet lettere kan læses ind i en talværdi!

Hvilke overvejelser har du gjort dig omkring mapningen mellem koordinater og kort? Har du fx specifikationerne på dine kort, således du kender koordinaterne på henholdsvis de 4 hjørner?
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 13:41 #18
Det er rigtige kordinater vi snakker om, så du har ret med hensyn til tallende
Det eneste jeg skal overholde er den måde data kommer ind på
resten kan laves som det passer bedst.
dette er signalet som kommer ind
$GPGGA,123128.999,5538.9469,N,01212.9181,E,1,04,4.3,57.3,M,,,,0000*37
og jeg på nuværnde tidspunkt læser jeg dem fra usb porten så outputtet ligger sorteret og behandlet ( men alt sammen i consol )
Med hensyn til mapningen så  er jeg på nuverende tidspunkt ved at finde de aktuelle kordinater frem.

Den med kommaet var en fejl.  det er "." der bruges og "," er seperator i min nuværende kode.
Jeg vender lige tilbage med kordinaterne
Avatar billede jpk Nybegynder
22. januar 2003 - 13:46 #19
Se det er jo sådan noget information jeg skal bruge...
Det er jo NMEA standard data format fra GPS-modtagere!
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 13:47 #20
således sortere jeg data linien  $GPGGA,123128.999,5538.9469,N,01212.9181,E,1,04,4.3,57.3,M,,,,0000*37

//start
void ProcessEngineGps(char* lpzBuffer)
{

    char seps[]  = ",";

    char *token;
   
    int nTokenCount(1);

    char valuebuffer[255];
   
    strcpy(valuebuffer,lpzBuffer);
   
    token = strtok( valuebuffer, seps );


    _LOCATION_VALUE valuestruct;

   
    /* While there are tokens in buffer */
    while( token != NULL )
    {
     
        #ifdef _DEBUG
            TRACE(token);
        #endif

        switch(nTokenCount)
        {   
           
            //DATALINIE EKSEMPEL $GPGGA,klokken(092204.999),CURRENT_max(4250.5589),TEMP_DIR(S),14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F

            /* PROCESS TIME*/  // integer
            case 1:

                valuestruct.KLOKKEN = atoi(token);

                break;

            /* PROCESS TEMPARATUR_MAX_CURRENT*/ // float
            case 2:
               
                valuestruct.Longitude_NORTH= atof(token);
               
                break;

            /* PROCESS TEMPSENSOR-ID*/ // char
            case 3:
               
        //    valuestruct.MAX_TEMP_DIR = token == "S" ? TRUE:FALSE;
            valuestruct.NORTH = token;

                break;
            /* PROCESS TEMPARATUR_MIN_CURRENT*/ // integer
            case 4:

                valuestruct.Latitude_EAST = atof(token);

                break;
            /* PROCESS MIN_TEMP*/ // char
            case 5:

        //        valuestruct.DIR_TEMP = token == "E" ? TRUE:FALSE;
                valuestruct.EAST = token;
                break;


                break;
            /* PROCESS STATUS_ID*/ // integer
            case 6:

                valuestruct.STATUS_ID = atoi(token);

                break;
                /* PROCESS SENSORUSED*/ // integer
            case 7:

                valuestruct.SENSORUSED = atoi(token);
                break;


        } 

/* Get next token: */
      token = strtok( NULL, seps );
      nTokenCount++;
    }
PrintEngineStructure(valuestruct);
SendToPrinter(valuestruct);       
    telldestination(valuestruct);
finaldestination(valuestruct);
}

//slut
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 13:49 #21
har du arbejdet med den slags før ?
Avatar billede jpk Nybegynder
22. januar 2003 - 14:09 #22
Næ, egentlig ikke, men jeg har en Navman GPS 3400 til min Compaq iPAQ.
Den har jeg fundet ud af at man også kan læse data fra, via std seriel kommunikation, hvis man ikke har brug for de faciliteter, der er i det medfølgende program!

Jeg har dog ikke kigget ret meget på det, så du er nok mere inde i formatet end jeg...

Hvilke sætningstyper læser du, foruden $GPGGA?
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 14:12 #23
Kun GPGGA på nuværende tidspunkt
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 14:15 #24
hvis man går i på G-sat.dk  så har de en fin beskrivelse af de forskeliige sætninger
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 14:56 #25
men jeg skal have SA implementeret også, for der er noget med misvisning korrektion i disse sætninger
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 15:03 #26
Navman GPS 3400 er fed nok,  kiggede lige på en webside om den
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 15:25 #27
Jeg har nu prøvet at finde kordinator et stykke tid. Og det er ret svært at finde det precist nok. Mon man kunne kaliberere det selv, ved at gemme en gps position. Nå men det finder jeg ud af.
alt om alt er at den starter ved 55.00.00 N og slutter ved 55.99.99 N og for bredegraderne gælder 11 40 00 til 12 40 00
pis  jeg har en aftale håber vi snakkes ved
Avatar billede jpk Nybegynder
22. januar 2003 - 15:26 #28
Du kan også se en oversigt over de forskellige sætningstyper samt en beskrivelse af de mest anvendte på:
http://www.zyche.com/articles/nmea.asp

I din kode har du noget med temperatur osv., det tyder mere på $GPMTA / $GPMTW???
Avatar billede baltazar_ Nybegynder
22. januar 2003 - 15:39 #29
Tag dig ikke af det, det er fordi jeg har haft brugt den stump kode til målling af temparature på min båd ( vand,motor,kølling osv )
Avatar billede jpk Nybegynder
23. januar 2003 - 14:02 #30
Til inspiration kan du jo prøve at tage et kig på programmet GPS Utility. Det kan hentes på adressen http://www.gpsu.co.uk/
Avatar billede baltazar_ Nybegynder
23. januar 2003 - 23:04 #31
Ja det kender jeg godt, har luret på det. og der er også mange funktioner jeg synes er ok og som skal med.
Avatar billede baltazar_ Nybegynder
24. januar 2003 - 22:23 #32
Jeg kører ud i aften og finder de kordinater jeg skal bruge til et par kort
Avatar billede baltazar_ Nybegynder
25. januar 2003 - 17:00 #33
er du i nærheden ? jpk
Avatar billede jpk Nybegynder
26. januar 2003 - 10:56 #34
Jep, Eksperten må have været nede, jeg kunne ikke få adgang...
Jeg skal nok prøve at se på det...
Avatar billede baltazar_ Nybegynder
26. januar 2003 - 13:59 #35
ja der har vist været lidt problemmer,  den har også været lidt sløv.

Men det luder rigtig godt at du vil se på sagen.
Avatar billede jpk Nybegynder
27. januar 2003 - 13:10 #36
Hvad skal du egentlig bruge det til?
Er det bare for sjov du laver det?
Avatar billede baltazar_ Nybegynder
27. januar 2003 - 16:44 #37
det er bare for at lære noget nyt.
Avatar billede jpk Nybegynder
27. januar 2003 - 17:05 #38
Jeg har kigget lidt på at få lavet en datamodel til at indeholde de forskellige typer information. Jeg har kun lavet support for typerne GPGGA, GPGSA og GPRMC (det er nok de mest brugte???). For at tilføje flere typer skal man bare lave specialiceringer af klassen NMEA (som du kan se herunder) og implementere metoden DecodeNMEAString.
Jeg har desværre ikke haft tid til at kigge på den grafiske del endnu...

//////////////////////////////////////////////
// NMEA.h

#include "Position.h"

class NMEA
{
public:
    typedef enum {INVALID, GPGGA, GPGSA, GPRMC} NMEAType;
    typedef enum {OK, WARNING} DataStatus;
    typedef enum {MANUAL, AUTOMATIC} Mode;
    typedef enum {NO_FIX, _2D, _3D} SatelliteMode;
    typedef enum {Invalid, ValidSPS, ValidDGPS, ValidPPS} PositionFix;
    typedef enum {NONE, METERS} Unit;

    const static NMEAType GetTypeFromSentence(const CString& strNMEASentence);
    const NMEAType GetType();
    static NMEA* DecodeNMEAString(const CString& strNMEASentence);
    const static CString GetSeparator() { return ","; }

protected:
    NMEAType    m_Type;
};


// GPGGA: Fix data
class NMEA_GPGGA : public NMEA
{
public:
    bool DecodeNMEAString(const CString& strNMEASentence);

protected:
    // Attributes
    CTime        m_Time;
    Position    m_Latitude;
    Position    m_Longitude;
    PositionFix    m_PositionFix;
    short        m_SatellitesUsed;
    float        m_HDOP; // Horizontal dilution of precision
    float        m_Altitude;
    Unit        m_AltitudeUnit;
    float        m_GeoidSeperation;
    Unit        m_GeoidSeperationUnit;
    float        m_DGPSAge;
    int            m_DGPSStationID;
    CString        m_Checksum;
};


// GPGSA: Active satellites
class NMEA_GPGSA : public NMEA
{
public:
    bool DecodeNMEAString(const CString& strNMEASentence);

protected:
    // Attributes
    Mode            m_Mode;
    SatelliteMode    m_SatelliteMode;
    int            m_IDs[12];
    float            m_PDOP;
    float            m_HDOP;
    CString            m_VDOP;
};

// GPRMC: Position and time
class NMEA_GPRMC : public NMEA
{
public:
    bool DecodeNMEAString(const CString& strNMEASentence);

protected:
    // Attributes
    CTime        m_Time;
    DataStatus    m_DataStatus;
    Position    m_Latitude;
    Position    m_Longitude;
    float        m_Speed;
    float        m_Course;
    CString        m_Variation;
    CString        m_Checksum;
};




////////////////////////////////
// NMEA.cpp

#include "NMEA.h"
#include "StringUtils.h"

using NMEA::NMEAType;
//-*-;

//////////////////////////////////////////////////////////////////////
// NMEA implementation
//////////////////////////////////////////////////////////////////////
const NMEAType NMEA::GetTypeFromSentence(const CString& strNMEASentence)
{
    CString strNMEACode = strNMEASentence.Left(6);
    if(strNMEACode == "$GPGGA")
        return GPGGA;
    if(strNMEACode == "$GPGSA")
        return GPGSA;
    if(strNMEACode == "$GPRMC")
        return GPRMC;

    return INVALID;
}

const NMEAType NMEA::GetType()
{
    return m_Type;
}

NMEA* NMEA::DecodeNMEAString(const CString& strNMEASentence)
{
    NMEAType type = GetTypeFromSentence(strNMEASentence);
    NMEA* pNMEA = NULL;
    if(type == GPGGA)
        pNMEA = new NMEA_GPGGA;
    else if(type == GPGSA)
        pNMEA = new NMEA_GPGSA;
    else if(type == GPRMC)
        pNMEA = new NMEA_GPRMC;

    if(pNMEA->DecodeNMEAString(strNMEASentence))
        return pNMEA;

    delete pNMEA;
    return NULL;
}


//////////////////////////////////////////////////////////////////////
// NMEA_GPGGA implementation
//////////////////////////////////////////////////////////////////////
bool NMEA_GPGGA::DecodeNMEAString(const CString& strNMEASentence)
{
    CStringList TokenList;
    int nTokens = StringUtils::Tokenize(strNMEASentence, GetSeparator(), TokenList);
    if(nTokens != 15)
        return false;

    POSITION pos = TokenList.GetHeadPosition();
    CString strToken = TokenList.GetNext(pos);
    if(strToken != "$GPGGA")
        return false;

    // Get hour, min and sec
    int nHour, nMin, nSec;
    strToken = TokenList.GetNext(pos);
    nHour = _wtoi(strToken.Left(2));
    nMin = _wtoi(strToken.Mid(2, 2));
    nSec = _wtoi(strToken.Mid(4, 2));
    m_Time = CTime(2000, 1, 1, nHour, nMin, nSec); // We only have time, not date, so just put some default values

    m_Latitude.SetPositionFromString(TokenList.GetNext(pos));
    m_Latitude.SetDirectionFromString(TokenList.GetNext(pos));
    m_Longitude.SetPositionFromString(TokenList.GetNext(pos));
    m_Longitude.SetDirectionFromString(TokenList.GetNext(pos));

    m_PositionFix = (PositionFix)_wtoi(TokenList.GetNext(pos));

    m_SatellitesUsed = (short)_wtoi(TokenList.GetNext(pos));

    m_HDOP = (float)wcstod(TokenList.GetNext(pos), NULL);

    m_Altitude = (float)wcstod(TokenList.GetNext(pos), NULL);

    strToken = TokenList.GetNext(pos);
    if(strToken == "M")
        m_AltitudeUnit = METERS;

    m_GeoidSeperation = (float)wcstod(TokenList.GetNext(pos), NULL);

    strToken = TokenList.GetNext(pos);
    if(strToken == "M")
        m_GeoidSeperationUnit = METERS;

    m_DGPSAge = (float)wcstod(TokenList.GetNext(pos), NULL);

    strToken = TokenList.GetNext(pos);
    m_DGPSStationID = _wtoi(strToken.Left(4));

    m_Checksum = strToken.Mid(4);

    return true;
}


//////////////////////////////////////////////////////////////////////
// NMEA_GPGSA implementation
//////////////////////////////////////////////////////////////////////
bool NMEA_GPGSA::DecodeNMEAString(const CString& strNMEASentence)
{
    CStringList TokenList;
    int nTokens = StringUtils::Tokenize(strNMEASentence, GetSeparator(), TokenList);
    if(nTokens != 18)
        return false;

    POSITION pos = TokenList.GetHeadPosition();
    CString strToken = TokenList.GetNext(pos);
    if(strToken != "$GPGSA")
        return false;

    // Mode
    strToken = TokenList.GetNext(pos);
    if(strToken == "M") m_Mode = MANUAL;
    else if(strToken == "A") m_Mode = AUTOMATIC;

    // SatelliteMode
    strToken = TokenList.GetNext(pos);
    if(strToken == "1") m_SatelliteMode = NO_FIX;
    else if(strToken == "2") m_SatelliteMode = _2D;
    else if(strToken == "3") m_SatelliteMode = _3D;

    // IDs
    for(int i=0; i<12; ++i)
    {
        strToken = TokenList.GetNext(pos);
        m_IDs[i] = atoi((char*)(LPCTSTR)strToken);
    }

    m_PDOP = (float)wcstod(TokenList.GetNext(pos), NULL);
    m_HDOP = (float)wcstod(TokenList.GetNext(pos), NULL);
    m_VDOP = TokenList.GetNext(pos);

    return true;
}


//////////////////////////////////////////////////////////////////////
// NMEA_GPRMC implementation
//////////////////////////////////////////////////////////////////////
bool NMEA_GPRMC::DecodeNMEAString(const CString& strNMEASentence)
{
    CStringList TokenList;
    int nTokens = StringUtils::Tokenize(strNMEASentence, GetSeparator(), TokenList);
    if(nTokens != 12)
        return false;

    POSITION pos = TokenList.GetHeadPosition();
    CString& strToken = TokenList.GetNext(pos);
    if(strToken != "$GPRMC")
        return false;

    // Get hour, min and sec
    int nYear, nMonth, nDay, nHour, nMin, nSec;
    strToken = TokenList.GetNext(pos);
    nHour = _wtoi(strToken.Left(2));
    nMin = _wtoi(strToken.Mid(2, 2));
    nSec = _wtoi(strToken.Mid(4, 2));

    strToken = TokenList.GetNext(pos);
    if(strToken == "A") m_DataStatus = OK;
    else if(strToken == "V") m_DataStatus = WARNING;

    m_Latitude.SetPositionFromString(TokenList.GetNext(pos));
    m_Latitude.SetDirectionFromString(TokenList.GetNext(pos));
    m_Longitude.SetPositionFromString(TokenList.GetNext(pos));
    m_Longitude.SetDirectionFromString(TokenList.GetNext(pos));

    m_Speed = (float)wcstod(TokenList.GetNext(pos), NULL);

    m_Course = (float)wcstod(TokenList.GetNext(pos), NULL);

    strToken = TokenList.GetNext(pos);
    nDay = _wtoi(strToken.Left(2));
    nMonth = _wtoi(strToken.Mid(2, 2));
    nYear = _wtoi(strToken.Mid(4, 2));
    m_Time = CTime(2000+nYear, nMonth, nDay, nHour, nMin, nSec);

    m_Variation = TokenList.GetNext(pos);

    m_Checksum = TokenList.GetNext(pos);

    return true;
}
Avatar billede baltazar_ Nybegynder
27. januar 2003 - 19:00 #39
det ser dælme godt ud, Jeg sidder selv og prøver bitmap delen men det går lidt trægt. Men ok jeg skal jo også først lære det
Avatar billede jpk Nybegynder
30. januar 2003 - 09:54 #40
Jeg har ændret lidt i ovenstående kode, bl.a.:
Datamodellen kompilerer både som MBCS og Unicode (så det kan køre på Win98/W2K/PocketPC)
Ændring i nogle attributter/parser.

Jeg har desuden lavet et MFC SDI projekt, hvor du kan åbne NMEA-encodeded filer og få vist GPRMC-data i en liste.

Jeg kan sende det til dig hvis du er interesseret..?
Avatar billede baltazar_ Nybegynder
30. januar 2003 - 15:21 #41
jo tak det ville jeg mægtigt gerne se på.

min mail er glenn007@worldonline.dk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester