# HG changeset patch # User Matti Hamalainen # Date 1594122106 -10800 # Node ID edbc0190e82ab9b4a02a9c4964fcde73d6d3982a # Parent 7512889f7b724f61fe383d5c9f9f366c455ee4be weather: Move some functions around into more logical location. diff -r 7512889f7b72 -r edbc0190e82a weather.tcl --- a/weather.tcl Tue Jul 07 14:40:45 2020 +0300 +++ b/weather.tcl Tue Jul 07 14:41:46 2020 +0300 @@ -126,105 +126,6 @@ } -# Translate wind direction compass degree to name -proc weather_get_wind_direction {uangle} { - global weather_msg_wind_directions - - # If the data was not got, return empty value - if {$uangle == ""} { - return "" - } - - # Calculate index to array of 8 compass direction names based on the angle we have - set uvalue [expr int(floor(fmod($uangle + 45.0/2, 360.0) / 45.0))] - if {$uvalue >= 0 && $uvalue < [llength $weather_msg_wind_directions]} { - return [lindex $weather_msg_wind_directions $uvalue] - } else { - return "ERROR ($udir)" - } -} - - -proc weather_get_raw_table_value {utable uvalue} { - # If the data was not got, return empty value - if {$uvalue == "" || $uvalue == "NaN"} { - return "" - } - - return "[expr int($uvalue) + 1]/[llength $utable]" -} - - -# "Translate" a straight table index (0-N) to table value -proc weather_get_table_value {utable uvalue} { - # If the data was not got, return empty value - if {$uvalue == "" || $uvalue == "NaN"} { - return "" - } - - set uvalue [expr int($uvalue)] - set ulen [llength $utable] - if {$uvalue >= 0 && $uvalue < $ulen} { - return [lindex $utable $uvalue] - } else { - return "ERROR ($uvalue)" - } -} - - -#------------------------------------------------------------------------- -# Produce one location of weather data as a string -proc weather_get_str {udata umsg} { - global weather_msg_cloudiness - - array unset uvals - set uvals(station) [lindex $udata 0] - set uvals(type) [lindex $udata 1] - set uvals(c_lat) [lindex $udata 2] - set uvals(c_lng) [lindex $udata 3] - set uvals(c_height) [lindex $udata 4] - set uvals(vtime) [lindex $udata 5] - set uvals(temp) [lindex $udata 6] - set uvals(humidity) [lindex $udata 7] - set uvals(wind_speed) [lindex $udata 8] - set uvals(wind_direction) [weather_get_wind_direction [lindex $udata 9]] - set uvals(wind_direction_deg) [lindex $udata 9] - set uvals(cloudiness) [weather_get_table_value $weather_msg_cloudiness [lindex $udata 10]] - set uvals(cloudiness_val) [weather_get_raw_table_value $weather_msg_cloudiness [lindex $udata 10]] - set uvals(road_surface_temp) [lindex $udata 11] - set uvals(precipitation) [lindex $udata 12] - set uvals(visibility) [lindex $udata 13] - - if {[expr [clock seconds] - $uvals(vtime)] < 3600} { - set uvals(ctime) [clock format $uvals(vtime) -format "%H:%M"] - } else { - set uvals(ctime) [clock format $uvals(vtime) -format "%H:%M (%d.%m.%Y)"] - } - - set astr "" - foreach aitem $umsg { - set atmp $aitem - foreach {akey aval} [array get uvals] { - if {$aval != ""} { - set atmp [string map [list "@${akey}@" $aval] $atmp] - } - } - if {$atmp != $aitem || [string first "@" $aitem] < 0} { - append astr $atmp - } - } - - return $astr -} - - -# Get data by location key -proc weather_get_by_key {ukey} { - global weather_data weather_msg_result - return [weather_get_str $weather_data($ukey) $weather_msg_result] -} - - #------------------------------------------------------------------------- proc weather_update {} { global weather_datafile weather_data @@ -293,6 +194,108 @@ #------------------------------------------------------------------------- +# Translate wind direction compass degree to name +proc weather_get_wind_direction {uangle} { + global weather_msg_wind_directions + + # If the data was not got, return empty value + if {$uangle == ""} { + return "" + } + + # Calculate index to array of 8 compass direction names based on the angle we have + set uvalue [expr int(floor(fmod($uangle + 45.0/2, 360.0) / 45.0))] + if {$uvalue >= 0 && $uvalue < [llength $weather_msg_wind_directions]} { + return [lindex $weather_msg_wind_directions $uvalue] + } else { + return "ERROR ($udir)" + } +} + + +proc weather_get_raw_table_value {utable uvalue} { + # If the data was not got, return empty value + if {$uvalue == "" || $uvalue == "NaN"} { + return "" + } + + return "[expr int($uvalue) + 1]/[llength $utable]" +} + + +# "Translate" a straight table index (0-N) to table value +proc weather_get_table_value {utable uvalue} { + # If the data was not got, return empty value + if {$uvalue == "" || $uvalue == "NaN"} { + return "" + } + + set uvalue [expr int($uvalue)] + set ulen [llength $utable] + if {$uvalue >= 0 && $uvalue < $ulen} { + return [lindex $utable $uvalue] + } else { + return "ERROR ($uvalue)" + } +} + + +# Produce one location of weather data as a string +proc weather_get_str {udata umsg} { + global weather_msg_cloudiness + global weather_msg_precipitation + + array unset uvals + set uvals(station) [lindex $udata 0] + set uvals(type) [lindex $udata 1] + set uvals(c_lat) [lindex $udata 2] + set uvals(c_lng) [lindex $udata 3] + set uvals(c_height) [lindex $udata 4] + set uvals(vtime) [lindex $udata 5] + set uvals(temp) [lindex $udata 6] + set uvals(humidity) [lindex $udata 7] + set uvals(wind_speed) [lindex $udata 8] + set uvals(wind_direction) [weather_get_wind_direction [lindex $udata 9]] + set uvals(wind_direction_deg) [lindex $udata 9] + set uvals(cloudiness) [weather_get_table_value $weather_msg_cloudiness [lindex $udata 10]] + set uvals(cloudiness_val) [weather_get_raw_table_value $weather_msg_cloudiness [lindex $udata 10]] + set uvals(road_surface_temp) [lindex $udata 11] + set uvals(precipitation) [lindex $udata 12] + set uvals(visibility) [lindex $udata 13] + set uvals(precipitation2) [weather_get_table_value $weather_msg_precipitation [lindex $udata 14]] + set uvals(precipitation_val) [weather_get_raw_table_value $weather_msg_precipitation [lindex $udata 14]] + + if {[expr [clock seconds] - $uvals(vtime)] < 3600} { + set uvals(ctime) [clock format $uvals(vtime) -format "%H:%M"] + } else { + set uvals(ctime) [clock format $uvals(vtime) -format "%H:%M (%d.%m.%Y)"] + } + + set astr "" + foreach aitem $umsg { + set atmp $aitem + foreach {akey aval} [array get uvals] { + if {$aval != ""} { + set atmp [string map [list "@${akey}@" $aval] $atmp] + } + } + if {$atmp != $aitem || [string first "@" $aitem] < 0} { + append astr $atmp + } + } + + return $astr +} + + +# Get data by location key +proc weather_get_by_key {ukey} { + global weather_data weather_msg_result + return [weather_get_str $weather_data($ukey) $weather_msg_result] +} + + +#------------------------------------------------------------------------- # Script initialization #-------------------------------------------------------------------------