From 972b1a3e0baa0cedd8b46b3d29c1adef0f2ea873 Mon Sep 17 00:00:00 2001 From: bebopagogo Date: Sun, 22 May 2022 21:52:45 -0400 Subject: [PATCH] fixes to pynorm for Python3 and normMsgr.py and normFileSend.py examples --- examples/normSocket.h | 2 +- examples/python/normFileSend.py | 14 +++++++------- examples/python/normMsgr.py | 6 ++++-- src/common/normNode.cpp | 2 +- src/common/normObject.cpp | 1 + src/common/normSession.cpp | 2 +- src/pynorm/core.py | 4 ++-- src/pynorm/instance.py | 17 +++++++++++------ src/pynorm/session.py | 32 ++++++++++++++++---------------- 9 files changed, 44 insertions(+), 36 deletions(-) diff --git a/examples/normSocket.h b/examples/normSocket.h index 201cad3..136a5fb 100644 --- a/examples/normSocket.h +++ b/examples/normSocket.h @@ -119,7 +119,7 @@ typedef enum NormSocketEventType } NormSocketEventType; -// Right now, these options MUST be set after NormOpen() +// Right now, these options MUST be set _after_ NormOpen() // but _before_ NormConnect() or NormListen() // (This will be expanded, perhaps to include parameters // that can be changed after connection setup) diff --git a/examples/python/normFileSend.py b/examples/python/normFileSend.py index 750d21e..e652de3 100755 --- a/examples/python/normFileSend.py +++ b/examples/python/normFileSend.py @@ -10,7 +10,7 @@ from random import randint import pynorm USAGE = 'usage: %s [options] ' % sys.argv[0] -DEFAULT_ADDR = '224.1.2.3' +DEFAULT_ADDR = u'224.1.2.3' DEFAULT_PORT = 6003 def get_option_parser(): @@ -29,7 +29,7 @@ def main(argv): (opts, args) = get_option_parser().parse_args(argv) if len(args) != 2: - print get_option_parser().get_usage() + print(get_option_parser().get_usage()) return 1 filepath = os.path.abspath(args[1]) @@ -40,23 +40,23 @@ def main(argv): session = instance.createSession(opts.address, opts.port) if opts.iface: session.setMulticastInterface(opts.iface) - session.setTxRate(256e10) + session.setTxRate(1.0e+06) session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16) - print 'Sending file %s' % filename + print(('Sending file %s' % filename)) session.fileEnqueue(filepath, filename) try: for event in instance: if event == 'NORM_TX_FLUSH_COMPLETED': - print 'Flush completed, exiting.' + print('Flush completed, exiting.') return 0 else: - print event + print(event) except KeyboardInterrupt: pass - print 'Exiting.' + print('Exiting.') return 0 # end main diff --git a/examples/python/normMsgr.py b/examples/python/normMsgr.py index 4ee6305..6661280 100644 --- a/examples/python/normMsgr.py +++ b/examples/python/normMsgr.py @@ -14,7 +14,8 @@ class InputThread(Thread): def __init__(self, parent, *args, **kwargs): super(InputThread, self).__init__(*args, **kwargs) - self.setDaemon(True) ;# this is "child" daemon thread + #self.setDaemon(True) ;# this is "child" daemon thread (setDaemon is deprecated) + self.daemon = True self.msgr = parent def run(self): @@ -233,7 +234,8 @@ class NormEventHandler(Thread): def __init__(self, parentMsgr, *args, **kwargs): super(NormEventHandler, self).__init__(*args, **kwargs) - self.setDaemon(True) ;# this is "child" daemon thread + #self.setDaemon(True) ;# this is "child" daemon thread (setDaemon is deprecated) + self.daemon = True self.lock = Lock() self.msgr = parentMsgr diff --git a/src/common/normNode.cpp b/src/common/normNode.cpp index e830543..1c386cb 100644 --- a/src/common/normNode.cpp +++ b/src/common/normNode.cpp @@ -1975,7 +1975,7 @@ void NormSenderNode::Sync(NormObjectId objectId) } else if (objectId > firstPending) { - bool incrementResyncCount = false; // may just be a squelch trim + bool incrementResyncCount = false; // may just be a squelch trim NormObject* obj; while ((obj = rx_table.Find(rx_table.RangeLo())) && (obj->GetId() < objectId)) diff --git a/src/common/normObject.cpp b/src/common/normObject.cpp index a1bf6d4..1f48ddf 100644 --- a/src/common/normObject.cpp +++ b/src/common/normObject.cpp @@ -140,6 +140,7 @@ bool NormObject::Open(const NormObjectSize& objectSize, fec_block_mask = NormPayloadId::GetFecBlockMask(fecId, fecM); UINT32 blockIdMax = fec_block_mask; + if (IsStream()) blockIdMax = (blockIdMax / 2) - 1; if ((numBlocks.MSB() > 0) || (numBlocks.LSB() > blockIdMax)) { diff --git a/src/common/normSession.cpp b/src/common/normSession.cpp index 0185187..b70f249 100644 --- a/src/common/normSession.cpp +++ b/src/common/normSession.cpp @@ -759,7 +759,7 @@ bool NormSession::StartSender(UINT16 instanceId, UINT16 segmentSize, UINT16 numData, UINT16 numParity, - UINT8 fecId) + UINT8 fecId) { UINT16 blockSize = numData + numParity; if (blockSize <= 255) diff --git a/src/pynorm/core.py b/src/pynorm/core.py index 0cdee7e..20c8ee6 100644 --- a/src/pynorm/core.py +++ b/src/pynorm/core.py @@ -214,8 +214,8 @@ def get_libnorm(): # Sender functions libnorm.NormStartSender.restype = ctypes.c_bool - libnorm.NormStartSender.argtypes = [ctypes.c_void_p, ctypes.c_uint16, - ctypes.c_uint32, ctypes.c_uint16, ctypes.c_ubyte, ctypes.c_ubyte] + libnorm.NormStartSender.argtypes = [ctypes.c_void_p, ctypes.c_uint16, ctypes.c_uint32, ctypes.c_uint16, + ctypes.c_uint16, ctypes.c_uint16, ctypes.c_uint8] libnorm.NormStartSender.errcheck = errcheck_bool libnorm.NormStopSender.restype = None diff --git a/src/pynorm/instance.py b/src/pynorm/instance.py index 237603c..85f5fcf 100644 --- a/src/pynorm/instance.py +++ b/src/pynorm/instance.py @@ -73,21 +73,23 @@ class Instance(object): if not result: sys.stderr.write("NormInstance.getNextEvent() warning: no more NORM events\n") return False + # Note a NORM_EVENT_INVALID can be OK (with NORM_SESSION_INVALID) if self._estruct.type == c.NORM_EVENT_INVALID: return Event(c.NORM_EVENT_INVALID, None, None, None) - + if self._estruct.session == c.NORM_SESSION_INVALID: raise NormError("No new event") + try: sender = self._senders[self._estruct.sender] except KeyError: sender = self._senders[self._estruct.sender] = Node(self._estruct.sender) try: - object = self._objects[self._estruct.object] + obj = self._objects[self._estruct.object] except KeyError: - object = self._objects[self._estruct.object] = Object(self._estruct.object) - return Event(self._estruct.type, self._sessions[self._estruct.session], sender, object) + obj = self._objects[self._estruct.object] = Object(self._estruct.object) + return Event(self._estruct.type, self._sessions[self._estruct.session], sender, obj) def getDescriptor(self): return libnorm.NormGetDescriptor(self) @@ -99,7 +101,7 @@ class Instance(object): if localId == None: localId = c.NORM_NODE_ANY session = Session(self, address, port, localId) - self._sessions[session] = session + self._sessions[session._session] = session return session ## Properties @@ -130,12 +132,15 @@ class Instance(object): def __iter__(self): return self - def next(self): + def __next__(self): """So you can iterate over the events.""" try: return self.getNextEvent() except NormError: raise StopIteration + + def next(self): + return __next__() def __cmp__(self, other): return cmp(self._as_parameter_, other._as_parameter) diff --git a/src/pynorm/session.py b/src/pynorm/session.py index c648c59..d5540bb 100644 --- a/src/pynorm/session.py +++ b/src/pynorm/session.py @@ -23,7 +23,7 @@ class Session(object): localId - NormNodeId """ self._instance = instance - self._session = libnorm.NormCreateSession(instance, address, port, localId) + self._session = libnorm.NormCreateSession(instance, address.encode('utf-8'), port, localId) self.sendGracefulStop = False self.gracePeriod = 0 @@ -33,10 +33,11 @@ class Session(object): def setUserData(self, data): """data should be a string""" - libnorm.NormSetUserData(self, data) + libnorm.NormSetUserData(self, data.encode('utf-8')) def getUserData(self): - return libnorm.NormGetUserData(self) + data = libnorm.NormGetUserData(self) + return data.decode('utf-8') if data else None def getNodeId(self): return libnorm.NormGetLocalNodeId(self) @@ -48,10 +49,10 @@ class Session(object): libnorm.NormSetRxPortReuse(self, enable, bindToSessionAddr) def setMulticastInterface(self, iface): - libnorm.NormSetMulticastInterface(self, iface) + libnorm.NormSetMulticastInterface(self, iface.encode('utf-8')) def setSSM(self, srcAddr): - libnorm.NormSetSSM(self, srcAddr) + libnorm.NormSetSSM(self, srcAddr.encode('utf-8')) def setTTL(self, ttl): libnorm.NormSetTTL(self, ttl) @@ -69,9 +70,8 @@ class Session(object): libnorm.NormSetReportInterval(self, interval) ## Sender functions - def startSender(self, sessionId, bufferSpace, segmentSize, blockSize, numParity): - libnorm.NormStartSender(self, sessionId, bufferSpace, segmentSize, - blockSize, numParity) + def startSender(self, sessionId, bufferSpace, segmentSize, blockSize, numParity, fecId=0): + libnorm.NormStartSender(self, sessionId, bufferSpace, segmentSize, blockSize, numParity, fecId) def stopSender(self): libnorm.NormStopSender(self) @@ -122,19 +122,19 @@ class Session(object): libnorm.NormSetGroupSize(self, size) def fileEnqueue(self, filename, info=""): - return Object(libnorm.NormFileEnqueue(self, filename, info, len(info))) + return Object(libnorm.NormFileEnqueue(self, filename.encode('utf-8'), info.encode('utf-8'), len(info))) def dataEnqueue(self, data, info=""): - return Object(libnorm.NormDataEnqueue(self, data, len(data), info, len(info))) + return Object(libnorm.NormDataEnqueue(self, data.encode('utf-8'), len(data), info.encode('utf-8'), len(info))) def requeueObject(self, normObject): libnorm.NormRequeueObject(self, normObject) def streamOpen(self, bufferSize, info=""): - return Object(libnorm.NormStreamOpen(self, bufferSize, info, len(info))) + return Object(libnorm.NormStreamOpen(self, bufferSize, info.encode('utf-8'), len(info))) def sendCommand(self, cmdBuffer, robust=False): - return libnorm.NormSendCommand(self, cmdBuffer, len(cmdBuffer), robust) + return libnorm.NormSendCommand(self, cmdBuffer.encode('utf-8'), len(cmdBuffer), robust) def cancelCommand(self): libnorm.NormCancelCommand(self) @@ -161,9 +161,9 @@ class Session(object): def startReceiver(self, bufferSpace): libnorm.NormStartReceiver(self, bufferSpace) - def stopReceiver(self, gracePeriod=0): + def stopReceiver(self): """This will be called automatically if the receiver is active""" - libnorm.NormStopReceiver(self, gracePeriod) + libnorm.NormStopReceiver(self) def setRxCacheLimit(self, count): libnorm.NormSetRxCacheLimit(self, count) @@ -199,8 +199,8 @@ class Session(object): ## Private functions def __del__(self): - self.stopReceiver(self.gracePeriod) - self.stopSender(self.sendGracefulStop) + self.stopReceiver() + self.stopSender() libnorm.NormDestroySession(self) @property