/** * @brief Dumps contest results * * @param type The type of the contest to dump */ void CTestContest::Dump(const CContestMgr::TType type) const { CContestMgr::CResult result = _contestMgr.Result(type, true); const CPointGPSArray &array = result.PointArray(); unsigned distance = 0; if(array.size()) { bool triangle = (type == CContestMgr::TYPE_OLC_FAI || type == CContestMgr::TYPE_OLC_FAI_PREDICTED); for(unsigned i=0; i<array.size() - 1; i++) { if((i==0 || i==array.size() - 2) && triangle) continue; distance += array[i].Distance(array[i+1]); } if(triangle) distance += array[3].Distance(array[1]); } std::cout << std::endl; std::wstring typeStr = CContestMgr::TypeToString(type); std::cout << "Contest '" << std::string(typeStr.begin(), typeStr.end()) << "':" << std::endl; std::cout << " - Distance: " << result.Distance() << " (error: " << (int)distance - (int)result.Distance() << ")" << std::endl; std::cout << " - Score: " << result.Score() << std::endl; std::cout << " - Predicted: " << result.Predicted() << std::endl; for(CPointGPSArray::const_iterator it=result.PointArray().begin(); it!=result.PointArray().end(); ++it) std::cout << " - " << TimeToString(it->Time()) << std::endl; _kml.Dump(result); }
void MapWindow::DrawFAIOptimizer(HDC hdc, RECT rc, const POINT &Orig_Aircraft) { COLORREF whitecolor = RGB_WHITE; COLORREF origcolor = SetTextColor(hDCTemp, whitecolor); HPEN oldpen = 0; HBRUSH oldbrush = 0; oldpen = (HPEN) SelectObject(hdc, hpStartFinishThick); oldbrush = (HBRUSH) SelectObject(hdc, GetStockObject(HOLLOW_BRUSH)); /********************************************************************/ unsigned int ui; double lat1 = 0; double lon1 = 0; double lat2 = 0; double lon2 = 0; BOOL bFlat = false; BOOL bFAI = false; double fDist, fAngle; LockTaskData(); // protect from external task changes bFAI = CContestMgr::Instance().FAI(); CContestMgr::CResult result = CContestMgr::Instance().Result( CContestMgr::TYPE_FAI_TRIANGLE, true); const CPointGPSArray &points = result.PointArray(); unsigned int iSize = points.size(); CContestMgr::TType sType = result.Type(); double lat_CP = CContestMgr::Instance().GetClosingPoint().Latitude(); double lon_CP = CContestMgr::Instance().GetClosingPoint().Longitude(); double fFAIDistance = result.Distance(); UnlockTaskData(); // protect from external task changes if((sType == CContestMgr::TYPE_FAI_TRIANGLE) && iSize>0) { double fPrefAngle =0; LKASSERT(iSize<100); for(ui=0; ui< iSize-1; ui++) { LockTaskData(); // protect from external task changes lat1 = points[ui].Latitude(); lon1 = points[ui].Longitude(); lat2 = points[ui+1].Latitude(); lon2 = points[ui+1].Longitude(); UnlockTaskData(); DistanceBearing(lat1, lon1, lat2, lon2, &fDist, &fAngle); if((fDist > FAI_MIN_DISTANCE_THRESHOLD) && (ui < 3) && !bFlat && (fDist/ fFAIDistance > 0.05)) { fPrefAngle = fAngle; COLORREF rgbCol = RGB_BLUE; switch(ui) { case 0: rgbCol = RGB_YELLOW; break; case 1: rgbCol = RGB_CYAN ; break; case 2: rgbCol = RGB_GREEN ; break; default: break; } RenderFAISector ( hdc, rc, lat1, lon1, lat2, lon2, 1, rgbCol ); RenderFAISector ( hdc, rc, lat1, lon1, lat2, lon2, 0, rgbCol ); } if (fFAIDistance > 0) /* check if triangle is too flat for second sector */ if(fDist/ fFAIDistance > 0.45) bFlat = true; } /*********************************************************/ if(ISPARAGLIDER && bFAI) { HPEN hpSectorPen = (HPEN)CreatePen(PS_SOLID, IBLSCALE(2), FAI_SECTOR_COLOR ); HPEN hOldPen = (HPEN) SelectObject (hdc, hpSectorPen); POINT Pt1; MapWindow::LatLon2Screen(lon_CP, lat_CP, Pt1); FindLatitudeLongitude(lat1, lon1, 0 , fFAIDistance* 0.20, &lat2, &lon2); /* 1000m destination circle */ int iRadius = (int)((lat2-lat1)*zoom.DrawScale()); Circle(hdc, Pt1.x, Pt1.y, iRadius , rc, true , false); FindLatitudeLongitude(lat1, lon1, 0 , 500, &lat2, &lon2); /* 1000m destination circle */ iRadius = (int)((lat2-lat1)*zoom.DrawScale()); Circle(hdc, Pt1.x, Pt1.y, iRadius , rc, true , false); SelectObject (hdc, hOldPen); DeleteObject(hpSectorPen); } /*********************************************************/ } /********************************************************************/ // restore original color SetTextColor(hDCTemp, origcolor); SelectObject(hdc, oldpen); SelectObject(hdc, oldbrush); }
/***************************************************************** * Alpha Lima splitted RenderContest from Render Task for CC * adding FAI Sector display ****************************************************************/ void Statistics::RenderFAIOptimizer(LKSurface& Surface, const RECT& rc) { unsigned int ui; double fXY_Scale = 1.0; double lat0 = 0; double lon0 = 0; double lat1 = 0; double lon1 = 0; double lat2 = 0; double lon2 = 0; double x0, y0, x1, y1, x2=0, y2=0; double lat_c, lon_c; double lat_p = GPS_INFO.Latitude; double lon_p = GPS_INFO.Longitude; BOOL bFlat = false; #define DRAWPERCENT #ifdef DRAWPERCENT double fTotalPercent = 1.0; #endif ResetScale(); CContestMgr::CResult result = CContestMgr::Instance().Result(contestType, true); const CPointGPSArray &points = result.PointArray(); if(contestType == CContestMgr::TYPE_FAI_TRIANGLE) fXY_Scale = 1.5; // find center double fTotalDistance = result.Distance(); if (fTotalDistance < 1) fTotalDistance =1; CPointGPSArray trace; CContestMgr::Instance().Trace(trace); for(ui=0; ui<trace.size(); ui++) { lat1 = trace[ui].Latitude(); lon1 = trace[ui].Longitude(); ScaleYFromValue(rc, lat1); ScaleXFromValue(rc, lon1); } const auto hfOldU = Surface.SelectObject(LK8PanelUnitFont); BOOL bFAITri = CContestMgr::Instance().FAI(); double fDist, fAngle; lat_c = (y_max+y_min)/2; lon_c = (x_max+x_min)/2; double xp = (lon_p-lon_c)*fastcosine(lat_p); double yp = (lat_p-lat_c); // find scale ResetScale(); lat1 = GPS_INFO.Latitude; lon1 = GPS_INFO.Longitude; x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); ScaleXFromValue(rc, x1*fXY_Scale); ScaleYFromValue(rc, y1*fXY_Scale); for(ui=0; ui<trace.size(); ui++) { lat1 = trace[ui].Latitude(); lon1 = trace[ui].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); ScaleXFromValue(rc, x1*fXY_Scale); ScaleYFromValue(rc, y1*fXY_Scale); } ScaleMakeSquare(rc); if(result.Type() == contestType) { for(ui=0; ui<points.size()-1; ui++) { lat1 = points[ui].Latitude(); lon1 = points[ui].Longitude(); lat2 = points[ui+1].Latitude(); lon2 = points[ui+1].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); DistanceBearing(lat1, lon1, lat2, lon2, &fDist, &fAngle); if( (ui <points.size()-2) && !bFlat && ((fDist / fTotalDistance ) > 0.05) ) { if(fDist > 5000) { #ifndef UNDITHER LKColor rgbCol = RGB_BLUE; switch(ui) { case 0: rgbCol = RGB_LIGHTYELLOW; break; case 1: rgbCol = RGB_LIGHTCYAN ; break; case 2: rgbCol = RGB_LIGHTGREEN ; break; default: break; } #else LKColor rgbCol = RGB_DARKBLUE; switch(ui) { case 0: rgbCol = RGB_LIGHTGREY; break; case 1: rgbCol = RGB_GREY ; break; case 2: rgbCol = RGB_MIDDLEGREY ; break; default: break; } #endif RenderFAISector ( Surface, rc, lat1, lon1, lat2, lon2, lat_c, lon_c,1, rgbCol ); RenderFAISector ( Surface, rc, lat1, lon1, lat2, lon2, lat_c, lon_c,0, rgbCol ); } } if((fDist / fTotalDistance ) > 0.45) /* prevent drawing almost same sectors */ bFlat = true; } // draw track for(ui=0; trace.size() && ui<trace.size()-1; ui++) { lat1 = trace[ui].Latitude(); lon1 = trace[ui].Longitude(); lat2 = trace[ui+1].Latitude(); lon2 = trace[ui+1].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); DrawLine(Surface, rc, x1, y1, x2, y2, STYLE_MEDIUMBLACK); } for(ui=0; ui<points.size()-1; ui++) { lat1 = points[ui].Latitude(); lon1 = points[ui].Longitude(); lat2 = points[ui+1].Latitude(); lon2 = points[ui+1].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); int style = STYLE_REDTHICK; if((ui > 0) && (ui < 3)) { style = STYLE_BLUETHIN; DistanceBearing(lat1, lon1, lat2, lon2, &fDist, &fAngle); #ifdef DRAWPERCENT if((result.Distance()> 5000) && bFAITri) { TCHAR text[180]; SIZE tsize; fTotalPercent -= fDist/result.Distance(); _stprintf(text, TEXT("%3.1f%%"), (fDist/result.Distance()*100.0)); Surface.GetTextSize(text, _tcslen(text), &tsize); #ifndef UNDITHER Surface.SetTextColor(RGB_BLUE); #else Surface.SetTextColor(RGB_BLACK); #endif Surface.DrawText(ScaleX(rc, x1 +( x2-x1)/2)-tsize.cx/2, ScaleY(rc,y1 + (y2-y1)/2), text, _tcslen(text)); } #endif DrawLine(Surface, rc, x1, y1, x2, y2, style); } } if(bFAITri) { if(points.size() >3) { if(ISPARAGLIDER) { lat0 = CContestMgr::Instance().GetBestNearClosingPoint().Latitude(); lon0 = CContestMgr::Instance().GetBestNearClosingPoint().Longitude(); lat1 = CContestMgr::Instance().GetBestClosingPoint().Latitude(); lon1 = CContestMgr::Instance().GetBestClosingPoint().Longitude(); x1 = (lon0-lon_c)*fastcosine(lat0); y1 = (lat0-lat_c); x2 = (lon1-lon_c)*fastcosine(lat1); y2 = (lat1-lat_c); DrawLine(Surface, rc, x1, y1, x2, y2, STYLE_ORANGETHIN ); //result.Predicted() ? STYLE_BLUETHIN : STYLE_REDTHICK); } lat1 = points[1].Latitude(); lon1 = points[1].Longitude(); lat2 = points[3].Latitude(); lon2 = points[3].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); DrawLine(Surface, rc, x1, y1, x2, y2, STYLE_THINDASHPAPER ); //result.Predicted() ? STYLE_BLUETHIN : STYLE_REDTHICK); #ifdef DRAWPERCENT TCHAR text[180]; SIZE tsize; _stprintf(text, TEXT("%3.1f%%"), (fTotalPercent*100.0)); Surface.GetTextSize(text, _tcslen(text), &tsize); #ifndef UNDITHER Surface.SetTextColor(RGB_LIGHTBLUE); #else Surface.SetTextColor(RGB_RED); #endif Surface.DrawText(ScaleX(rc, x1 +( x2-x1)/2)-tsize.cx/2, ScaleY(rc,y1 + (y2-y1)/2), text, _tcslen(text)); #endif lat0 = CContestMgr::Instance().GetClosingPoint().Latitude(); lon0 = CContestMgr::Instance().GetClosingPoint().Longitude(); x0 = (lon0-lon_c)*fastcosine(lat0); y0 = (lat0-lat_c); DrawLine(Surface, rc, xp, yp, x0, y0, STYLE_REDTHICK); } } } DrawXGrid(Surface, rc, 1.0, 0, STYLE_THINDASHPAPER, 1.0, false); DrawYGrid(Surface, rc, 1.0, 0, STYLE_THINDASHPAPER, 1.0, false); Surface.SetBackgroundTransparent(); #ifndef UNDITHER Surface.SetTextColor(RGB_MAGENTA); #else Surface.SetTextColor(RGB_BLACK); #endif DrawLabel(Surface, rc, TEXT("O"), xp, yp); Surface.SelectObject(hfOldU); }
/***************************************************************** * Alpha Lima splitted RenderContest from Render Task for CC * adding FAI Sector display ****************************************************************/ void Statistics::RenderContest(LKSurface& Surface, const RECT& rc) { if(contestType == CContestMgr::TYPE_FAI_TRIANGLE) RenderFAIOptimizer(Surface, rc); else { unsigned int ui; double fXY_Scale = 1.0; double lat1 = 0; double lon1 = 0; double lat2 = 0; double lon2 = 0; double x1, y1, x2=0, y2=0; double lat_c, lon_c; ResetScale(); CContestMgr::CResult result = CContestMgr::Instance().Result(contestType, true); const CPointGPSArray &points = result.PointArray(); // find center CPointGPSArray trace; CContestMgr::Instance().Trace(trace); for(ui=0; ui<trace.size(); ui++) { lat1 = trace[ui].Latitude(); lon1 = trace[ui].Longitude(); ScaleYFromValue(rc, lat1); ScaleXFromValue(rc, lon1); } const auto hfOldU = Surface.SelectObject(LK8PanelUnitFont); lat_c = (y_max+y_min)/2; lon_c = (x_max+x_min)/2; // find scale ResetScale(); lat1 = GPS_INFO.Latitude; lon1 = GPS_INFO.Longitude; x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); ScaleXFromValue(rc, x1*fXY_Scale); ScaleYFromValue(rc, y1*fXY_Scale); for(ui=0; ui<trace.size(); ui++) { lat1 = trace[ui].Latitude(); lon1 = trace[ui].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); ScaleXFromValue(rc, x1*fXY_Scale); ScaleYFromValue(rc, y1*fXY_Scale); } ScaleMakeSquare(rc); // draw track for(ui=0; trace.size() && ui<trace.size()-1; ui++) { lat1 = trace[ui].Latitude(); lon1 = trace[ui].Longitude(); lat2 = trace[ui+1].Latitude(); lon2 = trace[ui+1].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); DrawLine(Surface, rc, x1, y1, x2, y2, STYLE_MEDIUMBLACK); } // Draw aircraft on top double lat_p = GPS_INFO.Latitude; double lon_p = GPS_INFO.Longitude; double xp = (lon_p-lon_c)*fastcosine(lat_p); double yp = (lat_p-lat_c); if(result.Type() == contestType) { for(ui=0; ui<points.size()-1; ui++) { lat1 = points[ui].Latitude(); lon1 = points[ui].Longitude(); lat2 = points[ui+1].Latitude(); lon2 = points[ui+1].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); int style = STYLE_REDTHICK; if((result.Type() == CContestMgr::TYPE_OLC_FAI || result.Type() == CContestMgr::TYPE_OLC_FAI_PREDICTED) && (ui==0 || ui==3)) { // triangle start and finish style = STYLE_DASHGREEN; } else if(result.Predicted() && (result.Type() == CContestMgr::TYPE_OLC_FAI_PREDICTED || ui == points.size() - 2)) { // predicted edge style = STYLE_BLUETHIN; } if((result.Type() == CContestMgr::TYPE_FAI_3_TPS) ||// TYPE_FAI_3_TPS_PREDICTED (result.Type() == CContestMgr::TYPE_FAI_3_TPS_PREDICTED) ) { } if((contestType != CContestMgr::TYPE_FAI_TRIANGLE) ) DrawLine(Surface, rc, x1, y1, x2, y2, style); } if(result.Type() == CContestMgr::TYPE_OLC_FAI || result.Type() == CContestMgr::TYPE_OLC_FAI_PREDICTED) { // draw the last edge of a triangle lat1 = points[1].Latitude(); lon1 = points[1].Longitude(); lat2 = points[3].Latitude(); lon2 = points[3].Longitude(); x1 = (lon1-lon_c)*fastcosine(lat1); y1 = (lat1-lat_c); x2 = (lon2-lon_c)*fastcosine(lat2); y2 = (lat2-lat_c); DrawLine(Surface, rc, x1, y1, x2, y2, result.Predicted() ? STYLE_BLUETHIN : STYLE_REDTHICK); } DrawXGrid(Surface, rc, 1.0, 0, STYLE_THINDASHPAPER, 1.0, false); DrawYGrid(Surface, rc, 1.0, 0, STYLE_THINDASHPAPER, 1.0, false); Surface.SelectObject(hfOldU); #ifndef UNDITHER Surface.SetTextColor(RGB_MAGENTA); #else Surface.SetTextColor(RGB_BLACK); #endif Surface.SetBackgroundTransparent(); DrawLabel(Surface, rc, TEXT("O"), xp, yp); } } }
void MapWindow::DrawFAIOptimizer(LKSurface& Surface, const RECT& rc, const POINT &Orig_Aircraft) { LKColor whitecolor = RGB_WHITE; LKColor origcolor = Surface.SetTextColor(whitecolor); LKPen oldpen = Surface.SelectObject(hpStartFinishThick); LKBrush oldbrush = Surface.SelectObject(LKBrush_Hollow); /********************************************************************/ unsigned int ui; double lat1 = 0; double lon1 = 0; double lat2 = 0; double lon2 = 0; BOOL bFlat = false; BOOL bFAI = false; double fDist, fAngle; LockTaskData(); // protect from external task changes bFAI = CContestMgr::Instance().FAI(); CContestMgr::CResult result = CContestMgr::Instance().Result( CContestMgr::TYPE_FAI_TRIANGLE, true); const CPointGPSArray &points = result.PointArray(); unsigned int iSize = points.size(); CContestMgr::TType sType = result.Type(); double lat_CP = CContestMgr::Instance().GetClosingPoint().Latitude(); double lon_CP = CContestMgr::Instance().GetClosingPoint().Longitude(); double fFAIDistance = result.Distance(); UnlockTaskData(); // protect from external task changes if((sType == CContestMgr::TYPE_FAI_TRIANGLE) && iSize>0) { LKASSERT(iSize<100); for(ui=0; ui< iSize-1; ui++) { LockTaskData(); // protect from external task changes lat1 = points[ui].Latitude(); lon1 = points[ui].Longitude(); lat2 = points[ui+1].Latitude(); lon2 = points[ui+1].Longitude(); UnlockTaskData(); DistanceBearing(lat1, lon1, lat2, lon2, &fDist, &fAngle); #if BUGSTOP LKASSERT(fFAIDistance!=0); #endif if (fFAIDistance==0) fFAIDistance=0.1; if(((fDist > FAI_MIN_DISTANCE_THRESHOLD) && (ui < 3) && !bFlat && (fDist/ fFAIDistance > 0.05)) ) { LKColor rgbCol = RGB_BLUE; switch(ui) { case 0: rgbCol = RGB_YELLOW; break; case 1: rgbCol = RGB_CYAN ; break; case 2: rgbCol = RGB_GREEN ; break; default: break; } RenderFAISector ( Surface, rc, lat1, lon1, lat2, lon2, 1, rgbCol ); RenderFAISector ( Surface, rc, lat1, lon1, lat2, lon2, 0, rgbCol ); } if (fFAIDistance > 0) /* check if triangle is too flat for second sector */ if(fDist/ fFAIDistance > 0.45) bFlat = true; } /*********************************************************/ if(ISPARAGLIDER && bFAI) { LKPen hpSectorPen(PEN_SOLID, IBLSCALE(2), FAI_SECTOR_COLOR ); LKPen hOldPen = Surface.SelectObject(hpSectorPen); POINT Pt1; MapWindow::LatLon2Screen(lon_CP, lat_CP, Pt1); FindLatitudeLongitude(lat1, lon1, 0 , fFAIDistance* 0.20, &lat2, &lon2); /* 1000m destination circle */ int iRadius = (int)((lat2-lat1)*zoom.DrawScale()); Surface.Circle(Pt1.x, Pt1.y, iRadius , rc, true , false); FindLatitudeLongitude(lat1, lon1, 0 , 500, &lat2, &lon2); /* 1000m destination circle */ iRadius = (int)((lat2-lat1)*zoom.DrawScale()); Surface.Circle(Pt1.x, Pt1.y, iRadius , rc, true , false); Surface.SelectObject (hOldPen); } /*********************************************************/ } /********************************************************************/ // restore original color Surface.SetTextColor(origcolor); Surface.SelectObject(oldpen); Surface.SelectObject(oldbrush); }
void UpdateAnalysis(void){ TCHAR sTmp[1000]; TCHAR szPolarName[80]; extern void LK_wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext); LK_wsplitpath(szPolarFile, (WCHAR*) NULL, (WCHAR*) NULL, szPolarName, (WCHAR*) NULL); switch(analysis_page){ case ANALYSIS_PAGE_BAROGRAPH: _stprintf(sTmp, TEXT("%s: %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M127_ = "Barograph" gettext(TEXT("_@M127_"))); wfa->SetCaption(sTmp); if (flightstats.Altitude_Ceiling.sum_n<2) { _stprintf(sTmp, TEXT("\0")); } else if (flightstats.Altitude_Ceiling.sum_n<4) { _stprintf(sTmp, TEXT("%s:\r\n %.0f-%.0f %s"), // LKTOKEN _@M823_ = "Working band" gettext(TEXT("_@M823_")), flightstats.Altitude_Base.y_ave*ALTITUDEMODIFY, flightstats.Altitude_Ceiling.y_ave*ALTITUDEMODIFY, Units::GetAltitudeName()); } else { _stprintf(sTmp, TEXT("%s:\r\n %.0f-%.0f %s\r\n\r\n%s:\r\n %.0f %s/hr"), // LKTOKEN _@M823_ = "Working band" gettext(TEXT("_@M823_")), flightstats.Altitude_Base.y_ave*ALTITUDEMODIFY, flightstats.Altitude_Ceiling.y_ave*ALTITUDEMODIFY, Units::GetAltitudeName(), // LKTOKEN _@M165_ = "Ceiling trend" gettext(TEXT("_@M165_")), flightstats.Altitude_Ceiling.m*ALTITUDEMODIFY, Units::GetAltitudeName()); } waInfo->SetCaption(sTmp); break; case ANALYSIS_PAGE_CLIMB: _stprintf(sTmp, TEXT("%s: %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M182_ = "Climb" gettext(TEXT("_@M182_"))); wfa->SetCaption(sTmp); if (flightstats.ThermalAverage.sum_n==0) { _stprintf(sTmp, TEXT("\0")); } else if (flightstats.ThermalAverage.sum_n==1) { _stprintf(sTmp, TEXT("%s:\r\n %3.1f %s"), // LKTOKEN _@M116_ = "Av climb" gettext(TEXT("_@M116_")), flightstats.ThermalAverage.y_ave*LIFTMODIFY, Units::GetVerticalSpeedName() ); } else { _stprintf(sTmp, TEXT("%s:\r\n %3.1f %s\r\n\r\n%s:\r\n %3.2f %s"), // LKTOKEN _@M116_ = "Av climb" gettext(TEXT("_@M116_")), flightstats.ThermalAverage.y_ave*LIFTMODIFY, Units::GetVerticalSpeedName(), // LKTOKEN _@M181_ = "Climb trend" gettext(TEXT("_@M181_")), flightstats.ThermalAverage.m*LIFTMODIFY, Units::GetVerticalSpeedName() ); } waInfo->SetCaption(sTmp); break; case ANALYSIS_PAGE_WIND: _stprintf(sTmp, TEXT("%s: %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M820_ = "Wind at Altitude" gettext(TEXT("_@M820_"))); wfa->SetCaption(sTmp); _stprintf(sTmp, TEXT(" ")); waInfo->SetCaption(sTmp); break; case ANALYSIS_PAGE_POLAR: if (ScreenLandscape) { _stprintf(sTmp, TEXT("%s: %s %s (%s %3.0f kg)"), MsgToken(93), // Analysis: szPolarName, MsgToken(325), // Glide Polar MsgToken(889), // Mass GlidePolar::GetAUW()); } else { // Portrait reduced size _stprintf(sTmp, TEXT("%s: %s (%3.0f kg)"), MsgToken(93), // Analysis: szPolarName, GlidePolar::GetAUW()); } wfa->SetCaption(sTmp); _stprintf(sTmp, TEXT(" ")); waInfo->SetCaption(sTmp); break; case ANALYSIS_PAGE_TEMPTRACE: _stprintf(sTmp, TEXT("%s: %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M701_ = "Temp trace" gettext(TEXT("_@M701_"))); wfa->SetCaption(sTmp); _stprintf(sTmp, TEXT("%s:\r\n %5.0f %s\r\n\r\n%s:\r\n %5.0f %s\r\n"), // LKTOKEN _@M714_ = "Thermal height" gettext(TEXT("_@M714_")), CuSonde::thermalHeight*ALTITUDEMODIFY, Units::GetAltitudeName(), // LKTOKEN _@M187_ = "Cloud base" gettext(TEXT("_@M187_")), CuSonde::cloudBase*ALTITUDEMODIFY, Units::GetAltitudeName()); waInfo->SetCaption(sTmp); break; case ANALYSIS_PAGE_TASK_SPEED: _stprintf(sTmp, TEXT("%s: %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M697_ = "Task speed" gettext(TEXT("_@M697_"))); wfa->SetCaption(sTmp); waInfo->SetCaption(TEXT("")); break; case ANALYSIS_PAGE_TASK: _stprintf(sTmp, TEXT("%s: %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M699_ = "Task" gettext(TEXT("_@M699_"))); wfa->SetCaption(sTmp); RefreshTaskStatistics(); if (!ValidTaskPoint(ActiveWayPoint)) { // LKTOKEN _@M476_ = "No task" _stprintf(sTmp, gettext(TEXT("_@M476_"))); } else { TCHAR timetext1[100]; TCHAR timetext2[100]; if (AATEnabled) { Units::TimeToText(timetext1, (int)CALCULATED_INFO.TaskTimeToGo); Units::TimeToText(timetext2, (int)CALCULATED_INFO.AATTimeToGo); if (ScreenLandscape) { _stprintf(sTmp, TEXT("%s:\r\n %s\r\n%s:\r\n %s\r\n%s:\r\n %5.0f %s\r\n%s%.0f %s\r\n"), // 100429 // LKTOKEN _@M698_ = "Task to go" gettext(TEXT("_@M698_")), timetext1, // LKTOKEN _@M42_ = "AAT to go" gettext(TEXT("_@M42_")), timetext2, // LKTOKEN _@M242_ = "Dist to go" gettext(TEXT("_@M242_")), DISTANCEMODIFY*CALCULATED_INFO.AATTargetDistance, Units::GetDistanceName(), // LKTOKEN _@M626_ = "Sp " gettext(TEXT("_@M626_")), TASKSPEEDMODIFY*CALCULATED_INFO.AATTargetSpeed, Units::GetTaskSpeedName() ); } else { _stprintf(sTmp, TEXT("%s: %s\r\n%s: %s\r\n%s: %5.0f %s\r\n%s: %5.0f %s\r\n"), // LKTOKEN _@M698_ = "Task to go" gettext(TEXT("_@M698_")), timetext1, // LKTOKEN _@M42_ = "AAT to go" gettext(TEXT("_@M42_")), timetext2, // LKTOKEN _@M242_ = "Dist to go" gettext(TEXT("_@M242_")), DISTANCEMODIFY*CALCULATED_INFO.AATTargetDistance, Units::GetDistanceName(), // LKTOKEN _@M681_ = "Targ.speed" gettext(TEXT("_@M681_")), TASKSPEEDMODIFY*CALCULATED_INFO.AATTargetSpeed, Units::GetTaskSpeedName() ); } } else { Units::TimeToText(timetext1, (int)CALCULATED_INFO.TaskTimeToGo); _stprintf(sTmp, TEXT("%s: %s\r\n%s: %5.0f %s\r\n"), // LKTOKEN _@M698_ = "Task to go" gettext(TEXT("_@M698_")), timetext1, // LKTOKEN _@M242_ = "Dist to go" gettext(TEXT("_@M242_")), DISTANCEMODIFY*CALCULATED_INFO.TaskDistanceToGo, Units::GetDistanceName()); } } waInfo->SetCaption(sTmp); break; case ANALYSIS_PAGE_CONTEST: _stprintf(sTmp, TEXT("%s: %s - %s"), // LKTOKEN _@M93_ = "Analysis" gettext(TEXT("_@M93_")), // LKTOKEN _@M1450_ = "Contest" gettext(TEXT("_@M1450_")), CContestMgr::TypeToString(contestType)); wfa->SetCaption(sTmp); { CContestMgr::CResult result = CContestMgr::Instance().Result(contestType, false); if(result.Type() == contestType) { BOOL bFAI = CContestMgr::Instance().FAI(); double fDist = result.Distance(); if(!bFAI && (result.Type() == CContestMgr::TYPE_FAI_TRIANGLE)) // was only !bFAI fDist /=2.0; double fCPDist = CContestMgr::Instance().GetClosingPointDist(); double fB_CPDist = CContestMgr::Instance().GetBestClosingPointDist(); // LKASSERT( fDist >0 ); if(fDist < 10.0) fDist= 1000.0; TCHAR distStr[50]; TCHAR speedStr[50]; if((result.Type() == CContestMgr::TYPE_FAI_TRIANGLE) && bFAI) _stprintf(distStr, _T("%.1f %s FAI\r\n"), DISTANCEMODIFY * fDist, Units::GetDistanceName()); else _stprintf(distStr, _T("%.1f %s\r\n"), DISTANCEMODIFY * fDist, Units::GetDistanceName()); if((result.Type() == CContestMgr::TYPE_FAI_TRIANGLE) && bFAI ) _stprintf(speedStr, _T("%s%-.1f %s\r\n(%.1f %%)\r\n"),gettext(TEXT("_@M1508_")), DISTANCEMODIFY * fCPDist, Units::GetDistanceName(),fCPDist/fDist*100.0); else _stprintf(speedStr, TEXT("%.1f %s\r\n"),TASKSPEEDMODIFY * result.Speed(), Units::GetTaskSpeedName()); TCHAR timeTempStr[50]; Units::TimeToText(timeTempStr, result.Duration()); TCHAR timeStr[50]; if( (result.Type() == CContestMgr::TYPE_FAI_TRIANGLE) && bFAI && ISPARAGLIDER) _stprintf(timeStr, _T("\r\n%s%-.1f %s\r\n(%.1f %%)\r\n"),gettext(TEXT("_@M1511_")), DISTANCEMODIFY * fB_CPDist, Units::GetDistanceName(), fB_CPDist/fDist*100.0); //_@M1511_ = "B:" else _stprintf(timeStr, _T("%s\r\n"), timeTempStr); TCHAR scoreStr[50] = _T(""); if(result.Type() != CContestMgr::TYPE_FAI_3_TPS && result.Type() != CContestMgr::TYPE_FAI_TRIANGLE && result.Type() != CContestMgr::TYPE_FAI_3_TPS_PREDICTED) _stprintf(scoreStr, TEXT("%.2f pt\r\n"), result.Score()); TCHAR plusStr[50] = _T(""); if(result.Type() == CContestMgr::TYPE_OLC_CLASSIC || result.Type() == CContestMgr::TYPE_OLC_CLASSIC_PREDICTED || result.Type() == CContestMgr::TYPE_OLC_FAI || result.Type() == CContestMgr::TYPE_OLC_FAI_PREDICTED) { CContestMgr::TType type = (result.Type() == CContestMgr::TYPE_OLC_CLASSIC_PREDICTED || result.Type() == CContestMgr::TYPE_OLC_FAI_PREDICTED) ? CContestMgr::TYPE_OLC_PLUS_PREDICTED : CContestMgr::TYPE_OLC_PLUS; CContestMgr::CResult resultPlus = CContestMgr::Instance().Result(type, false); if(ScreenLandscape) _stprintf(plusStr, TEXT("\r\n%s:\r\n%.2f pt"), CContestMgr::TypeToString(type), resultPlus.Score()); else _stprintf(plusStr, TEXT("\r\n%s: %.2f pt"), CContestMgr::TypeToString(type), resultPlus.Score()); } _stprintf(sTmp, _T("%s%s%s%s%s"), distStr, speedStr, timeStr, scoreStr, plusStr); } else { _stprintf(sTmp, TEXT("%s\r\n"), // LKTOKEN _@M477_ = "No valid path" gettext(TEXT("_@M477_"))); } waInfo->SetCaption(sTmp); } break; } waGrid->SetVisible(analysis_page<MAXPAGE+1); if (waGrid != NULL) waGrid->Redraw(); }