void SimpleE133Device::OnTCPConnect(TCPSocket *socket) { OLA_INFO << "Opened new TCP connection: " << socket; m_socket.reset(socket); m_in_transport.reset(new IncomingTCPTransport(&m_root_inflator, socket)); m_message_queue.reset( new MessageQueue(m_socket.get(), &m_ss, m_message_builder.pool())); m_health_checked_connection.reset(new E133HealthCheckedConnection( &m_message_builder, m_message_queue.get(), NewSingleCallback(this, &SimpleE133Device::SocketClosed), &m_ss)); socket->SetOnData(NewCallback(this, &SimpleE133Device::ReceiveTCPData)); socket->SetOnClose(NewSingleCallback(this, &SimpleE133Device::SocketClosed)); m_ss.AddReadDescriptor(socket); if (!m_health_checked_connection->Setup()) { OLA_WARN << "Failed to setup heartbeat controller for " << m_controller; SocketClosed(); return; } }
/** * Check that we send OSC messages correctly. */ void OSCNodeTest::testSendBlob() { // First up create a UDP socket to receive the messages on. // Port 0 means 'ANY' IPV4SocketAddress socket_address(IPV4Address::Loopback(), 0); // Bind the socket, set the callback, and register with the select server. OLA_ASSERT_TRUE(m_udp_socket.Bind(socket_address)); m_udp_socket.SetOnData(NewCallback(this, &OSCNodeTest::UDPSocketReady)); OLA_ASSERT_TRUE(m_ss.AddReadDescriptor(&m_udp_socket)); // Store the local address of the UDP socket so we know where to tell the // OSCNode to send to. OLA_ASSERT_TRUE(m_udp_socket.GetSocketAddress(&socket_address)); // Setup the OSCTarget pointing to the local socket address OSCTarget target(socket_address, TEST_OSC_ADDRESS); // Add the target to the node. m_osc_node->AddTarget(TEST_GROUP, target); // Send the data OLA_ASSERT_TRUE(m_osc_node->SendData(TEST_GROUP, OSCNode::FORMAT_BLOB, m_dmx_data)); // Run the SelectServer this will return either when UDPSocketReady // completes, or the abort timeout triggers. m_ss.Run(); // Remove target OLA_ASSERT_TRUE(m_osc_node->RemoveTarget(TEST_GROUP, target)); // Try to remove it a second time OLA_ASSERT_FALSE(m_osc_node->RemoveTarget(TEST_GROUP, target)); // Try to remove the target from a group that doesn't exist OLA_ASSERT_FALSE(m_osc_node->RemoveTarget(TEST_GROUP + 1, target)); }
/** * Init this node */ bool SimpleE133Node::Init() { // setup notifications for stdin & turn off buffering m_stdin_descriptor.SetOnData(ola::NewCallback(this, &SimpleE133Node::Input)); m_ss.AddReadDescriptor(&m_stdin_descriptor); tcgetattr(STDIN_FILENO, &m_old_tc); termios new_tc = m_old_tc; new_tc.c_lflag &= static_cast<tcflag_t>(~ICANON & ~ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &new_tc); if (!m_e133_device.Init()) return false; // register the root endpoint m_e133_device.SetRootEndpoint(&m_root_endpoint); // add a single endpoint m_endpoint_manager.RegisterEndpoint(1, &m_first_endpoint); // register in SLP OLA_INFO << "service is " << m_service_name; if (!m_slp_thread.Init()) { OLA_WARN << "SlpThread Init() failed"; return false; } m_slp_thread.Start(); return true; }
void RootSenderTest::testRootSenderWithCIDs(const CID &root_cid, const CID &send_cid) { std::auto_ptr<Callback0<void> > stop_closure( NewCallback(this, &RootSenderTest::Stop)); // inflators MockInflator inflator(send_cid, stop_closure.get()); RootInflator root_inflator; OLA_ASSERT(root_inflator.AddInflator(&inflator)); // sender RootSender root_sender(root_cid); // setup the socket ola::network::UDPSocket socket; OLA_ASSERT(socket.Init()); OLA_ASSERT( socket.Bind(IPV4SocketAddress(IPV4Address::Loopback(), 0))); OLA_ASSERT(socket.EnableBroadcast()); IncomingUDPTransport incoming_udp_transport(&socket, &root_inflator); socket.SetOnData(NewCallback(&incoming_udp_transport, &IncomingUDPTransport::Receive)); OLA_ASSERT(m_ss->AddReadDescriptor(&socket)); // Get the port we bound to. IPV4SocketAddress local_address; OLA_ASSERT(socket.GetSocketAddress(&local_address)); OutgoingUDPTransportImpl udp_transport_impl(&socket); OutgoingUDPTransport outgoing_udp_transport(&udp_transport_impl, IPV4Address::Loopback(), local_address.Port()); // now actually send some data MockPDU mock_pdu(4, 8); if (root_cid == send_cid) OLA_ASSERT(root_sender.SendPDU(MockPDU::TEST_VECTOR, mock_pdu, &outgoing_udp_transport)); else OLA_ASSERT(root_sender.SendPDU(MockPDU::TEST_VECTOR, mock_pdu, send_cid, &outgoing_udp_transport)); SingleUseCallback0<void> *closure = NewSingleCallback(this, &RootSenderTest::FatalStop); m_ss->RegisterSingleTimeout(ABORT_TIMEOUT_IN_MS, closure); m_ss->Run(); }
void RootSenderTest::testRootSenderWithCIDs(const CID &root_cid, const CID &send_cid) { std::auto_ptr<Callback0<void> > stop_closure( NewCallback(this, &RootSenderTest::Stop)); // inflators MockInflator inflator(send_cid, stop_closure.get()); RootInflator root_inflator; CPPUNIT_ASSERT(root_inflator.AddInflator(&inflator)); // sender RootSender root_sender(root_cid); // setup the socket ola::network::UdpSocket socket; CPPUNIT_ASSERT(socket.Init()); CPPUNIT_ASSERT(socket.Bind(ACN_PORT)); CPPUNIT_ASSERT(socket.EnableBroadcast()); IncomingUDPTransport incoming_udp_transport(&socket, &root_inflator); socket.SetOnData(NewCallback(&incoming_udp_transport, &IncomingUDPTransport::Receive)); CPPUNIT_ASSERT(m_ss->AddReadDescriptor(&socket)); // outgoing transport IPV4Address addr; CPPUNIT_ASSERT(IPV4Address::FromString("255.255.255.255", &addr)); OutgoingUDPTransportImpl udp_transport_impl(&socket); OutgoingUDPTransport outgoing_udp_transport(&udp_transport_impl, addr); // now actually send some data MockPDU mock_pdu(4, 8); if (root_cid == send_cid) CPPUNIT_ASSERT(root_sender.SendPDU(MockPDU::TEST_VECTOR, mock_pdu, &outgoing_udp_transport)); else CPPUNIT_ASSERT(root_sender.SendPDU(MockPDU::TEST_VECTOR, mock_pdu, send_cid, &outgoing_udp_transport)); SingleUseCallback0<void> *closure = NewSingleCallback(this, &RootSenderTest::FatalStop); m_ss->RegisterSingleTimeout(ABORT_TIMEOUT_IN_MS, closure); m_ss->Run(); }
/** * Start up the controller */ bool SimpleE133Controller::Init() { if (!m_udp_socket.Init()) return false; if (!m_udp_socket.Bind(IPV4SocketAddress(m_controller_ip, 0))) { OLA_INFO << "Failed to bind to UDP port"; return false; } m_ss.AddReadDescriptor(&m_udp_socket); if (m_slp_thread.get()) { if (!m_slp_thread->Init()) { OLA_WARN << "SLPThread Init() failed"; return false; } m_slp_thread->Start(); } return true; }
/* * Test the UDPTransport */ void UDPTransportTest::testUDPTransport() { CID cid; std::auto_ptr<Callback0<void> > stop_closure( NewCallback(this, &UDPTransportTest::Stop)); MockInflator inflator(cid, stop_closure.get()); // setup the socket ola::network::UDPSocket socket; OLA_ASSERT(socket.Init()); OLA_ASSERT(socket.Bind(IPV4SocketAddress(IPV4Address::Loopback(), 0))); OLA_ASSERT(socket.EnableBroadcast()); // Get the port we bound to. IPV4SocketAddress local_address; OLA_ASSERT(socket.GetSocketAddress(&local_address)); IncomingUDPTransport incoming_udp_transport(&socket, &inflator); socket.SetOnData(NewCallback(&incoming_udp_transport, &IncomingUDPTransport::Receive)); OLA_ASSERT(m_ss->AddReadDescriptor(&socket)); // outgoing transport OutgoingUDPTransportImpl udp_transport_impl(&socket); OutgoingUDPTransport outgoing_udp_transport(&udp_transport_impl, IPV4Address::Loopback(), local_address.Port()); // now actually send some data PDUBlock<PDU> pdu_block; MockPDU mock_pdu(4, 8); pdu_block.AddPDU(&mock_pdu); OLA_ASSERT(outgoing_udp_transport.Send(pdu_block)); SingleUseCallback0<void> *closure = NewSingleCallback(this, &UDPTransportTest::FatalStop); m_ss->RegisterSingleTimeout(ABORT_TIMEOUT_IN_MS, closure); m_ss->Run(); }