You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							121 lines
						
					
					
						
							2.5 KiB
						
					
					
				#include <cassert>
 | 
						|
#include <iostream>
 | 
						|
#include <string>
 | 
						|
 | 
						|
#include "msgq/ipc.h"
 | 
						|
#include "msgq/impl_zmq.h"
 | 
						|
#include "msgq/impl_msgq.h"
 | 
						|
#include "msgq/impl_fake.h"
 | 
						|
 | 
						|
#ifdef __APPLE__
 | 
						|
const bool MUST_USE_ZMQ = true;
 | 
						|
#else
 | 
						|
const bool MUST_USE_ZMQ = false;
 | 
						|
#endif
 | 
						|
 | 
						|
bool messaging_use_zmq(){
 | 
						|
  if (std::getenv("ZMQ") || MUST_USE_ZMQ) {
 | 
						|
    if (std::getenv("OPENPILOT_PREFIX")) {
 | 
						|
      std::cerr << "OPENPILOT_PREFIX not supported with ZMQ backend\n";
 | 
						|
      assert(false);
 | 
						|
    }
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool messaging_use_fake(){
 | 
						|
  char* fake_enabled = std::getenv("CEREAL_FAKE");
 | 
						|
  return fake_enabled != NULL;
 | 
						|
}
 | 
						|
 | 
						|
Context * Context::create(){
 | 
						|
  Context * c;
 | 
						|
  if (messaging_use_zmq()){
 | 
						|
    c = new ZMQContext();
 | 
						|
  } else {
 | 
						|
    c = new MSGQContext();
 | 
						|
  }
 | 
						|
  return c;
 | 
						|
}
 | 
						|
 | 
						|
SubSocket * SubSocket::create(){
 | 
						|
  SubSocket * s;
 | 
						|
  if (messaging_use_fake()) {
 | 
						|
    if (messaging_use_zmq()) {
 | 
						|
      s = new FakeSubSocket<ZMQSubSocket>();
 | 
						|
    } else {
 | 
						|
      s = new FakeSubSocket<MSGQSubSocket>();
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    if (messaging_use_zmq()){
 | 
						|
      s = new ZMQSubSocket();
 | 
						|
    } else {
 | 
						|
      s = new MSGQSubSocket();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
SubSocket * SubSocket::create(Context * context, std::string endpoint, std::string address, bool conflate, bool check_endpoint){
 | 
						|
  SubSocket *s = SubSocket::create();
 | 
						|
  int r = s->connect(context, endpoint, address, conflate, check_endpoint);
 | 
						|
 | 
						|
  if (r == 0) {
 | 
						|
    return s;
 | 
						|
  } else {
 | 
						|
    std::cerr << "Error, failed to connect SubSocket to " << endpoint << ": " << strerror(errno) << std::endl;
 | 
						|
 | 
						|
    delete s;
 | 
						|
    return nullptr;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
PubSocket * PubSocket::create(){
 | 
						|
  PubSocket * s;
 | 
						|
  if (messaging_use_zmq()){
 | 
						|
    s = new ZMQPubSocket();
 | 
						|
  } else {
 | 
						|
    s = new MSGQPubSocket();
 | 
						|
  }
 | 
						|
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
PubSocket * PubSocket::create(Context * context, std::string endpoint, bool check_endpoint){
 | 
						|
  PubSocket *s = PubSocket::create();
 | 
						|
  int r = s->connect(context, endpoint, check_endpoint);
 | 
						|
 | 
						|
  if (r == 0) {
 | 
						|
    return s;
 | 
						|
  } else {
 | 
						|
    std::cerr << "Error, failed to bind PubSocket to " << endpoint << ": " << strerror(errno) << std::endl;
 | 
						|
 | 
						|
    delete s;
 | 
						|
    return nullptr;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
Poller * Poller::create(){
 | 
						|
  Poller * p;
 | 
						|
  if (messaging_use_fake()) {
 | 
						|
    p = new FakePoller();
 | 
						|
  } else {
 | 
						|
    if (messaging_use_zmq()){
 | 
						|
      p = new ZMQPoller();
 | 
						|
    } else {
 | 
						|
      p = new MSGQPoller();
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return p;
 | 
						|
}
 | 
						|
 | 
						|
Poller * Poller::create(std::vector<SubSocket*> sockets){
 | 
						|
  Poller * p = Poller::create();
 | 
						|
 | 
						|
  for (auto s : sockets){
 | 
						|
    p->registerSocket(s);
 | 
						|
  }
 | 
						|
  return p;
 | 
						|
}
 | 
						|
 |