set_units allow scale multiplier

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-03-14 18:11:16 -07:00
parent 5acc5db9e2
commit 4c2a1aa101
2 changed files with 34 additions and 49 deletions

View File

@ -140,26 +140,22 @@ proc set_cmd_units { args } {
set_unit_values "distance" -distance "m" keys
}
proc set_unit_values { unit key unit_name key_var } {
proc set_unit_values { unit key suffix key_var } {
upvar 1 $key_var keys
if { [info exists keys($key)] } {
set value $keys($key)
if { [string equal -nocase $value $unit_name] } {
set_cmd_unit_scale $unit 1.0
if { [regexp "(10*)?(\[Mkmunpf\])?" $value match mult prefix] } {
set arg_suffix [string range $value [string length $match] end]
if { ![string match -nocase $arg_suffix $suffix] } {
sta_error 501 "unknown unit $unit suffix $arg_suffix."
}
if { $mult == "" } {
set mult 1
}
set scale [unit_prefix_scale $unit $prefix ]
set_cmd_unit_scale $unit $scale
} else {
set prefix [string index $value 0]
set suffix [string range $value 1 end]
# unit includes "1" prefix
if { [string is digit $prefix] } {
set prefix [string index $value 1]
set suffix [string range $value 2 end]
}
if { [string equal -nocase $suffix $unit_name] } {
set scale [unit_prefix_scale $unit $prefix]
set_cmd_unit_scale $unit $scale
} else {
sta_error 163 "unknown $unit unit '$suffix'."
}
sta_error 163 "unknown unit $unit format."
}
if [info exists keys(-digits)] {
set_cmd_unit_digits $unit $keys(-digits)

View File

@ -235,51 +235,40 @@ proc set_units { args } {
check_unit "current" -current "A" keys
check_unit "power" -power "W" keys
check_unit "distance" -distance "m" keys
check_unit "power" -power "w" keys
}
proc check_unit { unit key unit_name key_var } {
proc check_unit { unit key suffix key_var } {
upvar 1 $key_var keys
if { [info exists keys($key)] } {
set value $keys($key)
if { [string equal -nocase $value $unit_name] } {
check_unit_scale $unit 1.0
if { [regexp "(10*)?(\[Mkmunpf\])?" $value match mult prefix] } {
set arg_suffix [string range $value [string length $match] end]
if { ![string match -nocase $arg_suffix $suffix] } {
sta_error 501 "unknown unit $unit suffix $arg_suffix."
}
if { $mult == "" } {
set mult 1
}
set scale [unit_prefix_scale $unit $prefix ]
check_unit_scale $unit [expr $scale * $mult]
} else {
set prefix [string index $value 0]
set suffix [string range $value 1 end]
# unit includes "1" prefix
if { [string is digit $prefix] } {
set prefix [string index $value 1]
set suffix [string range $value 2 end]
}
if { [string equal -nocase $suffix $unit_name] } {
set scale [unit_prefix_scale $unit $prefix]
check_unit_scale $unit $scale
} else {
sta_error 343 "unknown unit $unit '$suffix'."
}
sta_error 343 "unknown unit $unit format."
}
}
}
proc unit_prefix_scale { unit prefix } {
if { [string equal $prefix "M"] } {
return 1E+6
} elseif { [string equal $prefix "k"] } {
return 1E+3
} elseif { [string equal $prefix "m"] } {
return 1E-3
} elseif { [string equal $prefix "u"] } {
return 1E-6
} elseif { [string equal $prefix "n"] } {
return 1E-9
} elseif { [string equal $prefix "p"] } {
return 1E-12
} elseif { [string equal $prefix "f"] } {
return 1E-15
} else {
sta_error 344 "unknown $unit prefix '$prefix'."
switch -exact -- $prefix {
"M" { return 1E+6 }
"k" { return 1E+3 }
"" { return 1E+0 }
"m" { return 1E-3 }
"u" { return 1E-6 }
"n" { return 1E-9 }
"p" { return 1E-12 }
"f" { return 1E-15 }
}
sta_error 344 "unknown $unit prefix '$prefix'."
}
proc check_unit_scale { unit scale } {