278 lines
8.1 KiB
Tcl
Executable File
278 lines
8.1 KiB
Tcl
Executable File
###############################################################################
|
|
#
|
|
# Locale specific functions for playing back time, numbers and spelling words.
|
|
# Often, the functions in this file are the only ones that have to be
|
|
# reimplemented for a new language pack.
|
|
#
|
|
###############################################################################
|
|
|
|
#
|
|
# 25/06/2011 F1SMF modif for fr_FR
|
|
# 04/04/2016 F8ASB Add playTemp read temperature datas for fr_FR
|
|
# Spell the specified word using a phonetic alphabet
|
|
#
|
|
proc spellWord {word} {
|
|
set word [string tolower $word];
|
|
for {set i 0} {$i < [string length $word]} {set i [expr $i + 1]} {
|
|
set char [string index $word $i];
|
|
if {$char == "*"} {
|
|
playMsg "Default" "star";
|
|
} elseif {$char == "/"} {
|
|
playMsg "Default" "slash";
|
|
} elseif {$char == "-"} {
|
|
playMsg "Default" "dash";
|
|
} elseif {[regexp {[a-z0-9]} $char]} {
|
|
playMsg "Default" "phonetic_$char";
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#
|
|
# Spell the specified number digit for digit
|
|
#
|
|
proc spellNumber {number} {
|
|
for {set i 0} {$i < [string length $number]} {set i [expr $i + 1]} {
|
|
set ch [string index $number $i];
|
|
if {$ch == "."} {
|
|
playMsg "Default" "decimal";
|
|
} else {
|
|
playMsg "Default" "$ch";
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#
|
|
# Say the specified two digit number (00 - 99)
|
|
#
|
|
proc playTwoDigitNumber {number} {
|
|
if {[string length $number] != 2} {
|
|
puts "*** WARNING: Function playTwoDigitNumber received a non two digit number: $number";
|
|
return;
|
|
}
|
|
|
|
set first [string index $number 0];
|
|
if {($first == "0") || ($first == "O")} {
|
|
playMsg "Default" $first;
|
|
playMsg "Default" [string index $number 1];
|
|
} elseif {$first == "1"} {
|
|
playMsg "Default" $number;
|
|
} elseif {$first == "7"} {
|
|
playMsg "Default" "6X";
|
|
if {[string index $number 1] == "1"} {
|
|
playMsg "Default" "and";
|
|
}
|
|
playMsg "Default" [expr $number - 60];
|
|
} elseif {$first == "9"} {
|
|
playMsg "Default" "8X";
|
|
playMsg "Default" [expr $number - 80];
|
|
} else {
|
|
playMsg "Default" "[string index $number 0]X";
|
|
if {[string index $number 1] == "1"} {
|
|
playMsg "Default" "and";
|
|
}
|
|
if {[string index $number 1] != "0"} {
|
|
playMsg "Default" "[string index $number 1]";
|
|
}
|
|
}
|
|
}
|
|
#
|
|
# Say the specified three digit number (000 - 999)
|
|
#
|
|
proc playThreeDigitNumber {number} {
|
|
if {[string length $number] != 3} {
|
|
puts "*** WARNING: Function playThreeDigitNumber received a non three digit number: $number";
|
|
return;
|
|
}
|
|
|
|
set first [string index $number 0];
|
|
if {($first == "0") || ($first == "O")} {
|
|
spellNumber $number
|
|
} else {
|
|
append first "00";
|
|
playMsg "Default" $first;
|
|
if {[string index $number 1] != "0"} {
|
|
playTwoDigitNumber [string range $number 1 2];
|
|
} elseif {[string index $number 2] != "0"} {
|
|
playMsg "Default" [string index $number 2];
|
|
}
|
|
}
|
|
}
|
|
|
|
#Say Wind Direction as as intelligent as posible.
|
|
proc playWindDir {windDir} {
|
|
|
|
if { 0 < $windDir && $windDir < 22.5} {
|
|
puts " Direction N"
|
|
playMsg "WeatherStation" "North";
|
|
} elseif {$windDir >= 22.5 && $windDir < 45 } {
|
|
puts " Direction N NE"
|
|
playMsg "WeatherStation" "North";
|
|
playMsg "WeatherStation" "North-East";
|
|
} elseif {$windDir >= 45 && $windDir < 67.5 } {
|
|
puts " Direction NE"
|
|
playMsg "WeatherStation" "North-East";
|
|
} elseif {$windDir >= 67.5 && $windDir < 90 } {
|
|
puts " Direction NE E"
|
|
playMsg "WeatherStation" "North-East";
|
|
playMsg "WeatherStation" "East";
|
|
} elseif {$windDir >= 90 && $windDir < 112.5 } {
|
|
puts " Direction E"
|
|
playMsg "WeatherStation" "East";
|
|
} elseif {$windDir >= 112.5 && $windDir < 135 } {
|
|
puts " Direction E SE"
|
|
playMsg "WeatherStation" "East";
|
|
} elseif {$windDir >= 135 && $windDir < 157.5 } {
|
|
puts " Direction SE"
|
|
playMsg "WeatherStation" "South-East";
|
|
} elseif {$windDir >= 157.5 && $windDir < 180 } {
|
|
puts " Direction SE S"
|
|
playMsg "WeatherStation" "South-East";
|
|
playMsg "WeatherStation" "South";
|
|
} elseif {$windDir >= 180 && $windDir < 202.5} {
|
|
puts " Direction S"
|
|
playMsg "WeatherStation" "South";
|
|
} elseif {$windDir >= 202.5 && $windDir < 225 } {
|
|
puts " Direction S SW"
|
|
playMsg "WeatherStation" "South";
|
|
playMsg "WeatherStation" "South-West";
|
|
} elseif {$windDir >= 225 && $windDir < 247.5} {
|
|
puts " Direction SW"
|
|
playMsg "WeatherStation" "South-West";
|
|
} elseif {$windDir >= 247.5 && $windDir < 270 } {
|
|
puts " Direction SW W"
|
|
playMsg "WeatherStation" "South-West";
|
|
playMsg "WeatherStation" "West";
|
|
} elseif {$windDir >= 270 && $windDir < 292.5} {
|
|
puts " Direction W"
|
|
playMsg "WeatherStation" "West";
|
|
} elseif {$windDir >= 292.5 && $windDir < 315 } {
|
|
puts " Direction W NW"
|
|
playMsg "WeatherStation" "West";
|
|
playMsg "WeatherStation" "North-West";
|
|
} elseif {$windDir >= 315 && $windDir < 337.5} {
|
|
puts " Direction NW"
|
|
playMsg "WeatherStation" "North-West";
|
|
} elseif {$windDir >= 337.5 && $windDir < 359 } {
|
|
puts " Direction NW N"
|
|
playMsg "WeatherStation" "North-West";
|
|
playMsg "WeatherStation" "North";
|
|
} else {
|
|
puts " Non disponible"
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
#
|
|
# Say a number as intelligent as posible. Examples:
|
|
#
|
|
# 1 - one
|
|
# 24 - twentyfour
|
|
# 245 - twohundred and fourtyfive
|
|
# 1234 - twelve thirtyfour
|
|
# 12345 - onehundred and twentythree fourtyfive
|
|
# 136.5 - onehundred and thirtysix point five
|
|
#
|
|
proc playNumber {number} {
|
|
if {[regexp {(\d+)\.(\d+)?} $number -> integer fraction]} {
|
|
playNumber $integer;
|
|
|
|
|
|
# No say 0 if decimal = 0
|
|
if {$fraction != 0} {
|
|
playMsg "Default" "decimal";
|
|
spellNumber $fraction;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
while {[string length $number] > 0} {
|
|
set len [string length $number];
|
|
if {$len == 1} {
|
|
playMsg "Default" $number;
|
|
set number "";
|
|
} elseif {$len % 2 == 0} {
|
|
playTwoDigitNumber [string range $number 0 1];
|
|
set number [string range $number 2 end];
|
|
} else {
|
|
playThreeDigitNumber [string range $number 0 2];
|
|
set number [string range $number 3 end];
|
|
}
|
|
}
|
|
}
|
|
|
|
#
|
|
# Say temperature as intelligent as posible. Examples:
|
|
#
|
|
# 1 - one
|
|
# 24 - twentyfour
|
|
# 245 - twohundred and fourtyfive
|
|
# 1234 - twelve thirtyfour
|
|
# 12345 - onehundred and twentythree fourtyfive
|
|
# 136.5 - onehundred and thirtysix point five
|
|
#
|
|
proc playTemp {number} {
|
|
if {[regexp {(\d+)\.(\d+)?} $number -> integer fraction]} {
|
|
playNumber $integer;
|
|
playMsg "WeatherStation" "degree";
|
|
|
|
# No say 0 if decimal = 0
|
|
if {$fraction != 0} {
|
|
spellNumber $fraction;
|
|
}
|
|
return;
|
|
}
|
|
|
|
while {[string length $number] > 0} {
|
|
set len [string length $number];
|
|
if {$len == 1} {
|
|
playMsg "Default" $number;
|
|
set number "";
|
|
} elseif {$len % 2 == 0} {
|
|
playTwoDigitNumber [string range $number 0 1];
|
|
set number [string range $number 2 end];
|
|
} else {
|
|
playThreeDigitNumber [string range $number 0 2];
|
|
set number [string range $number 3 end];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#
|
|
# Say the time specified by function arguments "hour" and "minute".
|
|
#
|
|
proc playTime {hour minute} {
|
|
# Strip white space and leading zeros. Check ranges.
|
|
if {[scan $hour "%d" hour] != 1 || $hour < 0 || $hour > 23} {
|
|
error "playTime: Non digit hour or value out of range: $hour"
|
|
}
|
|
if {[scan $minute "%d" minute] != 1 || $minute < 0 || $minute > 59} {
|
|
error "playTime: Non digit minute or value out of range: $hour"
|
|
}
|
|
if {[string length $hour] == 1} {
|
|
playMsg "Default" [expr $hour];
|
|
} else {
|
|
playTwoDigitNumber $hour;
|
|
}
|
|
# playSilence 250
|
|
playMsg "Core" "time";
|
|
|
|
if {$minute == 0} {
|
|
return;
|
|
}
|
|
if {[string length $minute] == 1} {
|
|
playMsg "Default" [expr $minute];
|
|
} else {
|
|
playTwoDigitNumber $minute;
|
|
}
|
|
}
|
|
|
|
#
|
|
# This file has not been truncated
|
|
#
|