'''
Peripheral class - encapsulates a device, used in an app actor
Created on Jan 6, 2017
@author: riaps
'''
'''
Part class
Created on Oct 9, 2016
@author: run
'''
from enum import Enum
from .exc import StateError
from .exc import SetupError
from .exc import ControlError
from .exc import BuildError
import logging
[docs]class Peripheral(object):
'''
Peripheral class to encapsulate access to a device component
Note: implements a public interface compatible with a part
'''
[docs] class State(Enum): # Component state codes
Starting = 0
Initial = 1
Ready = 2
Active = 3
Checkpointing = 4
Inactive = 5
Passive = 6
Destroyed = 7
_mods = {}
@property
def mods(self):
return self._mods
@mods.setter
def mods(self, val):
self._mods = val
def __init__(self, parentActor, iTypeDef, iName, iTypeName, iArgs):
'''
Construct the Peripheral object
'''
self.logger = logging.getLogger(__name__)
self.logger.info("building device component %s:%s" % (iName, iTypeName))
self.state = Peripheral.State.Starting
self.name = iName
self.parent = parentActor
self.type = iTypeDef
self.typeName = self.type['name']
self.args = iArgs
self.state = Peripheral.State.Initial
[docs] def getControl(self):
return None
[docs] def setup(self):
'''
Set up the peripheral and change its state to Ready
'''
if self.state != Peripheral.State.Initial:
raise StateError("Invalid state %s in setup()" % self.state)
self.logger.info("setting up device component")
# Ask parent actor to contact devm to start our dca
msg = (self.typeName, self.name, self.args)
_resp = self.parent.requestDevice(msg)
self.state = Peripheral.State.Ready
[docs] def handlePortUpdate(self, _portName, _host, _port):
'''
Handle an update message coming from the devm service
'''
self.logger.error("Peripheral.handlePortUpdate() called")
raise StateError("Peripheral does not implement portUpdate")
[docs] def activate(self):
'''
Activate this peripheral
'''
if not self.state in (Peripheral.State.Ready, Peripheral.State.Passive, Peripheral.State.Inactive):
raise StateError("Invalid state %s in activate()" % self.state)
# Now we are active
self.state = Peripheral.State.Active
[docs] def deactivate(self):
if self.state != Peripheral.State.Active:
raise StateError("Invalid state %s in deactivate()" % self.state)
# Now we are inactive
self.state = Peripheral.State.Inactive
[docs] def passivate(self):
if self.state != Peripheral.State.Active:
raise StateError("Invalid state %s in passivate()" % self.state)
# self.sendControl("passivate",-1) # Send passivate command to component thread
self.state = Peripheral.State.Passive
[docs] def reactivate(self):
if self.state != Peripheral.State.Ready:
raise StateError("Invalid state %s in reactivate()" % self.state)
self.state = Peripheral.State.Active
[docs] def checkpoint(self):
if self.state != Peripheral.State.Active:
raise StateError("Invalid state %s in checkpoint()" % self.state)
# Checkpoint
[docs] def destroy(self):
if self.state == Peripheral.State.Destroyed:
raise StateError("Invalid state %s in destroy()" % self.state)
# Destroy thread
[docs] def handleReinstate(self):
pass
[docs] def handleCPULimit(self):
# Peripheral devices are just placeholders
# for the device components that live inside
# device actors.
pass
[docs] def handleMemLimit(self):
pass
[docs] def handleSpcLimit(self):
pass
[docs] def handleNetLimit(self):
pass
[docs] def handleNICStateChange(self, state):
pass
[docs] def handlePeerStateChange(self, state, uuid):
pass
[docs] def terminate(self):
self.logger.info("terminating %s" % self.typeName)
msg = (self.typeName,self.name)
resp = self.parent.releaseDevice(msg)
self.logger.info("terminating %s" % self.typeName)