From 47c92518a9bfdb58880fd05f7f56c3206828711c Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Thu, 6 Nov 2014 12:54:21 +1100 Subject: [PATCH] Make protocol_args like {add,make}_args and add nosctcontroller in read_config --- site_ansto/instrument/util/gen_sct.py | 137 +++++++++++++++++--------- 1 file changed, 91 insertions(+), 46 deletions(-) diff --git a/site_ansto/instrument/util/gen_sct.py b/site_ansto/instrument/util/gen_sct.py index ae5afc2c..07c241d0 100755 --- a/site_ansto/instrument/util/gen_sct.py +++ b/site_ansto/instrument/util/gen_sct.py @@ -933,6 +933,13 @@ def build_driver(MyDriver, TheTree): arg_map = MyDriver['make_args_map'] for arg in arg_map: print ' %s:' % arg, arg_map[arg] + if 'protocol_args' in MyDriver: + MyDriver['protocol_args_lst'], MyDriver['protocol_args_map'] = parse_args(MyDriver['protocol_args']) + if Verbose: + print "PROTOCOL_ARGS:", MyDriver['protocol_args'] + arg_map = MyDriver['protocol_args_map'] + for arg in arg_map: + print ' %s:' % arg, arg_map[arg] if 'add_args_lst' in MyDriver and 'make_args_lst' in MyDriver: if MyDriver['add_args_lst'] != MyDriver['make_args_lst']: print "Add_Args:", MyDriver['add_args_lst'] @@ -999,6 +1006,8 @@ def dump_driver(MyDriver): Comments += ['add_args_map'] Comments += ['make_args_lst'] Comments += ['make_args_map'] + Comments += ['protocol_args_lst'] + Comments += ['protocol_args_map'] Deferred = ['Groups', 'Funcs', 'Deferred', 'name'] + Comments for Comment in sorted(Comments): if Comment in MyDriver: @@ -1639,9 +1648,18 @@ def put_add_driver(MyDriver): txt += [' makesctcontroller sct_${name} aqadapter ${tcp_port}'] txt += [' } else {'] if 'protocol_args' in MyDriver: - protocol_args = MyDriver['protocol_args'].replace('\\', '\\\\').replace('"', '\\"') - txt += [' %s::sics_log 9 "makesctcontroller sct_${name} %s ${ip_address}:${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['protocol'], protocol_args)] - txt += [' makesctcontroller sct_${name} %s ${ip_address}:${tcp_port} %s' % (MyDriver['protocol'], MyDriver['protocol_args'])] + protocol_args = [] + for arg in MyDriver['protocol_args_lst']: + if 'add_args_lst' in MyDriver and arg in MyDriver['add_args_lst']: + protocol_args.append('${%s}' % arg) + elif arg in MyDriver['protocol_args_map'] and MyDriver['protocol_args_map'][arg] is not None: + protocol_args.append(MyDriver['protocol_args_map'][arg]) + else: + PrintPostError('Protocol arg %s is not in add_args and has no default' % arg) + tmp = ' '.join(protocol_args).replace('\\', '\\\\').replace('"', '\\"') + txt += [' %s::sics_log 9 "makesctcontroller sct_${name} %s ${ip_address}:${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['protocol'], tmp)] + tmp = ' '.join(protocol_args) + txt += [' makesctcontroller sct_${name} %s ${ip_address}:${tcp_port} %s' % (MyDriver['protocol'], tmp)] else: txt += [' %s::sics_log 9 "makesctcontroller sct_${name} %s ${ip_address}:${tcp_port}"' % (MyDriver['namespace'], MyDriver['protocol'])] txt += [' makesctcontroller sct_${name} %s ${ip_address}:${tcp_port}' % MyDriver['protocol']] @@ -1732,50 +1750,77 @@ def put_read_config(MyDriver): txt += [' continue'] txt += [' }'] txt += [' if { [string equal -nocase [dict get $v "driver"] "%s"] } {' % MyDriver['name']] - txt += [' if { ![string equal -nocase "${simulation_flag}" "false"] } {'] - txt += [' set asyncqueue "null"'] - txt += [' ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue"'] - txt += [' ${ns}::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL"'] - txt += [' makesctcontroller sct_${name} aqadapter NULL'] - txt += [' } elseif { [dict exists $v "asyncqueue"] } {'] - txt += [' set asyncqueue [dict get $v "asyncqueue"]'] - txt += [' if { [string equal -nocase ${asyncqueue} "sct"] } {'] - txt += [' set ip_address [dict get $v ip]'] - txt += [' set tcp_port [dict get $v port]'] - if 'protocol_args' in MyDriver: - protocol_args = ' ' + MyDriver['protocol_args'] + if ('WrapperProperty' in MyDriver) and ('nosctcontroller' in MyDriver['WrapperProperty']): + txt += [' %s::sics_log 9 "No sctcontroller for %s"' % (MyDriver['namespace'], MyDriver['name'])] else: - protocol_args = '' - txt += [' makesctcontroller sct_${name} %s ${ip_address}:${tcp_port} %s' % (MyDriver['protocol'], protocol_args)] - txt += [' } else {'] - txt += [' makesctcontroller sct_${name} aqadapter ${asyncqueue}'] - txt += [' }'] - txt += [' } else {'] - txt += [' if { [dict exists $v "asyncprotocol"] } {'] - txt += [' set asyncprotocol [dict get $v "asyncprotocol"]'] - txt += [' } else {'] - txt += [' set asyncprotocol ${name}_protocol'] - txt += [' MakeAsyncProtocol ${asyncprotocol}'] - txt += [' if { [dict exists $v "sendterminator"] } {'] - txt += [' ${asyncprotocol} sendterminator "[dict get $v "sendterminator"]"'] - txt += [' } elseif { [dict exists $v "terminator"] } {'] - txt += [' ${asyncprotocol} sendterminator "[dict get $v "terminator"]"'] - txt += [' }'] - txt += [' if { [dict exists $v "replyterminator"] } {'] - txt += [' ${asyncprotocol} replyterminator "[dict get $v "replyterminator"]"'] - txt += [' } elseif { [dict exists $v "terminator"] } {'] - txt += [' ${asyncprotocol} replyterminator "[dict get $v "terminator"]"'] - txt += [' }'] - txt += [' }'] - txt += [' set asyncqueue ${name}_queue'] - txt += [' set ip_address [dict get $v ip]'] - txt += [' set tcp_port [dict get $v port]'] - txt += [' MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port}'] - txt += [' if { [dict exists $v "timeout"] } {'] - txt += [' ${asyncqueue} timeout "[dict get $v "timeout"]"'] - txt += [' }'] - txt += [' makesctcontroller sct_${name} aqadapter ${asyncqueue}'] - txt += [' }'] + txt += [' if { ![string equal -nocase "${simulation_flag}" "false"] } {'] + txt += [' set asyncqueue "null"'] + txt += [' ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue"'] + txt += [' ${ns}::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL"'] + txt += [' makesctcontroller sct_${name} aqadapter NULL'] + txt += [' } elseif { [dict exists $v "asyncqueue"] } {'] + txt += [' set asyncqueue [dict get $v "asyncqueue"]'] + txt += [' if { [string equal -nocase ${asyncqueue} "sct"] } {'] + txt += [' set ip_address [dict get $v ip]'] + txt += [' set tcp_port [dict get $v port]'] + if 'protocol_args_lst' in MyDriver: + txt += [' set arg_list [list]'] + txt += [' set missing_list [list]'] + default_list = [] + for arg in [key for key in MyDriver['protocol_args_lst'] if MyDriver['protocol_args_map'][key] is not None]: + default_list += [arg, MyDriver['protocol_args_map'][arg]] + if len(default_list) > 0: + txt += [' array unset default_map'] + txt += [' array set default_map [list %s]' % ' '.join(default_list)] + txt += [' foreach arg {' + ' '.join(MyDriver['protocol_args_lst']) + '} {'] + txt += [' if {[dict exists $u $arg]} {'] + txt += [' lappend arg_list "[dict get $u $arg]"'] + txt += [' } elseif {[dict exists $v $arg]} {'] + txt += [' lappend arg_list "[dict get $v $arg]"'] + if len(default_list) > 0: + txt += [' } elseif {[info exists default_map($arg)]} {'] + txt += [' lappend arg_list $default_map($arg)'] + txt += [' } else {'] + txt += [' ${ns}::sics_log 9 "Missing configuration value $arg"'] + txt += [' lappend missing_list $arg'] + txt += [' }'] + txt += [' }'] + txt += [' if { [llength $missing_list] > 0 } {'] + txt += [' error "$name is missing configuration values $missing_list"'] + txt += [' }'] + protocol_args = ' {*}$arg_list' + else: + protocol_args = '' + txt += [' makesctcontroller sct_${name} %s ${ip_address}:${tcp_port}%s' % (MyDriver['protocol'], protocol_args)] + txt += [' } else {'] + txt += [' makesctcontroller sct_${name} aqadapter ${asyncqueue}'] + txt += [' }'] + txt += [' } else {'] + txt += [' if { [dict exists $v "asyncprotocol"] } {'] + txt += [' set asyncprotocol [dict get $v "asyncprotocol"]'] + txt += [' } else {'] + txt += [' set asyncprotocol ${name}_protocol'] + txt += [' MakeAsyncProtocol ${asyncprotocol}'] + txt += [' if { [dict exists $v "sendterminator"] } {'] + txt += [' ${asyncprotocol} sendterminator "[dict get $v "sendterminator"]"'] + txt += [' } elseif { [dict exists $v "terminator"] } {'] + txt += [' ${asyncprotocol} sendterminator "[dict get $v "terminator"]"'] + txt += [' }'] + txt += [' if { [dict exists $v "replyterminator"] } {'] + txt += [' ${asyncprotocol} replyterminator "[dict get $v "replyterminator"]"'] + txt += [' } elseif { [dict exists $v "terminator"] } {'] + txt += [' ${asyncprotocol} replyterminator "[dict get $v "terminator"]"'] + txt += [' }'] + txt += [' }'] + txt += [' set asyncqueue ${name}_queue'] + txt += [' set ip_address [dict get $v ip]'] + txt += [' set tcp_port [dict get $v port]'] + txt += [' MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port}'] + txt += [' if { [dict exists $v "timeout"] } {'] + txt += [' ${asyncqueue} timeout "[dict get $v "timeout"]"'] + txt += [' }'] + txt += [' makesctcontroller sct_${name} aqadapter ${asyncqueue}'] + txt += [' }'] if 'make_args_lst' in MyDriver: txt += [' set arg_list [list]'] txt += [' set missing_list [list]']