/*
* Provides the ability to calculate the local time for sunrise,
* sunset, and moonrise at any point in time at any location in the world
*
* Original work used with permission maintaining license
* Copyright (GPL) 2004 Mike Chirico mchirico@comcast.net
* Modifications copyright
* Copyright (GPL) 2015 Peter Buelow
*
* This file is part of the Sunset library
*
* Sunset 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.
*
* Sunset 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 Foobar. If not, see .
*/
#ifndef __SUNPOSITION_H__
#define __SUNPOSITION_H__
#include
#include
#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950288
#endif
/**
* \class SunSet
*
* This class controls all aspects of the operations. The math is done in private
* functions, and the public API's allow for returning a sunrise/sunset value for the
* given coordinates and timezone.
*
* The resulting calculations are relative to midnight of the day you set in the
* setCurrentDate() function. It does not return a time_t value for delta from the
* current epoch as that would not make sense as the sunrise/sunset can be calculated
* thousands of years in the past. The library acts on a day timeframe, and doesn't
* try to assume anything about any other unit of measurement other than the current
* set day.
*
* You can instantiate this class a few different ways, depending on your needs. It's possible
* to set your location one time and forget about doing that again if you don't plan to move.
* Then you only need to change the date and timezone to get correct data. Or, you can
* simply create an object with no location or time data and then do that later. This is
* a good mechanism for the setup()/loop() construct.
*
* The most important thing to remember is to make sure the library knows the exact date and
* timezone for the sunrise/sunset you are trying to calculate. Not doing so means you are going
* to have very odd results. It's reasonably easy to know when you've forgotten one or the other
* by looking at the time the sun would rise and noticing that it is X hours earlier or later.
* That is, if you get a return of 128 minutes (2:08 AM) past midnight when the sun should rise
* at 308 (6:08 AM), then you probably forgot to set your EST timezone.
*
* The library also has no idea about daylight savings time. If your timezone changes during the
* year to account for savings time, you must update your timezone accordingly.
*/
class SunSet {
public:
SunSet();
SunSet(double, double, int);
SunSet(double, double, double);
~SunSet();
static constexpr double SUNSET_OFFICIAL = 90.833; /**< Standard sun angle for sunset */
static constexpr double SUNSET_NAUTICAL = 102.0; /**< Nautical sun angle for sunset */
static constexpr double SUNSET_CIVIL = 96.0; /**< Civil sun angle for sunset */
static constexpr double SUNSET_ASTONOMICAL = 108.0; /**< Astronomical sun angle for sunset */
void setPosition(double, double, int);
void setPosition(double, double, double);
void setTZOffset(int);
void setTZOffset(double);
double setCurrentDate(int, int, int);
double calcNauticalSunrise() const;
double calcNauticalSunset() const;
double calcCivilSunrise() const;
double calcCivilSunset() const;
double calcAstronomicalSunrise() const;
double calcAstronomicalSunset() const;
double calcCustomSunrise(double) const;
double calcCustomSunset(double) const;
[[deprecated("UTC specific calls may not be supported in the future")]] double calcSunriseUTC();
[[deprecated("UTC specific calls may not be supported in the future")]] double calcSunsetUTC();
double calcSunrise() const;
double calcSunset() const;
int moonPhase(int) const;
int moonPhase() const;
private:
double degToRad(double) const;
double radToDeg(double) const;
double calcMeanObliquityOfEcliptic(double) const;
double calcGeomMeanLongSun(double) const;
double calcObliquityCorrection(double) const;
double calcEccentricityEarthOrbit(double) const;
double calcGeomMeanAnomalySun(double) const;
double calcEquationOfTime(double) const;
double calcTimeJulianCent(double) const;
double calcSunTrueLong(double) const;
double calcSunApparentLong(double) const;
double calcSunDeclination(double) const;
double calcHourAngleSunrise(double, double, double) const;
double calcHourAngleSunset(double, double, double) const;
double calcJD(int,int,int) const;
double calcJDFromJulianCent(double) const;
double calcSunEqOfCenter(double) const;
double calcAbsSunrise(double) const;
double calcAbsSunset(double) const;
double m_latitude;
double m_longitude;
double m_julianDate;
double m_tzOffset;
int m_year;
int m_month;
int m_day;
};
#endif