Separate functions to calculate sunrise and sunset
authorArjen Baart <arjen@andromeda.nl>
Fri, 3 Apr 2020 06:19:40 +0000 (08:19 +0200)
committerArjen Baart <arjen@andromeda.nl>
Fri, 3 Apr 2020 06:19:40 +0000 (08:19 +0200)
src/Makefile.am
src/sunrise.cpp
test/Makefile.am
test/sunrise_test.cpp [new file with mode: 0644]
test/sunrise_test.exp [new file with mode: 0644]

index 702824d..ebf5eb9 100644 (file)
@@ -1,4 +1,4 @@
-bin_PROGRAMS = wakeup pwm curtain lightcontrol sunrise read_serial
+bin_PROGRAMS = wakeup pwm curtain lightcontrol read_serial
 
 wakeup_SOURCES = wakeup.cpp event.cpp
 pwm_SOURCES = pwm.c
index bfd4346..65b943f 100644 (file)
@@ -4,50 +4,69 @@
 #include <date.h>
 #include <iostream>
 
-int main()
+// Calculate the time of sunrise in timezone UTC.
+
+hour calculate_sunrise(double latitude, double longitude, date when)
 {
-   // Hardinxveld:
-   double latitude = 51.821366;
-   double longitude = 4.844401;
-   double labda_y = latitude * M_PI / 180.0;
+   float Declanation;
+   float solaroffset;
+   float h0;
 
-   hour utctime = now(false);
-   hour localtime = now(true);
+   hour midday(12, 0, 0);
+
+   double labda_y = latitude * M_PI / 180.0;
 
    // Declanation of the sun  as determined by the tilt of the earth's axis.
-   float Declanation;
 
-   Declanation = -23.44 * cos(2 * M_PI * (today(false).YearDay() + 10) / 365);
-   //delta_s = math.radians (Declanation)
-   std::cout << "Solar declanation: " << Declanation << "\n";
+   Declanation = -23.44 * cos(2 * M_PI * (when.YearDay() + 10) / 365);
 
    // The earth rotates 15 degrees in 1 hour
 
-   float solaroffset;
    solaroffset = longitude / 15.0 * 3600;   // In seconds
 
-   std::cout << "Solar offset = " << solaroffset << " seconds.\n";
-
-   float h0;
-
    h0 = acos ( (-1 * tan (labda_y) * tan (Declanation * M_PI / 180.0)));
 
-   std::cout << " h0 = " << h0 << " h0 hours = " << h0 * 12 / M_PI << "\n";
-
    long sunseconds = h0 * 12.0 / M_PI * 3600;
    hour  sunhours(sunseconds / 3600, (sunseconds / 60) % 60, sunseconds % 60);
 
-   // Calculate the times of sunrise and sunset
+   // Calculate the time of sunrise
+
+   hour sunrise = midday - sunseconds;
+   sunrise = sunrise - hour(long(solaroffset));
+   return sunrise;
+
+}
+
+// Calculate the time of sunset in timezone UTC.
+
+hour calculate_sunset(double latitude, double longitude, date when)
+{
+   float Declanation;
+   float solaroffset;
+   float h0;
 
    hour midday(12, 0, 0);
 
-   hour sunrise = midday - sunseconds;
-   sunrise = sunrise - hour(long(solaroffset)) + (localtime - utctime);
-   std::cout << "Sunrise at " << sunrise << "\n";
+   double labda_y = latitude * M_PI / 180.0;
+
+   // Declanation of the sun  as determined by the tilt of the earth's axis.
+
+   Declanation = -23.44 * cos(2 * M_PI * (when.YearDay() + 10) / 365);
+
+   // The earth rotates 15 degrees in 1 hour
+
+   solaroffset = longitude / 15.0 * 3600;   // In seconds
+
+   h0 = acos ( (-1 * tan (labda_y) * tan (Declanation * M_PI / 180.0)));
+
+   long sunseconds = h0 * 12.0 / M_PI * 3600;
+   hour  sunhours(sunseconds / 3600, (sunseconds / 60) % 60, sunseconds % 60);
+
+   // Calculate the time of sunset
 
    hour sunset = midday + sunseconds;
-   sunset = sunset - hour(long(solaroffset)) + (localtime - utctime);
-   std::cout << "Sunset at " << sunset << "\n";
+   sunset = sunset - hour(long(solaroffset));
+   return sunset;
 
 }
 
index f1a54f3..e1a2aa4 100644 (file)
@@ -2,6 +2,7 @@ TESTS = lightctrl lightctrl-oor lightctrl-fade $(check_PROGRAMS) check_output
 
 AM_CPPFLAGS = -I../src
 LDADD = -lTachyon -lACL
-check_PROGRAMS = wakeup_load_events 
+check_PROGRAMS = wakeup_load_events sunrise_test
 
 wakeup_load_events_SOURCES = wakeup_load_events.cpp ../src/event.cpp
+sunrise_test_SOURCES = sunrise_test.cpp ../src/sunrise.cpp
diff --git a/test/sunrise_test.cpp b/test/sunrise_test.cpp
new file mode 100644 (file)
index 0000000..5f00e82
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *  test sunrise and sunset functions.
+ */
+
+#include <date.h>
+
+#include <assert.h>
+
+// Hardinxveld:
+const double latitude = 51.821366;
+const double longitude = 4.844401;
+
+extern hour calculate_sunrise(double latitude, double longtitude, date when);
+extern hour calculate_sunset(double latitude, double longtitude, date when);
+
+int main()
+{
+   date   when;
+   hour   sunrise_at, sunset_at;
+
+   when = date(1, 1, 2020);
+
+   std::cout << "On the date " << when << ":\n";
+   sunrise_at = calculate_sunrise(latitude, longitude, when);
+   std::cout << "Sunrise : " << sunrise_at << " UTC.\n";
+   sunset_at  = calculate_sunset(latitude, longitude, when);
+   std::cout << "Sunset : " << sunset_at << " UTC.\n";
+   assert(sunrise_at == hour(7, 51, 29));
+   assert(sunset_at  == hour(15, 29, 47));
+
+   when = date(30, 6, 2020);
+
+   std::cout << "On the date " << when << ":\n";
+   sunrise_at = calculate_sunrise(latitude, longitude, when);
+   std::cout << "Sunrise : " << sunrise_at << " UTC.\n";
+   sunset_at  = calculate_sunset(latitude, longitude, when);
+   std::cout << "Sunset : " << sunset_at << " UTC.\n";
+   assert(sunrise_at == hour(3, 29, 3));
+   assert(sunset_at  == hour(19, 52, 13));
+}
diff --git a/test/sunrise_test.exp b/test/sunrise_test.exp
new file mode 100644 (file)
index 0000000..410989f
--- /dev/null
@@ -0,0 +1,7 @@
+On the date 01-01-2020:
+Sunrise : 07:51:29 UTC.
+Sunset : 15:29:47 UTC.
+On the date 30-06-2020:
+Sunrise : 03:29:03 UTC.
+Sunset : 19:52:13 UTC.
+PASS sunrise_test (exit status: 0)