Пример #1
0
 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__()
Пример #2
0
 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"
         )
Пример #3
0
 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__()
Пример #4
0
 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))
Пример #5
0
 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))
Пример #6
0
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')
Пример #7
0
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:
Пример #8
0
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]
Пример #9
0
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)
Пример #10
0
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]