void RC_Widget::run()
{
    struct timeval a, b;
    long totalb, totala;
    long diff;

    int cycle_processing = 50;

    while (true) {
        gettimeofday(&a, NULL);
        totala = a.tv_sec * 1000000 + a.tv_usec;

        //
        pthread_mutex_lock( &mutex );
        if(!press && !automatic){
            if(p_actual.x()>250){
                p_actual.setX(p_actual.x() - 10);
                if(p_actual.x()<250)
                    p_actual.setX(250);
            }
            else if(p_actual.x()<250){
                p_actual.setX(p_actual.x() + 10);
                if(p_actual.x()>250)
                    p_actual.setX(250);
            }
            if(!block_Y){
                if(p_actual.y()>250){
                    p_actual.setY(p_actual.y() - 10) ;
                    if(p_actual.y()<250)
                        p_actual.setY(250);
                }
                else if(p_actual.y()<250){
                    p_actual.setY(p_actual.y() + 10) ;
                    if(p_actual.y()>250)
                        p_actual.setY(250);
                }
            }

        }
        pthread_mutex_unlock( &mutex );
        //

        gettimeofday(&b, NULL);
        totalb = b.tv_sec * 1000000 + b.tv_usec;
        diff = (totalb - totala) / 1000;

        if (diff < 0 || diff > cycle_processing)
            diff = cycle_processing;
        else
            diff = cycle_processing - diff;

        /*Sleep Algorithm*/
        usleep(diff * 1000);
        emit update_GUI();
    }
}
int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QMainWindow::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: on_start_button_clicked(); break;
        case 1: update_GUI(); break;
        case 2: motion_capture_failed(); break;
        default: ;
        }
        _id -= 3;
    }
    return _id;
}
RC_Widget::RC_Widget(bool block_Y,
                     int max_up_down, int min_up_down,
                     int max_left_right, int min_left_right,
                     int rev_up_down, int rev_left_right,
                     QWidget *parent) :
    QWidget(parent)
{
    if (pthread_mutex_init(&mutex, NULL) != 0){
        std::cout << "mutex init failed" << std::endl;
    }

    QPalette pal_background;
    pal_background.setColor(QPalette::Background, Qt::black);
    setAutoFillBackground(true);
    setPalette(pal_background);
    setMaximumSize(500, 500);
    setMinimumSize(500, 500);

    press = false;
    automatic = false;
    this->block_Y = block_Y;

    boost::thread workerThread(&RC_Widget::run, this);

    connect(this, SIGNAL(update_GUI()), this, SLOT(on_update_GUI_recieved()));

    p_actual.setX(250);
    if(block_Y)
        p_actual.setY(495);
    else
        p_actual.setY(250);

    this->min_value_up_down = min_up_down;
    this->max_value_up_down = max_up_down;

    this->min_value_left_right = min_left_right;
    this->max_value_left_right = max_left_right;

    this->rev_left_right = rev_left_right;
    this->rev_up_down = rev_up_down;
}