Unify error handling (a little more)
Change-Id: I81184c64aa4d51d0838df62269eace9e44b511da
This commit is contained in:
@ -201,50 +201,49 @@ class Dispatcher(object):
|
||||
self.log.debug('-> device is not to be exported!')
|
||||
return {}
|
||||
|
||||
# demo stuff
|
||||
def _setDeviceValue(self, devobj, value):
|
||||
# set the device value. return readback value
|
||||
# if return == None -> Ellispis (readonly!)
|
||||
if self._getDeviceParam(devobj, 'target') != Ellipsis:
|
||||
return self._setDeviceParam(devobj, 'target', value)
|
||||
return Ellipsis
|
||||
def _setParamValue(self, devname, pname, value):
|
||||
devobj = self.get_device(devname)
|
||||
if devobj is None:
|
||||
return NoSuchDeviceError(devname)
|
||||
|
||||
def _getDeviceValue(self, devobj):
|
||||
# get the device value
|
||||
# if return == None -> Ellipsis
|
||||
return self._getDeviceParam(devobj, 'value')
|
||||
|
||||
def _setDeviceParam(self, devobj, pname, value):
|
||||
# set the device param. return readback value
|
||||
# if return == None -> Ellipsis (readonly!)
|
||||
pobj = devobj.PARAMS.get(pname, Ellipsis)
|
||||
if pobj == Ellipsis:
|
||||
return pobj
|
||||
pobj = getattr(devobj.PARAMS, pname, None)
|
||||
if pobj is None:
|
||||
return NoSuchParamError(devname, pname)
|
||||
if pobj.readonly:
|
||||
return self._getDeviceParam(devobj, pname)
|
||||
return ParamReadonlyError(devname, pname)
|
||||
|
||||
writefunc = getattr(devobj, 'write_%s' % pname, None)
|
||||
validator = pobj.validator
|
||||
value = validator(value)
|
||||
try:
|
||||
if writefunc:
|
||||
value = writefunc(value)
|
||||
else:
|
||||
setattr(devobj, pname, value)
|
||||
except ValueError:
|
||||
return InvalidParamValueError(devname, pname, value, e)
|
||||
except Exception as e:
|
||||
return InternalError(e)
|
||||
|
||||
if writefunc:
|
||||
value = writefunc(value) or value
|
||||
else:
|
||||
setattr(devobj, pname, value)
|
||||
return WriteParamReply(devname, pname, pobj.value, timestamp=pobj.timestamp)
|
||||
|
||||
return self._getDeviceParam(devobj, pname)
|
||||
def _getParamValue(self, devname, pname):
|
||||
devobj = self.get_device(devname)
|
||||
if devobj is None:
|
||||
return NoSuchDeviceError(devname)
|
||||
|
||||
pobj = devobj.PARAMS.get(pname, None)
|
||||
if pobj is None:
|
||||
return NoSuchParamError(devname, pname)
|
||||
|
||||
def _getDeviceParam(self, devobj, pname):
|
||||
# get the device value
|
||||
# if return == None -> Ellipsis
|
||||
readfunc = getattr(devobj, 'read_%s' % pname, None)
|
||||
if readfunc:
|
||||
# should also update the pobj (via the setter from the metaclass)
|
||||
readfunc()
|
||||
pobj = devobj.PARAMS.get(pname, None)
|
||||
if pobj:
|
||||
return (pobj.value, pobj.timestamp)
|
||||
return getattr(devobj, pname, Ellipsis)
|
||||
try:
|
||||
readfunc()
|
||||
except Exception as e:
|
||||
return InternalError(e)
|
||||
return ReadParamReply(devname, pname, pobj.value, timestamp=pobj.timestamp)
|
||||
|
||||
# demo stuff
|
||||
def handle_Demo(self, conn, msg):
|
||||
novalue = msg.novalue
|
||||
devname = msg.devname
|
||||
@ -344,7 +343,7 @@ class Dispatcher(object):
|
||||
except TypeError as e:
|
||||
return InternalError(e)
|
||||
|
||||
# now clean responce a little
|
||||
# now clean responce a little and sort value to top....
|
||||
res = [
|
||||
e.replace(
|
||||
'/v=',
|
||||
@ -361,106 +360,52 @@ class Dispatcher(object):
|
||||
def handle_ListDevices(self, conn, msg):
|
||||
# XXX: What about the descriptive data????
|
||||
# XXX: choose!
|
||||
return ListDevicesReply(self.list_device_names())
|
||||
# return ListDevicesReply(*self.list_devices())
|
||||
# return ListDevicesReply(self.list_device_names())
|
||||
return ListDevicesReply(*self.list_devices())
|
||||
|
||||
def handle_ListDeviceParams(self, conn, msg):
|
||||
# reply with a list of the parameter names for a given device
|
||||
self.log.error('Keep: ListDeviceParams')
|
||||
if msg.device in self._dispatcher_export:
|
||||
params = self.list_device_params(msg.device)
|
||||
return ListDeviceParamsReply(msg.device, params.keys())
|
||||
devname = msg.device
|
||||
if devname in self._dispatcher_export:
|
||||
params = self.list_device_params(devname).keys()
|
||||
return ListDeviceParamsReply(devname, params)
|
||||
else:
|
||||
return NoSuchDeviceError(msg.device)
|
||||
return NoSuchDeviceError(device)
|
||||
|
||||
def handle_ReadAllDevices(self, conn, msg):
|
||||
# reply with a bunch of ReadValueReplies, reading ALL devices
|
||||
result = []
|
||||
for devname in sorted(self.list_device_names()):
|
||||
devobj = self.get_device(devname)
|
||||
value = self._getdeviceValue(devobj)
|
||||
if value is not Ellipsis:
|
||||
result.append(ReadValueReply(devname, value,
|
||||
timestamp=time.time()))
|
||||
value = self._getParamValue(devname, 'value')
|
||||
result.append(value)
|
||||
return ReadAllDevicesReply(readValueReplies=result)
|
||||
|
||||
def handle_ReadValue(self, conn, msg):
|
||||
devname = msg.device
|
||||
devobj = self.get_device(devname)
|
||||
if devobj is None:
|
||||
return NoSuchDeviceError(devname)
|
||||
|
||||
value = self._getdeviceValue(devname)
|
||||
if value is not Ellipsis:
|
||||
return ReadValueReply(devname, value,
|
||||
timestamp=time.time())
|
||||
|
||||
return InternalError('undefined device value')
|
||||
res = self._getParamValue(devname, 'value')
|
||||
if not isinstance(res, ReadParamReply):
|
||||
return res
|
||||
return WriteValueReply(devname, res.value, res.timestamp)
|
||||
|
||||
def handle_WriteValue(self, conn, msg):
|
||||
value = msg.value
|
||||
devname = msg.device
|
||||
devobj = self.get_device(devname)
|
||||
if devobj is None:
|
||||
return NoSuchDeviceError(devname)
|
||||
|
||||
pobj = getattr(devobj.PARAMS, 'target', None)
|
||||
if pobj is None:
|
||||
return NoSuchParamError(devname, 'target')
|
||||
|
||||
if pobj.readonly:
|
||||
return ParamReadonlyError(devname, 'target')
|
||||
|
||||
validator = pobj.validator
|
||||
try:
|
||||
value = validator(value)
|
||||
except Exception as e:
|
||||
return InvalidParamValueError(devname, 'target', value, e)
|
||||
|
||||
value = self._setDeviceValue(devobj, value) or value
|
||||
WriteValueReply(devname, value, timestamp=time.time())
|
||||
res = self._setParamValue(devname, 'target', value)
|
||||
if not isinstance(res, WriteParamReply):
|
||||
return res
|
||||
return WriteValueReply(devname, res.value, res.timestamp)
|
||||
|
||||
def handle_ReadParam(self, conn, msg):
|
||||
devname = msg.device
|
||||
pname = msg.param
|
||||
devobj = self.get_device(devname)
|
||||
if devobj is None:
|
||||
return NoSuchDeviceError(devname)
|
||||
|
||||
pobj = getattr(devobj.PARAMS, pname, None)
|
||||
if pobj is None:
|
||||
return NoSuchParamError(devname, pname)
|
||||
|
||||
value = self._getdeviceParam(devobj, pname)
|
||||
if value is not Ellipsis:
|
||||
return ReadParamReply(devname, pname, value,
|
||||
timestamp=time.time())
|
||||
|
||||
return InternalError('undefined device value')
|
||||
return self._getParamValue(devname, pname)
|
||||
|
||||
def handle_WriteParam(self, conn, msg):
|
||||
value = msg.value
|
||||
pname = msg.param
|
||||
devname = msg.device
|
||||
devobj = self.get_device(devname)
|
||||
if devobj is None:
|
||||
return NoSuchDeviceError(devname)
|
||||
|
||||
pobj = getattr(devobj.PARAMS, pname, None)
|
||||
if pobj is None:
|
||||
return NoSuchParamError(devname, pname)
|
||||
|
||||
if pobj.readonly:
|
||||
return ParamReadonlyError(devname, pname)
|
||||
|
||||
validator = pobj.validator
|
||||
try:
|
||||
value = validator(value)
|
||||
except Exception as e:
|
||||
return InvalidParamValueError(devname, pname, value, e)
|
||||
|
||||
value = self._setDeviceParam(devobj, pname, value) or value
|
||||
WriteParamReply(devname, pname, value, timestamp=time.time())
|
||||
return self._setParamValue(devname, pname, value)
|
||||
|
||||
# XXX: !!!
|
||||
def handle_RequestAsyncData(self, conn, msg):
|
||||
|
@ -162,7 +162,7 @@ class vector(object):
|
||||
if len(args) != len(self.validators):
|
||||
raise ValueError('Vector: need exactly %d elementes (got %d)' %
|
||||
len(self.validators), len(args))
|
||||
return [v(e) for v, e in zip(self.validators, args)]
|
||||
return tuple(v(e) for v, e in zip(self.validators, args))
|
||||
|
||||
def __repr__(self):
|
||||
return ('%s(%s)' % (self.__class__.__name__, self.argstr))
|
||||
|
Reference in New Issue
Block a user