From 60acb838b41be8bce2c39a0b16e0e87ec7b4d3ae Mon Sep 17 00:00:00 2001 From: Joel Bender Date: Thu, 1 Nov 2018 18:49:19 -0400 Subject: [PATCH] pass the last value down into the object and assign a value when created so the current property list has something not None --- samples/IP2VLANRouter.py | 72 ++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/samples/IP2VLANRouter.py b/samples/IP2VLANRouter.py index 45f95f0..d089da9 100755 --- a/samples/IP2VLANRouter.py +++ b/samples/IP2VLANRouter.py @@ -25,7 +25,10 @@ from bacpypes.bvllservice import BIPSimple, AnnexJCodec, UDPMultiplexer from bacpypes.app import Application from bacpypes.appservice import StateMachineAccessPoint, ApplicationServiceAccessPoint from bacpypes.local.device import LocalDeviceObject -from bacpypes.service.device import WhoIsIAmServices +from bacpypes.local.object import CurrentPropertyList +from bacpypes.service.device import ( + WhoIsIAmServices, + ) from bacpypes.service.object import ( ReadWritePropertyServices, ReadWritePropertyMultipleServices, @@ -41,6 +44,9 @@ from bacpypes.errors import ExecutionError _debug = 0 _log = ModuleLogger(globals()) +# globals +args = None + # # RandomValueProperty # @@ -63,18 +69,27 @@ class RandomValueProperty(Property): value = random.random() * 100.0 if _debug: RandomValueProperty._debug(" - value: %r", value) + # save the value that was generated + super(RandomValueProperty, self).WriteProperty(obj, value, direct=True) + + # now return it to the client return value def WriteProperty(self, obj, value, arrayIndex=None, priority=None, direct=False): if _debug: RandomValueProperty._debug("WriteProperty %r %r arrayIndex=%r priority=%r direct=%r", obj, value, arrayIndex, priority, direct) - raise ExecutionError(errorClass='property', errorCode='writeAccessDenied') + if not direct: + raise ExecutionError(errorClass='property', errorCode='writeAccessDenied') + if arrayIndex is not None: + raise ExecutionError(errorClass='property', errorCode='propertyIsNotAnArray') + + # continue along + super(RandomValueProperty, self).WriteProperty(obj, value, direct=True) # # Random Value Object Type # @bacpypes_debugging -@register_object_type(vendor_id=999) class RandomAnalogValueObject(AnalogValueObject): properties = [ @@ -85,6 +100,10 @@ class RandomAnalogValueObject(AnalogValueObject): if _debug: RandomAnalogValueObject._debug("__init__ %r", kwargs) AnalogValueObject.__init__(self, **kwargs) + # if a value hasn't already been provided, initialize with a random one + if 'presentValue' not in kwargs: + self.presentValue = random.random() * 100.0 + # # VLANApplication # @@ -94,13 +113,19 @@ class VLANApplication( Application, WhoIsIAmServices, ReadWritePropertyServices, - ReadWritePropertyMultipleServices, ): def __init__(self, vlan_device, vlan_address, aseID=None): if _debug: VLANApplication._debug("__init__ %r %r aseID=%r", vlan_device, vlan_address, aseID) + global args + + # normal initialization Application.__init__(self, vlan_device, vlan_address, aseID) + # optional read property multiple + if args.rpm: + self.add_capability(ReadWritePropertyMultipleServices) + # include a application decoder self.asap = ApplicationServiceAccessPoint() @@ -178,6 +203,8 @@ class VLANRouter: # def main(): + global args + # parse the command line arguments parser = ArgumentParser( description=__doc__, @@ -186,24 +213,36 @@ def main(): # add an argument for interval parser.add_argument('addr1', type=str, - help='address of first network', - ) + help='address of first network', + ) # add an argument for interval parser.add_argument('net1', type=int, - help='network number of first network', - ) + help='network number of first network', + ) # add an argument for interval parser.add_argument('net2', type=int, - help='network number of second network', - ) + help='network number of second network', + ) # add an argument for how many virtual devices parser.add_argument('--count', type=int, - help='number of virtual devices', - default=1, - ) + help='number of virtual devices', + default=1, + ) + + # add an argument for how many virtual devices + parser.add_argument('--rpm', + help='enable read property multiple', + action="store_true", + ) + + # add an argument for including the property list + parser.add_argument('--plist', + help='enable property list property', + action="store_true", + ) # now parse the arguments args = parser.parse_args() @@ -231,6 +270,13 @@ def main(): # send network topology deferred(router.nse.i_am_router_to_network) + # add the dynamic property list + if args.plist: + RandomAnalogValueObject.properties.append(CurrentPropertyList()) + + # register it now that all its properties are defined + register_object_type(RandomAnalogValueObject, vendor_id=999) + # make some devices for device_number in range(2, 2 + args.count): # device identifier is assigned from the address