コード例 #1
0
ファイル: Wiimote.cpp プロジェクト: flair2005/Vrui
void Wiimote::setReportingMode(bool insideReader)
{
    /* Assemble the data request packet: */
    unsigned char requestData[]= {0xa2,0x12,0x00,0x00};

    if(readContinuously)
        requestData[2]|=0x04;

    if(extensionDevice!=NONE)
    {
        if(readAccelerometers&&readIRTracking)
            requestData[3]=0x37;
        else if(readAccelerometers)
            requestData[3]=0x35;
        else if(readIRTracking)
            requestData[3]=0x36;
        else
            requestData[3]=0x32;
    }
    else
    {
        if(readAccelerometers&&readIRTracking)
            requestData[3]=0x33;
        else if(readAccelerometers)
            requestData[3]=0x31;
        else if(readIRTracking)
            requestData[3]=0x36;
        else
            requestData[3]=0x30;
    }

    /* Set the appropriate IR camera reporting mode for the data reporting mode: */
    if(readIRTracking)
    {
        if(insideReader)
        {
            /* Write to the camera's register area: */
            unsigned char IRMode[]= {0xa2,0x16,0x04,0xb0,0x00,0x33,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
            if(extensionDevice==NONE&&readAccelerometers&&readIRTracking)
                IRMode[7]=0x03;
            writePacket(IRMode,sizeof(IRMode));

            /* Wait for acknowledgment: */
            unsigned char packet[21];
            waitForPacket(0x22,packet,6);
        }
        else
        {
            unsigned char IRMode=0x01;
            if(extensionDevice==NONE&&readAccelerometers&&readIRTracking)
                IRMode=0x03;
            uploadData(true,0xb00033,&IRMode,sizeof(unsigned char));
        }
    }

    /* Send the packet: */
    writePacket(requestData,sizeof(requestData));
}
コード例 #2
0
bool SeaNet::isFullDuplex(int timeout)
{
    std::vector<uint8_t> packet = SeaNetPacket::createPaket(device_type,mtSendBBUser);
    writePacket(&packet[0],packet.size());
    waitForPacket(mtBBUserData,timeout);
    BBUserData settings;
    sea_net_packet.decodeBBUserData(settings);
    return settings.full_duplex;
}
コード例 #3
0
void SeaNet::getVersion(VersionData &version,int timeout)
{
    std::vector<uint8_t> send_packet = SeaNetPacket::createPaket(device_type,mtSendVersion);
    writePacket(&send_packet[0],send_packet.size());

    //wait until we received a mtVersionData package
    waitForPacket(mtVersionData,timeout);
    sea_net_packet.decodeVersionData(version);
}
コード例 #4
0
void SeaNet::reboot(int timeout)
{
    LOG_DEBUG_S << "rebooting device" ;
    std::vector<uint8_t> packet = SeaNetPacket::createPaket(device_type,mtReBoot);
    writePacket(&packet[0],packet.size());
    clear();

    //now wait for an alive message
    waitForPacket(mtAlive,timeout);
}
コード例 #5
0
ファイル: Server.cpp プロジェクト: Struchu/ghosts-client-qt4
void Server::run()
{
    while(m_running)
    {
        // check if there are any outgoing packets waiting to be send
        Packet *packet = nextOutgoingPacket();
        while(packet != 0)
        {
            sendPacket(packet);
            delete packet;
            packet = nextOutgoingPacket();
        }
        
        // get next incoming packet
        packet = waitForPacket(100);
                
        if(packet != 0)
        {
            addIncomingPacket(packet);
            emit newPacketArrived();
        }
    }
}
コード例 #6
0
void SeaNet::writeHeadCommand(HeadCommand &head_config, int timeout)
{
    if (has_pending_data)
        throw std::runtime_error("requestData() called and the corresponding receiveData() has not been called");

    iodrivers_base::Timeout time_out(timeout);
    std::vector<uint8_t> packet =
        SeaNetPacket::createPaket(device_type,
                mtHeadCommand,
                (uint8_t*)&head_config,
                sizeof(head_config));

    LOG_DEBUG_S <<"Sent mtHeadCommand packet" ;
    writePacket(&packet[0],packet.size(),time_out.timeLeft());

    //wait for an alive packet to check if the sonar is configured
    AliveData alive_data;
    bool received_alive = false;
    while(!alive_data.ready && alive_data.no_config && !alive_data.config_send)
    {
        try
        {
            waitForPacket(mtAlive,time_out.timeLeft());
        }
        catch(std::runtime_error e)
        {
            if(received_alive)
                throw std::runtime_error("Configure failed: Configuration was not accepted by the device.");
            else
                throw std::runtime_error("Configure failed: Device is not responding. Timeout too small?");

        }
        received_alive = true;
        sea_net_packet.decodeAliveData(alive_data);
    }
}
コード例 #7
0
ファイル: Server.cpp プロジェクト: Struchu/ghosts-client-qt4
Packet *Server::nextPacket()
{
    if(m_socket == 0)
    {
        m_error = QObject::tr("Socket is not open");
        return 0;
    }
    
    int bytesRead;
        
    if(m_packetSize == 0)
    {
        // read packet length
        if(m_socket->bytesAvailable() > 0)
            bytesRead = m_socket->read(m_buffer, 4);
        else
            return 0;
        
        if(bytesRead < 0)
        {
            // error
            m_error = QObject::tr("Error while reading from socket: ") + m_socket->errorString();
            return new DisconnectPacket();
        }
        else if(bytesRead == 0)
            return 0;
        
        m_packetSize = Packet::readInt(m_buffer);
        
        m_offset = bytesRead;
    }
        
    if(m_socket->bytesAvailable() > 0)
        bytesRead = m_socket->read(&m_buffer[m_offset], m_packetSize - m_offset);
    else
        return 0;
        
    if(bytesRead < 0)
    {
        // error
        m_error = QObject::tr("Error while reading from socket: ") + m_socket->errorString();
        return new DisconnectPacket();
    }
    else if(bytesRead == 0)
    {
        // no data to read
        return 0;
    }
    else
    {
        // read some data
        m_offset += bytesRead;
        
        if(m_offset == m_packetSize)
        {
            Packet *result = PacketFactory::getPacket(m_buffer[4]);
            
            if(result != 0)
            {
                m_offset = m_packetSize = 0;
                
                if(result->type() == PlayerListPacket::Type)
                {
                    PlayerListPacket *playerList = dynamic_cast<PlayerListPacket*>(result);
                    
                    int size = Packet::readInt(m_buffer + 5);
                    
                    for(int i = 0; i < size; i++)
                    {
                        Packet *p = waitForPacket(20000);
                        
                        if(p == 0 || p->type() != PlayerPacket::Type)
                        {
                            m_error = QObject::tr("Corrupted player list");
                            delete result;
                            if(p != 0)
                                delete p;
                            
                            return new DisconnectPacket();
                        }
                        
                        playerList->addPlayer(dynamic_cast<PlayerPacket*>(p));
                    }
                }
                else
                {
                    result->read(m_buffer + 5);   
                }
            }
            else
                // unknown packet
                m_error = QObject::tr("Unknown packet ID: ") + QString("%1").arg((int)m_buffer[4]);
            
            return result;
        }
    }
    
    return 0;
}
コード例 #8
0
void SeaNet::receiveData(int timeout)
{
    LOG_DEBUG_S << "waiting for a mtHeadData packet" ;
    waitForPacket(mtHeadData, timeout);
}