📄 cdevice.cpp
字号:
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 + -