# # Simple driver generator for the non-motor galil controls on mc8 # vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent # driver tank = { vendor = galil; device = mc8; protocol = dmc2280; class = instrument simulation_group = motor_simulation # # Unnamed group has variables at device level # # # The named group is at the device level, variables below that # group = { var pos = { type = float; priv = spy; mutable = true; readable = 1; read_function = read_pos; read_command = 'MG _TPH'; } } group switches = { type = text; priv = user; readable = 1; read_function = read_switch; var forward = { read_command = 'MG @IN[5]' } var reverse = { read_command = 'MG @IN[6]' } }; group limits = { type = text; priv = user; readable = 1; read_function = read_switch; var forward = { read_command = 'MG _LFH' } var reverse = { read_command = 'MG _LRH' } }; # # Code lines start with '@' which is stripped before being emitted # The code is emitted at the appropriate place in the given function # code read_function read_switch = { @ if { [string equal -nocase -length 1 "${data}" "?"] } { @ sct geterror "Galil error in: '${data}'" @ } else { @ set data_list [split [string trim "${data}"]] @ if { [llength ${data_list}] > 1 && [lindex ${data_list} end] == ":" } { @ set data_list [lrange ${data_list} 0 0] @ } @ if { [llength ${data_list}] == 1 } { @ set left [expr [lindex ${data_list} 0]] @ if { ${left} == 1 } { # open @ set data "open" @ } else { # closed @ set data "closed" @ } @ } else { @ sct geterror "Syntax error in: '${data}'=>'${data_list}'" @ } @ } } code read_function read_pos = { @ global tank_absenchome tank_cnts_per_x tank_home @ if { [string equal -nocase -length 1 "${data}" "?"] } { @ sct geterror "Galil error in: '${data}'" @ } else { @ set data_list [split [string trim "${data}"]] @ if { [llength ${data_list}] > 1 && [lindex ${data_list} end] == ":" } { @ set data_list [lrange ${data_list} 0 0] @ } @ if { [llength ${data_list}] == 1 } { @ set absenc [unpad [lindex ${data_list} 0]] @ set data [expr {($absenc - $tank_absenchome) / $tank_cnts_per_x + $tank_home}] @ vessel_y $data @ } else { @ sct geterror "Syntax error in: '${data}'=>'${data_list}'" @ } @ } } # # This code is after database creation # code mkDriver = { @ ::utility::mkVar vessel_y float user vessel_y true instrument true true } };