ROS DefaultNode 监听器的注册和执行

  
  
 /***************监听器包EventDispatcher  然后交注册进事件分配器中******************/
  
 public DefaultNode(NodeConfiguration nodeConfiguration, Collection<NodeListener> nodeListeners,
      ScheduledExecutorService scheduledExecutorService) {
    this.nodeConfiguration = NodeConfiguration.copyOf(nodeConfiguration);
	//建立DefaultNode监听事件链表
    this.nodeListeners = new ListenerGroup<NodeListener>(scheduledExecutorService);
    //将监听事件注册到链表中
	this.nodeListeners.addAll(nodeListeners);
    
	this.scheduledExecutorService = scheduledExecutorService;
    masterUri = nodeConfiguration.getMasterUri();
    masterClient = new MasterClient(masterUri);
    topicParticipantManager = new TopicParticipantManager();
    serviceManager = new ServiceManager();
    parameterManager = new ParameterManager(scheduledExecutorService);

    GraphName basename = nodeConfiguration.getNodeName();
    NameResolver parentResolver = nodeConfiguration.getParentResolver();
    nodeName = parentResolver.getNamespace().join(basename);
    resolver = new NodeNameResolver(nodeName, parentResolver);
    slaveServer =
        new SlaveServer(nodeName, nodeConfiguration.getTcpRosBindAddress(),
            nodeConfiguration.getTcpRosAdvertiseAddress(),
            nodeConfiguration.getXmlRpcBindAddress(),
            nodeConfiguration.getXmlRpcAdvertiseAddress(), masterClient, topicParticipantManager,
            serviceManager, parameterManager, scheduledExecutorService);
    slaveServer.start();

    NodeIdentifier nodeIdentifier = slaveServer.toNodeIdentifier();

    parameterTree =
        DefaultParameterTree.newFromNodeIdentifier(nodeIdentifier, masterClient.getRemoteUri(),
            resolver, parameterManager);

    publisherFactory =
        new PublisherFactory(nodeIdentifier, topicParticipantManager,
            nodeConfiguration.getTopicMessageFactory(), scheduledExecutorService);
    subscriberFactory =
        new SubscriberFactory(nodeIdentifier, topicParticipantManager, scheduledExecutorService);
    serviceFactory =
        new ServiceFactory(nodeName, slaveServer, serviceManager, scheduledExecutorService);

    registrar = new Registrar(masterClient, scheduledExecutorService);
    topicParticipantManager.setListener(registrar);
    serviceManager.setListener(registrar);

    scheduledExecutorService.execute(new Runnable() {
      @Override
      public void run() {
        start();
      }
    });
  }
    private void start() {
    // The Registrar must be started first so that master registration is
    // possible during startup.
    registrar.start(slaveServer.toNodeIdentifier());

    // During startup, we wait for 1) the RosoutLogger and 2) the TimeProvider.
    final CountDownLatch latch = new CountDownLatch(2);

    log = new RosoutLogger(this);
    log.getPublisher().addListener(new DefaultPublisherListener<rosgraph_msgs.Log>() {
      @Override
      public void onMasterRegistrationSuccess(Publisher<rosgraph_msgs.Log> registrant) {
        latch.countDown();
      }
    });

    boolean useSimTime = false;
    try {
      useSimTime =
          parameterTree.has(Parameters.USE_SIM_TIME)
              && parameterTree.getBoolean(Parameters.USE_SIM_TIME);
    } catch (Exception e) {
      signalOnError(e);
    }
    if (useSimTime) {
      ClockTopicTimeProvider clockTopicTimeProvider = new ClockTopicTimeProvider(this);
      clockTopicTimeProvider.getSubscriber().addSubscriberListener(
          new DefaultSubscriberListener<rosgraph_msgs.Clock>() {
            @Override
            public void onMasterRegistrationSuccess(Subscriber<rosgraph_msgs.Clock> subscriber) {
              latch.countDown();
            }
          });
      timeProvider = clockTopicTimeProvider;
    } else {
      timeProvider = nodeConfiguration.getTimeProvider();
      latch.countDown();
    }

    try {
      latch.await();
    } catch (InterruptedException e) {
      signalOnError(e);
      shutdown();
      return;
    }
 
 
   //向事件监听ListenerGroup注册监听事件
    signalOnStart();  
  }
  
  
  /**
   * SignalRunnable all {@link NodeListener}s that the {@link Node} has started.
   * <p>
   * Each listener is called in a separate thread.
   */
   
   /*
  任务链结构
| nodeListener1—————————————nodeListener2——————————————nodeListener3------------|
			|注册任务1_1            |                             |
			|注册任务2_1            |                             |
			|注册任务3_1            |                             |
			|注册任务4_1            |                             |
			                      	|注册任务1_2                  |
									|注册任务2_2                  |
									|注册任务3_2                  |
									|注册任务4_2                  |
                                                                  |注册任务1_3
																  |注册任务2_3
															 	  |注册任务3_3
																  |注册任务4_3
			 
   */
  private void signalOnStart() {
	  
	//注册参数  DefaultNode : connectedNode  
    final ConnectedNode connectedNode = this; 
	//监听任务链 中的每个监听任务 注册SignalRunnable 任务
    nodeListeners.signal(new SignalRunnable<NodeListener>() {
      @Override
      public void run(NodeListener listener) {
        listener.onStart(connectedNode);
      }
    });
	
	
	
  }

  
  
  
  /***************监听器运行******************/
  public Collection<EventDispatcher<T>> addAll(Collection<T> listeners, int limit) {
    Collection<EventDispatcher<T>> eventDispatchers = Lists.newArrayList();
    for (T listener : listeners) {
      eventDispatchers.add(add(listener, limit)); // 注册监听器,并且执行监听
    }
    return eventDispatchers;
  }
  
  
    public EventDispatcher<T> add(T listener, int queueCapacity) {
    EventDispatcher<T> eventDispatcher = new EventDispatcher<T>(listener, queueCapacity);
    eventDispatchers.add(eventDispatcher);    //注册监听
    executorService.execute(eventDispatcher); //执行监听
    return eventDispatcher;
  }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值