diff --git a/apps/panel.c b/apps/panel.c index 8fcd39da..e28f1ad5 100644 --- a/apps/panel.c +++ b/apps/panel.c @@ -440,11 +440,13 @@ static struct MenuEntry_Normal * weather_updated_entry; static struct MenuEntry_Normal * weather_conditions_entry; static struct MenuEntry_Normal * weather_humidity_entry; static struct MenuEntry_Normal * weather_clouds_entry; +static struct MenuEntry_Normal * weather_pressure_entry; static char * weather_title_str; static char * weather_updated_str; static char * weather_conditions_str; static char * weather_humidity_str; static char * weather_clouds_str; +static char * weather_pressure_str; static char * weather_temp_str; static int weather_status_valid = 0; static hashmap_t * weather_icons = NULL; @@ -473,6 +475,7 @@ static void update_weather_status(void) { if (weather_conditions_str) free(weather_conditions_str); if (weather_humidity_str) free(weather_humidity_str); if (weather_clouds_str) free(weather_clouds_str); + if (weather_pressure_str) free(weather_pressure_str); if (weather_temp_str) free(weather_temp_str); /* read the entire status file */ @@ -501,6 +504,9 @@ static void update_weather_status(void) { char * city = t; t = strstr(t, "\n"); *t = '\0'; t++; char * updated = t; + t = strstr(t, "\n"); *t = '\0'; t++; + char * pressure = t; + t = strstr(t, "\n"); if (t) { *t = '\0'; t++; } if (!weather_icons) { weather_icons = hashmap_create(10); @@ -527,6 +533,8 @@ static void update_weather_status(void) { weather_humidity_str = strdup(tmp); sprintf(tmp, "Clouds: %s%%", clouds); weather_clouds_str = strdup(tmp); + sprintf(tmp, "Pressure: %s hPa", pressure); + weather_pressure_str = strdup(tmp); sprintf(tmp, "%s°", temp_r); weather_temp_str = strdup(tmp); @@ -649,16 +657,18 @@ static void show_weather_status(void) { menu_insert(weather, menu_create_separator()); weather_conditions_entry = (struct MenuEntry_Normal *)menu_create_normal(NULL, NULL, "", NULL); menu_insert(weather, weather_conditions_entry); - weather_humidity_entry = (struct MenuEntry_Normal *)menu_create_normal(NULL, NULL, "", NULL); + weather_humidity_entry = (struct MenuEntry_Normal *)menu_create_normal("weather-humidity", NULL, "", NULL); menu_insert(weather, weather_humidity_entry); - weather_clouds_entry = (struct MenuEntry_Normal *)menu_create_normal(NULL, NULL, "", NULL); + weather_clouds_entry = (struct MenuEntry_Normal *)menu_create_normal("weather-clouds", NULL, "", NULL); menu_insert(weather, weather_clouds_entry); + weather_pressure_entry = (struct MenuEntry_Normal *)menu_create_normal("weather-pressure", NULL, "", NULL); + menu_insert(weather, weather_pressure_entry); menu_insert(weather, menu_create_separator()); menu_insert(weather, menu_create_normal("refresh", NULL, "Refresh...", weather_refresh)); menu_insert(weather, menu_create_normal("config", NULL, "Configure...", weather_configure)); menu_insert(weather, menu_create_separator()); menu_insert(weather, menu_create_normal(NULL, NULL, "Weather data provided by", NULL)); - menu_insert(weather, menu_create_normal(NULL, NULL, "OpenWeatherMap.org", NULL)); + menu_insert(weather, menu_create_normal(NULL, NULL, "OpenWeather™", NULL)); } if (weather_status_valid) { menu_update_title(weather_title_entry, weather_title_str); @@ -666,6 +676,7 @@ static void show_weather_status(void) { menu_update_title(weather_conditions_entry, weather_conditions_str); menu_update_title(weather_humidity_entry, weather_humidity_str); menu_update_title(weather_clouds_entry, weather_clouds_str); + menu_update_title(weather_pressure_entry, weather_pressure_str); } if (!weather->window) { int mwidth, mheight, offset; @@ -1225,7 +1236,7 @@ static void redraw(void) { uint32_t color = (weather && weather->window) ? HILIGHT_COLOR : ICON_COLOR; tt_set_size(font, 12); int t = tt_string_width(font, weather_temp_str); - tt_draw_string(ctx, font, WIDGET_POSITION(widget) + (WIDGET_WIDTH - t) / 2, 5 + Y_PAD + 12, weather_temp_str, color); + tt_draw_string(ctx, font, WIDGET_POSITION(widget) + (WIDGET_WIDTH - t) / 2, 6 + Y_PAD + 12, weather_temp_str, color); draw_sprite_alpha_paint(ctx, weather_icon, WIDGET_POSITION(widget+1), ICON_Y_PAD, 1.0, color); widget += 2; } diff --git a/apps/weather-tool.c b/apps/weather-tool.c index 28a89cb1..868544e0 100644 --- a/apps/weather-tool.c +++ b/apps/weather-tool.c @@ -62,6 +62,18 @@ int main(int argc, char * argv[]) { JSON_IND(JSON_KEY(result,"weather"),0) : NULL; FILE * out = fopen(WEATHER_OUT_PATH, "w"); + + /** + * The format for a parsed weather payload is a series of line-separated entries: + * - Formatted temperature, with decimal. + * - Integral temperature, eg. for the panel widget. + * - Main weather conditions string, eg. "Clouds" + * - Icon identifier, eg. 02d is "cloudy, daytime". + * - Humidity (integer, percentage) + * - Cloud coverage (integer, percentage) + * - City name (we're using the guessed location, not the one from the weather provider...) + * - Date string of last update + */ fprintf(out, "%.2lf\n", JSON_KEY(_main,"temp")->number); fprintf(out, "%d\n", (int)JSON_KEY(_main,"temp")->number); fprintf(out, "%s\n", conditions ? JSON_KEY(conditions,"main")->string : ""); @@ -69,7 +81,7 @@ int main(int argc, char * argv[]) { fprintf(out, "%d\n", (int)JSON_KEY(_main,"humidity")->number); fprintf(out, "%d\n", JSON_KEY(JSON_KEY(result,"clouds"),"all") ? (int)JSON_KEY(JSON_KEY(result,"clouds"),"all")->number : 0); fprintf(out, "%s\n", city); - char * format = "%a, %d %b %Y %H:%M:%S"; + char * format = "%a, %d %b %Y %H:%M:%S\n"; struct tm * timeinfo; struct timeval now; char buf[BUFSIZ] = {0}; @@ -77,6 +89,9 @@ int main(int argc, char * argv[]) { timeinfo = localtime((time_t *)&now.tv_sec); strftime(buf,BUFSIZ,format,timeinfo); fprintf(out, buf); + + fprintf(out, "%d\n", (int)JSON_KEY(_main,"pressure")->number); + fclose(out); return 0; diff --git a/base/usr/share/icons/16/weather-clouds.png b/base/usr/share/icons/16/weather-clouds.png new file mode 100644 index 00000000..0421f9f4 Binary files /dev/null and b/base/usr/share/icons/16/weather-clouds.png differ diff --git a/base/usr/share/icons/16/weather-humidity.png b/base/usr/share/icons/16/weather-humidity.png new file mode 100644 index 00000000..978efa27 Binary files /dev/null and b/base/usr/share/icons/16/weather-humidity.png differ diff --git a/base/usr/share/icons/16/weather-pressure.png b/base/usr/share/icons/16/weather-pressure.png new file mode 100644 index 00000000..9b15bef2 Binary files /dev/null and b/base/usr/share/icons/16/weather-pressure.png differ