void ConsoleCanvas::UpdateRouteData() { wxString str_buf; if( g_pRouteMan->GetpActiveRoute() ) { if( g_pRouteMan->m_bDataValid ) { // Range to the next waypoint is needed always float rng = g_pRouteMan->GetCurrentRngToActivePoint(); // Brg to the next waypoint float dcog = g_pRouteMan->GetCurrentBrgToActivePoint(); if( dcog >= 359.5 ) dcog = 0; wxString cogstr; if( g_bShowMag ) cogstr << wxString::Format( wxString("%6.0f(M)", wxConvUTF8 ), gFrame->GetTrueOrMag( dcog ) ); else cogstr << wxString::Format( wxString("%6.0f", wxConvUTF8 ), gFrame->GetTrueOrMag( dcog ) ); pBRG->SetAValue( cogstr ); // VMG // VMG is always to next waypoint, not to end of route // VMG is SOG x cosine (difference between COG and BRG to Waypoint) double VMG = 0.; if( !wxIsNaN(gCog) && !wxIsNaN(gSog) ) { double BRG; BRG = g_pRouteMan->GetCurrentBrgToActivePoint(); VMG = gSog * cos( ( BRG - gCog ) * PI / 180. ) ; str_buf.Printf( _T("%6.2f"), toUsrSpeed( VMG ) ); } else str_buf = _T("---"); pVMG->SetAValue( str_buf ); if( !g_bShowRouteTotal ) { float nrng = g_pRouteMan->GetCurrentRngToActiveNormalArrival(); wxString srng; double deltarng = fabs( rng - nrng ); if( ( deltarng > .01 ) && ( ( deltarng / rng ) > .10 ) && ( rng < 10.0 ) ) // show if there is more than 10% difference in ranges, etc... { if( nrng < 10.0 ) srng.Printf( _T("%5.2f/%5.2f"), toUsrDistance( rng ), toUsrDistance( nrng ) ); else srng.Printf( _T("%5.1f/%5.1f"), toUsrDistance( rng ), toUsrDistance( nrng ) ); } else { if( rng < 10.0 ) srng.Printf( _T("%6.2f"), toUsrDistance( rng ) ); else srng.Printf( _T("%6.1f"), toUsrDistance( rng ) ); } //RNG to the next WPT pRNG->SetAValue( srng ); // XTE str_buf.Printf( _T("%6.2f"), toUsrDistance( g_pRouteMan->GetCurrentXTEToActivePoint() ) ); pXTE->SetAValue( str_buf ); if( g_pRouteMan->GetXTEDir() < 0 ) pXTE->SetALabel( wxString( _("XTE L") ) ); else pXTE->SetALabel( wxString( _("XTE R") ) ); // TTG // In all cases, ttg/eta are declared invalid if VMG <= 0. // If showing only "this leg", use VMG for calculation of ttg wxString ttg_s; if( ( VMG > 0. ) && !wxIsNaN(gCog) && !wxIsNaN(gSog) ) { float ttg_sec = ( rng / VMG ) * 3600.; wxTimeSpan ttg_span( 0, 0, long( ttg_sec ), 0 ); ttg_s = ttg_span.Format(); } else ttg_s = _T("---"); pTTG->SetAValue( ttg_s ); } else { // Remainder of route float trng = rng; Route *prt = g_pRouteMan->GetpActiveRoute(); wxRoutePointListNode *node = ( prt->pRoutePointList )->GetFirst(); RoutePoint *prp; int n_addflag = 0; while( node ) { prp = node->GetData(); if( n_addflag ) trng += prp->m_seg_len; if( prp == prt->m_pRouteActivePoint ) n_addflag++; node = node->GetNext(); } // total rng wxString strng; if( trng < 10.0 ) strng.Printf( _T("%6.2f"), toUsrDistance( trng ) ); else strng.Printf( _T("%6.1f"), toUsrDistance( trng ) ); pRNG->SetAValue( strng ); // total TTG // If showing total route TTG/ETA, use gSog for calculation wxString tttg_s; wxTimeSpan tttg_span; if( VMG > 0. ) { float tttg_sec = ( trng / gSog ) * 3600.; tttg_span = wxTimeSpan::Seconds( (long) tttg_sec ); tttg_s = tttg_span.Format(); } else { tttg_span = wxTimeSpan::Seconds( 0 ); tttg_s = _T("---"); } pTTG->SetAValue( tttg_s ); // total ETA to be shown on XTE panel wxDateTime dtnow, eta; dtnow.SetToCurrent(); eta = dtnow.Add( tttg_span ); wxString seta; if( VMG > 0. ) seta = eta.Format( _T("%H:%M") ); else seta = _T("---"); pXTE->SetAValue( seta ); pXTE->SetALabel( wxString( _("ETA ") ) ); } pRNG->Refresh(); pBRG->Refresh(); pVMG->Refresh(); pTTG->Refresh(); pXTE->Refresh(); } } }
wxString OCPNListCtrl::GetTargetColumnData( AIS_Target_Data *pAISTarget, long column ) const { wxString ret; if( pAISTarget ) { switch( column ){ case tlTRK: if( pAISTarget->b_show_track ) ret = _("Yes"); else ret = _("No"); break; case tlNAME: if( ( pAISTarget->Class == AIS_BASE ) || ( pAISTarget->Class == AIS_SART ) || pAISTarget->b_SarAircraftPosnReport) ret = _("-"); else { wxString uret = trimAISField( pAISTarget->ShipName ); if( uret == _T("Unknown") ) ret = wxGetTranslation( uret ); else ret = uret; if( strlen( pAISTarget->ShipNameExtension ) ) ret.Append( wxString( pAISTarget->ShipNameExtension, wxConvUTF8 ) ); } break; case tlCALL: ret = trimAISField( pAISTarget->CallSign ); break; case tlMMSI: if( pAISTarget->Class != AIS_GPSG_BUDDY ) ret.Printf( _T("%09d"), abs( pAISTarget->MMSI ) ); else ret.Printf( _T(" nil ") ); break; case tlCLASS: if(pAISTarget->b_SarAircraftPosnReport) ret = _("SAR Aircraft"); else ret = wxGetTranslation( pAISTarget->Get_class_string( true ) ); break; case tlTYPE: if( ( pAISTarget->Class == AIS_BASE ) || ( pAISTarget->Class == AIS_SART ) || pAISTarget->b_SarAircraftPosnReport) ret = _("-"); else ret = wxGetTranslation( pAISTarget->Get_vessel_type_string( false ) ); break; case tlNAVSTATUS: { if( pAISTarget->Class == AIS_SART ) { if( pAISTarget->NavStatus == RESERVED_14 ) ret = _("Active"); else if( pAISTarget->NavStatus == UNDEFINED ) ret = _("Testing"); } else { if( ( pAISTarget->NavStatus <= 20 ) && ( pAISTarget->NavStatus >= 0 ) ) ret = wxGetTranslation(ais_get_status(pAISTarget->NavStatus)); else ret = _("-"); } if( ( pAISTarget->Class == AIS_ATON ) || ( pAISTarget->Class == AIS_BASE ) || ( pAISTarget->Class == AIS_CLASS_B ) || pAISTarget->b_SarAircraftPosnReport) ret = _("-"); break; } case tlBRG: { if( pAISTarget->b_positionOnceValid && bGPSValid && ( pAISTarget->Brg >= 0. ) && ( fabs( pAISTarget->Lat ) < 85. ) ) { int brg = (int) wxRound( pAISTarget->Brg ); if( pAISTarget->Brg > 359.5 ) brg = 0; ret.Printf( _T("%03d"), brg ); } else ret = _("-"); break; } case tlCOG: { if( ( pAISTarget->COG >= 360.0 ) || ( pAISTarget->Class == AIS_ATON ) || ( pAISTarget->Class == AIS_BASE ) ) ret = _("-"); else { int crs = wxRound( pAISTarget->COG ); if( crs == 360 ) ret.Printf( _T(" 000") ); else ret.Printf( _T(" %03d"), crs ); } break; } case tlSOG: { if( (( pAISTarget->SOG > 100. ) && !pAISTarget->b_SarAircraftPosnReport) || ( pAISTarget->Class == AIS_ATON ) || ( pAISTarget->Class == AIS_BASE ) ) ret = _("-"); else ret.Printf( _T("%5.1f"), toUsrSpeed( pAISTarget->SOG ) ); break; } case tlCPA: { if( ( !pAISTarget->bCPA_Valid ) || ( pAISTarget->Class == AIS_ATON ) || ( pAISTarget->Class == AIS_BASE ) ) ret = _("-"); else ret.Printf( _T("%5.2f"), toUsrDistance( pAISTarget->CPA ) ); break; } case tlTCPA: { if( ( !pAISTarget->bCPA_Valid ) || ( pAISTarget->Class == AIS_ATON ) || ( pAISTarget->Class == AIS_BASE ) ) ret = _("-"); else ret.Printf( _T("%5.0f"), pAISTarget->TCPA ); break; } case tlRNG: { if( pAISTarget->b_positionOnceValid && bGPSValid && ( pAISTarget->Range_NM >= 0. ) ) ret.Printf( _T("%5.2f"), toUsrDistance( pAISTarget->Range_NM ) ); else ret = _("-"); break; } default: break; } } return ret; }
wxString AIS_Target_Data::GetRolloverString( void ) { wxString result; wxString t; if( b_nameValid ) { result.Append( _T("\"") ); result.Append( GetFullName() ); result.Append( _T("\" ") ); } if( Class != AIS_GPSG_BUDDY ) { t.Printf( _T("%09d"), abs( MMSI ) ); result.Append( t ); result.Append( _T(" ") ); result.Append( GetCountryCode(false) ); } t = trimAISField( CallSign ); if( t.Len() ) { result.Append( _T(" (") ); result.Append( t ); result.Append( _T(")") ); } if( g_bAISRolloverShowClass || ( Class == AIS_SART ) ) { if( result.Len() ) result.Append( _T("\n") ); result.Append( _T("[") ); if( Class == AIS_ATON ) { result.Append( wxGetTranslation( Get_class_string( true ) ) ); result.Append(_T(": ")); result.Append( wxGetTranslation( Get_vessel_type_string( false ) ) ); } else if(b_SarAircraftPosnReport) result.Append(_("SAR Aircraft")); else result.Append( wxGetTranslation( Get_class_string( false ) ) ); result.Append( _T("] ") ); if( ( Class != AIS_ATON ) && ( Class != AIS_BASE ) ) { if( Class == AIS_SART ) { int mmsi_start = MMSI / 1000000; switch( mmsi_start ){ case 970: break; case 972: result += _T("MOB"); break; case 974: result += _T("EPIRB"); break; default: result += _("Unknown"); break; } } if( Class != AIS_SART ) { if( !b_SarAircraftPosnReport ) result.Append( wxGetTranslation( Get_vessel_type_string( false ) ) ); } if( ( Class != AIS_CLASS_B ) && ( Class != AIS_SART ) && !b_SarAircraftPosnReport) { if( ( NavStatus <= 15 ) && ( NavStatus >= 0 ) ) { result.Append( _T(" (") ); result.Append(wxGetTranslation(ais_get_status(NavStatus))); result.Append( _T(")") ); } } else if( Class == AIS_SART ) { result.Append( _T(" (") ); if( NavStatus == RESERVED_14 ) result.Append( _("Active") ); else if( NavStatus == UNDEFINED ) result.Append( _("Testing") ); result.Append( _T(")") ); } } } if( g_bAISRolloverShowCOG && (( SOG <= 102.2 ) || b_SarAircraftPosnReport) && ( ( Class != AIS_ATON ) && ( Class != AIS_BASE ) ) ) { if( result.Len() ) result << _T("\n"); double speed_show = toUsrSpeed( SOG ); if( speed_show < 10.0 ) result << wxString::Format( _T("SOG %.2f "), speed_show ) << getUsrSpeedUnit() << _T(" "); else if( speed_show < 100.0 ) result << wxString::Format( _T("SOG %.1f "), speed_show ) << getUsrSpeedUnit() << _T(" "); else result << wxString::Format( _T("SOG %.0f "), speed_show ) << getUsrSpeedUnit() << _T(" "); int crs = wxRound( COG ); if( b_positionOnceValid ) { if( crs < 360 ) { if( g_bShowMag ) result << wxString::Format( wxString("COG %03d°(M) ", wxConvUTF8 ), (int)gFrame->GetTrueOrMag( crs ) ); else result << wxString::Format( wxString("COG %03d° ", wxConvUTF8 ), (int)gFrame->GetTrueOrMag( crs ) ); } else if( COG == 360.0 ) result << _(" COG Unavailable"); else if( crs == 360 ) result << wxString( " COG 000°", wxConvUTF8 ); } else result << _(" COG Unavailable"); } if( g_bAISRolloverShowCPA && bCPA_Valid ) { if( result.Len() ) result << _T("\n"); result << _("CPA") << _T(" ") << cc1->FormatDistanceAdaptive( CPA ) << _T(" ") << _("in") << _T(" ") << wxString::Format( _T("%.0f"), TCPA ) << _T(" ") << _("min"); } return result; }
wxString AIS_Target_Data::BuildQueryResult( void ) { wxString html; wxDateTime now = wxDateTime::Now(); wxString tableStart = _T("\n<table border=0 cellpadding=1 cellspacing=0>\n"); wxString tableEnd = _T("</table>\n\n"); wxString rowStart = _T("<tr><td><font size=-2>"); wxString rowStartH = _T("<tr><td nowrap>"); wxString rowSeparator = _T("</font></td><td></td><td><b>"); wxString rowSeparatorH = _T("</td><td></td><td>"); wxString colSeparator = _T("<td></td>"); wxString rowEnd = _T("</b></td></tr>\n"); wxString vertSpacer = _T("<tr><td></td></tr><tr><td></td></tr><tr><td></td></tr>\n\n"); wxString IMOstr, MMSIstr, ClassStr; html << tableStart << _T("<tr><td nowrap colspan=2>"); if( /*( Class != AIS_BASE ) &&*/ ( Class != AIS_SART ) ) { if( b_nameValid ) { html << _T("<font size=+2><i><b>") << GetFullName() ; html << _T("</b></i></font> <b>"); } } if( ( Class != AIS_ATON ) && ( Class != AIS_BASE ) && ( Class != AIS_GPSG_BUDDY ) && ( Class != AIS_SART ) ) { html << trimAISField( CallSign ) << _T("</b>") << rowEnd; if( Class != AIS_CLASS_B ) { if( IMO > 0 ) IMOstr = wxString::Format( _T("%08d"), abs( IMO ) ); } } else html << _T("</b>") << rowEnd; html << vertSpacer; if( Class != AIS_GPSG_BUDDY ) { MMSIstr = wxString::Format( _T("%09d"), abs( MMSI ) ); } ClassStr = wxGetTranslation( Get_class_string( false ) ); if( Class == AIS_ATON ) { wxString cls(_T("AtoN: ") ); cls += Get_vessel_type_string(false); ClassStr = wxGetTranslation( cls ); } if(b_SarAircraftPosnReport) ClassStr = _("SAR Aircraft"); if( IMOstr.Length() ) html << _T("<tr><td colspan=2><table width=100% border=0 cellpadding=0 cellspacing=0>") << rowStart <<_("MMSI") << _T("</font></td><td> </td><td><font size=-2>") << _("Class") << _T("</font></td><td> </td><td align=right><font size=-2>") << _("IMO") << _T("</font></td></tr>") << rowStartH << _T("<b>") << MMSIstr << _T("</b></td><td> </td><td><b>") << ClassStr << _T("</b></td><td> </td><td align=right><b>") << IMOstr << rowEnd << _T("</table></td></tr>"); else html << _T("<tr><td colspan=2><table width=100% border=0 cellpadding=0 cellspacing=0>") << rowStart <<_("MMSI") << _T("</font></td><td> </td><td align=right><font size=-2>") << _("Class") << _T("</font></td></tr>") << rowStartH << _T("<b>") << MMSIstr << _T("</b></td><td> </td><td align=right><b>") << ClassStr << rowEnd << _T("</table></td></tr>"); if((Class != AIS_SART ) && ( Class != AIS_BASE ) && ( Class != AIS_DSC ) ) html << _T("<tr><td colspan=2><table width=100% border=0 cellpadding=0 cellspacing=0>") << rowStart << _("Flag") << rowEnd << _T("</font></td></tr>") << rowStartH << _T("<b>")<< GetCountryCode(true) << rowEnd << _T("</table></td></tr>"); html << vertSpacer; wxString navStatStr; if( ( Class != AIS_BASE ) && ( Class != AIS_CLASS_B ) && ( Class != AIS_SART ) ) { if( ( NavStatus <= 21 ) && ( NavStatus >= 0 ) ) navStatStr = wxGetTranslation(ais_get_status(NavStatus)); } else if( Class == AIS_SART ) { if( NavStatus == RESERVED_14 ) navStatStr = _("Active"); else if( NavStatus == UNDEFINED ) navStatStr = _("Testing"); } wxString sart_sub_type; if( Class == AIS_SART ) { int mmsi_start = MMSI / 1000000; switch( mmsi_start ){ case 970: // sart_sub_type = _T("SART"); break; case 972: sart_sub_type = _T("MOB"); break; case 974: sart_sub_type = _T("EPIRB"); break; default: sart_sub_type = _("Unknown"); break; } } wxString AISTypeStr, UNTypeStr, sizeString; if( ( Class != AIS_BASE ) && ( Class != AIS_SART ) && ( Class != AIS_DSC ) ) { // Ship type AISTypeStr = wxGetTranslation( Get_vessel_type_string() ); if( b_isEuroInland && UN_shiptype ) { ERIShipTypeHash::iterator it = s_ERI_hash.find( UN_shiptype ); wxString type; if( it == s_ERI_hash.end() ) type = _("Undefined"); else type = it->second; UNTypeStr = wxGetTranslation( type ); } if( b_SarAircraftPosnReport ){ AISTypeStr.Clear(); UNTypeStr.Clear(); navStatStr.Clear(); } if( Class == AIS_SART ) { if( MSG_14_text.Len() ) { html << rowStart << _("Safety Broadcast Message") << rowEnd << rowStartH << _T("<b>") << MSG_14_text << rowEnd; } } // Dimensions if( NavStatus != ATON_VIRTUAL && Class != AIS_ARPA && Class != AIS_APRS ) { if( ( Class == AIS_CLASS_B ) || ( Class == AIS_ATON ) ) { sizeString = wxString::Format( _T("%dm x %dm"), ( DimA + DimB ), ( DimC + DimD ) ); } else if(!b_SarAircraftPosnReport) { if( ( DimA + DimB + DimC + DimD ) == 0 ) { if( b_isEuroInland ) { if( Euro_Length == 0.0 ) { if( Euro_Draft > 0.01 ) { sizeString << wxString::Format( _T("---m x ---m x %4.1fm"), Euro_Draft ); } else { sizeString << _T("---m x ---m x ---m"); } } else { if( Euro_Draft > 0.01 ) { sizeString << wxString::Format( _T("%5.1fm x %4.1fm x %4.1fm"), Euro_Length, Euro_Beam, Euro_Draft ); } else { sizeString << wxString::Format( _T("%5.1fm x %4.1fm x ---m\n\n"), Euro_Length, Euro_Beam ); } } } else { if( Draft > 0.01 ) { sizeString << wxString::Format( _T("---m x ---m x %4.1fm"), Draft ); } else { sizeString << _T("---m x ---m x ---m"); } } } else if( Draft < 0.01 ) { sizeString << wxString::Format( _T("%dm x %dm x ---m"), ( DimA + DimB ), ( DimC + DimD ) ); } else { sizeString << wxString::Format( _T("%dm x %dm x %4.1fm"), ( DimA + DimB ), ( DimC + DimD ), Draft ); } } } } if( Class == AIS_SART ) { html << _T("<tr><td colspan=2>") << _T("<b>") << AISTypeStr; if( sart_sub_type.Length() ) html << _T(" (") << sart_sub_type << _T("), "); html << navStatStr; html << rowEnd << _T("<tr><td colspan=2>") << _T("<b>") << sizeString << rowEnd; } else if( Class == AIS_ATON ) { html << _T("<tr><td colspan=2>") << _T("<b>") << navStatStr; html << rowEnd << _T("<tr><td colspan=2>") << _T("<b>") << sizeString << rowEnd; } else if( ( Class != AIS_BASE ) && ( Class != AIS_DSC ) ) { html << _T("<tr><td colspan=2>") << _T("<b>") << AISTypeStr; if( navStatStr.Length() ) html << _T(", ") << navStatStr; if( UNTypeStr.Length() ) html << _T(" (UN Type ") << UNTypeStr << _T(")"); html << rowEnd << _T("<tr><td colspan=2>") << _T("<b>") << sizeString << rowEnd; } if( b_positionOnceValid ) { wxString posTypeStr; if( b_positionDoubtful ) posTypeStr << _(" (Last Known)"); now.MakeGMT(); int target_age = now.GetTicks() - PositionReportTicks; html << vertSpacer << rowStart << _("Position") << posTypeStr << _T("</font></td><td align=right><font size=-2>") << _("Report Age") << _T("</font></td></tr>") << rowStartH << _T("<b>") << toSDMM( 1, Lat ) << _T("</b></td><td align=right><b>") << FormatTimeAdaptive( target_age ) << rowEnd << rowStartH << _T("<b>") << toSDMM( 2, Lon ) << rowEnd; } wxString courseStr, sogStr, hdgStr, rotStr, rngStr, brgStr, destStr, etaStr; if( Class == AIS_GPSG_BUDDY ) { long month, year, day; m_date_string.Mid(0,2).ToLong(&day); m_date_string.Mid(2,2).ToLong(&month); m_date_string.Mid(4,2).ToLong(&year); wxDateTime date; date.SetDay(day); date.SetMonth((wxDateTime::Month)(month-1)); date.SetYear(year + 2000); wxString f_date = date.FormatISODate(); html << vertSpacer << rowStart << _("Report as of") << rowEnd << rowStartH << _T("<b>") << f_date + _T("</b> at <b>") << wxString::Format( _T("%d:%d UTC "), m_utc_hour, m_utc_min ) << rowEnd; } else { if( Class == AIS_CLASS_A && !b_SarAircraftPosnReport ) { html << vertSpacer << rowStart << _("Destination") << _T("</font></td><td align=right><font size=-2>") << _("ETA (UTC)") << _T("</font></td></tr>\n") << rowStartH << _T("<b>"); wxString dest = trimAISField( Destination ); if(dest.Length() ) html << dest; else html << _("---"); html << _T("</b></td><td nowrap align=right><b>"); if( ( ETA_Mo ) && ( ETA_Hr < 24 ) ) { int yearOffset = 0; if( now.GetMonth() > ( ETA_Mo - 1 ) ) yearOffset = 1; wxDateTime eta( ETA_Day, wxDateTime::Month( ETA_Mo - 1 ), now.GetYear() + yearOffset, ETA_Hr, ETA_Min ); html << eta.Format( _T("%b %d %H:%M") ); } else html << _("---"); html << rowEnd; } if( Class == AIS_CLASS_A || Class == AIS_CLASS_B || Class == AIS_ARPA || Class == AIS_APRS ) { int crs = wxRound( COG ); if( crs < 360 ) { if( g_bShowMag ) courseStr << wxString::Format( wxString("%03d°(M) ", wxConvUTF8 ), (int)gFrame->GetTrueOrMag( crs ) ); else courseStr << wxString::Format( wxString("%03d° ", wxConvUTF8 ), (int)gFrame->GetTrueOrMag( crs ) ); } else if( COG == 360.0 ) courseStr = _T("---"); else if( crs == 360 ) courseStr = _T("0°"); double speed_show = toUsrSpeed( SOG ); if( ( SOG <= 102.2 ) || b_SarAircraftPosnReport ){ if( speed_show < 10.0 ) sogStr = wxString::Format( _T("%.2f "), speed_show ) + getUsrSpeedUnit(); else if( speed_show < 100.0 ) sogStr = wxString::Format( _T("%.1f "), speed_show ) + getUsrSpeedUnit(); else sogStr = wxString::Format( _T("%.0f "), speed_show ) + getUsrSpeedUnit(); } // sogStr = wxString::Format( _T("%5.2f ") + getUsrSpeedUnit(), toUsrSpeed( SOG ) ); else sogStr = _("---"); if( (int) HDG != 511 ) hdgStr = wxString::Format( _T("%03d°"), (int) HDG ); else hdgStr = _T("---"); if( ROTAIS != -128 ) { if( ROTAIS == 127 ) rotStr << _T("> 5°/30s ") << _("Right"); else if( ROTAIS == -127 ) rotStr << _T("> 5°/30s ") << _("Left"); else { if( ROTIND > 0 ) rotStr << wxString::Format( _T("%3d°/Min "), ROTIND ) << _("Right"); else if( ROTIND < 0 ) rotStr << wxString::Format( _T("%3d°/Min "), -ROTIND ) << _("Left"); else rotStr = _T("0"); } } else if( !b_SarAircraftPosnReport ) rotStr = _("---"); } } if( b_positionOnceValid && bGPSValid && ( Range_NM >= 0. ) ) rngStr = cc1->FormatDistanceAdaptive( Range_NM ); else rngStr = _("---"); int brg = (int) wxRound( Brg ); if( Brg > 359.5 ) brg = 0; if( b_positionOnceValid && bGPSValid && ( Brg >= 0. ) && ( Range_NM > 0. ) && ( fabs( Lat ) < 85. ) ){ if( g_bShowMag ) brgStr << wxString::Format( wxString("%03d°(M) ", wxConvUTF8 ), (int)gFrame->GetTrueOrMag( Brg ) ); else brgStr << wxString::Format( wxString("%03d° ", wxConvUTF8 ), (int)gFrame->GetTrueOrMag( Brg ) ); } else brgStr = _("---"); wxString turnRateHdr; // Blank if ATON or BASE or Special Position Report (9) if( ( Class != AIS_ATON ) && ( Class != AIS_BASE ) && ( Class != AIS_DSC ) ) { html << vertSpacer << _T("<tr><td colspan=2><table width=100% border=0 cellpadding=0 cellspacing=0>") << rowStart <<_("Speed") << _T("</font></td><td> </td><td><font size=-2>") << _("Course") << _T("</font></td><td> </td><td align=right><font size=-2>"); if( !b_SarAircraftPosnReport ) html << _("Heading") ; html << _T("</font></td></tr>") << rowStartH << _T("<b>") << sogStr << _T("</b></td><td> </td><td><b>") << courseStr << _T("</b></td><td> </td><td align=right><b>"); if(!b_SarAircraftPosnReport) html << hdgStr; html << rowEnd << _T("</table></td></tr>") << vertSpacer; if( !b_SarAircraftPosnReport ) turnRateHdr = _("Turn Rate"); } html << _T("<tr><td colspan=2><table width=100% border=0 cellpadding=0 cellspacing=0>") << rowStart <<_("Range") << _T("</font></td><td> </td><td><font size=-2>") << _("Bearing") << _T("</font></td><td> </td><td align=right><font size=-2>") << turnRateHdr << _T("</font></td></tr>") << rowStartH << _T("<b>") << rngStr << _T("</b></td><td> </td><td><b>") << brgStr << _T("</b></td><td> </td><td align=right><b>"); if(!b_SarAircraftPosnReport) html << rotStr; html << rowEnd << _T("</table></td></tr>") << vertSpacer; if( bCPA_Valid ) { wxString tcpaStr; tcpaStr << _T("</b> ") << _("in ") << _T("</td><td align=right><b>") << FormatTimeAdaptive( (int)(TCPA*60.) ); html<< /*vertSpacer << */rowStart << _T("<font size=-2>") <<_("CPA") << _T("</font>") << rowEnd << rowStartH << _T("<b>") << cc1->FormatDistanceAdaptive( CPA ) << tcpaStr << rowEnd; } if( Class != AIS_BASE ) { if( blue_paddle == 1 ) { html << rowStart << _("Inland Blue Flag") << rowEnd << rowStartH << _T("<b>") << _("Clear") << rowEnd; } else if( blue_paddle == 2 ) { html << rowStart << _("Inland Blue Flag") << rowEnd << rowStartH << _T("<b>") << _("Set") << rowEnd; } } if(b_SarAircraftPosnReport) { wxString altStr; if(altitude != 4095) altStr.Printf(_T("%4d m"), altitude ); else altStr = _("Unknown"); html << rowStart <<_("Altitude") << _T("</font></td><td> </td><td><font size=-0>") << rowStartH << _T("<b>") << altStr << _T("</b></td><td> </td><td><b>") << rowEnd << _T("</table></td></tr>") << vertSpacer; } html << _T("</table>"); return html; }
bool TrackPropDlg::UpdateProperties() { if( NULL == m_pRoute ) return false; ::wxBeginBusyCursor(); wxWindowList kids = m_scrolledWindowLinks->GetChildren(); for( unsigned int i = 0; i < kids.GetCount(); i++ ) { wxWindowListNode *node = kids.Item( i ); wxWindow *win = node->GetData(); if( win->IsKindOf( CLASSINFO(wxHyperlinkCtrl) ) ) { ( (wxHyperlinkCtrl*) win )->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( TrackPropDlg::OnHyperLinkClick ) ); ( (wxHyperlinkCtrl*) win )->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( TrackPropDlg::m_hyperlinkContextMenu ) ); } } m_scrolledWindowLinks->DestroyChildren(); int NbrOfLinks = m_pRoute->m_HyperlinkList->GetCount(); HyperlinkList *hyperlinklist = m_pRoute->m_HyperlinkList; // int len = 0; if( NbrOfLinks > 0 ) { wxHyperlinkListNode *linknode = hyperlinklist->GetFirst(); while( linknode ) { Hyperlink *link = linknode->GetData(); wxString Link = link->Link; wxString Descr = link->DescrText; wxHyperlinkCtrl* ctrl = new wxHyperlinkCtrl( m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); ctrl->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( TrackPropDlg::OnHyperLinkClick ), NULL, this ); if( !m_pRoute->m_bIsInLayer ) ctrl->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( TrackPropDlg::m_hyperlinkContextMenu ), NULL, this ); bSizerLinks->Add( ctrl, 0, wxALL, 5 ); linknode = linknode->GetNext(); } } bSizerLinks->Fit( m_scrolledWindowLinks ); m_tName->SetValue( m_pRoute->m_RouteNameString ); m_tFrom->SetValue( m_pRoute->m_RouteStartString ); m_tTo->SetValue( m_pRoute->m_RouteEndString ); m_tDescription->SetValue( m_pRoute->m_RouteDescription ); m_tTotDistance->SetValue( _T("") ); m_tTimeEnroute->SetValue( _T("") ); m_sdbBtmBtnsSizerSplit->Enable( false ); m_sdbBtmBtnsSizerExtend->Enable( false ); m_pRoute->UpdateSegmentDistances(); // get segment and total distance // but ignore leg speed calcs // Calculate AVG speed if we are showing a track and total time RoutePoint *last_point = m_pRoute->GetLastPoint(); RoutePoint *first_point = m_pRoute->GetPoint( 1 ); double total_seconds = 0.; if( last_point->GetCreateTime().IsValid() && first_point->GetCreateTime().IsValid() ) { total_seconds = last_point->GetCreateTime().Subtract( first_point->GetCreateTime() ).GetSeconds().ToDouble(); if( total_seconds != 0. ) { m_avgspeed = m_pRoute->m_route_length / total_seconds * 3600; } else { m_avgspeed = 0; } wxString s; s.Printf( _T("%5.2f"), toUsrSpeed( m_avgspeed ) ); m_tAvgSpeed->SetValue( s ); } else { wxString s( _T("--") ); m_tAvgSpeed->SetValue( s ); } // Total length wxString slen; slen.Printf( wxT("%5.2f ") + getUsrDistanceUnit(), toUsrDistance( m_pRoute->m_route_length ) ); m_tTotDistance->SetValue( slen ); // Time wxString time_form; wxTimeSpan time( 0, 0, (int) total_seconds, 0 ); if( total_seconds > 3600. * 24. ) time_form = time.Format( _("%D Days, %H:%M") ); else if( total_seconds > 0. ) time_form = time.Format( _("%H:%M") ); else time_form = _T("--"); m_tTimeEnroute->SetValue( time_form ); m_cbShow->SetValue( m_pRoute->IsVisible() ); if( m_pRoute->m_Colour == wxEmptyString ) m_cColor->Select( 0 ); else { for( unsigned int i = 0; i < sizeof( ::GpxxColorNames ) / sizeof(wxString); i++ ) { if( m_pRoute->m_Colour == ::GpxxColorNames[i] ) { m_cColor->Select( i + 1 ); break; } } } for( unsigned int i = 0; i < sizeof( ::StyleValues ) / sizeof(int); i++ ) { if( m_pRoute->m_style == ::StyleValues[i] ) { m_cStyle->Select( i ); break; } } for( unsigned int i = 0; i < sizeof( ::WidthValues ) / sizeof(int); i++ ) { if( m_pRoute->m_width == ::WidthValues[i] ) { m_cWidth->Select( i ); break; } } if( m_pRoute->m_bIsInLayer ) { m_tName->SetEditable( false ); m_tFrom->SetEditable( false ); m_tTo->SetEditable( false ); m_tDescription->SetEditable( false ); m_cbShow->Enable( false ); m_cColor->Enable( false ); m_cStyle->Enable( false ); m_cWidth->Enable( false ); m_sdbBtmBtnsSizerExtend->Enable( false ); m_sdbBtmBtnsSizerSplit->Enable( false ); SetTitle( wxString::Format( _("Track Properties, Layer: %d"), m_pRoute->m_LayerID ) ); } else { m_tName->SetEditable( true ); m_tFrom->SetEditable( true ); m_tTo->SetEditable( true ); m_tDescription->SetEditable( true ); m_cbShow->Enable( true ); m_cColor->Enable( true ); m_cStyle->Enable( true ); m_cWidth->Enable( true ); m_sdbBtmBtnsSizerExtend->Enable( IsThisTrackExtendable() ); //m_sdbBtmBtnsSizerSplit->Enable( false ); SetTitle( _("Track Properties") ); } ::wxEndBusyCursor(); return true; }
wxString OCPNTrackListCtrl::OnGetItemText( long item, long column ) const { wxString ret; if( item != g_prev_item ) { if( g_prev_point_index == ( item - 1 ) ) { if( !g_prev_point_node ) return wxEmptyString; g_prev_point = g_this_point; g_this_point_node = g_prev_point_node->GetNext(); if( g_this_point_node ) g_this_point = g_this_point_node->GetData(); else g_this_point = NULL; } else { wxRoutePointListNode *node = m_pRoute->pRoutePointList->GetFirst(); if( node ) { if( item > 0 ) { int i = 0; while( node && ( i < ( item - 1 ) ) ) { node = node->GetNext(); i++; } g_prev_point_node = node; if( ! node ) return wxEmptyString; g_prev_point = g_prev_point_node->GetData(); g_this_point_node = g_prev_point_node->GetNext(); if( g_this_point_node ) g_this_point = g_this_point_node->GetData(); else g_this_point = NULL; } else { g_prev_point_node = NULL; g_prev_point = NULL; g_this_point_node = node; if( g_this_point_node ) g_this_point = g_this_point_node->GetData(); else g_this_point = NULL; } } else { g_prev_point_node = NULL; g_prev_point = NULL; g_this_point_node = NULL; g_this_point = NULL; } } // Update for next time g_prev_point_node = g_this_point_node; g_prev_point_index = item; g_prev_item = item; } if( ! g_this_point ) return wxEmptyString; switch( column ) { case 0: if( item == 0 ) ret = _T("---"); else ret.Printf( _T("%ld"), item ); break; case 1: double slat, slon; if( item == 0 ) { slat = gLat; slon = gLon; } else { slat = g_prev_point->m_lat; slon = g_prev_point->m_lon; } DistanceBearingMercator( g_this_point->m_lat, g_this_point->m_lon, slat, slon, >_brg, >_leg_dist ); ret.Printf( _T("%6.2f ") + getUsrDistanceUnit(), toUsrDistance( gt_leg_dist ) ); break; case 2: ret.Printf( _T("%03.0f \u00B0T"), gt_brg ); break; case 3: ret = toSDMM( 1, g_this_point->m_lat, 1 ); break; case 4: ret = toSDMM( 2, g_this_point->m_lon, 1 ); break; case 5: { wxDateTime timestamp = g_this_point->GetCreateTime(); if( timestamp.IsValid() ) ret = timestamp2s( timestamp, m_tz_selection, m_LMT_Offset, TIMESTAMP_FORMAT ); else ret = _T("----"); } break; case 6: if( ( item > 0 ) && g_this_point->GetCreateTime().IsValid() && g_prev_point->GetCreateTime().IsValid() ) { double speed = 0.; double seconds = g_this_point->GetCreateTime().Subtract( g_prev_point->GetCreateTime() ).GetSeconds().ToDouble(); if( seconds > 0. ) speed = gt_leg_dist / seconds * 3600; ret.Printf( _T("%5.2f"), toUsrSpeed( speed ) ); } else ret = _("--"); break; default: break; } return ret; }