/*
* Equation Of Time plug-in for Stellarium
*
* Copyright (C) 2014 Alexander Wolf
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "StelProjector.hpp"
#include "StelPainter.hpp"
#include "StelApp.hpp"
#include "StelCore.hpp"
#include "SkyGui.hpp"
#include "StelLocaleMgr.hpp"
#include "StelModuleMgr.hpp"
#include "StelFileMgr.hpp"
#include "StelGui.hpp"
#include "StelGuiItems.hpp"
#include "StelObjectMgr.hpp"
#include "StelUtils.hpp"
#include "Planet.hpp"
#include "EquationOfTime.hpp"
#include "EquationOfTimeWindow.hpp"
#include "sidereal_time.h"
#include
#include
#include
#include
StelModule* EquationOfTimeStelPluginInterface::getStelModule() const
{
return new EquationOfTime();
}
StelPluginInfo EquationOfTimeStelPluginInterface::getPluginInfo() const
{
// Allow to load the resources when used as a static plugin
Q_INIT_RESOURCE(EquationOfTime);
StelPluginInfo info;
info.id = "EquationOfTime";
info.displayedName = N_("Equation of Time");
info.authors = "Alexander Wolf";
info.contact = "http://stellarium.org";
info.description = N_("This plugin shows the solution of the equation of time.");
info.version = EQUATIONOFTIME_PLUGIN_VERSION;
return info;
}
EquationOfTime::EquationOfTime()
: flagShowSolutionEquationOfTime(false)
, flagUseInvertedValue(false)
, flagUseMsFormat(false)
, flagEnableAtStartup(false)
, flagShowEOTButton(false)
, fontSize(20)
, toolbarButton(NULL)
{
setObjectName("EquationOfTime");
mainWindow = new EquationOfTimeWindow();
StelApp &app = StelApp::getInstance();
conf = app.getSettings();
gui = dynamic_cast(app.getGui());
}
EquationOfTime::~EquationOfTime()
{
delete mainWindow;
}
void EquationOfTime::init()
{
StelApp &app = StelApp::getInstance();
if (!conf->childGroups().contains("EquationOfTime"))
{
qDebug() << "EquationOfTime: no EquationOfTime section exists in main config file - creating with defaults";
restoreDefaultConfigIni();
}
// populate settings from main config file.
readSettingsFromConfig();
addAction("actionShow_EquationOfTime", N_("Equation of Time"), N_("Show solution for Equation of Time"), "showEOT", "Ctrl+Alt+T");
enableEquationOfTime(getFlagEnableAtStartup());
setFlagShowEOTButton(flagShowEOTButton);
// Initialize the message strings and make sure they are translated when
// the language changes.
updateMessageText();
connect(&app, SIGNAL(languageChanged()), this, SLOT(updateMessageText()));
}
void EquationOfTime::deinit()
{
//
}
void EquationOfTime::draw(StelCore *core)
{
if (!isEnabled())
return;
StelPainter sPainter(core->getProjection2d());
sPainter.setColor(textColor[0], textColor[1], textColor[2], 1.f);
font.setPixelSize(getFontSize());
sPainter.setFont(font);
QString timeText;
double time = getSolutionEquationOfTime(core->getJDay());
if (getFlagInvertedValue())
time *= -1;
if (getFlagMsFormat())
{
double seconds = std::abs(round((time - (int)time)*60));
QString messageSecondsValue;
if (seconds<10.)
messageSecondsValue = QString("0%1").arg(QString::number(seconds, 'f', 0));
else
messageSecondsValue = QString("%1").arg(QString::number(seconds, 'f', 0));
timeText = QString("%1: %2%3%4%5").arg(messageEquation, QString::number((int)time), messageEquationMinutes, messageSecondsValue, messageEquationSeconds);
}
else
timeText = QString("%1: %2%3").arg(messageEquation, QString::number(time, 'f', 2), messageEquationMinutes);
QFontMetrics fm(font);
QSize fs = fm.size(Qt::TextSingleLine, timeText);
if (core->getCurrentPlanet().data()->getEnglishName()=="Earth")
sPainter.drawText(gui->getSkyGui()->getSkyGuiWidth()/2 - fs.width()/2, gui->getSkyGui()->getSkyGuiHeight() - fs.height()*1.5, timeText);
//qDebug() << timeText;
}
double EquationOfTime::getCallOrder(StelModuleActionName actionName) const
{
if (actionName==StelModule::ActionDraw)
return StelApp::getInstance().getModuleMgr().getModule("LandscapeMgr")->getCallOrder(actionName)+10.;
return 0;
}
bool EquationOfTime::configureGui(bool show)
{
if (show)
{
mainWindow->setVisible(true);
}
return true;
}
void EquationOfTime::restoreDefaults(void)
{
restoreDefaultConfigIni();
readSettingsFromConfig();
}
void EquationOfTime::restoreDefaultConfigIni(void)
{
conf->beginGroup("EquationOfTime");
// delete all existing Equation Of Time settings...
conf->remove("");
conf->setValue("enable_at_startup", false);
conf->setValue("flag_use_ms_format", true);
conf->setValue("flag_use_inverted_value", false);
conf->setValue("flag_show_button", true);
conf->setValue("text_color", "0,0.5,1");
conf->setValue("font_size", 20);
conf->endGroup();
}
void EquationOfTime::readSettingsFromConfig(void)
{
conf->beginGroup("EquationOfTime");
setFlagEnableAtStartup(conf->value("enable_at_startup", false).toBool());
setFlagMsFormat(conf->value("flag_use_ms_format", true).toBool());
setFlagInvertedValue(conf->value("flag_use_inverted_value", false).toBool());
textColor = StelUtils::strToVec3f(conf->value("text_color", "0,0.5,1").toString());
setFontSize(conf->value("font_size", 20).toInt());
flagShowEOTButton = conf->value("flag_show_button", true).toBool();
conf->endGroup();
}
void EquationOfTime::saveSettingsToConfig(void)
{
conf->beginGroup("EquationOfTime");
conf->setValue("enable_at_startup", getFlagEnableAtStartup());
conf->setValue("flag_use_ms_format", getFlagMsFormat());
conf->setValue("flag_use_inverted_value", getFlagInvertedValue());
conf->setValue("flag_show_button", getFlagShowEOTButton());
//conf->setValue("text_color", "0,0.5,1");
conf->setValue("font_size", getFontSize());
conf->endGroup();
}
double EquationOfTime::getSolutionEquationOfTime(const double JDay) const
{
StelCore* core = StelApp::getInstance().getCore();
double tau = (JDay - 2451545.0)/365250.0;
double sunMeanLongitude = 280.4664567 + tau*(360007.6892779 + tau*(0.03032028 + tau*(1/49931 - tau*(1/15300 - tau/2000000))));
// reduce the angle
sunMeanLongitude = std::fmod(sunMeanLongitude, 360.);
// force it to be the positive remainder, so that 0 <= angle < 360
sunMeanLongitude = std::fmod(sunMeanLongitude + 360., 360.);
Vec3d pos = GETSTELMODULE(StelObjectMgr)->searchByName("Sun")->getEquinoxEquatorialPos(core);
double ra, dec;
StelUtils::rectToSphe(&ra, &dec, pos);
// covert radians to degrees and reduce the angle
double alpha = std::fmod(ra*180./M_PI, 360.);
// force it to be the positive remainder, so that 0 <= angle < 360
alpha = std::fmod(alpha + 360., 360.);
double equation = 4*(sunMeanLongitude - 0.0057183 - alpha + get_nutation_longitude(JDay)*cos(get_mean_ecliptical_obliquity(JDay)));
// The equation of time is always smaller 20 minutes in absolute value
if (std::abs(equation)>20)
{
// If absolute value of the equation of time appears to be too large, add 24 hours (1440 minutes) to or subtract it from our result
if (equation>0.)
equation -= 1440.;
else
equation += 1440.;
}
return equation;
}
void EquationOfTime::updateMessageText()
{
messageEquation = q_("Equation of Time");
// TRANSLATORS: minutes.
messageEquationMinutes = qc_("m", "time");
// TRANSLATORS: seconds.
messageEquationSeconds = qc_("s", "time");
}
void EquationOfTime::setFlagShowEOTButton(bool b)
{
if (b==true) {
if (toolbarButton==NULL) {
// Create the button
toolbarButton = new StelButton(NULL,
QPixmap(":/EquationOfTime/bt_EquationOfTime_On.png"),
QPixmap(":/EquationOfTime/bt_EquationOfTime_Off.png"),
QPixmap(":/graphicGui/glow32x32.png"),
"actionShow_EquationOfTime");
}
gui->getButtonBar()->addButton(toolbarButton, "065-pluginsGroup");
} else {
gui->getButtonBar()->hideButton("actionShow_EquationOfTime");
}
flagShowEOTButton = b;
}
void EquationOfTime::enableEquationOfTime(bool b)
{
flagShowSolutionEquationOfTime = b;
}
void EquationOfTime::setFlagInvertedValue(bool b)
{
flagUseInvertedValue=b;
}
void EquationOfTime::setFlagMsFormat(bool b)
{
flagUseMsFormat=b;
}
//! Enable plugin usage at startup
void EquationOfTime::setFlagEnableAtStartup(bool b)
{
flagEnableAtStartup=b;
}
//! Set font size for message
void EquationOfTime::setFontSize(int size)
{
fontSize=size;
}