--- moonrock.c 2010-01-18 14:46:38.000000000 +0100 +++ moonrock_07.c 2010-01-12 17:03:57.000000000 +0100 @@ -12,7 +12,7 @@ * (original upload 5 November 2007 by Tomruen) * moon phase code based on moontool.c by John Walker * - * Extended by: Marek Niemiec, DB1BMN, Dec. 29-31 th. 2009 + * Extended by: Marek Niemiec, DB1BMN, Dec. 29th. 2009 till Jan. 12 th. 2010 * * * This program is free software; you can redistribute it and/or @@ -456,6 +456,93 @@ return tmp; } + +/* convert double numbers to strings */ +// http://www.mikrocontroller.net/topic/38903 +char * ltoa(char * buf, long val, int pad, char padchar) +{ + int i; + int neg = 0; + char tmp_buf[21]; + + if(val<0) { + val = -val; + neg = 1; + } + + for(i=0; val>0; val/=10) + tmp_buf[i++] = (val % 10) + '0'; + + if(i==0) + tmp_buf[i++] = '0'; + + if(neg) { + if(padchar) { + tmp_buf[i++] = '-'; + while(i0) + *buf++ = tmp_buf[--i]; + + *buf = 0; + + return buf; +} + +void ftoa(char * buf, double f, int d, int pad, char padchar) +{ + char * p; + const double powers[] = {1.0,10.0,100.0,1000.0,10000.0,100000.0}; + + /* round */ + f = f>=0.0 ? (f*powers[d]+0.5)/powers[d] : +(f*powers[d]-0.5)/powers[d]; + + /* special case */ + if (f<0.0 && f > -1.0) { +/* if(pad<2) + pad = 2; + if(padchar) { + while(--pad-1) + *buf++ = ' '; + *buf++ = '-'; + *buf++ = '0'; + } + else { + *buf++ = '-'; + while(--pad) + *buf++ = '0'; + } + p = buf; */ + p = ltoa(buf,-1,pad,padchar); + *(p-1) = '0'; + } + else + p = ltoa(buf,f,pad,padchar); + + *p++ = '.'; + + if (f<0.0) + f = -f; + + f -= (long) f; + f *= powers[d]; + ltoa(p,(long)f,d,0); +} + + + /* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { @@ -470,7 +557,7 @@ double cangdia; /* Angular diameter in degrees */ double csund; /* Distance to Sun */ double csuang; /* Sun's angular diameter */ - double utc_offset = 1; // utc offset in hours, eastern from greenwich: positive, western from greenwich: negative + float utc_offset = 1.0; // utc offset in hours, eastern from greenwich: positive, western from greenwich: negative //bool viewbmp=true; bool refresh=true; bool done=false; @@ -488,6 +575,9 @@ #endif char output[32]; /* output string buffer */ + char buff_ftoa[16]; + char phase_tendency='+'; // store '+' or '-' + /* array with moon phase names */ /* can we take also other languages into account? */ @@ -607,8 +697,9 @@ else { /* print some kind of error message or perhaps some ASCII-Art? */ - rb->snprintf(output,sizeof(output), "Error opening moonrock.dat"); - rb->lcd_puts(0,0,output); + //rb->snprintf(output,sizeof(output), "Error opening moonrock.dat"); + //rb->lcd_puts(0,0,output); + rb->splash(HZ, "Error opening moonrock.dat"); } break; @@ -635,17 +726,36 @@ iphase=8*phase+0.5; iphase=iphase%8; - rb->snprintf(output,sizeof(output), "UTC: %02d:%02d:%02d %+2.1fh", tm_utc.tm_hour, tm_utc.tm_min, tm_utc.tm_sec, utc_offset ); /* some dummy output */ + //rb->snprintf(output,sizeof(output), "UTC: %02d:%02d:%02d %+02.1fh", tm_utc.tm_hour, tm_utc.tm_min, tm_utc.tm_sec, utc_offset ); + ftoa( buff_ftoa, utc_offset, 1, 2, '0'); + rb->snprintf(output,sizeof(output), "UTC: %02d:%02d:%02d %s", tm_utc.tm_hour, tm_utc.tm_min, tm_utc.tm_sec, buff_ftoa); rb->lcd_puts(0, 0,output); rb->snprintf(output,sizeof(output), "%s. %02d. %s. %4d", wday_name[tm_utc.tm_wday-1], tm_utc.tm_mday, month_name[tm_utc.tm_mon-1], tm_utc.tm_year+1900); rb->lcd_puts(0, 1,output); - rb->snprintf(output,sizeof(output), "Age of Moon: %2d d", (int)(aom)); + // age of moon + ftoa( buff_ftoa, aom, 2, 2, ' '); + rb->snprintf(output,sizeof(output), "Age of Moon: %s d", buff_ftoa); rb->lcd_puts(0, 2,output); - rb->snprintf(output,sizeof(output), "Moon Phase: %3d%%", (int)(cphase*100+0.5)); + + // phase of moon in percent + if (phase <= 0.5) + { + phase_tendency = '+'; + } + else + { + phase_tendency = '-'; + } + ftoa( buff_ftoa, (cphase*100+0.5), 1, 2, ' '); + rb->snprintf(output,sizeof(output), "Moon Phase: %c%s %%", phase_tendency, buff_ftoa); rb->lcd_puts(0, 3,output); + + rb->snprintf(output,sizeof(output), "%s", desc[iphase]); rb->lcd_puts(0, 4,output); + + rb->snprintf(output,sizeof(output), "Lunation (B/2k): ####"); rb->lcd_puts(0, 5,output); @@ -673,26 +783,30 @@ /* calculate easter date */ tm_easter_now = easter_date(tm_utc.tm_year+1900); tm_easter_next = easter_date(tm_utc.tm_year+1900+1); - - rb->snprintf(output,sizeof(output), "Julian Date:" ); + + // julian date + ftoa( buff_ftoa, jd, 5, 1, ' '); + rb->snprintf(output,sizeof(output), "Julian Date:" ); rb->lcd_puts(0, 0,output); - rb->snprintf(output,sizeof(output), "%f", jd ); + rb->snprintf(output,sizeof(output), "%s", buff_ftoa ); rb->lcd_puts(0, 1,output); + + // moon distance + ftoa( buff_ftoa, cdist, 1, 1, ' '); rb->snprintf(output,sizeof(output), "Moon's distance:"); rb->lcd_puts(0, 2,output); - rb->snprintf(output,sizeof(output), "%.1f km", cdist); + rb->snprintf(output,sizeof(output), "%s km", buff_ftoa); rb->lcd_puts(0, 3,output); rb->snprintf(output,sizeof(output), "* Apogee/Perigee? *"); // how do we calculate this? - rb->lcd_puts(0, 4,output); - - rb-snprintf(output,sizeof(output), "Easter Sunday:"); - rb->lcd_puts(0, 8,output); - rb-snprintf(output,sizeof(output), "%02d. %s. %4d", tm_easter_now.tm_mday, month_name[tm_easter_now.tm_mon-1], tm_easter_now.tm_year+1900); // current year + rb->lcd_puts(0, 4,output); + + rb->snprintf(output,sizeof(output), "Easter Sunday:" ); // + rb->lcd_puts(0, 8,output); + rb->snprintf(output,sizeof(output), "%02d. %s. %4d", tm_easter_now.tm_mday, month_name[tm_easter_now.tm_mon-1], tm_easter_now.tm_year+1900); // current year rb->lcd_puts(0, 9,output); - rb-snprintf(output,sizeof(output), "%02d. %s. %4d", tm_easter_next.tm_mday, month_name[tm_easter_next.tm_mon-1], tm_easter_next.tm_year+1900); // next year + rb->snprintf(output,sizeof(output), "%02d. %s. %4d", tm_easter_next.tm_mday, month_name[tm_easter_next.tm_mon-1], tm_easter_next.tm_year+1900); // next year rb->lcd_puts(0, 10,output); - - + rb->lcd_update(); // do not forget to update the display! break; case 3: