adds a toggle to choose temperature units;
This commit is contained in:
@@ -236,6 +236,7 @@ void weather_save_config( void ) {
|
||||
doc["lon"] = weather_config.lon;
|
||||
doc["autosync"] = weather_config.autosync;
|
||||
doc["showWind"] = weather_config.showWind;
|
||||
doc["imperial"] = weather_config.imperial;
|
||||
|
||||
if ( serializeJsonPretty( doc, file ) == 0) {
|
||||
log_e("Failed to write config file");
|
||||
@@ -268,6 +269,7 @@ void weather_load_config( void ) {
|
||||
strlcpy( weather_config.lon, doc["lon"], sizeof( weather_config.lon ) );
|
||||
weather_config.autosync = doc["autosync"].as<bool>();
|
||||
weather_config.showWind = doc["showWind"].as<bool>();
|
||||
weather_config.imperial = doc["imperial"].as<bool>();
|
||||
}
|
||||
doc.clear();
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
char lat[16] = "";
|
||||
bool autosync = true;
|
||||
bool showWind = false;
|
||||
bool imperial = false;
|
||||
} weather_config_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -35,8 +35,10 @@ static void weather_wind_to_string( weather_forcast_t* container, int speed, int
|
||||
int weather_fetch_today( weather_config_t *weather_config, weather_forcast_t *weather_today ) {
|
||||
char url[512]="";
|
||||
int httpcode = -1;
|
||||
|
||||
snprintf( url, sizeof( url ), "http://%s/data/2.5/weather?lat=%s&lon=%s&appid=%s", OWM_HOST, weather_config->lat, weather_config->lon, weather_config->apikey);
|
||||
const char* weather_units_symbol = weather_config->imperial ? "F" : "C";
|
||||
const char* weather_units_char = weather_config->imperial ? "imperial" : "metric";
|
||||
|
||||
snprintf( url, sizeof( url ), "http://%s/data/2.5/weather?lat=%s&lon=%s&appid=%s&units=%s", OWM_HOST, weather_config->lat, weather_config->lon, weather_config->apikey, weather_units_char);
|
||||
|
||||
HTTPClient today_client;
|
||||
|
||||
@@ -45,7 +47,7 @@ int weather_fetch_today( weather_config_t *weather_config, weather_forcast_t *we
|
||||
httpcode = today_client.GET();
|
||||
|
||||
if ( httpcode != 200 ) {
|
||||
log_e("HTTPClient error %d", httpcode );
|
||||
log_e("HTTPClient error %d", httpcode, url );
|
||||
today_client.end();
|
||||
return( -1 );
|
||||
}
|
||||
@@ -63,7 +65,7 @@ int weather_fetch_today( weather_config_t *weather_config, weather_forcast_t *we
|
||||
today_client.end();
|
||||
|
||||
weather_today->valide = true;
|
||||
snprintf( weather_today->temp, sizeof( weather_today->temp ),"%0.1f°C", doc["main"]["temp"].as<float>() - 273.15 );
|
||||
snprintf( weather_today->temp, sizeof( weather_today->temp ), "%0.1f°%s", doc["main"]["temp"].as<float>(), weather_units_symbol);
|
||||
snprintf( weather_today->humidity, sizeof( weather_today->humidity ),"%f%%", doc["main"]["humidity"].as<float>() );
|
||||
snprintf( weather_today->pressure, sizeof( weather_today->pressure ),"%fpha", doc["main"]["pressure"].as<float>() );
|
||||
strcpy( weather_today->icon, doc["weather"][0]["icon"] );
|
||||
@@ -80,8 +82,10 @@ int weather_fetch_today( weather_config_t *weather_config, weather_forcast_t *we
|
||||
int weather_fetch_forecast( weather_config_t *weather_config, weather_forcast_t * weather_forecast ) {
|
||||
char url[512]="";
|
||||
int httpcode = -1;
|
||||
const char* weather_units_symbol = weather_config->imperial ? "F" : "C";
|
||||
const char* weather_units_char = weather_config->imperial ? "imperial" : "metric";
|
||||
|
||||
snprintf( url, sizeof( url ), "http://%s/data/2.5/forecast?cnt=%d&lat=%s&lon=%s&appid=%s", OWM_HOST, WEATHER_MAX_FORECAST, weather_config->lat, weather_config->lon, weather_config->apikey);
|
||||
snprintf( url, sizeof( url ), "http://%s/data/2.5/forecast?cnt=%d&lat=%s&lon=%s&appid=%s&units=%s", OWM_HOST, WEATHER_MAX_FORECAST, weather_config->lat, weather_config->lon, weather_config->apikey, weather_units_char);
|
||||
|
||||
HTTPClient forecast_client;
|
||||
|
||||
@@ -90,7 +94,7 @@ int weather_fetch_forecast( weather_config_t *weather_config, weather_forcast_t
|
||||
httpcode = forecast_client.GET();
|
||||
|
||||
if ( httpcode != 200 ) {
|
||||
log_e("HTTPClient error %d", httpcode );
|
||||
log_e("HTTPClient error %d", httpcode, url );
|
||||
forecast_client.end();
|
||||
return( -1 );
|
||||
}
|
||||
@@ -110,7 +114,7 @@ int weather_fetch_forecast( weather_config_t *weather_config, weather_forcast_t
|
||||
weather_forecast[0].valide = true;
|
||||
for ( int i = 0 ; i < WEATHER_MAX_FORECAST ; i++ ) {
|
||||
weather_forecast[ i ].timestamp = doc["list"][i]["dt"].as<long>();
|
||||
snprintf( weather_forecast[ i ].temp, sizeof( weather_forecast[ i ].temp ),"%0.1f°C", doc["list"][i]["main"]["temp"].as<float>() - 273.15 );
|
||||
snprintf( weather_forecast[ i ].temp, sizeof( weather_forecast[ i ].temp ),"%0.1f°%s", doc["list"][i]["main"]["temp"].as<float>(), weather_units_symbol );
|
||||
snprintf( weather_forecast[ i ].humidity, sizeof( weather_forecast[ i ].humidity ),"%f%%", doc["list"][i]["main"]["humidity"].as<float>() );
|
||||
snprintf( weather_forecast[ i ].pressure, sizeof( weather_forecast[ i ].pressure ),"%fpha", doc["list"][i]["main"]["pressure"].as<float>() );
|
||||
strcpy( weather_forecast[ i ].icon, doc["list"][i]["weather"][0]["icon"] );
|
||||
|
||||
@@ -44,6 +44,7 @@ lv_obj_t *weather_lat_textfield = NULL;
|
||||
lv_obj_t *weather_lon_textfield = NULL;
|
||||
lv_obj_t *weather_autosync_onoff = NULL;
|
||||
lv_obj_t *weather_wind_onoff = NULL;
|
||||
lv_obj_t *weather_imperial_onoff = NULL;
|
||||
lv_style_t weather_widget_setup_style;
|
||||
|
||||
LV_IMG_DECLARE(exit_32px);
|
||||
@@ -52,6 +53,7 @@ static void weather_textarea_event_cb( lv_obj_t * obj, lv_event_t event );
|
||||
static void exit_weather_widget_setup_event_cb( lv_obj_t * obj, lv_event_t event );
|
||||
static void weather_autosync_onoff_event_handler( lv_obj_t * obj, lv_event_t event );
|
||||
static void weather_wind_onoff_event_handler( lv_obj_t *obj, lv_event_t event );
|
||||
static void weather_imperial_onoff_event_handler( lv_obj_t *obj, lv_event_t event );
|
||||
|
||||
static void bluetooth_message_event_cb( EventBits_t event, char* msg );
|
||||
static void bluetooth_message_msg_pharse( char* msg );
|
||||
@@ -179,6 +181,21 @@ void weather_setup_tile_setup( uint32_t tile_num ) {
|
||||
lv_label_set_text( weather_wind_label, "Display wind");
|
||||
lv_obj_align( weather_wind_label, weather_wind_cont, LV_ALIGN_IN_LEFT_MID, 5, 0);
|
||||
|
||||
lv_obj_t *weather_imperial_cont = lv_obj_create( weather_setup_tile, NULL);
|
||||
lv_obj_set_size( weather_imperial_cont, LV_HOR_RES_MAX, 32);
|
||||
lv_obj_add_style( weather_imperial_cont, LV_OBJ_PART_MAIN, &weather_setup_style );
|
||||
lv_obj_align( weather_imperial_cont, weather_autosync_cont, LV_ALIGN_OUT_BOTTOM_MID, 0, 0 );
|
||||
weather_imperial_onoff = lv_switch_create( weather_imperial_cont, NULL);
|
||||
lv_obj_add_protect( weather_imperial_onoff, LV_PROTECT_CLICK_FOCUS);
|
||||
lv_obj_add_style( weather_imperial_onoff, LV_SWITCH_PART_INDIC, mainbar_get_switch_style() );
|
||||
lv_switch_off( weather_imperial_onoff, LV_ANIM_ON);
|
||||
lv_obj_align( weather_imperial_onoff, weather_imperial_cont, LV_ALIGN_IN_RIGHT_MID, -5, 0);
|
||||
lv_obj_set_event_cb( weather_imperial_onoff, weather_imperial_onoff_event_handler);
|
||||
lv_obj_t *weather_imperial_label = lv_label_create(weather_imperial_cont, NULL);
|
||||
lv_obj_add_style( weather_imperial_label, LV_OBJ_PART_MAIN, &weather_setup_style );
|
||||
lv_label_set_text( weather_imperial_label, "Use Imperial");
|
||||
lv_obj_align( weather_imperial_label, weather_imperial_cont, LV_ALIGN_IN_LEFT_MID, 5, 0);
|
||||
|
||||
if ( weather_config->autosync)
|
||||
lv_switch_on(weather_autosync_onoff, LV_ANIM_OFF);
|
||||
else
|
||||
@@ -189,6 +206,11 @@ void weather_setup_tile_setup( uint32_t tile_num ) {
|
||||
else
|
||||
lv_switch_off( weather_wind_onoff, LV_ANIM_OFF );
|
||||
|
||||
if ( weather_config->imperial )
|
||||
lv_switch_on( weather_imperial_onoff, LV_ANIM_OFF );
|
||||
else
|
||||
lv_switch_off( weather_imperial_onoff, LV_ANIM_OFF );
|
||||
|
||||
blectl_register_cb( BLECTL_MSG, bluetooth_message_event_cb );
|
||||
}
|
||||
|
||||
@@ -215,6 +237,15 @@ static void weather_wind_onoff_event_handler(lv_obj_t *obj, lv_event_t event)
|
||||
}
|
||||
}
|
||||
|
||||
static void weather_imperial_onoff_event_handler(lv_obj_t *obj, lv_event_t event)
|
||||
{
|
||||
switch (event) {
|
||||
case ( LV_EVENT_VALUE_CHANGED ): weather_config_t *weather_config = weather_get_config();
|
||||
weather_config->imperial = lv_switch_get_state( obj );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void exit_weather_widget_setup_event_cb( lv_obj_t * obj, lv_event_t event ) {
|
||||
switch( event ) {
|
||||
case( LV_EVENT_CLICKED ): keyboard_hide();
|
||||
|
||||
Reference in New Issue
Block a user