fixes to pynorm for Python3 and normMsgr.py and normFileSend.py examples

pull/68/head
bebopagogo 2022-05-22 21:52:45 -04:00
parent 9e796e69b2
commit 972b1a3e0b
9 changed files with 44 additions and 36 deletions

View File

@ -119,7 +119,7 @@ typedef enum NormSocketEventType
} 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() // but _before_ NormConnect() or NormListen()
// (This will be expanded, perhaps to include parameters // (This will be expanded, perhaps to include parameters
// that can be changed after connection setup) // that can be changed after connection setup)

View File

@ -10,7 +10,7 @@ from random import randint
import pynorm import pynorm
USAGE = 'usage: %s [options] <file>' % sys.argv[0] USAGE = 'usage: %s [options] <file>' % sys.argv[0]
DEFAULT_ADDR = '224.1.2.3' DEFAULT_ADDR = u'224.1.2.3'
DEFAULT_PORT = 6003 DEFAULT_PORT = 6003
def get_option_parser(): def get_option_parser():
@ -29,7 +29,7 @@ def main(argv):
(opts, args) = get_option_parser().parse_args(argv) (opts, args) = get_option_parser().parse_args(argv)
if len(args) != 2: if len(args) != 2:
print get_option_parser().get_usage() print(get_option_parser().get_usage())
return 1 return 1
filepath = os.path.abspath(args[1]) filepath = os.path.abspath(args[1])
@ -40,23 +40,23 @@ def main(argv):
session = instance.createSession(opts.address, opts.port) session = instance.createSession(opts.address, opts.port)
if opts.iface: if opts.iface:
session.setMulticastInterface(opts.iface) session.setMulticastInterface(opts.iface)
session.setTxRate(256e10) session.setTxRate(1.0e+06)
session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16) session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16)
print 'Sending file %s' % filename print(('Sending file %s' % filename))
session.fileEnqueue(filepath, filename) session.fileEnqueue(filepath, filename)
try: try:
for event in instance: for event in instance:
if event == 'NORM_TX_FLUSH_COMPLETED': if event == 'NORM_TX_FLUSH_COMPLETED':
print 'Flush completed, exiting.' print('Flush completed, exiting.')
return 0 return 0
else: else:
print event print(event)
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
print 'Exiting.' print('Exiting.')
return 0 return 0
# end main # end main

View File

@ -14,7 +14,8 @@ class InputThread(Thread):
def __init__(self, parent, *args, **kwargs): def __init__(self, parent, *args, **kwargs):
super(InputThread, self).__init__(*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 self.msgr = parent
def run(self): def run(self):
@ -233,7 +234,8 @@ class NormEventHandler(Thread):
def __init__(self, parentMsgr, *args, **kwargs): def __init__(self, parentMsgr, *args, **kwargs):
super(NormEventHandler, self).__init__(*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.lock = Lock()
self.msgr = parentMsgr self.msgr = parentMsgr

View File

@ -1975,7 +1975,7 @@ void NormSenderNode::Sync(NormObjectId objectId)
} }
else if (objectId > firstPending) else if (objectId > firstPending)
{ {
bool incrementResyncCount = false; // may just be a squelch trim bool incrementResyncCount = false; // may just be a squelch trim
NormObject* obj; NormObject* obj;
while ((obj = rx_table.Find(rx_table.RangeLo())) && while ((obj = rx_table.Find(rx_table.RangeLo())) &&
(obj->GetId() < objectId)) (obj->GetId() < objectId))

View File

@ -140,6 +140,7 @@ bool NormObject::Open(const NormObjectSize& objectSize,
fec_block_mask = NormPayloadId::GetFecBlockMask(fecId, fecM); fec_block_mask = NormPayloadId::GetFecBlockMask(fecId, fecM);
UINT32 blockIdMax = fec_block_mask; UINT32 blockIdMax = fec_block_mask;
if (IsStream()) blockIdMax = (blockIdMax / 2) - 1; if (IsStream()) blockIdMax = (blockIdMax / 2) - 1;
if ((numBlocks.MSB() > 0) || (numBlocks.LSB() > blockIdMax)) if ((numBlocks.MSB() > 0) || (numBlocks.LSB() > blockIdMax))
{ {

View File

@ -759,7 +759,7 @@ bool NormSession::StartSender(UINT16 instanceId,
UINT16 segmentSize, UINT16 segmentSize,
UINT16 numData, UINT16 numData,
UINT16 numParity, UINT16 numParity,
UINT8 fecId) UINT8 fecId)
{ {
UINT16 blockSize = numData + numParity; UINT16 blockSize = numData + numParity;
if (blockSize <= 255) if (blockSize <= 255)

View File

@ -214,8 +214,8 @@ def get_libnorm():
# Sender functions # Sender functions
libnorm.NormStartSender.restype = ctypes.c_bool libnorm.NormStartSender.restype = ctypes.c_bool
libnorm.NormStartSender.argtypes = [ctypes.c_void_p, ctypes.c_uint16, libnorm.NormStartSender.argtypes = [ctypes.c_void_p, ctypes.c_uint16, ctypes.c_uint32, ctypes.c_uint16,
ctypes.c_uint32, ctypes.c_uint16, ctypes.c_ubyte, ctypes.c_ubyte] ctypes.c_uint16, ctypes.c_uint16, ctypes.c_uint8]
libnorm.NormStartSender.errcheck = errcheck_bool libnorm.NormStartSender.errcheck = errcheck_bool
libnorm.NormStopSender.restype = None libnorm.NormStopSender.restype = None

View File

@ -73,21 +73,23 @@ class Instance(object):
if not result: if not result:
sys.stderr.write("NormInstance.getNextEvent() warning: no more NORM events\n") sys.stderr.write("NormInstance.getNextEvent() warning: no more NORM events\n")
return False return False
# Note a NORM_EVENT_INVALID can be OK (with NORM_SESSION_INVALID) # Note a NORM_EVENT_INVALID can be OK (with NORM_SESSION_INVALID)
if self._estruct.type == c.NORM_EVENT_INVALID: if self._estruct.type == c.NORM_EVENT_INVALID:
return Event(c.NORM_EVENT_INVALID, None, None, None) return Event(c.NORM_EVENT_INVALID, None, None, None)
if self._estruct.session == c.NORM_SESSION_INVALID: if self._estruct.session == c.NORM_SESSION_INVALID:
raise NormError("No new event") raise NormError("No new event")
try: try:
sender = self._senders[self._estruct.sender] sender = self._senders[self._estruct.sender]
except KeyError: except KeyError:
sender = self._senders[self._estruct.sender] = Node(self._estruct.sender) sender = self._senders[self._estruct.sender] = Node(self._estruct.sender)
try: try:
object = self._objects[self._estruct.object] obj = self._objects[self._estruct.object]
except KeyError: except KeyError:
object = self._objects[self._estruct.object] = Object(self._estruct.object) obj = self._objects[self._estruct.object] = Object(self._estruct.object)
return Event(self._estruct.type, self._sessions[self._estruct.session], sender, object) return Event(self._estruct.type, self._sessions[self._estruct.session], sender, obj)
def getDescriptor(self): def getDescriptor(self):
return libnorm.NormGetDescriptor(self) return libnorm.NormGetDescriptor(self)
@ -99,7 +101,7 @@ class Instance(object):
if localId == None: if localId == None:
localId = c.NORM_NODE_ANY localId = c.NORM_NODE_ANY
session = Session(self, address, port, localId) session = Session(self, address, port, localId)
self._sessions[session] = session self._sessions[session._session] = session
return session return session
## Properties ## Properties
@ -130,12 +132,15 @@ class Instance(object):
def __iter__(self): def __iter__(self):
return self return self
def next(self): def __next__(self):
"""So you can iterate over the events.""" """So you can iterate over the events."""
try: try:
return self.getNextEvent() return self.getNextEvent()
except NormError: except NormError:
raise StopIteration raise StopIteration
def next(self):
return __next__()
def __cmp__(self, other): def __cmp__(self, other):
return cmp(self._as_parameter_, other._as_parameter) return cmp(self._as_parameter_, other._as_parameter)

View File

@ -23,7 +23,7 @@ class Session(object):
localId - NormNodeId localId - NormNodeId
""" """
self._instance = instance 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.sendGracefulStop = False
self.gracePeriod = 0 self.gracePeriod = 0
@ -33,10 +33,11 @@ class Session(object):
def setUserData(self, data): def setUserData(self, data):
"""data should be a string""" """data should be a string"""
libnorm.NormSetUserData(self, data) libnorm.NormSetUserData(self, data.encode('utf-8'))
def getUserData(self): def getUserData(self):
return libnorm.NormGetUserData(self) data = libnorm.NormGetUserData(self)
return data.decode('utf-8') if data else None
def getNodeId(self): def getNodeId(self):
return libnorm.NormGetLocalNodeId(self) return libnorm.NormGetLocalNodeId(self)
@ -48,10 +49,10 @@ class Session(object):
libnorm.NormSetRxPortReuse(self, enable, bindToSessionAddr) libnorm.NormSetRxPortReuse(self, enable, bindToSessionAddr)
def setMulticastInterface(self, iface): def setMulticastInterface(self, iface):
libnorm.NormSetMulticastInterface(self, iface) libnorm.NormSetMulticastInterface(self, iface.encode('utf-8'))
def setSSM(self, srcAddr): def setSSM(self, srcAddr):
libnorm.NormSetSSM(self, srcAddr) libnorm.NormSetSSM(self, srcAddr.encode('utf-8'))
def setTTL(self, ttl): def setTTL(self, ttl):
libnorm.NormSetTTL(self, ttl) libnorm.NormSetTTL(self, ttl)
@ -69,9 +70,8 @@ class Session(object):
libnorm.NormSetReportInterval(self, interval) libnorm.NormSetReportInterval(self, interval)
## Sender functions ## Sender functions
def startSender(self, sessionId, bufferSpace, segmentSize, blockSize, numParity): def startSender(self, sessionId, bufferSpace, segmentSize, blockSize, numParity, fecId=0):
libnorm.NormStartSender(self, sessionId, bufferSpace, segmentSize, libnorm.NormStartSender(self, sessionId, bufferSpace, segmentSize, blockSize, numParity, fecId)
blockSize, numParity)
def stopSender(self): def stopSender(self):
libnorm.NormStopSender(self) libnorm.NormStopSender(self)
@ -122,19 +122,19 @@ class Session(object):
libnorm.NormSetGroupSize(self, size) libnorm.NormSetGroupSize(self, size)
def fileEnqueue(self, filename, info=""): 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=""): 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): def requeueObject(self, normObject):
libnorm.NormRequeueObject(self, normObject) libnorm.NormRequeueObject(self, normObject)
def streamOpen(self, bufferSize, info=""): 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): 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): def cancelCommand(self):
libnorm.NormCancelCommand(self) libnorm.NormCancelCommand(self)
@ -161,9 +161,9 @@ class Session(object):
def startReceiver(self, bufferSpace): def startReceiver(self, bufferSpace):
libnorm.NormStartReceiver(self, bufferSpace) libnorm.NormStartReceiver(self, bufferSpace)
def stopReceiver(self, gracePeriod=0): def stopReceiver(self):
"""This will be called automatically if the receiver is active""" """This will be called automatically if the receiver is active"""
libnorm.NormStopReceiver(self, gracePeriod) libnorm.NormStopReceiver(self)
def setRxCacheLimit(self, count): def setRxCacheLimit(self, count):
libnorm.NormSetRxCacheLimit(self, count) libnorm.NormSetRxCacheLimit(self, count)
@ -199,8 +199,8 @@ class Session(object):
## Private functions ## Private functions
def __del__(self): def __del__(self):
self.stopReceiver(self.gracePeriod) self.stopReceiver()
self.stopSender(self.sendGracefulStop) self.stopSender()
libnorm.NormDestroySession(self) libnorm.NormDestroySession(self)
@property @property