trinamic and persistent
- remove methods from Modules existing in secop.persistent - do reset on start when encoder matched and motor was power cycled
This commit is contained in:
parent
d06cb0414d
commit
071f933982
@ -547,60 +547,6 @@ class Module(HasAccessibles):
|
|||||||
"""
|
"""
|
||||||
mkthread(self.writeInitParams, started_callback)
|
mkthread(self.writeInitParams, started_callback)
|
||||||
|
|
||||||
def loadParameters(self):
|
|
||||||
"""load persistent parameters
|
|
||||||
|
|
||||||
:return: persistent parameters which have to be written
|
|
||||||
|
|
||||||
is called upon startup and may be called from a module
|
|
||||||
when a hardware powerdown is detected
|
|
||||||
"""
|
|
||||||
if any(pobj.persistent for pobj in self.parameters.values()):
|
|
||||||
persistentdir = os.path.join(getGeneralConfig()['logdir'], 'persistent')
|
|
||||||
self.persistentFile = os.path.join(persistentdir, '%s.%s.json' % (self.DISPATCHER.equipment_id, self.name))
|
|
||||||
else:
|
|
||||||
self.persistentFile = None
|
|
||||||
return {}
|
|
||||||
try:
|
|
||||||
with open(self.persistentFile, 'r') as f:
|
|
||||||
self.persistentData = json.load(f)
|
|
||||||
except FileNotFoundError:
|
|
||||||
self.persistentData = {}
|
|
||||||
writeDict = {}
|
|
||||||
for pname, pobj in self.parameters.items():
|
|
||||||
if pobj.persistent and pname in self.persistentData:
|
|
||||||
value = pobj.datatype.import_value(self.persistentData[pname])
|
|
||||||
try:
|
|
||||||
pobj.value = value
|
|
||||||
if not pobj.readonly:
|
|
||||||
writeDict[pname] = value
|
|
||||||
except Exception as e:
|
|
||||||
self.log.warning('can not restore %r to %r (%r)' % (pname, value, e))
|
|
||||||
return writeDict
|
|
||||||
|
|
||||||
def saveParameters(self):
|
|
||||||
"""save persistent parameters
|
|
||||||
|
|
||||||
to be called regularely explicitly by the module
|
|
||||||
"""
|
|
||||||
data = {k: v.export_value() for k, v in self.parameters.items() if v.persistent}
|
|
||||||
if data != self.persistentData:
|
|
||||||
self.persistentData = data
|
|
||||||
persistentdir = os.path.basename(self.persistentFile)
|
|
||||||
tmpfile = self.persistentFile + '.tmp'
|
|
||||||
if not os.path.isdir(persistentdir):
|
|
||||||
os.makedirs(persistentdir, exist_ok=True)
|
|
||||||
try:
|
|
||||||
with open(tmpfile, 'w') as f:
|
|
||||||
json.dump(self.persistentData, f, indent=2)
|
|
||||||
f.write('\n')
|
|
||||||
os.rename(tmpfile, self.persistentFile)
|
|
||||||
finally:
|
|
||||||
try:
|
|
||||||
os.remove(tmpfile)
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class Readable(Module):
|
class Readable(Module):
|
||||||
"""basic readable module"""
|
"""basic readable module"""
|
||||||
|
@ -127,9 +127,7 @@ class Motor(PersistentMixin, HasIodev, Drivable):
|
|||||||
fast_pollfactor = 0.001 # poll as fast as possible when busy
|
fast_pollfactor = 0.001 # poll as fast as possible when busy
|
||||||
_started = 0
|
_started = 0
|
||||||
_calcTimeout = True
|
_calcTimeout = True
|
||||||
_need_reset = False
|
_need_reset = None
|
||||||
_save_filename = None
|
|
||||||
# _try_count = 0
|
|
||||||
|
|
||||||
def comm(self, cmd, adr, value=0, bank=0):
|
def comm(self, cmd, adr, value=0, bank=0):
|
||||||
"""set or get a parameter
|
"""set or get a parameter
|
||||||
@ -229,13 +227,18 @@ class Motor(PersistentMixin, HasIodev, Drivable):
|
|||||||
writeDict = self.loadParameters()
|
writeDict = self.loadParameters()
|
||||||
self.log.info('set to previous saved values %r', writeDict)
|
self.log.info('set to previous saved values %r', writeDict)
|
||||||
# self.encoder now contains the last known (persistent) value
|
# self.encoder now contains the last known (persistent) value
|
||||||
self.fix_encoder(encoder)
|
if self._need_reset is None:
|
||||||
|
if self.status[0] == self.Status.IDLE:
|
||||||
|
# server started, power cycled and encoder value matches last one
|
||||||
|
self.reset()
|
||||||
|
else:
|
||||||
|
self.fix_encoder(encoder)
|
||||||
|
self._need_reset = True
|
||||||
|
self.status = self.Status.ERROR, 'power loss'
|
||||||
|
# or should we just fix instead of error status?
|
||||||
|
# self.set('steppos', self.steppos - self.zero, check=False)
|
||||||
self.comm(SET_GLOB_PAR, 255, 1, bank=2) # set initialized flag
|
self.comm(SET_GLOB_PAR, 255, 1, bank=2) # set initialized flag
|
||||||
self._started = 0
|
self._started = 0
|
||||||
self._need_reset = True
|
|
||||||
self.status = self.Status.ERROR, 'power loss'
|
|
||||||
# or should we just fix instead of error status?
|
|
||||||
# self.set('steppos', self.steppos - self.zero, check=False)
|
|
||||||
|
|
||||||
return encoder if abs(encoder - steppos) > self.tolerance else steppos
|
return encoder if abs(encoder - steppos) > self.tolerance else steppos
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user