def _finish_init_(self): # Connect ODM callbacks, create device managers and waveforms self._odm = ODMListener() self._domain_id = self.getID for node in self._obj.devMgrs: self._children.append(Device_Manager(node, self, self._outbox)) for wave in self._obj.apps: self._children.append(Application(wave, self, self._outbox)) self.__connect_channels__()
def _setupOdmListener(self): try: self.odm = ODMListener() self.odm.connect(self.dom) self.odm.deviceManagerAdded.addListener( WeakBoundMethod(self.deviceManagerAdded)) self.odm.deviceManagerRemoved.addListener( WeakBoundMethod(self.deviceManagerRemoved)) except: print( " ERROR: setupOdmListener failed; please make sure a REDHAWK Domain Manager is running\n" )
def connectToODMChannel(self): self.odmListener = ODMListener() self.odmListener.connect(self.domManager) self.odmListener.deviceManagerAdded.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceManagerRemoved.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.applicationAdded.addListener(weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationRemoved.addListener(weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationFactoryAdded.addListener(weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.applicationFactoryRemoved.addListener(weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.deviceAdded.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceRemoved.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceAdded.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceRemoved.addListener(weakobj.boundmethod(self.devMgrODMEvent))
def connectToODMChannel(self): self.odmListener = ODMListener() self.odmListener.connect(self.domManager) self.odmListener.deviceManagerAdded.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceManagerRemoved.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.applicationAdded.addListener( weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationRemoved.addListener( weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationFactoryAdded.addListener( weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.applicationFactoryRemoved.addListener( weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.deviceAdded.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceRemoved.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceAdded.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceRemoved.addListener( weakobj.boundmethod(self.devMgrODMEvent))
class BrowseWindow(BrowseWindowBase): def __init__(self, domainName=None, verbose=False, parent = None,name = None,fl = 0): redhawk.setTrackApps(False) self.verbose = verbose self.currentDomain = "" self.apps = [] self.devMgrs = [] self.odmListener = None self.log = logging.getLogger(BrowseWindow.__name__) if not domainName: domainName = self.findDomains() BrowseWindowBase.__init__(self,parent,name,fl, domainName) self._requests = Queue.Queue() self.worker = self.WorkThread(self._requests) if not domainName: return self.debug('Domain:', domainName) self.connect(self.worker, SIGNAL('refreshApplications()'), self.refreshApplications) self.connect(self.worker, SIGNAL('refreshDeviceManagers()'), self.refreshDeviceManagers) self.connect(self.worker, SIGNAL('parseDomainManager()'), self.parseDomainManager) self.connect(self.worker, SIGNAL('parseApplications()'), self.parseApplications) self.connect(self.worker, SIGNAL('parseAllDeviceManagers()'), self.parseAllDeviceManagers) self.connect(self.worker, SIGNAL('setupDomain()'), self.setupDomain) self.connect(self.worker, SIGNAL('cleardomMgrItem()'), self.cleardomMgrItem) self.connect(self.worker, SIGNAL('cleardevMgrItem()'), self.cleardevMgrItem) self.connect(self.worker, SIGNAL('clearappsItem()'), self.clearappsItem) self.connect(self.worker, SIGNAL('setWindowTitle(QString)'), self.setWindowTitle) self.connect(self.worker, SIGNAL('releaseApplication(QString)'), self.releaseApplication) self.connect(self.worker, SIGNAL('shutdownDeviceManager(QString)'), self.shutdownDeviceManager) self.connect(self.worker, SIGNAL('refreshProperty(QString,QString,QString)'), self.refreshProperty) self.worker.start() self.updateDomain(domainName) class WorkThread(QThread): def __init__(self, request_queue): QThread.__init__(self) self.requests = request_queue self.exit = False def end(self): self.exit = True def run(self): while (True): try: request = self.requests.get(0.1) except: continue if self.exit: return if request == None: continue if request == 'refreshApplications': self.emit( SIGNAL('refreshApplications()')) elif request[0] == 'releaseApplication(QString)': self.emit( SIGNAL('releaseApplication(QString)'), request[1]) elif request[0] == 'shutdownDeviceManager(QString)': self.emit( SIGNAL('shutdownDeviceManager(QString)'), request[1]) elif request == 'refreshDeviceManagers': self.emit( SIGNAL('refreshDeviceManagers()')) elif request == 'parseDomainManager': self.emit( SIGNAL('parseDomainManager()')) elif request == 'parseApplications': self.emit( SIGNAL('parseApplications()')) elif request == 'parseAllDeviceManagers': self.emit( SIGNAL('parseAllDeviceManagers()')) elif request == 'setupDomain': self.emit( SIGNAL('setupDomain()')) elif request == 'cleardomMgrItem': self.emit( SIGNAL('cleardomMgrItem()')) elif request == 'cleardevMgrItem': self.emit( SIGNAL('cleardevMgrItem()')) elif request == 'clearappsItem': self.emit( SIGNAL('clearappsItem()')) elif request[0] == 'setWindowTitle': self.emit( SIGNAL('setWindowTitle(QString)'), request[1] ) elif request[0] == 'refreshProperty': self.emit( SIGNAL('refreshProperty(QString,QString,QString)'), request[1], request[2], request[3] ) else: print request,"...unrecognized" return def addRequest(self, request): self._requests.put(request) def removeWidget(self, widget): try: widget[0].disconnect(widget[1]) except: pass if hasattr(widget[1], 'releaseObject'): widget[1].releaseObject() if hasattr(widget[1], 'close'): widget[1].close() def applicationODMEvent(self, event): self._requests.put('refreshApplications') def unusedODMEvent(self, event): pass def devMgrODMEvent(self, event): self._requests.put('refreshDeviceManagers') def cleanupOnExit(self): self.removeAllWidgets() self.disconnectFromODMChannel() self.worker.end() def removeAllWidgets(self): for app in self.apps: for widget in app['widgets']: self.removeWidget(widget) for devMgr in self.devMgrs: for widget in devMgr['widgets']: self.removeWidget(widget) def connectToODMChannel(self): self.odmListener = ODMListener() self.odmListener.connect(self.domManager) self.odmListener.deviceManagerAdded.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceManagerRemoved.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.applicationAdded.addListener(weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationRemoved.addListener(weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationFactoryAdded.addListener(weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.applicationFactoryRemoved.addListener(weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.deviceAdded.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceRemoved.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceAdded.addListener(weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceRemoved.addListener(weakobj.boundmethod(self.devMgrODMEvent)) def disconnectFromODMChannel(self): if self.odmListener != None: try: self.odmListener.disconnect() except: self.log.trace("unable to disconnect from ODM channel") def findDomains(self): domainList = redhawk.scan() if len(domainList) == 1: return domainList[0] stringlist = QStringList() for entry in domainList: stringlist.append(QString(entry)) retval = QInputDialog.getItem(None, QString("pick a domain"), QString("domains"), stringlist, 0, False) if retval[1] == False: return None return str(retval[0]) def getDomain(self, domainName): try: self.currentDomain = domainName self.disconnectFromODMChannel() self.domManager = redhawk.attach(domainName) self.connectToODMChannel() if self.domManager is None: raise StandardError('Could not narrow Domain Manager') # this is here just to make sure that the pointer is accessible if self.domManager._non_existent(): raise StandardError("Unable to access the Domain Manager in naming context "+domainName) except: raise StandardError("Unable to access the Domain Manager in naming context "+domainName) try: self.fileMgr = self.domManager._get_fileMgr() except: raise StandardError("Unable to access the File Manager in Domain Manager "+domainName) def updateDomain(self, domainName): self.getDomain(domainName) self.setupDomain() self._requests.put('parseDomainManager') self._requests.put('parseApplications') self._requests.put('parseAllDeviceManagers') def cleardomMgrItem(self): clearChildren(self.domMgrItem) def cleardevMgrItem(self): clearChildren(self.devMgrItem) def clearappsItem(self): clearChildren(self.appsItem) def refreshView (self): if self.currentDomain == "": domainName = self.findDomains() if not domainName: return else: domainName = self.currentDomain self.getDomain(domainName) self._requests.put('cleardomMgrItem') self._requests.put('cleardevMgrItem') self._requests.put('clearappsItem') self._requests.put('parseDomainManager') self._requests.put('parseApplications') self._requests.put('parseAllDeviceManagers') if domainName == None: self._requests.put(('setWindowTitle', "REDHAWK Domain Browser")) else: self._requests.put(('setWindowTitle', "REDHAWK Domain Browser: "+domainName)) def getAttribute (self, item, attribute): child = item.firstChild() while child: if child.text(0) == attribute: return str(child.text(1)) child = child.nextSibling() return None def findApplication (self, id, name): for app in self.domManager._get_applications(): if app._get_identifier() == id: return app return None def createSelected (self): try: appList = self.domManager.catalogSads() except: try: self.refreshView() appList = self.domManager.catalogSads() except: QMessageBox.critical(self, 'Action failed', 'Unable to connect to the Domain.', QMessageBox.Ok) return # Present the app list in alphabetical order. appList.sort() app = installdialog.getApplicationFile(appList, self) if app == None: return try: app_inst = self.domManager.createApplication(app) except CF.ApplicationFactory.CreateApplicationError, e: QMessageBox.critical(self, 'Creation of waveform failed.', e.msg, QMessageBox.Ok) return if app_inst == None: QMessageBox.critical(self, 'Creation of waveform failed.', 'Unable to create Application instance for $SDRROOT'+app, QMessageBox.Ok) self._requests.put('clearappsItem') self._requests.put('parseApplications')
class BrowseWindow(BrowseWindowBase): def __init__(self, domainName=None, verbose=False, parent=None, name=None, fl=0): redhawk.setTrackApps(False) self.verbose = verbose self.currentDomain = "" self.apps = [] self.devMgrs = [] self.odmListener = None self.log = logging.getLogger(BrowseWindow.__name__) if not domainName: domainName = self.findDomains() BrowseWindowBase.__init__(self, parent, name, fl, domainName) self._requests = Queue.Queue() self.worker = self.WorkThread(self._requests) self.debug('Domain:', domainName) self.connect(self.worker, SIGNAL('refreshApplications()'), self.refreshApplications) self.connect(self.worker, SIGNAL('refreshDeviceManagers()'), self.refreshDeviceManagers) self.connect(self.worker, SIGNAL('parseDomainManager()'), self.parseDomainManager) self.connect(self.worker, SIGNAL('parseApplications()'), self.parseApplications) self.connect(self.worker, SIGNAL('parseAllDeviceManagers()'), self.parseAllDeviceManagers) self.connect(self.worker, SIGNAL('setupDomain()'), self.setupDomain) self.connect(self.worker, SIGNAL('cleardomMgrItem()'), self.cleardomMgrItem) self.connect(self.worker, SIGNAL('cleardevMgrItem()'), self.cleardevMgrItem) self.connect(self.worker, SIGNAL('clearappsItem()'), self.clearappsItem) self.connect(self.worker, SIGNAL('setWindowTitle(QString)'), self.setWindowTitle) self.connect(self.worker, SIGNAL('releaseApplication(QString)'), self.releaseApplication) self.connect(self.worker, SIGNAL('shutdownDeviceManager(QString)'), self.shutdownDeviceManager) self.connect(self.worker, SIGNAL('refreshProperty(QString,QString,QString)'), self.refreshProperty) self.worker.start() if not domainName: return self.updateDomain(domainName) class WorkThread(QThread): def __init__(self, request_queue): QThread.__init__(self) self.requests = request_queue self.exit = False def end(self): self.exit = True def run(self): while (True): try: request = self.requests.get(0.1) except: continue if self.exit: return if request == None: continue if request == 'refreshApplications': self.emit(SIGNAL('refreshApplications()')) elif request[0] == 'releaseApplication(QString)': self.emit(SIGNAL('releaseApplication(QString)'), request[1]) elif request[0] == 'shutdownDeviceManager(QString)': self.emit(SIGNAL('shutdownDeviceManager(QString)'), request[1]) elif request == 'refreshDeviceManagers': self.emit(SIGNAL('refreshDeviceManagers()')) elif request == 'parseDomainManager': self.emit(SIGNAL('parseDomainManager()')) elif request == 'parseApplications': self.emit(SIGNAL('parseApplications()')) elif request == 'parseAllDeviceManagers': self.emit(SIGNAL('parseAllDeviceManagers()')) elif request == 'setupDomain': self.emit(SIGNAL('setupDomain()')) elif request == 'cleardomMgrItem': self.emit(SIGNAL('cleardomMgrItem()')) elif request == 'cleardevMgrItem': self.emit(SIGNAL('cleardevMgrItem()')) elif request == 'clearappsItem': self.emit(SIGNAL('clearappsItem()')) elif request[0] == 'setWindowTitle': self.emit(SIGNAL('setWindowTitle(QString)'), request[1]) elif request[0] == 'refreshProperty': self.emit( SIGNAL('refreshProperty(QString,QString,QString)'), request[1], request[2], request[3]) else: print request, "...unrecognized" return def addRequest(self, request): self._requests.put(request) def removeWidget(self, widget): try: widget[0].disconnect(widget[1]) except: pass if hasattr(widget[1], 'releaseObject'): widget[1].releaseObject() if hasattr(widget[1], 'close'): widget[1].close() def applicationODMEvent(self, event): self._requests.put('refreshApplications') def unusedODMEvent(self, event): pass def devMgrODMEvent(self, event): self._requests.put('refreshDeviceManagers') def cleanupOnExit(self): self.removeAllWidgets() self.disconnectFromODMChannel() self.worker.end() def removeAllWidgets(self): for app in self.apps: for widget in app['widgets']: self.removeWidget(widget) for devMgr in self.devMgrs: for widget in devMgr['widgets']: self.removeWidget(widget) def connectToODMChannel(self): self.odmListener = ODMListener() self.odmListener.connect(self.domManager) self.odmListener.deviceManagerAdded.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceManagerRemoved.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.applicationAdded.addListener( weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationRemoved.addListener( weakobj.boundmethod(self.applicationODMEvent)) self.odmListener.applicationFactoryAdded.addListener( weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.applicationFactoryRemoved.addListener( weakobj.boundmethod(self.unusedODMEvent)) self.odmListener.deviceAdded.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.deviceRemoved.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceAdded.addListener( weakobj.boundmethod(self.devMgrODMEvent)) self.odmListener.serviceRemoved.addListener( weakobj.boundmethod(self.devMgrODMEvent)) def disconnectFromODMChannel(self): if self.odmListener != None: try: self.odmListener.disconnect() except: self.log.trace("unable to disconnect from ODM channel") def findDomains(self): try: domainList = redhawk.scan() except RuntimeError: return if len(domainList) == 1: return domainList[0] stringlist = QStringList() for entry in domainList: stringlist.append(QString(entry)) retval = QInputDialog.getItem(None, QString("pick a domain"), QString("domains"), stringlist, 0, False) if retval[1] == False: return None return str(retval[0]) def getDomain(self, domainName): try: self.currentDomain = domainName self.disconnectFromODMChannel() self.domManager = redhawk.attach(domainName) self.connectToODMChannel() if self.domManager is None: raise StandardError('Could not narrow Domain Manager') # this is here just to make sure that the pointer is accessible if self.domManager._non_existent(): raise StandardError( "Unable to access the Domain Manager in naming context " + domainName) except: raise StandardError( "Unable to access the Domain Manager in naming context " + domainName) try: self.fileMgr = self.domManager._get_fileMgr() except: raise StandardError( "Unable to access the File Manager in Domain Manager " + domainName) def updateDomain(self, domainName): self.getDomain(domainName) self.setupDomain() self._requests.put('parseDomainManager') self._requests.put('parseApplications') self._requests.put('parseAllDeviceManagers') def cleardomMgrItem(self): clearChildren(self.domMgrItem) def cleardevMgrItem(self): clearChildren(self.devMgrItem) def clearappsItem(self): clearChildren(self.appsItem) def refreshView(self): runsetup = False if self.currentDomain == "": domainName = self.findDomains() if not domainName: return runsetup = True elif self.currentDomain not in redhawk.scan(): domainName = self.findDomains() self.objectListView.clear() runsetup = True else: domainName = self.currentDomain self.getDomain(domainName) if runsetup: self.setupDomain() self._requests.put('cleardomMgrItem') self._requests.put('cleardevMgrItem') self._requests.put('clearappsItem') self._requests.put('parseDomainManager') self._requests.put('parseApplications') self._requests.put('parseAllDeviceManagers') if domainName == None: self._requests.put(('setWindowTitle', "REDHAWK Domain Browser")) else: self._requests.put( ('setWindowTitle', "REDHAWK Domain Browser: " + domainName)) def getAttribute(self, item, attribute): child = item.firstChild() while child: if child.text(0) == attribute: return str(child.text(1)) child = child.nextSibling() return None def findApplication(self, id, name): for app in self.domManager._get_applications(): if app._get_identifier() == id: return app return None def _getSADName(self, sadFile): try: f = self.fileMgr.open(sadFile, True) try: sad = ossie.parsers.sad.parseString(f.read(f.sizeOf())) return sad.name finally: f.close() except: return '<unknown>' def createSelected(self): try: appList = self.domManager.catalogSads() except: try: self.refreshView() appList = self.domManager.catalogSads() except: QMessageBox.critical(self, 'Action failed', 'Unable to connect to the Domain.', QMessageBox.Ok) return appList = [(self._getSADName(sadFile), sadFile) for sadFile in appList] app = installdialog.getApplicationFile(appList, self) if app == None: return try: app_inst = self.domManager.createApplication(app) except CF.ApplicationFactory.CreateApplicationError, e: QMessageBox.critical(self, 'Creation of waveform failed.', e.msg, QMessageBox.Ok) return except:
class Domain(Proxy_Base): """ * OVERRIDES """ def _finish_init_(self): # Connect ODM callbacks, create device managers and waveforms self._odm = ODMListener() self._domain_id = self.getID for node in self._obj.devMgrs: self._children.append(Device_Manager(node, self, self._outbox)) for wave in self._obj.apps: self._children.append(Application(wave, self, self._outbox)) self.__connect_channels__() def getMessage(self, change='change'): return RH_Message(change, 'domain', self.getID, self.getName) def _processThisMessage(self, message): # TODO: What kinds of messages would a domain process from the client? if ('update' == message['change']): return self.getUpdateFromHere('update') # default response return [] def _cleanUp(self): try: self._odm.disconnect() except: pass """ * ADDONS """ def __connect_channels__(self): try: # Connect to events on ODM channel self._odm.connect(self._obj) self._odm.deviceManagerAdded.addListener( WeakBoundMethod(self.__ODM_Added)) self._odm.deviceManagerRemoved.addListener( WeakBoundMethod(self.__ODM_Removed)) self._odm.deviceAdded.addListener(WeakBoundMethod( self.__ODM_Added)) self._odm.deviceRemoved.addListener( WeakBoundMethod(self.__ODM_Removed)) self._odm.serviceAdded.addListener( WeakBoundMethod(self.__ODM_Added)) self._odm.serviceRemoved.addListener( WeakBoundMethod(self.__ODM_Removed)) self._odm.applicationFactoryAdded.addListener( WeakBoundMethod(self.__ODM_Added)) self._odm.applicationFactoryRemoved.addListener( WeakBoundMethod(self.__ODM_Removed)) self._odm.applicationAdded.addListener( WeakBoundMethod(self.__ODM_Added)) self._odm.applicationRemoved.addListener( WeakBoundMethod(self.__ODM_Removed)) except: raise Domain('Unable to connect to domain to listeners') """ * ODM Event Callbacks * ODM Event: producerId, sourceId, sourceName, sourceCategory * Notes: 1) Ignoring sourceIOR stringified object. * 2) These are async callbacks to the parent and therefore * invoke passMessages via ZeroRPC. * The 2 second delay is to let the Domain's model catch up with the * faster incoming ODM events. * * Possible evt.sourceCategories are: device_manager, device, * application_factory, application, and service. The Domain * only needs to listen for the top-level Device Manager and * Application events since each entity will handle their children, * respectively. """ def __ODM_Added(self, evt): gevent.sleep(2) rhtype = string.lower("{0}".format(evt.sourceCategory)) if ('device_manager' == rhtype): for dm in self._obj.devMgrs: if (dm._get_identifier() == evt.sourceId): self._children.append( Device_Manager(dm, self, self._outbox)) elif ('application' == rhtype): for wave in self._obj.apps: if (wave._get_identifier() == evt.sourceId): self._children.append(Application(wave, self, self._outbox)) """ * ODM "Removed" listener. Only responds to device_manager and application * event categories since the Domain prunes the top-level entity. """ def __ODM_Removed(self, evt): rhtype = string.lower("{0}".format(evt.sourceCategory)) if ('device_manager' != rhtype) and ('application' != rhtype): return idx = -1 for i, c in enumerate(self._children): if (evt.sourceId == c.getID): idx = i c.cleanUp() break if (-1 != idx): del self._children[idx]
class WebSocketMapHandler(tornado.websocket.WebSocketHandler): def open(self): print("A websocket connection was opened to the Map websocket") self._connectToDomain() self._setupOdmListener() Timer(1.0, self._hack).start() """ Connect to domain, add pis found to our list, add them to the GUI. """ def _connectToDomain(self): self.dom = redhawk.attach(redhawk.scan()[0]) rx_pis, tx_pis = self._getPisList() for node in rx_pis: lat, lon, valid = self._getNodeLatLon(node) self.update_map(node.name, 'add', lat, lon) for node in tx_pis: lat, lon, valid = self._getNodeLatLon(node) self.update_map(node.name, 'addTx', lat, lon) def _setupOdmListener(self): try: self.odm = ODMListener() self.odm.connect(self.dom) self.odm.deviceManagerAdded.addListener( WeakBoundMethod(self.deviceManagerAdded)) self.odm.deviceManagerRemoved.addListener( WeakBoundMethod(self.deviceManagerRemoved)) except: print( " ERROR: setupOdmListener failed; please make sure a REDHAWK Domain Manager is running\n" ) def _hack(self): rx_pis, tx_pis = self._getPisList() for node in rx_pis: self.update_map(node.name, 'add', 0.0, 0.0) for node in tx_pis: self.update_map(node.name, 'addTx', 0.0, 0.0) cb = tornado.ioloop.PeriodicCallback(self._timed_pi_update, 1000) cb.start() lob_poll = tornado.ioloop.PeriodicCallback(self._pollLobComponents, 2000) lob_poll.start() def on_message(self, message): print("\nMessage received from map client: %s" % message) def on_close(self): print("\nWebsocket connection to %s closed" % self) def update_map(self, name, action, lat, lon, lob_angle=0.0): # action: 'add', 'addTx', 'remove', 'addLob', or 'update' data = { 'nodeName': name, 'action': action, 'lat': lat, 'lon': lon, 'angle': int(lob_angle) } msg = json.dumps(data) self.write_message(json.dumps(msg)) if ((action <> 'update') and (action <> 'addLob')): print("Will now %s marker for node %s located at %s, %s" % (action, name, lat, lon)) def deviceManagerAdded(self, evt): print("Added device manager %s" % evt.sourceName) #pdb.set_trace() if 'raspberry_pi' in evt.sourceName.lower(): #print("This is where I will call self.update_map to add a marker") self.update_map(evt.sourceName, 'add', 0.0, 0.0) def deviceManagerRemoved(self, evt): print("Removed device manager %s" % evt.sourceName) if evt.sourceName.lower() == 'raspberry_pi': #print("This is where I will call self.update_map to remove a marker") self.update_map(evt.sourceName, 'remove', 0.0, 0.0) """ Timed update of node positions at runtime """ def _timed_pi_update(self): rx_pis, tx_pis = self._getPisList() for node in list(merge(rx_pis, tx_pis)): try: """ Somehow dom.devMgrs is not being updated fully when nodes join/leave""" lat, lon, valid = self._getNodeLatLon(node) except: lat, lon, valid = 0.0, 0.0, False self.update_map(node.name, 'update', lat, lon) """ Simple function to pull all nodes whose name starts with raspberry_pi """ """ Node are sorted according to whether they are receiver or transmitter nodes """ def _getPisList(self): rx_list = [] tx_list = [] for node in self.dom.devMgrs: if node.name.startswith('raspberry_pi'): for dev in node.devs: if 'rtl_sdr' in dev.name.lower(): rx_list.append(node) break if 'transmit_control' in dev.name.lower(): tx_list.append(node) break return rx_list, tx_list """ Fetch lat, lon, and validity of information from node. """ def _getNodeLatLon(self, node): for dev in node.devs: if (dev.name == 'gps_receiver'): gps_port = dev.getPort('GPS_idl') pos = gps_port._get_gps_time_pos().position return pos.lat, pos.lon, pos.valid """ Poll the LOB components """ def _pollLobComponents(self): if len(self.dom.apps) > 0: for wf in self.dom.apps: for comp in wf.comps: if 'lobCalc' in comp.name: comp_dict = comp._query() if comp_dict['valid']: angle = int(comp_dict['lob']) # TODO: This can be hardcoded for testing only #piNum = comp_dict['streamID_prop'][-2:] piNum = 87 adjusted_angle = self._nearestFive(angle) print("INFO: raspberry_pi%s, LOB %d degrees (%d)" % (piNum, angle, adjusted_angle)) self.update_map('raspberry_pi' + str(piNum), 'addLob', 0, 0, adjusted_angle) else: #print("DEBUG: LOB valid for pi %s is not valid" % comp_dict['streamID_prop'][-2:]) pass else: print("No DF waveforms available") def _nearestFive(self, value): mod = value % 5 if mod < 3: return value - mod else: return value + (5 - mod)
class Domain(Proxy_Base): """ * OVERRIDES """ def _finish_init_(self): # Connect ODM callbacks, create device managers and waveforms self._odm = ODMListener() self._domain_id = self.getID for node in self._obj.devMgrs: self._children.append(Device_Manager(node, self, self._outbox)) for wave in self._obj.apps: self._children.append(Application(wave, self, self._outbox)) self.__connect_channels__() def getMessage(self, change='change'): return RH_Message(change, 'domain', self.getID, self.getName) def _processThisMessage(self, message): # TODO: What kinds of messages would a domain process from the client? if ('update' == message['change']): return self.getUpdateFromHere('update') # default response return [] def _cleanUp(self): try: self._odm.disconnect() except: pass """ * ADDONS """ def __connect_channels__(self): try: # Connect to events on ODM channel self._odm.connect(self._obj) self._odm.deviceManagerAdded.addListener(WeakBoundMethod(self.__ODM_Added)) self._odm.deviceManagerRemoved.addListener(WeakBoundMethod(self.__ODM_Removed)) self._odm.deviceAdded.addListener(WeakBoundMethod(self.__ODM_Added)) self._odm.deviceRemoved.addListener(WeakBoundMethod(self.__ODM_Removed)) self._odm.serviceAdded.addListener(WeakBoundMethod(self.__ODM_Added)) self._odm.serviceRemoved.addListener(WeakBoundMethod(self.__ODM_Removed)) self._odm.applicationFactoryAdded.addListener(WeakBoundMethod(self.__ODM_Added)) self._odm.applicationFactoryRemoved.addListener(WeakBoundMethod(self.__ODM_Removed)) self._odm.applicationAdded.addListener(WeakBoundMethod(self.__ODM_Added)) self._odm.applicationRemoved.addListener(WeakBoundMethod(self.__ODM_Removed)) except: raise Domain('Unable to connect to domain to listeners') """ * ODM Event Callbacks * ODM Event: producerId, sourceId, sourceName, sourceCategory * Notes: 1) Ignoring sourceIOR stringified object. * 2) These are async callbacks to the parent and therefore * invoke passMessages via ZeroRPC. * The 2 second delay is to let the Domain's model catch up with the * faster incoming ODM events. * * Possible evt.sourceCategories are: device_manager, device, * application_factory, application, and service. The Domain * only needs to listen for the top-level Device Manager and * Application events since each entity will handle their children, * respectively. """ def __ODM_Added(self, evt): gevent.sleep(2) rhtype = string.lower("{0}".format(evt.sourceCategory)) if ('device_manager' == rhtype): for dm in self._obj.devMgrs: if (dm._get_identifier() == evt.sourceId): self._children.append(Device_Manager(dm, self, self._outbox)) elif ('application' == rhtype): for wave in self._obj.apps: if (wave._get_identifier() == evt.sourceId): self._children.append(Application(wave, self, self._outbox)) """ * ODM "Removed" listener. Only responds to device_manager and application * event categories since the Domain prunes the top-level entity. """ def __ODM_Removed(self, evt): rhtype = string.lower("{0}".format(evt.sourceCategory)) if ('device_manager' != rhtype) and ('application' != rhtype): return idx = -1 for i, c in enumerate(self._children): if (evt.sourceId == c.getID): idx = i c.cleanUp() break if (-1 != idx): del self._children[idx]