예제 #1
0
bool DeviceResponder::read(ConnectionReader& connection) {
    Bottle cmd, response;
    if (!cmd.read(connection)) { return false; }
    //printf("command received: %s\n", cmd.toString().c_str());
    respond(cmd,response);
    if (response.size()>=1) {
        ConnectionWriter *writer = connection.getWriter();
        if (writer!=NULL) {
            if (response.get(0).toString()=="many"&&writer->isTextMode()) {
                for (int i=1; i<response.size(); i++) {
                    Value& v = response.get(i);
                    if (v.isList()) {
                        v.asList()->write(*writer);
                    } else {
                        Bottle b;
                        b.add(v);
                        b.write(*writer);
                    }
                }
            } else {
                response.write(*writer);
            }

            //printf("response sent: %s\n", response.toString().c_str());
        }
    } else {
        ConnectionWriter *writer = connection.getWriter();
        if (writer!=NULL) {
            response.clear();
            response.addVocab(Vocab::encode("nak"));
            response.write(*writer);
        }
    }
    return true;
}
예제 #2
0
bool yarp::os::Node::Helper::read(ConnectionReader& reader)
{
    if (!reader.isValid()) {
        return false;
    }
    NodeArgs na;
    na.request.read(reader);
    //printf("NODE API for %s received %s\n",
    //name.c_str(),
    //na.request.toString().c_str());
    std::string key = na.request.get(0).asString();
    na.args = na.request.tail().tail();
    if (key=="getBusStats") {
        getBusStats(na);
    } else if (key=="getBusInfo") {
        getBusInfo(na);
    } else if (key=="getMasterUri") {
        getMasterUri(na);
    } else if (key=="shutdown") {
        shutdown(na);
    } else if (key=="getPid") {
        getPid(na);
    } else if (key=="getSubscriptions") {
        getSubscriptions(na);
    } else if (key=="getPublications") {
        getPublications(na);
    } else if (key=="paramUpdate") {
        paramUpdate(na);
    } else if (key=="publisherUpdate") {
        publisherUpdate(na);
    } else if (key=="requestTopic") {
        requestTopic(na);
    } else {
        na.error("I have no idea what you are talking about");
    }
    if (na.should_drop) {
        reader.requestDrop(); // ROS likes to close down.
    }
    if (reader.getWriter()) {
        Bottle full;
        full.addInt32(na.code);
        full.addString(na.msg);
        full.add(na.reply);
        //printf("NODE %s <<< %s\n",
        //name.c_str(),
        //full.toString().c_str());
        full.write(*reader.getWriter());
    }
    return true;
}
예제 #3
0
bool RFModuleHelper::read(ConnectionReader& connection) {
    Bottle cmd, response;
    if (!cmd.read(connection)) { return false; }
    printf("command received: %s\n", cmd.toString().c_str());

    bool result = owner.safeRespond(cmd,response);
    if (response.size()>=1) {
        ConnectionWriter *writer = connection.getWriter();
        if (writer!=0) {
            if (response.get(0).toString()=="many" && writer->isTextMode()) {
                for (int i=1; i<response.size(); i++) {
                    Value& v = response.get(i);
                    if (v.isList()) {
                        v.asList()->write(*writer);
                    } else {
                        Bottle b;
                        b.add(v);
                        b.write(*writer);
                    }
                }
            } else {
                response.write(*writer);
            }

            //printf("response sent: %s\n", response.toString().c_str());
        }
    }
    return result;
}
예제 #4
0
파일: main.cpp 프로젝트: AbuMussabRaja/yarp
 virtual bool read(ConnectionReader& connection) {
     Bottle cmd, response;
     cmd.read(connection);
     printf("command received: %s\n", cmd.toString().c_str());
     int code = cmd.get(0).asVocab();
     switch (code) {
     case VOCAB3('s','e','t'):
         printf("set command received\n");
         prop.put(cmd.get(1).asString().c_str(),cmd.get(2));
         break;
     case VOCAB3('g','e','t'):
         printf("get command received\n");
         response.addVocab(VOCAB2('i','s'));
         response.add(cmd.get(1));
         response.add(prop.find(cmd.get(1).asString().c_str()));
         break;
     }
     if (response.size()>=1) {
         ConnectionWriter *writer = connection.getWriter();
         if (writer!=NULL) {
             response.write(*writer);
             printf("response sent: %s\n", response.toString().c_str());
         }
     }
 }
예제 #5
0
파일: PortTest.cpp 프로젝트: JoErNanO/yarp
 virtual bool read(ConnectionReader& connection) {
     Bottle receive;
     receive.read(connection);
     receive.addInt(5);
     ConnectionWriter *writer = connection.getWriter();
     if (writer!=NULL) {
         receive.write(*writer);
     }
     return true;
 }
예제 #6
0
파일: main.cpp 프로젝트: GunnyPong/wysiwyd
 virtual bool read(ConnectionReader& connection) {
     Bottle b,r;
     bool ok = b.read(connection);
     if (!ok) return false;
     stackWrap->onTick();
     r.addString("tack");
     ConnectionWriter *returnToSender = connection.getWriter();
     if (returnToSender != NULL)
         r.write(*returnToSender);
     return true;
 }
예제 #7
0
 virtual bool read(ConnectionReader& connection) {
     Bottle receive;
     //printf("service provider reading data\n");
     receive.read(connection);
     //printf("service provider read data\n");
     receive.addInt(5);
     ConnectionWriter *writer = connection.getWriter();
     if (writer!=NULL) {
         //printf("service provider replying\n");
         receive.write(*writer);
         //printf("service provider replied\n");
     }
     return true;
 }
 virtual bool read(ConnectionReader& connection) {
     Bottle in, out;
     in.read(connection);
     // process data "in", prepare "out"
     printf("Got message to reply to: %s\n", in.toString().c_str());  
     out.clear();
     out.add("acknowledge");
     out.append(in);
     ConnectionWriter *returnToSender = connection.getWriter();
     if (returnToSender!=NULL) {
         out.write(*returnToSender);
     }
     return true;
 }
예제 #9
0
	virtual bool read(ConnectionReader& connection) {

		Bottle in, out;
		bool ok = in.read(connection);
		if (!ok) {
			return false;
		}
		out.add(*active);
		ConnectionWriter *returnToSender = connection.getWriter();
		if (returnToSender!=NULL) {
			out.write(*returnToSender);
		}
		return true;

	}
예제 #10
0
bool CtrlThread::RpcPortCallback::read(ConnectionReader& connection)
{
    Bottle input, reply;
    bool ok = input.read(connection);
    if (!ok)
        return false;

    else{
        ctThread.parseRpcMessage(&input, &reply);
        ConnectionWriter *returnToSender = connection.getWriter();
        if (returnToSender!=NULL) {
            reply.write(*returnToSender);
        }
        return true;
    }
}
예제 #11
0
bool DataProcessor::read(ConnectionReader& connection) {
	Bottle in, out;
	bool ok = in.read(connection);
	std::cout << "DataProcessor read bottle "  << std::endl;	
	Stamp stamp;
//	stamp.read(connection);
//	std::cout << "DataProcessor read stamp!"  << std::endl;		
	if (!ok) return false;

	// process data "in", prepare "out"
	out.append(in);
	out.addList() = module->calculatePosition(in, stamp);

	std::cout << "DataProcessor: " << in.toString() << std::endl;

	// reply
	ConnectionWriter *returnToSender = connection.getWriter();
	if (returnToSender!=NULL) {
	  out.write(*returnToSender);
	}
	return true;
}
예제 #12
0
    virtual bool read(ConnectionReader& reader) {
        // called by comms code
        readBlock.wait();

        if (!reader.isValid()) {
            // termination
            stateMutex.wait();
            if (readDelegate!=NULL) {
                readResult = readDelegate->read(reader);
            }
            stateMutex.post();
            produce.post();
            readBlock.post();
            return false;
        }

        // wait for happy consumer - don't want to miss a packet
        if (!readBackground) {
            consume.wait();
        }

        if (closed) {
            YARP_DEBUG(Logger::get(),"Port::read shutting down");
            readBlock.post();
            return false;
        }

        stateMutex.wait();
        readResult = false;
        if (readDelegate!=NULL) {
            readResult = readDelegate->read(reader);
        } else {
            // read and ignore
            YARP_DEBUG(Logger::get(),"data received in Port, no reader for it");
            Bottle b;
            b.read(reader);
        }
        if (!readBackground) {
            readDelegate = NULL;
            writeDelegate = NULL;
        }
        bool result = readResult;
        stateMutex.post();
        if (!readBackground) {
            produce.post();
        }
        if (result&&willReply) {
            consume.wait();
            if (closed) {
                YARP_DEBUG(Logger::get(),"Port::read shutting down");
                readBlock.post();
                return false;
            }
            if (writeDelegate!=NULL) {
                stateMutex.wait();
                ConnectionWriter *writer = reader.getWriter();
                if (writer!=NULL) {
                    result = readResult = writeDelegate->write(*writer);
                }
                stateMutex.post();
            }
            if (dropDue) {
                reader.requestDrop();
            }
            produce.post();
        }
        readBlock.post();
        return result;
    }
예제 #13
0
bool InferrenceRequestReader::read(ConnectionReader& connection) {

    /** do rpcport */

    printf("Waiting for an RPC message...\n");
    Bottle cmd,response;
    bool ok = cmd.read(connection);
    if (!ok) return false;
    ConnectionWriter *returnToSender = connection.getWriter();

    // process data in b

    printf("Got message: %s\n", cmd.toString().c_str());
    std::string cmdstring = std::string(cmd.get(0).asString().c_str());
    if (!cmdstring.compare("INFER")||!cmdstring.compare("infer")) {

        std::string whichLearner = std::string(cmd.get(1).asString().c_str());
        int whichLearnerN = parent->learnerInd(whichLearner);
        if (whichLearnerN<0)whichLearnerN=parent->addLearner(whichLearner);

        int numComponents=cmd.get(2).asInt();
        Vector components(numComponents);
        Vector input(numComponents);
        for (int i=0;i<numComponents;i++) {
            components[i]=cmd.get(3+i).asDouble();
        }
        for (int i=0;i<numComponents;i++) {
            input[i]=cmd.get(numComponents+3+i).asDouble();
        }
        Vector output;
        Matrix sigmaDump;
        bool res = parent->gmmthreads[whichLearnerN]->doInference(input,components,output,sigmaDump);
        if (!res) {
            response.addString("NOTREADY");
            printf("Sending reply: %s\n", response.toString().c_str());
            response.write(*returnToSender);
            return true;
        } else {
            response.addString("REGRESSED");
            response.addInt(output.Size());
            for (int i=0;i<output.Size();i++) {
                response.addDouble(output[i]);
            }
            printf("Sending reply: %s\n", response.toString().c_str());
            response.write(*returnToSender);
            return true;
        }
    }else if (!cmdstring.compare("SAVEDATA")||!cmdstring.compare("savedata")) {
        std::string whichLearner = std::string(cmd.get(1).asString().c_str());
        int whichLearnerN = parent->learnerInd(whichLearner);      
	std::string saveName = std::string(cmd.get(2).asString().c_str());
	parent->gmmthreads[whichLearnerN]->saveData(saveName);
	response.addString("OK");
	printf("Sending reply to save data request: %s\n", response.toString().c_str());
	response.write(*returnToSender);
    }else if (!cmdstring.compare("SAVEMODEL")||!cmdstring.compare("savemodel")) {
        std::string whichLearner = std::string(cmd.get(1).asString().c_str());
        int whichLearnerN = parent->learnerInd(whichLearner);      
	std::string saveName = std::string(cmd.get(2).asString().c_str());
	parent->gmmthreads[whichLearnerN]->saveMap(saveName);
	response.addString("OK");
	printf("Sending reply to save model request: %s\n", response.toString().c_str());
	response.write(*returnToSender);    
      
    } else if (!cmdstring.compare("RELEARN")||!cmdstring.compare("relearn")) {
        std::string whichLearner = std::string(cmd.get(1).asString().c_str());
        int whichLearnerN = parent->learnerInd(whichLearner);      
	std::string saveName = std::string(cmd.get(2).asString().c_str());
	parent->gmmthreads[whichLearnerN]->forceRelearn();
	response.addString("OK");
	std::cout<<"Forced relearn for learner "<<whichLearner<<": sending response "<< response.toString().c_str()<<std::endl;
	response.write(*returnToSender);    
      
    } else {
        response.addString("UNKNOWNCOMMAND");
        printf("Sending reply: %s\n", response.toString().c_str());
        response.write(*returnToSender);
        return true;
    }


}
bool HapticDeviceWrapper::read(ConnectionReader &connection)
{
    Bottle cmd;
    if (!cmd.read(connection))
        return false;
    int tag=cmd.get(0).asVocab();

    Bottle rep;
    if (device!=NULL)
    {
        LockGuard lg(mutex);

        if (tag==hapticdevice::set_transformation)
        {
            if (cmd.size()>=2)
            {
                if (Bottle *payload=cmd.get(1).asList())
                {
                    Matrix T(payload->get(0).asInt(),
                             payload->get(1).asInt());

                    if (Bottle *vals=payload->get(2).asList())
                    {
                        for (int r=0; r<T.rows(); r++)
                            for (int c=0; c<T.cols(); c++)
                                T(r,c)=vals->get(T.rows()*r+c).asDouble();

                        if (device->setTransformation(T))
                            rep.addVocab(hapticdevice::ack);
                        else
                            rep.addVocab(hapticdevice::nack);
                    }
                }
            }
        }
        else if (tag==hapticdevice::get_transformation)
        {
            Matrix T;
            if (device->getTransformation(T))
            {
                rep.addVocab(hapticdevice::ack);
                rep.addList().read(T);
            }
            else
                rep.addVocab(hapticdevice::nack);
        }
        else if (tag==hapticdevice::stop_feedback)
        {
            fdbck=0.0;
            device->stopFeedback();
            applyFdbck=false;
            rep.addVocab(hapticdevice::ack);
        }
        else if (tag==hapticdevice::is_cartesian)
        {
            bool ret;
            if (device->isCartesianForceModeEnabled(ret))
            {
                rep.addVocab(hapticdevice::ack);
                rep.addInt(ret?1:0);
            }
            else
                rep.addVocab(hapticdevice::nack);
        }
        else if (tag==hapticdevice::set_cartesian)
        {
            rep.addVocab(device->setCartesianForceMode()?
                         hapticdevice::ack:hapticdevice::nack);
        }
        else if (tag==hapticdevice::set_joint)
        {
            rep.addVocab(device->setJointTorqueMode()?
                         hapticdevice::ack:hapticdevice::nack);
        }
        else if (tag==hapticdevice::get_max)
        {
            Vector max;
            if (device->getMaxFeedback(max))
            {
                rep.addVocab(hapticdevice::ack);
                rep.addList().read(max);
            }
            else
                rep.addVocab(hapticdevice::nack);
        }
    }

    if (rep.size()==0)
        rep.addVocab(hapticdevice::nack);

    ConnectionWriter *writer=connection.getWriter();
    if (writer!=NULL)
        rep.write(*writer);

    return true;
}
예제 #15
0
bool PortReaderBufferBase::read(ConnectionReader& connection)
{
    if (connection.getReference()!=nullptr) {
        //printf("REF %ld %d\n", (long int)connection.getReference(),
        //     connection.isValid());
        return acceptObjectBase(connection.getReference(), nullptr);
    }

    if (mPriv->replier != nullptr) {
        if (connection.getWriter()) {
            return mPriv->replier->read(connection);
        }
    }
    PortReaderPacket *reader = nullptr;
    while (reader==nullptr) {
        mPriv->stateSema.wait();
        reader = mPriv->get();
        if (reader && reader->getReader() == nullptr) {
            PortReader *next = create();
            yAssert(next != nullptr);
            reader->setReader(next);
        }

        mPriv->stateSema.post();
        if (reader==nullptr) {
            mPriv->consumeSema.wait();
        }
    }
    bool ok = false;
    if (connection.isValid()) {
        yAssert(reader->getReader()!=nullptr);
        ok = reader->getReader()->read(connection);
        reader->setEnvelope(connection.readEnvelope());
    } else {
        // this is a disconnection
        // don't talk to this port ever again
        mPriv->port = nullptr;
    }
    if (ok) {
        mPriv->stateSema.wait();
        bool pruned = false;
        if (mPriv->ct>0 && mPriv->prune) {
            PortReaderPacket *readerPacket =
                mPriv->dropContent();
            pruned = (readerPacket!=nullptr);
        }
        //mPriv->configure(reader, false, true);
        mPriv->pool.addActivePacket(reader);
        mPriv->ct++;
        mPriv->stateSema.post();
        if (!pruned) {
            mPriv->contentSema.post();
        }
        //YARP_ERROR(Logger::get(), ">>>>>>>>>>>>>>>>> adding data");
    } else {
        mPriv->stateSema.wait();
        mPriv->pool.addInactivePacket(reader);
        mPriv->stateSema.post();
        //YARP_ERROR(Logger::get(), ">>>>>>>>>>>>>>>>> skipping data");

        // important to give reader a shot anyway, allowing proper closing
        YARP_DEBUG(Logger::get(), "giving PortReaderBuffer chance to close");
        mPriv->contentSema.post();
    }
    return ok;
}
bool fakeMotorDeviceServer::read(ConnectionReader &connection)
{        
    Bottle cmd,reply;
    cmd.read(connection);
    
    mutex.wait();

    int codeIF=cmd.get(0).asVocab();
    int codeMethod=cmd.get(1).asVocab();

    if (codeIF==Vocab::encode("lim"))
    {
        if (codeMethod==Vocab::encode("get"))
        {
            int axis=cmd.get(2).asInt();
            double min,max;
            if (getLimits(axis,&min,&max))
            {
                reply.addVocab(Vocab::encode("ack"));
                reply.addDouble(min);
                reply.addDouble(max);
            }
        }
    }
    else if (codeIF==Vocab::encode("enc"))
    {
        if (codeMethod==Vocab::encode("axes"))
        {
            int ax;
            if (getAxes(&ax))
            {
                reply.addVocab(Vocab::encode("ack"));
                reply.addInt(ax);
            }
        }
    }
    else if (codeIF==Vocab::encode("vel"))
    {
        if (codeMethod==Vocab::encode("move"))
        {
            int axis=cmd.get(2).asInt();
            double sp=cmd.get(3).asDouble();
            if (velocityMove(axis,sp))
                reply.addVocab(Vocab::encode("ack"));
        }
        else if (codeMethod==Vocab::encode("acc"))
        {
            int axis=cmd.get(2).asInt();
            double acc=cmd.get(3).asDouble();
            if (setRefAcceleration(axis,acc))
                reply.addVocab(Vocab::encode("ack"));
        }
        else if (codeMethod==Vocab::encode("stop"))
        {
            int axis=cmd.get(2).asInt();
            if (stop(axis))
                reply.addVocab(Vocab::encode("ack"));
        }
    }

    if (reply.size()==0)
        reply.addVocab(Vocab::encode("nack"));

    mutex.post();

    if (ConnectionWriter *returnToSender=connection.getWriter())
        reply.write(*returnToSender);

    return true;
}
예제 #17
0
파일: NameServer.cpp 프로젝트: apaikan/yarp
    virtual bool read(ConnectionReader& reader) {
        YTRACE("NameServer::read start");
        ConstString ref = "NAME_SERVER ";
        bool ok = true;
        ConstString msg = "?";
        bool haveMessage = false;
        if (ok) {
            if (reader.isTextMode()) {
                msg = reader.expectText().c_str();
            } else {
                // migrate to binary mode support, eventually optimize
                Bottle b;
                b.read(reader);
                msg = b.toString().c_str();
            }
            haveMessage = (msg!="");
            msg = ref + msg;
        }
        if (reader.isActive()&&haveMessage) {
            YARP_DEBUG(Logger::get(),ConstString("name server got message ") + msg);
            size_t index = msg.find("NAME_SERVER");
            if (index==0) {
                Contact remote = reader.getRemoteContact();
                YARP_DEBUG(Logger::get(),
                           ConstString("name server receiving from ") +
                           remote.toURI());
                YARP_DEBUG(Logger::get(),
                           ConstString("name server request is ") + msg);
                ConstString result = server->apply(msg,remote);
                ConnectionWriter *os = reader.getWriter();
                if (os!=YARP_NULLPTR) {
                    if (result=="") {
                        result = ns_terminate(ConstString("unknown command ") +
                                              msg + "\n");
                    }
                    // This change is just to make Microsoft Telnet happy
                    ConstString tmp;
                    for (unsigned int i=0; i<result.length(); i++) {
                        if (result[i]=='\n') {
                            tmp += '\r';
                        }
                        tmp += result[i];
                    }
                    tmp += '\r';
                    os->appendString(tmp.c_str(),'\n');

                    YARP_DEBUG(Logger::get(),
                               ConstString("name server reply is ") + result);
                    ConstString resultSparse = result;
                    size_t end = resultSparse.find("\n*** end of message");
                    if (end!=ConstString::npos) {
                        resultSparse[end] = '\0';
                    }
                    YARP_INFO(Logger::get(),resultSparse);
                }
            } else {
                YARP_INFO(Logger::get(),
                          ConstString("Name server ignoring unknown command: ")+msg);
                ConnectionWriter *os = reader.getWriter();
                if (os!=YARP_NULLPTR) {
                    // this result is necessary for YARP1 support
                    os->appendString("???????????????????????????????????????",'\n');
                    //os->flush();
                    //os->close();
                }
            }
        }
        YTRACE("NameServer::read stop");
        return true;
    }