# # Simple driver generator for the Hiden Isochema XCS vapour delivery system # vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent # driver hiden_xcs_gen = { # driver_property douglas = clowes usecreatenode = false vendor = hiden; device = xcs; protocol = std; class = environment simulation_group = environment_simulation add_args = 'terminator {tol 0.5}'; make_args = 'tol'; protocol_args = '${terminator}'; # # Unnamed group has variables at device level # group = { # group_property douglas = clowes type = float priv = user var temperature var flow1 var flow2 var flow3 var gas_factor = { value = 1.0; } var humidity = { driveable = humidity readable = 1 read_command = '?ALL DATA' read_function = read_all_data checkrange_function = chkrange_function value = 50 lowerlimit = 10 upperlimit = 90 tolerance = 5 } } # # The named group is at the device level, variables below that # group analog = { # group_property 'data' = true type = float; priv = user; readable = 1; read_function = read_sixteen; property base = 0; # applies to all following vars var pv1 = { read_command = '?AIN,0'; property span = 500; }; # ain0 var pv2 = { read_command = '?AIN,1'; property span = 500; }; # ain1 var pv3 = { read_command = '?AIN,2'; property span = 500; }; # ain2 var rhtemp = { read_command = '?AIN,8'; property span = 100; }; # ain8 var rhsense = { read_command = '?AIN,9'; property span = 100; }; # ain9 var ansto_temp = { read_command = '?AIN,12'; property span = 100; }; # ain12 writeable = 1; read_function = read_twelve; write_function = write_twelve; var sp1 = { read_command = '?AOUT,0'; write_command = '!AOUT,0,'; property span = 500; } # aout0 var sp2 = { read_command = '?AOUT,1'; write_command = '!AOUT,1,'; property span = 500; } # aout1 var sp3 = { read_command = '?AOUT,2'; write_command = '!AOUT,2,'; property span = 500; } # aout2 }; group digital = { type = int; priv = user; readable = 1; writeable = 1; read_function = read_digital; write_Function = write_digital; var dout2 = { read_command = '?DOUT,2'; write_command = '!DOUT,2,'; allowed = '0,1'; readable = 5; # property junk = junk; } } # # Code lines start with '@' which is stripped before being emitted into generated driver # The code is emitted at the appropriate place in the given function # code read_function read_digital = { @ if { [string equal -nocase -length 5 "${data}" "DOUT ="] } { @ set result [scan "${data}" "DOUT = %d OK" val] @ if { ${result} == 1 } { @ set data ${val} @ } else { @ sct geterror "Syntax error (Result=${result}) in: '${data}'" @ } @ } else { @ sct geterror "Syntax error in: '${data}'" @ } } code read_function read_twelve = { @ if { [string equal -nocase -length 5 "${data}" "AOUT ="] } { @ set result [scan "${data}" "AOUT = %d OK" val] @ if { ${result} == 1 } { @ if { [hpropexists [sct] base] } { @ set base [sct base] @ } else { @ set base 0.0 @ } @ if { [hpropexists [sct] span] } { @ set span [sct span] @ } else { @ set span 500.0 @ } @ set data [expr (${span} * (${val} - ${base})) / 4095.0] @ } else { @ sct geterror "Syntax (Result=${result}) error in: '${data}'" @ } @ } else { @ sct geterror "Syntax error in: '${data}'" @ } } code read_function read_sixteen = { @ if { [string equal -nocase -length 5 "${data}" "AIN ="] } { @ set result [scan "${data}" "AIN = %d OK" val] @ if { ${result} == 1 } { @ if { [hpropexists [sct] base] } { @ set base [sct base] @ } else { @ set base 0.0 @ } @ if { [hpropexists [sct] span] } { @ set span [sct span] @ } else { @ set span 500.0 @ } @ set data [expr (${span} * (${val} - ${base})) / 65535.0] @ } else { @ sct geterror "Syntax error (Result=${result}) in: '${data}'" @ } @ } else { @ sct geterror "Syntax error in: '${data}'" @ } } code read_function read_all_data = { @ if { [string equal -nocase -length 2 "${data}" "A "] } { @ set data_list [split [string range "${data}" 2 end-3] ','] @ if { [llength ${data_list}] == 8 } { @ set data [expr [lindex ${data_list} 0]] @ hupdate ${tc_root}/temperature [expr [lindex ${data_list} 1]] @ hupdate ${tc_root}/flow1 [expr [lindex ${data_list} 3] / [hval ${tc_root}/gas_factor]] @ hupdate ${tc_root}/flow2 [expr [lindex ${data_list} 4] / [hval ${tc_root}/gas_factor]] @ hupdate ${tc_root}/flow3 [expr [lindex ${data_list} 5] / [hval ${tc_root}/gas_factor]] @ } else { @ sct geterror "Syntax error (Result=${result}) in: '${data}'" @ } @ } else { @ sct geterror "Syntax error for read_all_data in: '${data}'" @ } } code write_function write_digital = { } code write_function write_twelve = { @ if { [hpropexists [sct] base] } { @ set base [sct base] @ } else { @ set base 0.0 @ } @ if { [hpropexists [sct] span] } { @ set span [sct span] @ } else { @ set span 500.0 @ } @ set par [expr int(${base} + (4095.0 * ${par} / ${SPAN}))] @ set cmd "${cmd_str}${par}" } # # This code is after database creation # code mkDriver = { } code chkrange_function = { @ # hooked } };