void sun_times_init(void) { struct tm *tm = &pikrellcam.tm_local; int n, year, month, mday; if ( sscanf(pikrellcam.latitude, "%lf", &sun.latitude) == 1 && sscanf(pikrellcam.longitude, "%lf", &sun.longitude) == 1 ) { n = strlen(pikrellcam.latitude); if (pikrellcam.latitude[n - 1] == 'S' || pikrellcam.latitude[n - 1] == 's') sun.latitude = -sun.latitude; n = strlen(pikrellcam.longitude); if (pikrellcam.longitude[n - 1] == 'W' || pikrellcam.longitude[n - 1] == 'w') sun.longitude = -sun.longitude; year = tm->tm_year + 1900; month = tm->tm_mon + 1; mday = tm->tm_mday + 1; sun.sun_valid = sun_rise_set(year, month, mday, sun.longitude, sun.latitude, &sun.d_sunrise, &sun.d_sunset); sun.civil_valid = civil_twilight(year, month, mday, sun.longitude, sun.latitude, &sun.d_dawn, &sun.d_dusk); sun.nautical_valid = nautical_twilight(year, month, mday, sun.longitude, sun.latitude, &sun.d_nautical_dawn, &sun.d_nautical_dusk); sun.d_sunrise = TMOD(sun.d_sunrise + tm->tm_gmtoff / 3600); sun.sunrise = sun.d_sunrise * 60; sun.d_sunset = TMOD(sun.d_sunset + tm->tm_gmtoff / 3600); sun.sunset = sun.d_sunset * 60; sun.d_dawn = TMOD(sun.d_dawn + tm->tm_gmtoff / 3600); sun.dawn = sun.d_dawn * 60; sun.d_dusk = TMOD(sun.d_dusk + tm->tm_gmtoff / 3600); sun.dusk = sun.d_dusk * 60; sun.d_nautical_dawn = TMOD(sun.d_nautical_dawn + tm->tm_gmtoff / 3600); sun.nautical_dawn = sun.d_nautical_dawn * 60; sun.d_nautical_dusk = TMOD(sun.d_nautical_dusk + tm->tm_gmtoff / 3600); sun.nautical_dusk = sun.d_nautical_dusk * 60; log_printf_no_timestamp("sunrise/sunset times: %s dawn/dusk times: %s\n", sun.sun_valid ? "invalid" : "valid", sun.civil_valid ? "invalid" : "valid"); log_printf_no_timestamp(" dawn: %d:%02d\n", sun.dawn / 60, sun.dawn % 60); log_printf_no_timestamp(" sunrise: %d:%02d\n", sun.sunrise / 60, sun.sunrise % 60); log_printf_no_timestamp(" sunset: %d:%02d\n", sun.sunset / 60, sun.sunset % 60); log_printf_no_timestamp(" dusk: %d:%02d\n", sun.dusk / 60, sun.dusk % 60); } }
int main(int argc, char *argv[]) { int i, j; int year,month,day; double lon = -77.06945; double lat = 38.794433; int coords_set = 0; double temp; int local = 1; int hemisphere; int mode = MODE_USAGE; int offset_hour = 0; int offset_min = 0; int offset_sec = 0; int verbose = 0; time_t tt; struct tm *tm; tt = time(NULL); ctime(&tt); tm = localtime(&tt); year = 1900 + tm->tm_year; month = 1+ tm->tm_mon; day = 1+ tm->tm_mday; timezone_name = tm->tm_zone; timezone_offset = tm->tm_gmtoff; for (i=1; i< argc; i++) { if (!strcmp("-V", argv[i])) { printf("sunwait version 0.1\n"); exit(0); } if (!strcmp("-z", argv[i])) { local = 0; } if (!strcmp("-h", argv[i])) { print_usage(); exit(0); } if (!strcmp("-v", argv[i])) { verbose++; } if (!strcmp("-p", argv[i])) { mode = MODE_PRINT; } if (!strcmp("-y", argv[i])) { i++; year = atoi(argv[i]); } if (!strcmp("-m", argv[i])) { i++; month = atoi(argv[i]); } if (!strcmp("-d", argv[i])) { i++; day = 1 + atoi(argv[i]); } if (2 == sscanf(argv[i], "%lf%1[Nn]", &temp, &hemisphere)) { lat = temp; coords_set |= LAT_SET; } if (2 == sscanf(argv[i], "%lf%1[Ss]", &temp, &hemisphere)) { lat = -temp; coords_set |= LAT_SET; } if (2 == sscanf(argv[i], "%lf%1[Ww]", &temp, &hemisphere)) { lon = -temp; coords_set |= LON_SET; } /* this looks different from the others because 77E parses as scientific notation */ if (1 == sscanf(argv[i], "%lf%", &temp, &hemisphere) && (argv[i][strlen(argv[i])-1] == 'E' || argv[i][strlen(argv[i])-1] == 'e')) { lon = temp; coords_set |= LON_SET; } for (j=0; options[j].label; j++) { if (strstr(argv[i], options[j].label)) { mode = (mode &~ options[j].mask) | options[j].value; } } if (('+' == argv[i][0] || '-' == argv[i][0]) && ('0' <= argv[i][1] && '9' >= argv[i][1])) { /* perl would be nice here */ char* temp; temp = 1+argv[i]; offset_min = strtol(temp, &temp, 10); if (':' == *temp) { offset_hour = offset_min; offset_min = strtol(temp+1, &temp, 10); } if (':' == *temp) { offset_sec = strtol(temp+1, &temp, 10); } if ('-' == argv[i][0]) { offset_hour *= -1; offset_min *= -1; offset_sec *= -1; } } } if (coords_set != (LAT_SET | LON_SET)) { fprintf(stderr, "warning: latitude or longitude not set\n\tdefault coords of Alexandria, Virgina, USA used\n"); } if ((mode & MODE_MASK) && (mode & EVENT_MASK)) { int sit; double up, down, now, interval, offset; switch (mode & MODE_MASK) { case MODE_USAGE: print_usage(); exit(0); break; case MODE_SUN: sit = sun_rise_set ( year, month, day, lon, lat, &up, &down ); break; case MODE_CIVIL: sit = civil_twilight ( year, month, day, lon, lat, &up, &down ); break; case MODE_NAUT: sit = nautical_twilight ( year, month, day, lon, lat, &up, &down ); break; case MODE_ASTR: sit = astronomical_twilight( year, month, day, lon, lat, &up, &down ); break; } if (0 != sit) { fprintf(stderr, "Event does not occur today\n"); exit(1); } up = TMOD(up+timezone_offset/3600); down = TMOD(down+timezone_offset/3600); now = tm->tm_hour/1.0 + tm->tm_min/60.0 + tm->tm_sec/3600.0; offset = offset_hour/1.0 + offset_min/60.0 + offset_sec/3600.0; if (EVENT_RISE == (mode & EVENT_MASK)) { printf("%2.2d:%2.2d\n", HOURS(up+offset), MINUTES(up+offset)); } else if (EVENT_SET == (mode & EVENT_MASK)){ printf("%2.2d:%2.2d\n", HOURS(down+offset), MINUTES(down+offset)); } else { /* mode is EVENT_STATE */ if(now>up && now<down) { printf("up\n"); } else { printf("down\n"); } } if (0 > interval) { if (0 < verbose) { fprintf(stderr, "Warning: event already passed for today, waiting till tomorrow.\n"); } } if (1 < verbose) { fprintf(stderr, "Up %f\n", up); fprintf(stderr, "Down %f\n", down); fprintf(stderr, "Now %f\n", now); fprintf(stderr, "Offset %f\n", offset); } } if (MODE_PRINT == (MODE_MASK & mode)) print_everything(year, month, day, lat, lon, tm, local); if (MODE_USAGE == (MODE_MASK & mode)) print_usage(); exit(0); }
main() { int year,month,day; double lon, lat; double daylen, civlen, nautlen, astrlen; double rise, set, civ_start, civ_end, naut_start, naut_end, astr_start, astr_end; double daylen_int,daylen_frac; /* CWR */ int rs, civ, naut, astr; int daylen_hours,daylen_min, gmtoff_hr; /* cwr */ double rise_int,rise_frac,set_int,set_frac; int rise_hours,rise_min,set_hours,set_min; time_t the_time; /* only need so can get time zone of local machine... */ struct tm *mylocal_time; char buf[80]; /* get time and offset from GMT */ time(&the_time); mylocal_time = localtime(&the_time); gmtoff_hr = mylocal_time->tm_gmtoff/3600; printf("Enter longitude and latitude in decimal degrees, i.e. -97.75 30.23\n"); printf("Hint: divide minutes by 60 to get decimal portion\n"); printf( "Longitude (+ is east) and latitude (+ is north) : " ); fgets(buf, 80, stdin); sscanf(buf, "%lf %lf", &lon, &lat ); for(;;) { printf( "Input date ( yyyy mm dd ) (ctrl-C exits): " ); fgets(buf, 80, stdin); sscanf(buf, "%d %d %d", &year, &month, &day ); daylen = day_length(year,month,day,lon,lat); civlen = day_civil_twilight_length(year,month,day,lon,lat); nautlen = day_nautical_twilight_length(year,month,day,lon,lat); astrlen = day_astronomical_twilight_length(year,month,day, lon,lat); daylen_frac = modf(daylen,&daylen_int); /* daylen into int and fraction */ daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( "Day length: %5.2f hours", daylen ); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); daylen_frac = modf(civlen,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( "With civil twilight %5.2f hours", civlen ); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); daylen_frac = modf(nautlen,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( "With nautical twilight %5.2f hours", nautlen ); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); daylen_frac = modf(astrlen,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( "With astronomical twilight %5.2f hours", astrlen ); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); daylen_frac = modf((civlen-daylen)/2.0,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( "Length of twilight: civil %5.2f hours", (civlen-daylen)/2.0); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); daylen_frac = modf((nautlen-daylen)/2.0,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( " nautical %5.2f hours", (nautlen-daylen)/2.0); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); daylen_frac = modf((astrlen-daylen)/2.0,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( " astronomical %5.2f hours", (astrlen-daylen)/2.0); printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min ); rs = sun_rise_set ( year, month, day, lon, lat, &rise, &set ); civ = civil_twilight ( year, month, day, lon, lat, &civ_start, &civ_end ); naut = nautical_twilight ( year, month, day, lon, lat, &naut_start, &naut_end ); astr = astronomical_twilight( year, month, day, lon, lat, &astr_start, &astr_end ); daylen_frac = modf(((rise+set)/2.0)+gmtoff_hr ,&daylen_int); daylen_hours = (int)daylen_int; daylen_min = (int)(daylen_frac * 60); printf( "Sun at south %5.2fh UT,%20d:%02d local\n", (rise+set)/2.0,daylen_hours,daylen_min); switch( rs ) { case 0: /* add minutes and local. CWR*/ rise_frac = modf(rise+gmtoff_hr ,&rise_int); rise_hours = (int)rise_int; rise_min = (int)(rise_frac * 60); set_frac = modf(set+gmtoff_hr ,&set_int); set_hours = (int)set_int; set_min = (int)(set_frac * 60); printf( "Sun rises %5.2fh UT, sets %5.2fh UT;\n rises %02d:%02d, sets %02d:%02d local\n", rise, set, rise_hours,rise_min,set_hours,set_min); break; case +1: printf( "Sun above horizon\n" ); break; case -1: printf( "Sun below horizon\n" ); break; } switch( civ ) { case 0: rise_frac = modf(civ_start+gmtoff_hr ,&rise_int); rise_hours = (int)rise_int; rise_min = (int)(rise_frac * 60); set_frac = modf(civ_end+gmtoff_hr ,&set_int); set_hours = (int)set_int; set_min = (int)(set_frac * 60); printf( "Civil twilight starts %5.2fh, " "ends %5.2fh UT;\n starts %02d:%02d, ends %02d:%02d local\n", civ_start, civ_end, rise_hours, rise_min, set_hours, set_min); break; case +1: printf( "Never darker than civil twilight\n" ); break; case -1: printf( "Never as bright as civil twilight\n" ); break; } switch( naut ) { case 0: rise_frac = modf(naut_start+gmtoff_hr ,&rise_int); rise_hours = (int)rise_int; rise_min = (int)(rise_frac * 60); set_frac = modf(naut_end+gmtoff_hr ,&set_int); set_hours = (int)set_int; set_min = (int)(set_frac * 60); printf( "Nautical twilight starts %5.2fh, " "ends %5.2fh UT;\n starts %02d:%02d, ends %02d:%02d local\n", naut_start, naut_end, rise_hours, rise_min, set_hours, set_min ); break; case +1: printf( "Never darker than nautical twilight\n" ); break; case -1: printf( "Never as bright as nautical twilight\n" ); break; } switch( astr ) { case 0: rise_frac = modf(astr_start+gmtoff_hr ,&rise_int); rise_hours = (int)rise_int; rise_min = (int)(rise_frac * 60); set_frac = modf(astr_end+gmtoff_hr ,&set_int); set_hours = (int)set_int; set_min = (int)(set_frac * 60); printf( "Astronomical twilight starts %5.2fh, " "ends %5.2fh UT;\n starts %02d:%02d, ends %02d:%02d local\n", astr_start, astr_end, rise_hours, rise_min, set_hours, set_min ); break; case +1: printf( "Never darker than astronomical twilight\n" ); break; case -1: printf( "Never as bright as astronomical twilight\n" ); break; } return 0; } }
main() { int year,month,day; double lon, lat; double daylen, civlen, nautlen, astrlen; double rise, set, civ_start, civ_end, naut_start, naut_end, astr_start, astr_end; int rs, civ, naut, astr; char buf[80]; printf( "Longitude (+ is east) and latitude (+ is north) : " ); fgets(buf, 80, stdin); sscanf(buf, "%lf %lf", &lon, &lat ); for(;;) { printf( "Input date ( yyyy mm dd ) (ctrl-C exits): " ); fgets(buf, 80, stdin); sscanf(buf, "%d %d %d", &year, &month, &day ); daylen = day_length(year,month,day,lon,lat); civlen = day_civil_twilight_length(year,month,day,lon,lat); nautlen = day_nautical_twilight_length(year,month,day,lon,lat); astrlen = day_astronomical_twilight_length(year,month,day, lon,lat); printf( "Day length: %5.2f hours\n", daylen ); printf( "With civil twilight %5.2f hours\n", civlen ); printf( "With nautical twilight %5.2f hours\n", nautlen ); printf( "With astronomical twilight %5.2f hours\n", astrlen ); printf( "Length of twilight: civil %5.2f hours\n", (civlen-daylen)/2.0); printf( " nautical %5.2f hours\n", (nautlen-daylen)/2.0); printf( " astronomical %5.2f hours\n", (astrlen-daylen)/2.0); rs = sun_rise_set ( year, month, day, lon, lat, &rise, &set ); civ = civil_twilight ( year, month, day, lon, lat, &civ_start, &civ_end ); naut = nautical_twilight ( year, month, day, lon, lat, &naut_start, &naut_end ); astr = astronomical_twilight( year, month, day, lon, lat, &astr_start, &astr_end ); printf( "Sun at south %5.2fh UT\n", (rise+set)/2.0 ); switch( rs ) { case 0: printf( "Sun rises %5.2fh UT, sets %5.2fh UT\n", rise, set ); break; case +1: printf( "Sun above horizon\n" ); break; case -1: printf( "Sun below horizon\n" ); break; } switch( civ ) { case 0: printf( "Civil twilight starts %5.2fh, " "ends %5.2fh UT\n", civ_start, civ_end ); break; case +1: printf( "Never darker than civil twilight\n" ); break; case -1: printf( "Never as bright as civil twilight\n" ); break; } switch( naut ) { case 0: printf( "Nautical twilight starts %5.2fh, " "ends %5.2fh UT\n", naut_start, naut_end ); break; case +1: printf( "Never darker than nautical twilight\n" ); break; case -1: printf( "Never as bright as nautical twilight\n" ); break; } switch( astr ) { case 0: printf( "Astronomical twilight starts %5.2fh, " "ends %5.2fh UT\n", astr_start, astr_end ); break; case +1: printf( "Never darker than astronomical twilight\n" ); break; case -1: printf( "Never as bright as astronomical twilight\n" ); break; } return 0; } }