Renamed type to optype in sics_config.ini so devices

like multimeters can set a data type parameter eg datype
config_edit.py uses optype instead of type
Also the listwalker is now being generated dynamically so that in the
future unavailable drivers can be moved from the list of radiobuttons.
This commit is contained in:
Ferdi Franceschini
2014-07-02 08:50:17 +10:00
parent 89edcef811
commit 87bf34c7b1
2 changed files with 136 additions and 166 deletions

View File

@@ -1,239 +1,212 @@
[12tmagnet] [12tmagnet_oxford]
desc = "12 Tesla Oxford Magnet" desc = "12 Tesla Oxford Magnet"
driver = "12tmagnet" driver = "oxford_labview"
group = implementation
id = 11
ip = 10.157.205.3
name = magnetic
port = 55001
type = B
imptype = magnetic_field imptype = magnetic_field
ip = 10.157.205.3
port = 55001
[12tmagnet_sample_insert] [12tmagnet_sample_insert]
desc = "som will be redefined as the magnet sample insert rotation. Sample stage will be renamed to somss" desc = "som will be redefined as the magnet sample insert rotation. Sample stage will be renamed to somss"
group = implementation
offifon = normal_sample_stage,eularian_cradle,small_omega
radio = samstage
imptype = motion_axis imptype = motion_axis
[Default]
cascade = sample_stage:normal_sample_stage
enabled = True
group = Configuration
[12tmagnet_setup] [12tmagnet_setup]
cascade = B1:12tmagnet,sample_stage:12tmagnet_sample_insert,T1:mercury_scpi cascade = B1:12tmagnet_oxford,sample_stage:12tmagnet_sample_insert,T1:mercury_scpi
enabled = True enabled = False
group = Configuration
onifoff = normal_sample_stage [B1]
enabled = False
implementation = 12tmagnet_oxford
name = magnet1
optype = magnetic_field
[CF1] [CF1]
cascade = T1:CF1_ls340,sample_stage:normal_sample_stage cascade = T1:CF1_ls340,sample_stage:normal_sample_stage
enabled = False enabled = False
group = Configuration
[T1]
name = tc1
enabled = True
group = Configuration Components
implementation = mercury_scpi
type = temperature
[T2]
name = tc2
enabled = False
group = Configuration Components
implementation = ls336_02
type = temperature
[T3]
name = tc3
enabled = False
group = Configuration Components
implementation = ls336_04
type = temperature
[B1]
name = magnet1
enabled = True
group = Configuration Components
implementation = 12tmagnet
type = magnetic_field
[sample_stage]
name = sample_stage
enabled = Always
group = Configuration Components
implementation = 12tmagnet_sample_insert
type = motion_axis
[CF1_ls340] [CF1_ls340]
desc = "cf1: Bottom loading cryofurnace" desc = "cf1: Bottom loading cryofurnace"
driver = "lakeshore_340" driver = "lakeshore_340"
group = implementation imptype = temperature
id = 12
ip = 10.157.205.43 ip = 10.157.205.43
name = cf1
port = 4001 port = 4001
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature [Default]
cascade = sample_stage:normal_sample_stage
enabled = True
[I1]
datype = I
enabled = False
implementation = protek_01
name = curr1
optype = multimeter
[I2]
datype = I
enabled = False
implementation = protek_02
name = curr2
optype = multimeter
[T1]
enabled = False
implementation = mercury_scpi
name = tc1
optype = temperature
[T2]
enabled = False
implementation = ls336_02
name = tc2
optype = temperature
[T3]
enabled = False
implementation = ls336_04
name = tc3
optype = temperature
[V1]
datype = V
enabled = False
implementation = protek_01
name = volts1
optype = multimeter
[V2]
datype = V
enabled = False
implementation = protek_02
name = volts2
optype = multimeter
[eularian_cradle] [eularian_cradle]
desc = "Load the Eulerian cradle configuration" desc = "Load the Eulerian cradle configuration"
group = implementation
offifon = normal_sample_stage,small_omega,12tmagnet_sample_insert
radio = samstage
imptype = motion_axis imptype = motion_axis
[ls336_01] [ls336_01]
desc = "tc1: Lakeshore 336 temperature controller" desc = "tc1: Lakeshore 336 temperature controller"
driver = "lakeshore_336" driver = "lakeshore_336"
group = implementation imptype = temperature
id = 1
ip = 10.157.205.28 ip = 10.157.205.28
name = tc1
port = 7777 port = 7777
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls336_02] [ls336_02]
desc = "tc2: Lakeshore 336 temperature controller" desc = "tc2: Lakeshore 336 temperature controller"
driver = "lakeshore_336" driver = "lakeshore_336"
group = implementation imptype = temperature
id = 2
ip = 10.157.205.29 ip = 10.157.205.29
name = tc2
port = 7777 port = 7777
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls336_04] [ls336_04]
desc = "tc3: Lakeshore 336 temperature controller" desc = "tc3: Lakeshore 336 temperature controller"
driver = "lakeshore_336" driver = "lakeshore_336"
group = implementation imptype = temperature
id = 3
ip = 10.157.205.30 ip = 10.157.205.30
name = tc3
port = 7777 port = 7777
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls336_05] [ls336_05]
desc = "tc4: Lakeshore 336 temperature controller" desc = "tc4: Lakeshore 336 temperature controller"
driver = "lakeshore_336" driver = "lakeshore_336"
group = implementation imptype = temperature
id = 4
ip = 137.157.201.21 ip = 137.157.201.21
name = tc4
port = 7777 port = 7777
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls336_06] [ls336_06]
desc = "tc5: Lakeshore 336 temperature controller" desc = "tc5: Lakeshore 336 temperature controller"
driver = "lakeshore_336" driver = "lakeshore_336"
group = implementation imptype = temperature
id = 5
ip = 137.157.201.21 ip = 137.157.201.21
name = tc5
port = 7777 port = 7777
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls336_12] [ls336_12]
desc = "tc6: Lakeshore 336 temperature controller" desc = "tc6: Lakeshore 336 temperature controller"
driver = "lakeshore_336" driver = "lakeshore_336"
group = implementation imptype = temperature
id = 6
ip = 10.157.205.31 ip = 10.157.205.31
name = tc6
port = 7777 port = 7777
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls340_01] [ls340_01]
desc = "tc7: Lakeshore 340 temperature controller" desc = "tc7: Lakeshore 340 temperature controller"
group = implementation
driver = "lakeshore_340" driver = "lakeshore_340"
id = 7 imptype = temperature
ip = 137.157.201.86 ip = 137.157.201.86
name = tc7
port = 4001 port = 4001
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[ls340_02] [ls340_02]
desc = "tc8: Lakeshore 340 temperature controller" desc = "tc8: Lakeshore 340 temperature controller"
group = implementation
driver = "lakeshore_340" driver = "lakeshore_340"
id = 8 imptype = temperature
ip = 137.157.201.86 ip = 137.157.201.86
name = tc8
port = 4002 port = 4002
terminator = \r\n terminator = \r\n
tol1 = 1.0 tol1 = 1.0
tol2 = 1.0 tol2 = 1.0
type = T
imptype = temperature
[mercury_scpi] [mercury_scpi]
desc = "tc9: Oxford Mercury temperature controller in Mercury mode" desc = "tc9: Oxford Mercury temperature controller in Mercury mode"
driver = "mercury_scpi" driver = "mercury_scpi"
group = implementation imptype = temperature
id = 9
ip = 10.157.205.5 ip = 10.157.205.5
name = tc9
port = 7020 port = 7020
terminator = \r terminator = \r
tol = 2.0 tol = 2.0
type = T
imptype = temperature
[normal_sample_stage] [normal_sample_stage]
desc = "This is the default sample stage configuration with xy translation and phi and chi tilt stages" desc = "This is the default sample stage configuration with xy translation and phi and chi tilt stages"
group = implementation
offifon = eularian_cradle,small_omega,12tmagnet_sample_insert
radio = samstage
imptype = motion_axis imptype = motion_axis
[protek_01]
desc = "Protek Multimeter"
driver = "protek"
imptype = multimeter
ip = 10.157.205.36
port = 4001
[protek_02]
desc = "Protek Multimeter"
driver = "protek"
imptype = multimeter
ip = 10.157.205.37
port = 4001
[sample_stage]
enabled = Always
implementation = normal_sample_stage
name = sample_stage
optype = motion_axis
[small_omega] [small_omega]
desc = "Load the small omega configuration" desc = "Load the small omega configuration"
group = implementation
offifon = normal_sample_stage,eularian_cradle,12tmagnet_sample_insert
radio = samstage
imptype = motion_axis imptype = motion_axis
[west4100] [west4100]
desc = "tc10: Blue furnace temperature controller" desc = "Blue furnace temperature controller"
driver = "west4100" driver = "west4100"
group = implementation
id = 10
ip = 10.157.205.19
name = tc10
type = T
imptype = temperature imptype = temperature
ip = 10.157.205.19

View File

@@ -2,7 +2,7 @@
# vim: tabstop=8 softtabstop=2 shiftwidth=2 nocin si et ft=python # vim: tabstop=8 softtabstop=2 shiftwidth=2 nocin si et ft=python
# View Screen has 3 parts # View Screen has 3 parts
# (SICS Configuration), (Configuration Components), (Component Implementation) # (Instrument Configuration), (Configuration Options), (Option Implementation)
# Uses MVC implemented as InstConfigData<M>, InstConfigView<V>, ConfigEdit<C> # Uses MVC implemented as InstConfigData<M>, InstConfigView<V>, ConfigEdit<C>
# #
# InstConfigData <>--- ConfigParser.SafeConfig # InstConfigData <>--- ConfigParser.SafeConfig
@@ -20,23 +20,6 @@
# PresentationData # PresentationData
# |--set_cfdata() # |--set_cfdata()
# TODO
# cfgini = ConfigParser.SafeConfig()
# cfgdata = InstConfigData()
# DONE presentation = PresentationData()
# cfgedit = ConfigEdit()
# DONE cf_viewer = InstConfigView()
# config = ConfigParser.SafeConfig()
# cfgdata.set_cfparse(config)
# presentation.set_cfdata(cfgdata)
# cfgedit.set_cfdata(cfgdata)
# cfgedit.set_presdata(presentation)
# cf_viewer.set_cfedit(cfgedit)
# cf_viewer.set_presdata(presentation)
#
# cf_viewer calls self.cfgedit.set_xyz_data() methods on state change
# cf_viewer
import os import os
import argparse import argparse
@@ -53,11 +36,11 @@ class InstConfigData:
configuration_dict = defaultdict(dict) configuration_dict = defaultdict(dict)
# opt_dict: dict of configuration options as defined below, # opt_dict: dict of configuration options as defined below,
# {optname:{'enabled': T/F/Always, 'imptype':type, 'selected_imp':dflt}} # {optname:{'enabled': T/F/Always, 'imptype':optype, 'selected_imp':dflt}}
opt_dict = defaultdict(dict) opt_dict = defaultdict(dict)
# imp_dict: dict of implementations indexed by type, # imp_dict: dict of implementations indexed by optype,
# {type: [impname] } # {optype: [impname] }
imp_dict = defaultdict(list) imp_dict = defaultdict(list)
def __init__(self): def __init__(self):
@@ -74,6 +57,7 @@ class InstConfigData:
stateval = True stateval = True
else: else:
stateval = False stateval = False
self.configuration_dict[s]['enabled'] = stateval self.configuration_dict[s]['enabled'] = stateval
self.configuration_dict[s]['cascade_list'] = cascade_list self.configuration_dict[s]['cascade_list'] = cascade_list
@@ -81,7 +65,7 @@ class InstConfigData:
for s in self.file_parser.sections(): for s in self.file_parser.sections():
if self.file_parser.has_option(s, 'implementation'): if self.file_parser.has_option(s, 'implementation'):
selected_imp = self.file_parser.get(s, 'implementation') selected_imp = self.file_parser.get(s, 'implementation')
imptype = self.file_parser.get(s, 'type') imptype = self.file_parser.get(s, 'optype')
enabled = self.file_parser.get(s, 'enabled').lower() enabled = self.file_parser.get(s, 'enabled').lower()
if enabled == 'always': if enabled == 'always':
stateval = True stateval = True
@@ -120,7 +104,6 @@ class InstConfigData:
self.config_filename + "." + str(idx + 1)) self.config_filename + "." + str(idx + 1))
if os.path.exists(self.config_filename): if os.path.exists(self.config_filename):
os.rename(self.config_filename, self.config_filename + ".1") os.rename(self.config_filename, self.config_filename + ".1")
return
def write_config_file(self): def write_config_file(self):
for item,dict in self.opt_dict.iteritems(): for item,dict in self.opt_dict.iteritems():
@@ -130,7 +113,7 @@ class InstConfigData:
enabled = dict['enabled'].__str__() enabled = dict['enabled'].__str__()
self.file_parser.set(item, 'enabled', enabled) self.file_parser.set(item, 'enabled', enabled)
self.file_parser.set(item, 'implementation', dict['selected_imp']) self.file_parser.set(item, 'implementation', dict['selected_imp'])
self.file_parser.set(item, 'type', dict['imptype']) self.file_parser.set(item, 'optype', dict['imptype'])
for item,dict in self.configuration_dict.iteritems(): for item,dict in self.configuration_dict.iteritems():
enabled = dict['enabled'].__str__() enabled = dict['enabled'].__str__()
self.file_parser.set(item, 'enabled', enabled) self.file_parser.set(item, 'enabled', enabled)
@@ -248,28 +231,23 @@ class InstConfigManager:
urwid.register_signal(InstConfigManager, ['focus_change']) urwid.register_signal(InstConfigManager, ['focus_change'])
for opt,dict in cfdat.opt_dict.iteritems(): for opt,dict in cfdat.opt_dict.iteritems():
self.options.append((opt, dict['imptype'])) self.options.append((opt, dict['imptype']))
imp_items = [] # imp_items = []
for imp in cfdat.imp_dict[dict['imptype']]: # for imp in cfdat.imp_dict[dict['imptype']]:
if imp == dict['selected_imp']: # if imp == dict['selected_imp']:
imp_items.append((imp, True)) # imp_items.append((imp, True))
else: # else:
imp_items.append((imp, False)) # imp_items.append((imp, False))
imp_items.sort() # imp_items.sort()
self.imp_lw_dict[opt] = RadioButtonListWalker(imp_items, on_state_change=self.imp_statechange, user_data=opt) # self.imp_lw_dict[opt] = RadioButtonListWalker(imp_items, on_state_change=self.imp_statechange, user_data=opt)
self.options.sort() self.options.sort()
# ffr Make a sacrificail listwalker imp_lw because copy.copy() # imp_items.sort()
# doesn't work for urwid on the SL6 VMs
firstopt = self.options[0][0] firstopt = self.options[0][0]
for opt,dict in cfdat.opt_dict.iteritems(): self.imp_lw = self.__gen_imp_listwalker(firstopt)
self.options.append((opt, dict['imptype'])) # self.imp_lw = RadioButtonListWalker([], on_state_change=self.imp_statechange, user_data=firstopt)
imp_items = []
imp_items.sort()
imp_lw = RadioButtonListWalker(imp_items, on_state_change=self.imp_statechange, user_data=firstopt)
self.option_lw = OptionListWalker(cfdat.opt_dict, self.opt_statechange) self.option_lw = OptionListWalker(cfdat.opt_dict, self.opt_statechange)
self.imp_lb = ImpListBox(imp_lw) self.imp_lb = ImpListBox(self.imp_lw)
urwid.connect_signal(self.option_lw, 'focus_change', self.update_imp_lb) urwid.connect_signal(self.option_lw, 'focus_change', self.update_imp_lb)
item_states = [(i,d['enabled']) for i,d in cf_dat.configuration_dict.iteritems()] item_states = [(i,d['enabled']) for i,d in cf_dat.configuration_dict.iteritems()]
@@ -277,8 +255,23 @@ class InstConfigManager:
self.cfg_lw = RadioButtonListWalker(item_states, on_state_change = self.cf_statechange) self.cfg_lw = RadioButtonListWalker(item_states, on_state_change = self.cf_statechange)
self.config_lb = OptionListBox(self.cfg_lw) self.config_lb = OptionListBox(self.cfg_lw)
self.opt_lb = OptionListBox(self.option_lw) self.opt_lb = OptionListBox(self.option_lw)
self.opt_lb.set_focus(0)
return return
def __gen_imp_listwalker(self, opt):
imp_items = []
dict = self.cfdat.opt_dict[opt]
for imp in self.cfdat.imp_dict[dict['imptype']]:
if imp == dict['selected_imp']:
imp_items.append((imp, True))
else:
imp_items.append((imp, False))
imp_items.sort()
return RadioButtonListWalker(imp_items, on_state_change=self.imp_statechange, user_data=opt)
def cf_statechange(self, button, new_state, udat=None): def cf_statechange(self, button, new_state, udat=None):
self.cfdat.cf_statechange(button, new_state, udat) self.cfdat.cf_statechange(button, new_state, udat)
b = button.get_label() b = button.get_label()
@@ -289,7 +282,10 @@ class InstConfigManager:
self.option_lw.button_dict[opt].set_state(False) self.option_lw.button_dict[opt].set_state(False)
for opt,imp in cascade: for opt,imp in cascade:
self.option_lw.button_dict[opt].set_state(True) self.option_lw.button_dict[opt].set_state(True)
self.imp_lw_dict[opt].button_dict[imp].set_state(True) imp_lw = self.__gen_imp_listwalker(opt)
imp_lw.button_dict[imp].set_state(True)
currpos = self.opt_lb.get_focus()[1]
self.opt_lb.set_focus(currpos)
dbg.msg(self.cf_msg_index, 'InstConfigManager:cf_statechange({0},{1},{2}), cascade = {3}'.format(b, new_state, udat, cascade)) dbg.msg(self.cf_msg_index, 'InstConfigManager:cf_statechange({0},{1},{2}), cascade = {3}'.format(b, new_state, udat, cascade))
self.cf_msg_index = (self.cf_msg_index - 7) % 2 + 8 self.cf_msg_index = (self.cf_msg_index - 7) % 2 + 8
@@ -305,10 +301,11 @@ class InstConfigManager:
def update_imp_lb(self, pos): def update_imp_lb(self, pos):
optname = self.options[pos][0] optname = self.options[pos][0]
type = self.options[pos][1] optype = self.options[pos][1]
mstr = 'InstConfigManager:update_imp_lb({0}) -> select {1}'.format(pos, type) mstr = 'InstConfigManager:update_imp_lb({0}) -> select {1}'.format(pos, optype)
dbg.msg(1, mstr) dbg.msg(1, mstr)
self.imp_lb.use_listwalker(self.imp_lw_dict[optname]) self.imp_lw = self.__gen_imp_listwalker(optname)
self.imp_lb.use_listwalker(self.imp_lw)
return return