Fix posname algorithm so that it works if position lists are in descending order.
This commit is contained in:
@ -57,7 +57,8 @@ foreach pos {27 55 84 114 146 179 213 248 288 333} {
|
|||||||
}
|
}
|
||||||
sapmot positions {*}$poslist
|
sapmot positions {*}$poslist
|
||||||
sapmot position_names D2.5 D5 D7.5 D10 D12.5 D15 D17.5 D20 D30 D40
|
sapmot position_names D2.5 D5 D7.5 D10 D12.5 D15 D17.5 D20 D30 D40
|
||||||
sapmot precision 0.001
|
sapmot precision 0.002
|
||||||
|
sapmot creep_offset 0.1
|
||||||
# TODO implement target
|
# TODO implement target
|
||||||
::utility::macro::getset text sample_aperture { {target "NONE"} } {
|
::utility::macro::getset text sample_aperture { {target "NONE"} } {
|
||||||
return "sample_aperture = [SplitReply [posname sapmot]]"
|
return "sample_aperture = [SplitReply [posname sapmot]]"
|
||||||
@ -93,43 +94,70 @@ proc filter_non_numeric {retval} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proc posname {pmot} {
|
proc posname {pmot} {
|
||||||
set pos [ SplitReply [$pmot] ]
|
|
||||||
set tol [ SplitReply [$pmot precision] ]
|
|
||||||
set pnames [SplitReply [$pmot position_names]]
|
set pnames [SplitReply [$pmot position_names]]
|
||||||
|
if {[string len $pnames] == ""} {
|
||||||
|
error "[info level 0]: This motor does not have named positions."
|
||||||
|
}
|
||||||
set positions [SplitReply [$pmot positions]]
|
set positions [SplitReply [$pmot positions]]
|
||||||
set first_pos [lindex $positions 0]
|
if {[string len $positions] == ""} {
|
||||||
set last_pos [lindex $positions end]
|
error "[info level 0]: This motor does not have a list of positions."
|
||||||
|
}
|
||||||
|
|
||||||
if { [llength $pnames] != [llength $positions] } {
|
if { [llength $pnames] != [llength $positions] } {
|
||||||
error "[info level 0]: Name list and position list are not the same size"
|
error "[info level 0]: Name list and position list are not the same size"
|
||||||
} else {
|
|
||||||
if { [llength $pnames] < 1} {
|
|
||||||
error "[info level 0]: Motor $pmot does not have a list of positions"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if { [expr abs($pos - $first_pos)] < $tol } {
|
|
||||||
set named_pos [lindex $pnames 0]
|
|
||||||
} elseif {$pos < $first_pos} {
|
|
||||||
set named_pos "before_[lindex $pnames 0]"
|
|
||||||
}
|
|
||||||
if {[expr abs($pos - $last_pos)] < $tol} {
|
|
||||||
set named_pos [lindex $pnames end]
|
|
||||||
} elseif {$pos > $last_pos} {
|
|
||||||
set named_pos "after_[lindex $pnames end]"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set next_index 1
|
set pos [ SplitReply [$pmot] ]
|
||||||
foreach name [lrange $pnames 0 end-1] posit [lrange $positions 0 end-1] {
|
set tol [ SplitReply [$pmot precision] ]
|
||||||
|
set first_pos [lindex $positions 0]
|
||||||
|
set last_pos [lindex $positions end]
|
||||||
|
if {$last_pos < $first_pos} {
|
||||||
|
set p $last_pos
|
||||||
|
set last_pos $first_pos
|
||||||
|
set first_pos $p
|
||||||
|
set lstart [expr [llength $positions] - 1]
|
||||||
|
set lend 0
|
||||||
|
} else {
|
||||||
|
set lstart 0
|
||||||
|
set lend [expr [llength $positions] - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
if { [expr abs($pos - $first_pos)] < $tol } {
|
||||||
|
set named_pos [lindex $pnames $lstart]
|
||||||
|
return "$pmot = $named_pos"
|
||||||
|
} elseif {$pos < $first_pos} {
|
||||||
|
set named_pos "before_[lindex $pnames $lstart]"
|
||||||
|
return "$pmot = $named_pos"
|
||||||
|
}
|
||||||
|
if {[expr abs($pos - $last_pos)] < $tol} {
|
||||||
|
set named_pos [lindex $pnames $lend]
|
||||||
|
return "$pmot = $named_pos"
|
||||||
|
} elseif {$pos > $last_pos} {
|
||||||
|
set named_pos "after_[lindex $pnames $lend]"
|
||||||
|
return "$pmot = $named_pos"
|
||||||
|
}
|
||||||
|
|
||||||
|
set prev_posit [lindex $positions 0]
|
||||||
|
set prev_name [lindex $pnames 0]
|
||||||
|
if {[expr abs($pos - $prev_posit)] <= $tol} {
|
||||||
|
return "$pmot = $prev_name"
|
||||||
|
}
|
||||||
|
foreach name [lrange $pnames 1 end] posit [lrange $positions 1 end] {
|
||||||
if {[expr abs($pos - $posit)] <= $tol} {
|
if {[expr abs($pos - $posit)] <= $tol} {
|
||||||
set named_pos $name
|
set named_pos $name
|
||||||
break
|
return "$pmot = $named_pos"
|
||||||
} elseif {$pos > [expr {$posit + $tol}] && $pos < [expr {[lindex $positions $next_index] - $tol}]} {
|
} else {
|
||||||
set named_pos "between_${name}_[lindex $pnames $next_index]"
|
set diff1 [expr $prev_posit - $pos]
|
||||||
break
|
set diff2 [expr $posit - $pos]
|
||||||
|
if { [expr $diff1 * $diff2] < 0 } {
|
||||||
|
set named_pos "between_${name}_${prev_name}"
|
||||||
|
return "$pmot = $named_pos"
|
||||||
}
|
}
|
||||||
incr next_index
|
|
||||||
}
|
}
|
||||||
return "$pmot = $named_pos"
|
set prev_posit $posit
|
||||||
|
set prev_name $name
|
||||||
|
}
|
||||||
|
return $pmot = posname_unknown
|
||||||
}
|
}
|
||||||
publish posname user
|
publish posname user
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user