int main(int argc, char **argv) { plan_tests(5); const GeoPoint location(Angle::degrees(fixed(7.7061111111111114)), Angle::degrees(fixed(51.051944444444445))); BrokenDateTime dt; dt.year = 2010; dt.month = 9; dt.day = 24; dt.hour = 8; dt.minute = 21; dt.second = 12; SunEphemeris sun; sun.CalcSunTimes(location, dt, fixed_two); ok1(between(sun.MorningTwilight, 6.88, 6.9)); ok1(between(sun.TimeOfNoon, 13.3, 13.4)); ok1(between(sun.TimeOfSunSet, 19.36, 19.40)); ok1(between(sun.TimeOfSunRise, 7.32, 7.41)); ok1(between(sun.EveningTwilight, 19.81, 19.82)); return exit_status(); }
void dlgWayPointDetailsShowModal(SingleWindow &parent, const Waypoint& way_point) { selected_waypoint = &way_point; TCHAR sTmp[128]; double sunsettime; int sunsethours; int sunsetmins; WndProperty *wp; if (Layout::landscape) wf = LoadDialog(CallBackTable, parent, _T("IDR_XML_WAYPOINTDETAILS_L")); else wf = LoadDialog(CallBackTable, parent, _T("IDR_XML_WAYPOINTDETAILS")); nTextLines = 0; if (!wf) return; Profile::GetPath(szProfileWayPointFile, szWaypointFile); ExtractDirectory(Directory, szWaypointFile); _stprintf(path_modis, _T("%s" DIR_SEPARATOR_S "modis-%03d.jpg"), Directory, selected_waypoint->id+1); _stprintf(path_google,_T("%s" DIR_SEPARATOR_S "google-%03d.jpg"), Directory, selected_waypoint->id+1); _stprintf(sTmp, _T("%s: '%s'"), wf->GetCaption(), selected_waypoint->Name.c_str()); wf->SetCaption(sTmp); wp = ((WndProperty *)wf->FindByName(_T("prpWpComment"))); wp->SetText(selected_waypoint->Comment.c_str()); Units::LongitudeToString(selected_waypoint->Location.Longitude, sTmp, sizeof(sTmp)-1); ((WndProperty *)wf->FindByName(_T("prpLongitude"))) ->SetText(sTmp); Units::LatitudeToString(selected_waypoint->Location.Latitude, sTmp, sizeof(sTmp)-1); ((WndProperty *)wf->FindByName(_T("prpLatitude"))) ->SetText(sTmp); Units::FormatUserAltitude(selected_waypoint->Altitude, sTmp, sizeof(sTmp)-1); ((WndProperty *)wf->FindByName(_T("prpAltitude"))) ->SetText(sTmp); SunEphemeris sun; sunsettime = sun.CalcSunTimes (selected_waypoint->Location, XCSoarInterface::Basic().DateTime, GetUTCOffset()/3600); sunsethours = (int)sunsettime; sunsetmins = (int)((sunsettime - sunsethours) * 60); _stprintf(sTmp, _T("%02d:%02d"), sunsethours, sunsetmins); ((WndProperty *)wf->FindByName(_T("prpSunset")))->SetText(sTmp); fixed distance; Angle bearing; DistanceBearing(XCSoarInterface::Basic().Location, selected_waypoint->Location, &distance, &bearing); TCHAR DistanceText[MAX_PATH]; Units::FormatUserDistance(distance, DistanceText, 10); ((WndProperty *)wf->FindByName(_T("prpDistance"))) ->SetText(DistanceText); _stprintf(sTmp, _T("%d")_T(DEG), iround(bearing.value_degrees())); ((WndProperty *)wf->FindByName(_T("prpBearing"))) ->SetText(sTmp); GlidePolar glide_polar = protected_task_manager.get_glide_polar(); GlidePolar safety_polar = protected_task_manager.get_safety_polar(); UnorderedTaskPoint t(way_point, XCSoarInterface::SettingsComputer()); GlideResult r; // alt reqd at current mc const AIRCRAFT_STATE aircraft_state = ToAircraftState(XCSoarInterface::Basic()); r = TaskSolution::glide_solution_remaining(t, aircraft_state, glide_polar); wp = (WndProperty *)wf->FindByName(_T("prpMc2")); if (wp) { _stprintf(sTmp, _T("%.0f %s"), (double)Units::ToUserAltitude(r.AltitudeDifference), Units::GetAltitudeName()); wp->SetText(sTmp); } // alt reqd at mc 0 glide_polar.set_mc(fixed_zero); r = TaskSolution::glide_solution_remaining(t, aircraft_state, glide_polar); wp = (WndProperty *)wf->FindByName(_T("prpMc0")); if (wp) { _stprintf(sTmp, _T("%.0f %s"), (double)Units::ToUserAltitude(r.AltitudeDifference), Units::GetAltitudeName()); wp->SetText(sTmp); } // alt reqd at safety mc r = TaskSolution::glide_solution_remaining(t, aircraft_state, safety_polar); wp = (WndProperty *)wf->FindByName(_T("prpMc1")); if (wp) { _stprintf(sTmp, _T("%.0f %s"), (double)Units::ToUserAltitude(r.AltitudeDifference), Units::GetAltitudeName()); wp->SetText(sTmp); } wf->SetKeyDownNotify(FormKeyDown); ((WndButton *)wf->FindByName(_T("cmdClose")))->SetOnClickNotify(OnCloseClicked); wInfo = ((WndFrame *)wf->FindByName(_T("frmInfos"))); wCommand = ((WndFrame *)wf->FindByName(_T("frmCommands"))); wSpecial = ((WndFrame *)wf->FindByName(_T("frmSpecial"))); wImage = ((WndOwnerDrawFrame *)wf->FindByName(_T("frmImage"))); wDetails = (WndListFrame*)wf->FindByName(_T("frmDetails")); wDetails->SetPaintItemCallback(OnPaintDetailsListItem); assert(wInfo != NULL); assert(wCommand != NULL); assert(wSpecial != NULL); assert(wImage != NULL); assert(wDetails != NULL); nTextLines = TextToLineOffsets(way_point.Details.c_str(), LineOffsets, MAXLINES); wDetails->SetLength(nTextLines); /* TODO enhancement: wpdetails wp = ((WndProperty *)wf->FindByName(_T("prpWpDetails"))); wp->SetText(way_point.Details); */ wCommand->hide(); wSpecial->hide(); wImage->SetCaption(_("Blank!")); wImage->SetOnPaintNotify(OnImagePaint); WndButton *wb; wb = ((WndButton *)wf->FindByName(_T("cmdGoto"))); if (wb) wb->SetOnClickNotify(OnGotoClicked); wb = ((WndButton *)wf->FindByName(_T("cmdReplace"))); if (wb) wb->SetOnClickNotify(OnReplaceClicked); wb = ((WndButton *)wf->FindByName(_T("cmdNewHome"))); if (wb) wb->SetOnClickNotify(OnNewHomeClicked); wb = ((WndButton *)wf->FindByName(_T("cmdSetAlternate1"))); if (wb) wb->SetOnClickNotify(OnSetAlternate1Clicked); wb = ((WndButton *)wf->FindByName(_T("cmdSetAlternate2"))); if (wb) wb->SetOnClickNotify(OnSetAlternate2Clicked); wb = ((WndButton *)wf->FindByName(_T("cmdClearAlternates"))); if (wb) wb->SetOnClickNotify(OnClearAlternatesClicked); wb = ((WndButton *)wf->FindByName(_T("cmdTeamCode"))); if (wb) wb->SetOnClickNotify(OnTeamCodeClicked); wb = ((WndButton *)wf->FindByName(_T("cmdInserInTask"))); if (wb) wb->SetOnClickNotify(OnInsertInTaskClicked); wb = ((WndButton *)wf->FindByName(_T("cmdAppendInTask"))); if (wb) wb->SetOnClickNotify(OnAppendInTaskClicked); wb = ((WndButton *)wf->FindByName(_T("cmdRemoveFromTask"))); if (wb) wb->SetOnClickNotify(OnRemoveFromTaskClicked); hasimage1 = jpgimage1.load_file(path_modis); hasimage2 = jpgimage2.load_file(path_google); page = 0; NextPage(0); // JMW just to turn proper pages on/off wf->ShowModal(); delete wf; wf = NULL; }
static void test_azimuth() { double test_data1[24] = { 9.660271, 28.185910, 44.824283, 59.416812, 72.404059, 84.420232, 96.113747, 108.120524, 121.080364, 135.609075, 152.122820, 170.453770, -170.455922, -152.140313, -135.650092, -121.146412, -108.210341, -96.225746, -84.552904, -72.554841, -59.579269, -44.983118, -28.311449, -9.711208 }; double test_data2[24] = { 135.535117, 121.014248, 108.070607, 96.083211, 84.410044, 72.414117, 59.445455, 44.866010, 28.227658, 9.680160, -9.682373, -28.245579, -44.907783, -59.512321, -72.504563, -84.522294, -96.215579, -108.220331, -121.174709, -135.691072, -152.181075, -170.475266, 170.477364, 152.198463 }; GeoPoint location(Angle::degrees(fixed(7)), Angle::degrees(fixed(51))); BrokenDateTime dt; dt.year = 2010; dt.month = 9; dt.day = 24; dt.minute = 30; dt.second = 0; SunEphemeris sun; for(int hour = 0; hour < 24; hour++) { dt.hour = hour; sun.CalcSunTimes(location, dt, fixed_zero); ok1(equals(sun.Azimuth, test_data1[hour])); } location.Latitude.flip(); for(int hour = 0; hour < 24; hour++) { dt.hour = hour; sun.CalcSunTimes(location, dt, fixed_two); ok1(equals(sun.Azimuth, test_data2[hour])); } }
void dlgWayPointDetailsShowModal(SingleWindow &parent, const Waypoint& way_point, bool allow_navigation) { const NMEA_INFO &basic = CommonInterface::Basic(); const DERIVED_INFO &calculated = CommonInterface::Calculated(); const SETTINGS_COMPUTER &settings_computer = CommonInterface::SettingsComputer(); selected_waypoint = &way_point; wf = LoadDialog(CallBackTable, parent, Layout::landscape ? _T("IDR_XML_WAYPOINTDETAILS_L") : _T("IDR_XML_WAYPOINTDETAILS")); assert(wf != NULL); nTextLines = 0; TCHAR buffer[MAX_PATH]; const TCHAR *Directory = NULL; if (Profile::GetPath(szProfileWayPointFile, szWaypointFile)) Directory = DirName(szWaypointFile, buffer); if (Directory == NULL) Directory = _T(""); _stprintf(path_modis, _T("%s" DIR_SEPARATOR_S "modis-%03d.jpg"), Directory, selected_waypoint->original_id); _stprintf(path_google,_T("%s" DIR_SEPARATOR_S "google-%03d.jpg"), Directory, selected_waypoint->original_id); TCHAR sTmp[128]; _stprintf(sTmp, _T("%s: '%s'"), wf->GetCaption(), selected_waypoint->Name.c_str()); wf->SetCaption(sTmp); WndProperty *wp; wp = ((WndProperty *)wf->FindByName(_T("prpWpComment"))); wp->SetText(selected_waypoint->Comment.c_str()); Units::LongitudeToString(selected_waypoint->Location.Longitude, sTmp, sizeof(sTmp)-1); ((WndProperty *)wf->FindByName(_T("prpLongitude"))) ->SetText(sTmp); Units::LatitudeToString(selected_waypoint->Location.Latitude, sTmp, sizeof(sTmp)-1); ((WndProperty *)wf->FindByName(_T("prpLatitude"))) ->SetText(sTmp); Units::FormatUserAltitude(selected_waypoint->Altitude, sTmp, sizeof(sTmp)-1); ((WndProperty *)wf->FindByName(_T("prpAltitude"))) ->SetText(sTmp); SunEphemeris sun; sun.CalcSunTimes(selected_waypoint->Location, basic.DateTime, fixed(GetUTCOffset()) / 3600); int sunsethours = (int)sun.TimeOfSunSet; int sunsetmins = (int)((sun.TimeOfSunSet - fixed(sunsethours)) * 60); _stprintf(sTmp, _T("%02d:%02d"), sunsethours, sunsetmins); ((WndProperty *)wf->FindByName(_T("prpSunset")))->SetText(sTmp); GeoVector gv = basic.Location.distance_bearing(selected_waypoint->Location); TCHAR DistanceText[MAX_PATH]; Units::FormatUserDistance(gv.Distance, DistanceText, 10); ((WndProperty *)wf->FindByName(_T("prpDistance"))) ->SetText(DistanceText); _stprintf(sTmp, _T("%d")_T(DEG), iround(gv.Bearing.value_degrees())); ((WndProperty *)wf->FindByName(_T("prpBearing"))) ->SetText(sTmp); if (protected_task_manager != NULL) { GlidePolar glide_polar = settings_computer.glide_polar_task; const GlidePolar &safety_polar = calculated.glide_polar_safety; UnorderedTaskPoint t(way_point, settings_computer); GlideResult r; // alt reqd at current mc const AIRCRAFT_STATE aircraft_state = ToAircraftState(basic, calculated); r = TaskSolution::glide_solution_remaining(t, aircraft_state, glide_polar); wp = (WndProperty *)wf->FindByName(_T("prpMc2")); if (wp) { _stprintf(sTmp, _T("%.0f %s"), (double)Units::ToUserAltitude(r.AltitudeDifference), Units::GetAltitudeName()); wp->SetText(sTmp); } // alt reqd at mc 0 glide_polar.set_mc(fixed_zero); r = TaskSolution::glide_solution_remaining(t, aircraft_state, glide_polar); wp = (WndProperty *)wf->FindByName(_T("prpMc0")); if (wp) { _stprintf(sTmp, _T("%.0f %s"), (double)Units::ToUserAltitude(r.AltitudeDifference), Units::GetAltitudeName()); wp->SetText(sTmp); } // alt reqd at safety mc r = TaskSolution::glide_solution_remaining(t, aircraft_state, safety_polar); wp = (WndProperty *)wf->FindByName(_T("prpMc1")); if (wp) { _stprintf(sTmp, _T("%.0f %s"), (double)Units::ToUserAltitude(r.AltitudeDifference), Units::GetAltitudeName()); wp->SetText(sTmp); } } wf->SetKeyDownNotify(FormKeyDown); ((WndButton *)wf->FindByName(_T("cmdClose")))->SetOnClickNotify(OnCloseClicked); wInfo = ((WndFrame *)wf->FindByName(_T("frmInfos"))); wCommand = ((WndFrame *)wf->FindByName(_T("frmCommands"))); wImage = ((WndOwnerDrawFrame *)wf->FindByName(_T("frmImage"))); wDetails = (WndListFrame*)wf->FindByName(_T("frmDetails")); wDetails->SetPaintItemCallback(OnPaintDetailsListItem); assert(wInfo != NULL); assert(wCommand != NULL); assert(wImage != NULL); assert(wDetails != NULL); nTextLines = TextToLineOffsets(way_point.Details.c_str(), LineOffsets, MAXLINES); wDetails->SetLength(nTextLines); wCommand->hide(); wImage->SetOnPaintNotify(OnImagePaint); if (!allow_navigation) { WndButton* butnav = NULL; butnav = (WndButton *)wf->FindByName(_T("cmdPrev")); assert(butnav); butnav->hide(); butnav = (WndButton *)wf->FindByName(_T("cmdNext")); assert(butnav); butnav->hide(); butnav = (WndButton *)wf->FindByName(_T("cmdGoto")); assert(butnav); butnav->hide(); } WndButton *wb; wb = ((WndButton *)wf->FindByName(_T("cmdGoto"))); if (wb) wb->SetOnClickNotify(OnGotoClicked); wb = ((WndButton *)wf->FindByName(_T("cmdReplace"))); if (wb) wb->SetOnClickNotify(OnReplaceClicked); wb = ((WndButton *)wf->FindByName(_T("cmdNewHome"))); if (wb) wb->SetOnClickNotify(OnNewHomeClicked); wb = ((WndButton *)wf->FindByName(_T("cmdInserInTask"))); if (wb) wb->SetOnClickNotify(OnInsertInTaskClicked); wb = ((WndButton *)wf->FindByName(_T("cmdAppendInTask"))); if (wb) wb->SetOnClickNotify(OnAppendInTaskClicked); wb = ((WndButton *)wf->FindByName(_T("cmdRemoveFromTask"))); if (wb) wb->SetOnClickNotify(OnRemoveFromTaskClicked); /* JMW disabled until 6.2 work, see #996 wb = ((WndButton *)wf->FindByName(_T("cmdGotoAndClearTask"))); if (wb) wb->SetOnClickNotify(OnGotoAndClearTaskClicked); */ wb = ((WndButton *)wf->FindByName(_T("cmdActivatePan"))); if (wb) wb->SetOnClickNotify(OnActivatePanClicked); hasimage1 = jpgimage1.load_file(path_modis); hasimage2 = jpgimage2.load_file(path_google); page = 0; NextPage(0); // JMW just to turn proper pages on/off wf->ShowModal(); delete wf; jpgimage1.reset(); jpgimage2.reset(); }
double DoSunEphemeris(double lon, double lat) { mysun.CalcSunTimes((float)lon, (float)lat); return (double)mysun.settm; };