static void OverviewRefreshTask(void) { LockTaskData(); RefreshTask(); int i; // Only need to refresh info where the removal happened // as the order of other taskpoints hasn't changed UpLimit = 0; lengthtotal = 0; for (i=0; i<MAXTASKPOINTS; i++) { if (Task[i].Index != -1) { lengthtotal += Task[i].Leg; UpLimit = i+1; } } // Simple FAI 2004 triangle rules fai_ok = true; if (lengthtotal>0) { for (i=0; i<MAXTASKPOINTS; i++) { if (Task[i].Index != -1) { double lrat = Task[i].Leg/lengthtotal; if ((lrat>0.45)||(lrat<0.10)) { fai_ok = false; } } } } else { fai_ok = false; } RefreshTaskStatistics(); WndProperty* wp; wp = (WndProperty*)wf->FindByName(TEXT("prpAATEst")); if (wp) { double dd = CALCULATED_INFO.TaskTimeToGo; // if ((CALCULATED_INFO.TaskStartTime>0.0)&&(CALCULATED_INFO.Flying)) { patchout 091126 if ( (CALCULATED_INFO.TaskStartTime>0.0)&&(CALCULATED_INFO.Flying) &&(ActiveTaskPoint>0)) { // patch 091126 dd += GPS_INFO.Time-CALCULATED_INFO.TaskStartTime; } dd= min(24.0*60.0,dd/60.0); wp->GetDataField()->SetAsFloat(dd); wp->RefreshDisplay(); } LowLimit =0; wTaskList->ResetList(); wTaskList->Redraw(); UpdateCaption(); UnlockTaskData(); }
static void DoOptimise(void) { double myrange= Range; double RangeLast= Range; double deltaTlast = 0; int steps = 0; if (!AATEnabled) return; LockFlightData(); LockTaskData(); TargetDialogOpen = true; do { myrange = Range; AdjustAATTargets(Range); RefreshTask(); RefreshTaskStatistics(); double deltaT = CALCULATED_INFO.TaskTimeToGo; if ((CALCULATED_INFO.TaskStartTime>0.0)&&(CALCULATED_INFO.Flying)) { deltaT += GPS_INFO.Time-CALCULATED_INFO.TaskStartTime; } deltaT= min(24.0*60.0,deltaT/60.0)-AATTaskLength-5; double dRdT = 0.001; if (steps>0) { if (fabs(deltaT-deltaTlast)>0.01) { dRdT = min(0.5,(Range-RangeLast)/(deltaT-deltaTlast)); if (dRdT<=0.0) { // error, time decreases with increasing range! // or, no effect on time possible break; } } else { // minimal change for whatever reason // or, no effect on time possible, e.g. targets locked break; } } RangeLast = Range; deltaTlast = deltaT; if (fabs(deltaT)>0.25) { // more than 15 seconds error Range -= dRdT*deltaT; Range = max(-1.0, min(Range,1.0)); } else { break; } } while (steps++<25); Range = myrange; AdjustAATTargets(Range); RefreshCalculator(); TargetDialogOpen = false; UnlockTaskData(); UnlockFlightData(); }
static void RefreshCalculator(void) { WndProperty* wp; RefreshTask(); RefreshTaskStatistics(); // update outputs wp = (WndProperty*)wf->FindByName(TEXT("prpAATEst")); if (wp) { double dd = CALCULATED_INFO.TaskTimeToGo; if ((CALCULATED_INFO.TaskStartTime>0.0)&&(CALCULATED_INFO.Flying)) { dd += GPS_INFO.Time-CALCULATED_INFO.TaskStartTime; } dd= min(24.0*60.0,dd/60.0); wp->GetDataField()->SetAsFloat(dd); wp->RefreshDisplay(); } // update outputs wp = (WndProperty*)wf->FindByName(TEXT("prpAATTime")); if (wp) { if (!AATEnabled) { wp->SetVisible(false); } else { wp->GetDataField()->SetAsFloat(AATTaskLength); } wp->RefreshDisplay(); } double d1 = (CALCULATED_INFO.TaskDistanceToGo +CALCULATED_INFO.TaskDistanceCovered); if (AATEnabled && (d1==0.0)) { d1 = CALCULATED_INFO.AATTargetDistance; } wp = (WndProperty*)wf->FindByName(TEXT("prpDistance")); if (wp) { wp->GetDataField()->SetAsFloat(d1*DISTANCEMODIFY); wp->GetDataField()->SetUnits(Units::GetDistanceName()); wp->RefreshDisplay(); } wp = (WndProperty*)wf->FindByName(TEXT("prpMacCready")); if (wp) { wp->GetDataField()->SetUnits(Units::GetVerticalSpeedName()); wp->RefreshDisplay(); } wp = (WndProperty*)wf->FindByName(TEXT("prpEffectiveMacCready")); if (wp) { wp->GetDataField()->SetUnits(Units::GetVerticalSpeedName()); wp->GetDataField()->SetAsFloat(emc*LIFTMODIFY); wp->RefreshDisplay(); } wp = (WndProperty*)wf->FindByName(TEXT("prpRange")); if (wp) { wp->RefreshDisplay(); if (!AATEnabled || !ValidTaskPoint(ActiveWayPoint+1)) { wp->SetVisible(false); } else { wp->SetVisible(true); } wp->GetDataField()->SetAsFloat(Range*100.0); wp->RefreshDisplay(); } double v1; if (CALCULATED_INFO.TaskTimeToGo>0) { v1 = CALCULATED_INFO.TaskDistanceToGo/ CALCULATED_INFO.TaskTimeToGo; } else { v1 = 0; } wp = (WndProperty*)wf->FindByName(TEXT("prpSpeedRemaining")); if (wp) { wp->GetDataField()->SetAsFloat(v1*TASKSPEEDMODIFY); wp->GetDataField()->SetUnits(Units::GetTaskSpeedName()); wp->RefreshDisplay(); } wp = (WndProperty*)wf->FindByName(TEXT("prpSpeedAchieved")); if (wp) { wp->GetDataField()->SetAsFloat(CALCULATED_INFO.TaskSpeed*TASKSPEEDMODIFY); wp->GetDataField()->SetUnits(Units::GetTaskSpeedName()); wp->RefreshDisplay(); } wp = (WndProperty*)wf->FindByName(TEXT("prpCruiseEfficiency")); if (wp) { wp->GetDataField()->SetAsFloat(cruise_efficiency*100.0); wp->RefreshDisplay(); } }
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(); }