added cron helper to calculate sun rise and set times

This commit is contained in:
Steffen Vogel 2012-03-14 09:18:35 +00:00
parent 0a1ecb3273
commit 88e8bf1601
4 changed files with 74 additions and 4 deletions

2
debian/libfn.cron.d vendored Normal file
View File

@ -0,0 +1,2 @@
0 0 * * * echo 'fnctl stop && fnctl fade -c 000000' | at $(sun rise 55 -6 1)
0 0 * * * echo 'fnctl start' | at $(sun set 55 -6 1)

View File

@ -1,7 +1,7 @@
AM_CFLAGS= -Wall $(FNVUM_DEPS_CFLAGS) $(FNPOM_DEPS_CFLAGS)
AM_LDFLAGS=
bin_PROGRAMS = fnctl fnvum fnpom fnweb
bin_PROGRAMS = fnctl fnvum fnpom fnweb sun
lib_LTLIBRARIES = libfn.la
include_HEADERS = libfn.h
@ -18,3 +18,5 @@ fnvum_LDADD = -lfn $(FNVUM_DEPS_LIBS)
fnweb_SOURCES = fnweb.c
fnweb_LDADD = -lfn $(FNWEB_DEPS_LIBS)
sun_SOURCES = sun.c

View File

@ -37,7 +37,7 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
bin_PROGRAMS = fnctl$(EXEEXT) fnvum$(EXEEXT) fnpom$(EXEEXT) \
fnweb$(EXEEXT)
fnweb$(EXEEXT) sun$(EXEEXT)
subdir = src
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in
@ -90,6 +90,9 @@ fnvum_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_fnweb_OBJECTS = fnweb.$(OBJEXT)
fnweb_OBJECTS = $(am_fnweb_OBJECTS)
fnweb_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_sun_OBJECTS = sun.$(OBJEXT)
sun_OBJECTS = $(am_sun_OBJECTS)
sun_LDADD = $(LDADD)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@ -104,9 +107,9 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(libfn_la_SOURCES) $(fnctl_SOURCES) $(fnpom_SOURCES) \
$(fnvum_SOURCES) $(fnweb_SOURCES)
$(fnvum_SOURCES) $(fnweb_SOURCES) $(sun_SOURCES)
DIST_SOURCES = $(libfn_la_SOURCES) $(fnctl_SOURCES) $(fnpom_SOURCES) \
$(fnvum_SOURCES) $(fnweb_SOURCES)
$(fnvum_SOURCES) $(fnweb_SOURCES) $(sun_SOURCES)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
@ -244,6 +247,7 @@ fnvum_SOURCES = fnvum.c
fnvum_LDADD = -lfn $(FNVUM_DEPS_LIBS)
fnweb_SOURCES = fnweb.c
fnweb_LDADD = -lfn $(FNWEB_DEPS_LIBS)
sun_SOURCES = sun.c
all: all-am
.SUFFIXES:
@ -366,6 +370,9 @@ fnvum$(EXEEXT): $(fnvum_OBJECTS) $(fnvum_DEPENDENCIES)
fnweb$(EXEEXT): $(fnweb_OBJECTS) $(fnweb_DEPENDENCIES)
@rm -f fnweb$(EXEEXT)
$(LINK) $(fnweb_OBJECTS) $(fnweb_LDADD) $(LIBS)
sun$(EXEEXT): $(sun_OBJECTS) $(sun_DEPENDENCIES)
@rm -f sun$(EXEEXT)
$(LINK) $(sun_OBJECTS) $(sun_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@ -378,6 +385,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnvum.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnweb.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfn.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sun.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<

58
src/sun.c Normal file
View File

@ -0,0 +1,58 @@
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
double deg2rad(double deg) {
return M_PI * deg / 180.0;
}
enum sun { RISE, SET };
double sun(enum sun mode, double lat, double lon, int timezone) {
const double h = -0.0145;
const double g = 0.2618;
time_t t = time(NULL);
struct tm *now = localtime(&t);
int days = now->tm_yday;
/* Zeitgleichung */
double zgl = -0.171 * sin(0.0337 * days + 0.465) - 0.1299 * sin(0.01787 * days - 0.168) ;
/* Deklination der Sonne */
double dekl = 0.4095 * sin(0.016906 * (days - 80.086));
/* Zeitdifferenz */
double zd = 12 * acos((sin(h) - sin(lat) * sin(dekl)) / (cos(lat) * cos(dekl))) / M_PI;
switch (mode) {
case SET: return 12 + zd - zgl + lon/g + timezone;
case RISE: return 12 - zd - zgl + lon/g + timezone;
default: return 0;
}
}
int main(int argc, char *argv[]) {
enum sun mode;
if (argc < 5) goto usage;
if (strcmp(argv[1], "rise") == 0) mode = RISE;
else if (strcmp(argv[1], "set") == 0) mode = SET;
else goto usage;
int timezone = atoi(argv[4]);
double lat = deg2rad(strtod(argv[2], NULL));
double lon = deg2rad(strtod(argv[3], NULL));
double time = sun(mode, lat, lon, timezone);
double intpart;
printf("%d:%02d\n", (int) floor(time), (int) (modf(time, &intpart)*60));
return 0;
usage:
fprintf(stderr, "usage: sun (rise|set) LAT LON TIMEZONE\n");
return -1;
}