Example #1
0
bool message::receive(czmqpp::socket& socket)
{
    bool requires_reply = false;
    czmqpp::message message;

    requires_reply = message.receive(socket);

    if (requires_reply)
    {
        const data_stack& parts = message.parts();

        if (parts.size() > 0)
        {
            auto it = parts.begin();

            // Extract reply address(es)
            if (parts.size() > 2)
            {
                origin_ = *it;
                ++it;
            }

            // Confirm empty delimiter frame
            ++it;

            // Parse request payload from data frame
            if (decode_payload(*it))
            {
                ++it;

                // Confirm end of message (unnecessary)
                BITCOIN_ASSERT(it == parts.end());
            }
        }
    }

    return requires_reply;
}
//funzione che riceve e decodifica i pacchetti in arrivo da PC
void parser_mess(unsigned char buffer)
{    
    sensor_msgs::Imu msg;
    geometry_msgs::Pose msg_anchor;
     //implementazione della macchina a stati
    switch(state_msg){
        case HEADER_1:

            if(buffer == HEADER_A)
            {
                state_msg=PAYLOAD_1_1;
                index_range = 0;
                
            }
            if(buffer == HEADER_B)
            {
                state_msg=PAYLOAD_1_2;
                index_range = 0;
                
            }
            if(buffer == HEADER_C)
            {
                state_msg=PAYLOAD_1_3;
                index_range = 0;
                
            }
            if(buffer == HEADER_D)
            {
                state_msg=PAYLOAD_1_4;
                index_range = 0;
                
            }
            if(buffer == HEADER_E)
            {
                state_msg=PAYLOAD_1_5;
                index_range = 0;
                
            }
            if(buffer == HEADER_F)
            {
                state_msg=PAYLOAD_1_6;
                index_range = 0;
                
            }
            if(buffer == HEADER_G)
            {
                state_msg=PAYLOAD_1_7;
                index_range = 0;
                
            }
            if(buffer == HEADER_H)
            {
                state_msg=PAYLOAD_1_8;
                index_range = 0;
                
            }
            //calibrazione
            if(buffer == HEADER_CALIB)
            {
                state_msg=PAYLOAD_1_C;
                index_range = 0;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_1:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range1_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_A:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_2:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range2_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_B:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_3:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range3_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_C:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_4:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range4_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_D:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_5:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range5_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_E:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_6:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range6_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_F:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_7:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range7_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_G:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
//////////////////////////////////////////////////////////////////////////////////////////////////
        case PAYLOAD_1_8:
            switch(buffer)
            {
                case END_PACKET:
                    
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    msg.angular_velocity.x = range_recv[0];
                    msg.angular_velocity.y = range_recv[1];
                    msg.angular_velocity.z = range_recv[2];
                    msg.linear_acceleration.x = range_recv[3];
                    range8_pub.publish(msg);

                    new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case HEADER_H:
                
                    for(int i = 0; i< coda_recv_seriale.size(); i++)
                        coda_recv_seriale.pop();
                    index_range = 0;

                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    range_recv[index_range] = decode_payload();
                    //cout << range_recv[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;
            
//////////////////////////////////////////CALIBRATION//////////////////////
        case PAYLOAD_1_C:
            switch(buffer)
            {
                case END_PACKET:
                    
                    anchor_range[index_range] = decode_payload();
                    //cout << anchor_range[index_range] << endl;
                    cout << "Autocalibration response" << endl;
                    msg_anchor.position.x = anchor_range[0];
                    msg_anchor.position.y = anchor_range[1];
                    msg_anchor.position.z = anchor_range[2];
                    msg_anchor.orientation.x = anchor_range[3];
                    msg_anchor.orientation.y = anchor_range[4];
                    msg_anchor.orientation.z = anchor_range[5];
                    anchor_range_pub.publish(msg_anchor);

                    //new_packet ++;
                    state_msg=HEADER_1;
                    index_range = 0;
                    break;

                case SEPARATORE:
                    
                    //ho ricevuto un range, lo devo codificare
                    anchor_range[index_range] = decode_payload();
                    //cout << anchor_range[index_range] << endl;
                    index_range ++;
                    break;

                default:
                
                    coda_recv_seriale.push(buffer);
                    break;
            }
            break;

    }
      
}