Ejemplo n.º 1
0
void Drone::Connected()
{
    std::cout << "Connected\n";
    m_Client = m_Server.nextPendingConnection(); //m_Client on connection
    connect(m_Client, SIGNAL(readyRead()), this, SLOT(ReadCmd()));  //If recive data call ReadCmd()
    m_Connected = true;
    SendAnswer("Hello Client\n");
}
Ejemplo n.º 2
0
void Drone::ReadCmd()
{
    GLfloat x, y, z;
    //When recive data
    char buffer[1024] = {0};
    m_Client->read(buffer, m_Client->bytesAvailable());

    //std::string answer("My Z crd = ");
    //answer.append(std::to_string(center_z));
    //m_Client->write(answer.c_str());

    //Decode cmd there

    std::string cmd(buffer);
    if(cmd.find("M_") != std::string::npos)
    {
        cmd = cmd.substr(2);
        int pos = 0, size = cmd.size();
        char symb = cmd[pos];
        std::string tempStr;
        while(symb != ':')
        {
            tempStr.push_back(symb);
            pos++;
            if(pos == size)
            {
                std::string answer("Error cmd:");
                answer.append(buffer);
                SendAnswer(answer);
                return;
            }
            symb = cmd[pos];
        }
        x = atof(tempStr.c_str());
        tempStr.clear();

        pos++;
        symb = cmd[pos];
        while(symb != ':')
        {
            tempStr.push_back(symb);
            pos++;
            if(pos == size)
            {
                std::string answer("Error cmd:");
                answer.append(buffer);
                SendAnswer(answer);
                return;
            }
            symb = cmd[pos];
        }
        y = atof(tempStr.c_str());
        tempStr.clear();

        pos++;
        symb = cmd[pos];
        while(symb != '|')
        {
            tempStr.push_back(symb);
            pos++;
            if(pos == size)
            {
                std::string answer("Error cmd:");
                answer.append(buffer);
                SendAnswer(answer);
                return;
            }
            symb = cmd[pos];
        }
        z = atof(tempStr.c_str());

        add_path(x, y, z);
        std::string answer("Good cmd: add Path\n");
        answer.append(std::to_string(x));
        answer.push_back(' ');
        answer.append(std::to_string(y));
        answer.push_back(' ');
        answer.append(std::to_string(z));
        answer.push_back(' ');
        SendAnswer(answer);
    }
    else
    {
        std::string answer("Error cmd:");
        answer.append(buffer);
        SendAnswer(answer);
    }
    //Do Task there
    //add_path(x, y, z);
//TODO: добавить в парсер возможность других команд, кроме движения, исп add_command(int);

}
Ejemplo n.º 3
0
//------------------------------------------------------------------------------------------------------------------------------------------------------
err_t CallbackOnRecieve(void *_arg, struct tcp_pcb *_tpcb, struct pbuf *_p, err_t _err)
{
    err_t ret_err;
    LWIP_ASSERT("arg != NULL", _arg != NULL);
    struct State *ss = (struct State*)_arg;

    if (_p == NULL)
    {
        // remote host closed connection
        ss->state = S_CLOSING;
        if (ss->p == NULL)
        {
            // we're done sending, close it
            CloseConnection(_tpcb, ss);
        }
        else
        {
            // we're not done yet
            //tcp_sent(_tpcb, CallbackOnSent);
        }
        ret_err = ERR_OK;
    }
    else if (_err != ERR_OK)
    {
        // cleanup, for unkown reason
        if (_p != NULL)
        {
            ss->p = NULL;
            pbuf_free(_p);
        }
        ret_err = _err;
    }
    else if (ss->state == S_ACCEPTED)
    {
        if (ss->numPort == POLICY_PORT)
        {
            pbuf_free(_p);
            ss->state = S_RECIEVED;
            SendAnswer(ss, _tpcb);
            ss->state = S_CLOSING;
            ret_err = ERR_OK;
        }
        else
        {
            // first data chunk in _p->payload
            ss->state = S_RECIEVED;
            // store reference to incoming pbuf (chain)
            ss->p = _p;
            Send(_tpcb, ss);
            ret_err = ERR_OK;
        }
    }
    else if (ss->state == S_RECIEVED)
    {
        // read some more data
        if (ss->p == NULL)
        {
            //ss->p = _p;
            //tcp_sent(_tpcb, CallbackOnSent);
            //Send(_tpcb, ss);
            SocketFuncReciever((char*)_p->payload, _p->len);

            u8_t freed = 0;
            do
            {
                // try hard to free pbuf 
                freed = pbuf_free(_p);
            } while (freed == 0);

        }
        else
        {
            struct pbuf *ptr;
            // chain pbufs to the end of what we recv'ed previously
            ptr = ss->p;
            pbuf_chain(ptr, _p);
        }
        ret_err = ERR_OK;
    }
    else if (ss->state == S_CLOSING)
    {
        // odd case, remote side closing twice, trash data
        tcp_recved(_tpcb, _p->tot_len);
        ss->p = NULL;
        pbuf_free(_p);
        ret_err = ERR_OK;
    }
    else
    {
        // unknown ss->state, trash data
        tcp_recved(_tpcb, _p->tot_len);
        ss->p = NULL;
        pbuf_free(_p);
        ret_err = ERR_OK;
    }
    return ret_err;
}