refactored, but still not good

This commit is contained in:
2021-02-12 16:09:16 +00:00
parent dda1561fb9
commit 8892b1f320
2 changed files with 58 additions and 32 deletions

View File

@ -64,22 +64,22 @@ class MorIOC(Context):
sleep(wait_time)
def serve(self, **kwargs):
# host_kwargs = {name: type(value) for name, value in kwargs.items()}
self.host(**kwargs)
self.setParams(**kwargs)
ts, vs = make_mappings(kwargs, parse_string=False)
pvdb = make_pvdb(ts)
self.createPV(pvdb)
self.setParams(**vs)
def host(self, **kwargs):
pvdb = make_pvdb(kwargs)
if pvdb:
print("new PVs", pvdb)
self.createPV(pvdb)
ts, _vs = make_mappings(kwargs, parse_string=True)
pvdb = make_pvdb(ts)
self.createPV(pvdb)
def createPV(self, pvdb):
if not pvdb:
return
print("new PVs", pvdb)
current_pvdb = self.driver.pvDB #TODO crash due to keyerror otherwise
self.server.createPV(self.prefix, pvdb)
self.driver = self.DriverClass()
@ -111,50 +111,75 @@ class MorIOC(Context):
def make_mappings(name_to_dtype_or_value, *args, **kwargs):
name_to_dtype = {}
name_to_value = {}
def make_pvdb(name_to_value):
pvdb = {}
for name, value in name_to_value.items():
for name, type_or_value in name_to_dtype_or_value.items():
name = name.upper()
dtype, value = infer_type(type_or_value, *args, **kwargs)
dtype, value = infer_type(value)
name_to_dtype[name] = dtype
name_to_value[name] = value
managed_pvs = manager.pvs["default"]
if not name in managed_pvs:
print("will create", name)
pvdb[name] = {"type": dtype}
else:
pv_type = get_managed_pv_type(name)
if pv_type != dtype:
print(f"type for {name} changed:", pv_type, "->", dtype) #TODO what should be done if this happens?
# self.deletePV(name)
# pvdb[name] = {"type": dtype}
return pvdb
return name_to_dtype, name_to_value
def infer_type(value):
def infer_type(value, parse_string=True): #TODO arrays? strings?
# str -> "string", ""
# "test" -> "string", "test"
#TODO parse_string, when?
# "string" -> "string", ""
# "float" -> "float", 0.0
# or
# "string" -> "string", "string"
# "float" -> "string", "float"
if isinstance(value, type):
dtype = value
value = dtype()
else:
dtype = type(value)
dtype = dtype if isinstance(dtype, str) else DTYPES.get(dtype, "string") #TODO default?
if parse_string and isinstance(value, str):
if value in DTYPES.values():
dtype = value
value = ""
if not isinstance(dtype, str):
dtype = DTYPES.get(dtype, "string") #TODO default?
return dtype, value
def make_pvdb(name_to_dtype):
pvdb = {}
for name, dtype in name_to_dtype.items():
if not pv_is_managed(name):
print("will create", name)
pvdb[name] = {"type": dtype}
else:
pv_type = get_managed_pv_type(name)
if pv_type != dtype:
print(f"type for {name} changed:", pv_type, "->", dtype) #TODO what should be done if this happens?
# self.deletePV(name)
# pvdb[name] = {"type": dtype}
return pvdb
def pv_is_managed(name):
managed_pvs = manager.pvs["default"]
return name in managed_pvs
def get_managed_pv_type(name):
managed_pvs = manager.pvs["default"]
pv = managed_pvs[name]
pv_type = pv.info.type
return D_AIT[pv_type]
def make_info_dict(value):
pass
#TODO:
# - if pv name already contains ":", don't prepend prefix?!

View File

@ -14,7 +14,8 @@ if __name__ == "__main__":
rand1 = random(),
rand2 = randint(100, 200),
rand3 = random() + 10,
rand4 = choice(["test", "bla", "blabla"])
rand4 = choice(["test", "bla", "blabla"]),
rand5 = "float"
)
mor.host(