File indexing completed on 2024-04-28 03:50:24

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2012 Rene Kuettner <rene@bitkanal.net>
0004 //
0005 
0006 
0007 #include "SatellitesMSCItem.h"
0008 
0009 #include <QFile>
0010 #include <QColor>
0011 
0012 #include "MarbleClock.h"
0013 #include "MarbleDebug.h"
0014 #include "MarbleGlobal.h"
0015 #include "GeoPainter.h"
0016 #include "GeoDataCoordinates.h"
0017 #include "GeoDataPlacemark.h"
0018 #include "GeoDataStyle.h"
0019 #include "GeoDataTrack.h"
0020 #include "GeoDataPoint.h"
0021 
0022 namespace Marble {
0023 
0024 SatellitesMSCItem::SatellitesMSCItem( const QString &name, 
0025                                       const QString &category,
0026                                       const QString &relatedBody,
0027                                       const QString &catalog,
0028                                       const QDateTime &missionStart,
0029                                       const QDateTime &missionEnd,
0030                                       int catalogIndex,
0031                                       PlanetarySats *planSat,
0032                                       const MarbleClock *clock )
0033     : TrackerPluginItem( name ),
0034       m_track( new GeoDataTrack() ),
0035       m_clock( clock ),
0036       m_planSat( planSat ),
0037       m_category( category ),
0038       m_relatedBody( relatedBody ),
0039       m_catalog( catalog ),
0040       m_catalogIndex( catalogIndex ),
0041       m_missionStart( missionStart ),
0042       m_missionEnd( missionEnd )
0043 {
0044     placemark()->setVisualCategory(GeoDataPlacemark::Satellite);
0045     placemark()->setZoomLevel( 0 );
0046     placemark()->setGeometry( m_track );
0047 
0048     m_planSat->getKeplerElements(
0049         m_perc, m_apoc, m_inc, m_ecc, m_ra, m_tano, m_m0, m_a, m_n0 );
0050 
0051     m_period = 86400. / m_n0;
0052     m_step_secs = m_period / 500;
0053 
0054     setDescription();
0055     update();
0056 }
0057 
0058 SatellitesMSCItem::~SatellitesMSCItem()
0059 {
0060     delete m_planSat;
0061 }
0062 
0063 QString SatellitesMSCItem::category() const
0064 {
0065     return m_category;
0066 }
0067 
0068 QString SatellitesMSCItem::relatedBody() const
0069 {
0070     return m_relatedBody;
0071 }
0072 
0073 QString SatellitesMSCItem::catalog() const
0074 {
0075     return m_catalog;
0076 }
0077 
0078 int SatellitesMSCItem::catalogIndex() const
0079 {
0080     return m_catalogIndex;
0081 }
0082 
0083 QString SatellitesMSCItem::id() const
0084 {
0085     return QString( "%1:%2" ).arg( catalog() ).arg( catalogIndex() );
0086 }
0087 
0088 const QDateTime& SatellitesMSCItem::missionStart() const
0089 {
0090     return m_missionStart;
0091 }
0092 
0093 const QDateTime& SatellitesMSCItem::missionEnd() const
0094 {
0095     return m_missionEnd;
0096 }
0097 
0098 void SatellitesMSCItem::setDescription()
0099 {
0100     /*QString description =
0101       QObject::tr( "Object name: %1 <br />"
0102                    "Category: %2 <br />"
0103                    "Pericentre: %3 km<br />"
0104                    "Apocentre: %4 km<br />"
0105                    "Inclination: %5 Degree<br />"
0106                    "Revolutions per day (24h): %6" )
0107         .arg( name(), category(), QString::number( m_perc, 'f', 2 ),
0108                                   QString::number( m_apoc, 'f', 2 ),
0109                                   QString::number( m_inc, 'f', 2 ),
0110                                   QString::number( m_n0, 'f', 2 ) );*/
0111 
0112     QFile templateFile(QStringLiteral(":/marble/satellites/satellite.html"));
0113     if (!templateFile.open(QIODevice::ReadOnly)) {
0114         placemark()->setDescription(QObject::tr("No info available."));
0115         return;
0116     }
0117     QString html = templateFile.readAll();
0118 
0119     html.replace("%name%", name());
0120     html.replace("%noradId%", QString::number(catalogIndex()));
0121     html.replace("%perigee%", QString::number(m_perc, 'f', 2));
0122     html.replace("%apogee%", QString::number(m_apoc, 'f', 2));
0123     html.replace("%inclination%", QString::number(m_inc, 'f', 2));
0124     html.replace("%period%", "?");
0125     html.replace("%semiMajorAxis%", "?");
0126 
0127     placemark()->setDescription( html );
0128 }
0129 
0130 void SatellitesMSCItem::update()
0131 {
0132     if( m_missionStart.isValid() ) {
0133         setVisible( ( m_clock->dateTime() > m_missionStart ) );
0134     }
0135 
0136     if( m_missionEnd.isValid() ) {
0137         setVisible( ( m_clock->dateTime() < m_missionEnd ) );
0138     }
0139 
0140     if( !isEnabled() || !isVisible() ) {
0141         return;
0142     }
0143 
0144     QDateTime t = m_clock->dateTime();
0145     QDateTime endTime = t;
0146     if( isTrackVisible() ) {
0147         t = t.addSecs( - m_period / 2. );
0148         endTime = t.addSecs( m_period );
0149 
0150         m_track->removeBefore( t );
0151         m_track->removeAfter( endTime );
0152 
0153         if( m_track->firstWhen().isValid() && m_track->firstWhen() < t) {
0154             t = m_track->firstWhen().addSecs( m_step_secs );
0155         }
0156 
0157         for(; t < endTime; t = t.addSecs(m_step_secs)) {
0158             addTrackPointAt( t );
0159         }
0160     } else {
0161         m_track->clear();
0162     }
0163 
0164     addTrackPointAt( m_clock->dateTime() );
0165 }
0166 
0167 void SatellitesMSCItem::addTrackPointAt( const QDateTime &dateTime )
0168 {
0169     double lng    = 0.;
0170     double lat    = 0.;
0171     double height = 0.;
0172 
0173     QDateTime dt = dateTime.toUTC();
0174     QDate date = dt.date();
0175     QTime time = dt.time();
0176 
0177     m_planSat->setMJD( date.year(), date.month(), date.day(),
0178                        time.hour(), time.minute(), time.second() );
0179     m_planSat->currentPos();
0180     m_planSat->getPlanetographic( lng, lat, height );
0181 
0182     m_track->addPoint( dateTime,
0183                        GeoDataCoordinates( lng, lat, height * 1000,
0184                                            GeoDataCoordinates::Degree) );
0185 }
0186 
0187 } // namespace Marble