bool MapWindow::Event_NearestWaypointDetails(double lon, double lat, double range, bool pan) { int i; if(pan && (mode.Is(Mode::MODE_PAN) || mode.Is(Mode::MODE_TARGET_PAN))) // nearest to center of screen if in pan mode i=FindNearestWayPoint(PanLongitude, PanLatitude, range); else i=FindNearestWayPoint(lon, lat, range); if(i != -1) { SelectedWaypoint = i; PopupWaypointDetails(); return true; } return false; }
void dlgStatusShowModal(int start_page){ if (start_page==-1) { multi_page = true; status_page = max(0,min(NUMPAGES-1,status_page)); } else { status_page = start_page; multi_page = false; } first = true; char filename[MAX_PATH]; LocalPathS(filename, TEXT("dlgStatus.xml")); wf = dlgLoadFromXML(CallBackTable, filename, hWndMainWindow, TEXT("IDR_XML_STATUS")); if (!wf) return; #if FASTPAGE // LButtonUp notify will intercept ALL touchscreen and then ALSO process them // normally, such as in buttons. For this reason we must use TouchContext. wf->SetLButtonUpNotify(TouchKeyDown); #endif wf->SetKeyDownNotify(FormKeyDown); ((WndButton *)wf->FindByName(TEXT("cmdClose")))->SetOnClickNotify(OnCloseClicked); wStatus0 = ((WndFrame *)wf->FindByName(TEXT("frmStatusFlight"))); wStatus1 = ((WndFrame *)wf->FindByName(TEXT("frmStatusSystem"))); wStatus2 = ((WndFrame *)wf->FindByName(TEXT("frmStatusTask"))); wStatus3 = ((WndFrame *)wf->FindByName(TEXT("frmStatusRules"))); wStatus4 = ((WndFrame *)wf->FindByName(TEXT("frmStatusTimes"))); wStatus5 = ((WndFrame *)wf->FindByName(TEXT("frmStatusExtDevice"))); //ASSERT(wStatus0!=NULL); //ASSERT(wStatus1!=NULL); //ASSERT(wStatus2!=NULL); //ASSERT(wStatus3!=NULL); //ASSERT(wStatus4!=NULL); //ASSERT(wStatus5!=NULL); wf->SetTimerNotify(OnTimerNotify); if (!multi_page) { WndButton *wb; wb = ((WndButton *)wf->FindByName(TEXT("cmdNext"))); if (wb != NULL) { wb->SetVisible(false); } wb = ((WndButton *)wf->FindByName(TEXT("cmdPrev"))); if (wb != NULL) { wb->SetVisible(false); } } nearest_waypoint = FindNearestWayPoint(GPS_INFO.Longitude, GPS_INFO.Latitude, 100000.0, true); // big range limit UpdateValuesSystem(); UpdateValuesFlight(); UpdateValuesTask(); UpdateValuesRules(); UpdateValuesTimes(); NextPage(0); // just to turn proper pages on/off wf->ShowModal(); delete wf; wf = NULL; }
void DoAutoQNH(NMEA_INFO *Basic, DERIVED_INFO *Calculated) { static int done_autoqnh = 0; if (DoInit[MDI_DOAUTOQNH]) { done_autoqnh=0; DoInit[MDI_DOAUTOQNH]=false; } // Reject if already done if (done_autoqnh==10) return; // Reject if in IGC logger mode if (ReplayLogger::IsEnabled()) return; // Reject if no valid GPS fix if (Basic->NAVWarning) return; // Reject if no baro altitude if (!Basic->BaroAltitudeAvailable) return; // Reject if terrain height is invalid if (!Calculated->TerrainValid) return; if (QNH != 1013.25) return; if (Basic->Speed<TakeOffSpeedThreshold) { done_autoqnh++; } else { done_autoqnh= 0; // restart... } if (done_autoqnh==10) { double fixaltitude = Calculated->TerrainAlt; // if we have a valid fix, and a valid home waypoint, then if we are close to it assume we are at home // and use known altitude, instead of presumed terrain altitude which is always approximated double hdist=0; if (ValidWayPoint(HomeWaypoint)) { DistanceBearing(Basic->Latitude, Basic->Longitude, WayPointList[HomeWaypoint].Latitude, WayPointList[HomeWaypoint].Longitude,&hdist,NULL); if (hdist <2000) { fixaltitude=WayPointList[HomeWaypoint].Altitude; StartupStore(_T(". AutoQNH: setting QNH to HOME waypoint altitude=%.0f m%s"),fixaltitude,NEWLINE); } else { if (fixaltitude!=0) StartupStore(_T(". AutoQNH: setting QNH to average terrain altitude=%.0f m%s"),fixaltitude,NEWLINE); else StartupStore(_T(". AutoQNH: cannot set QNH, impossible terrain altitude%s"),NEWLINE); } } else { // 101121 extend search for nearest wp int i=FindNearestWayPoint(Basic->Longitude, Basic->Latitude, 2000); if ( (i>RESWP_END) && (WayPointList[i].Altitude>0) ) { // avoid using TAKEOFF wp fixaltitude=WayPointList[i].Altitude; #if ALPHADEBUG StartupStore(_T(". AutoQNH: setting QNH to nearest <%s> waypoint altitude=%.0f m%s"), WayPointList[i].Name,fixaltitude,NEWLINE); #endif } else { #if ALPHADEBUG if (fixaltitude!=0) StartupStore(_T(". AutoQNH: setting QNH to average terrain altitude=%.0f m%s"),fixaltitude,NEWLINE); else StartupStore(_T(". AutoQNH: cannot set QNH, impossible terrain altitude%s"),NEWLINE); #endif } } if (fixaltitude!=0) { QNH = FindQNH(Basic->BaroAltitude, fixaltitude); TCHAR qmes[80]; if (PressureHg) _stprintf(qmes,_T("QNH set to %.2f, Altitude %.0f%s"),QNH/TOHPA,fixaltitude, Units::GetUnitName(Units::GetUserAltitudeUnit())); else _stprintf(qmes,_T("QNH set to %.2f, Altitude %.0f%s"),QNH,fixaltitude, Units::GetUnitName(Units::GetUserAltitudeUnit())); DoStatusMessage(qmes); CAirspaceManager::Instance().QnhChangeNotify(QNH); } } }