⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdevice.cpp

📁 QLandkarte - use your Garmin GPS with Linux Requirements: * > Qt 4.2.x (Qt 4.1.x will not wo
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void CDevice::_downloadWaypoints(list<Garmin::Wpt_t>& waypoints){    waypoints.clear();    if(usb == 0) return;    Packet_t command;    Packet_t response;    // request waypoints    command.type = GUSB_APPLICATION_LAYER;    command.id   = Pid_Command_Data;    command.size = 2;    *(uint16_t*)command.payload = Cmnd_Transfer_Wpt;    usb->write(command);    // read returned packets    while(1){        if(!usb->read(response)) continue;        if(response.id == Pid_Records){#ifdef DBG_SHOW_WAYPOINT            cout << "number of waypoints:" << *(int16_t*)response.payload << endl;#endif        }        if(response.id == Pid_Wpt_Data){            D110_Wpt_t * srcWpt = (D110_Wpt_t*)response.payload;            waypoints.push_back(Wpt_t());            Wpt_t& tarWpt = waypoints.back();            tarWpt << *srcWpt;        }        if(response.id == Pid_Xfer_Cmplt){            break;        }    }    // request proximity waypoints    command.type = GUSB_APPLICATION_LAYER;    command.id   = Pid_Command_Data;    command.size = 2;    *(uint16_t*)command.payload = Cmnd_Transfer_Prx;    usb->write(command);    // read returned packets    while(1){        if(!usb->read(response)) continue;        if(response.id == Pid_Records){            //TODO read data#ifdef DBG_SHOW_WAYPOINT            cout << "number of proximity waypoints:" << *(int16_t*)response.payload << endl;#endif        }        if(response.id == Pid_Prx_Wpt_Data){            D110_Wpt_t * srcWpt = (D110_Wpt_t*)response.payload;            waypoints.push_back(Wpt_t());            Wpt_t& tarWpt = waypoints.back();            tarWpt << *srcWpt;        }        if(response.id == Pid_Xfer_Cmplt){            break;        }    }#ifdef DBG_SHOW_WAYPOINT    list<Wpt_t>::const_iterator wpt = waypoints.begin();    while(wpt != waypoints.end()){        cout << "-------------------------" << endl;        cout << "class      " << hex << (int)wpt->wpt_class << endl;        cout << "dspl_color " << hex << (int)wpt->dspl_color << endl;        cout << "dspl_attr  " << hex << (int)wpt->dspl_attr << endl;        cout << "smbl       " << dec <<(int)wpt->smbl << endl;        cout << "lat        " << wpt->lat << endl;        cout << "lon        " << wpt->lon << endl;        cout << "alt        " << wpt->alt << endl;        cout << "dpth       " << wpt->dpth << endl;        cout << "dist       " << wpt->dist << endl;        cout << "state      " << wpt->state << endl;        cout << "cc         " << wpt->cc << endl;        cout << "ete        " << wpt->ete << endl;        cout << "temp       " << wpt->temp << endl;        cout << "time       " << wpt->time << endl;        cout << "category   " << wpt->wpt_cat << endl;        cout << "ident      " << wpt->ident << endl;        cout << "comment    " << wpt->comment << endl;        cout << "facility   " << wpt->facility << endl;        cout << "city       " << wpt->city << endl;        cout << "addr       " << wpt->addr << endl;        cout << "crossroad  " << wpt->crossroad << endl;        ++wpt;    }#endif}void CDevice::_uploadWaypoints(std::list<Garmin::Wpt_t>& waypoints){    if(usb == 0) return;    // count number of proximity waypoints    uint16_t prx_wpt_cnt = 0;    list<Wpt_t>::const_iterator wpt = waypoints.begin();    while(wpt != waypoints.end()){        if(wpt->dist != 1e25f) ++prx_wpt_cnt;        ++wpt;    }    Packet_t command;    Packet_t response;    // transmit proximity waypoints first    if(prx_wpt_cnt){	// bug fix package with Pid_Records misstated	command.type = GUSB_APPLICATION_LAYER;	command.id   = 0x1C; // 28 is an unused Application Layer number	command.size = 2;	*(uint16_t*)command.payload = 0x0000;	usb->write(command);	// announce number	command.type = GUSB_APPLICATION_LAYER;	command.id   = 0x1B; // 27, Pid_Records	command.size = 2;	*(uint16_t*)command.payload =  prx_wpt_cnt;	usb->write(command);	// transfer them one a package        wpt = waypoints.begin();        while(wpt != waypoints.end()){            if(wpt->dist != 1e25f){                command.type = GUSB_APPLICATION_LAYER;                command.id   = Pid_Prx_Wpt_Data;                D110_Wpt_t * p = (D110_Wpt_t *)command.payload;                command.size = *wpt >> *p;                usb->write(command);            }            ++wpt;        }        // all packages transmitted        command.type = GUSB_APPLICATION_LAYER;        command.id   = Pid_Xfer_Cmplt;        command.size = 2;        *(uint16_t*)command.payload = Cmnd_Transfer_Prx;        usb->write(command);    }    //transmit _all_ waypoints    // bug fix package with Pid_Records misstated    command.type = GUSB_APPLICATION_LAYER;    command.id   = 0x1C; // 28 is an unused Application Layer number    command.size = 2;    *(uint16_t*)command.payload = 0x0000;    usb->write(command);    // announce number    command.type = GUSB_APPLICATION_LAYER;    command.id   = 0x1B; // 27, Pid_Records    command.size = 2;    *(uint16_t*)command.payload = waypoints.size();    usb->write(command);    // transfer them one a package    wpt = waypoints.begin();    while(wpt != waypoints.end()){        command.type = GUSB_APPLICATION_LAYER;        command.id   = Pid_Wpt_Data;        D110_Wpt_t * p = (D110_Wpt_t *)command.payload;        command.size = *wpt >> *p;        usb->write(command);        ++wpt;    }    // done with transfer    command.type = GUSB_APPLICATION_LAYER;    command.id   = Pid_Xfer_Cmplt;    command.size = 2;    *(uint16_t*)command.payload = Cmnd_Transfer_Wpt;    usb->write(command);}void CDevice::_downloadTracks(std::list<Garmin::Track_t>& tracks){    tracks.clear();    if(usb == 0) return;    Packet_t command;    Packet_t response;    // request the tracks    command.type = GUSB_APPLICATION_LAYER;    command.id   = Pid_Command_Data;    command.size = 2;    *(uint16_t*)command.payload = Cmnd_Transfer_Trk;    usb->write(command);    int         trackidx = 0;    string      name;    Track_t *   track = 0;    // read the returned packages    while(1){        if(!usb->read(response)) continue;        if(response.id == Pid_Trk_Hdr){            trackidx = 0;            D312_Trk_Hdr_t * hdr = (D312_Trk_Hdr_t*)response.payload;            tracks.push_back(Track_t());            track = &tracks.back();            *track << *hdr;            name  = hdr->ident;        }        if(response.id == Pid_Trk_Data){            D302_Trk_t * data = (D302_Trk_t*)response.payload;            TrkPt_t pt;            if(data->new_trk){                if(trackidx){                    tracks.push_back(Track_t());                    Track_t& t = tracks.back();                    t.color = track->color;                    t.dspl = track->dspl;                    char str[256];                    sprintf(str,"%s_%d",name.c_str(),trackidx++);                    t.ident = str;                    track = &t;                }                else{                    ++trackidx;                }            }            pt << *data;            track->track.push_back(pt);        }        if(response.id == Pid_Xfer_Cmplt){            break;        }    }}void CDevice::_release(){    if(usb == 0) return;    // close by resetting device    usb->close2();    delete usb;    usb = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -