added cron helper to calculate sun rise and set times
This commit is contained in:
parent
0a1ecb3273
commit
88e8bf1601
4 changed files with 74 additions and 4 deletions
2
debian/libfn.cron.d
vendored
Normal file
2
debian/libfn.cron.d
vendored
Normal 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)
|
|
@ -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
|
||||
|
|
|
@ -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
58
src/sun.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue