写字机器人程序

写字机器人程序#include”mainwindow.h”#include”ui_mainwindow.h”#include#include#include#include”math.h”#include#include#include#include//引入头文件/*定义常量*/#defineDIS_SMALL278;//定义小臂长度单位cm

大家好,又见面了,我是你们的朋友全栈君。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QtCore>
#include <QDebug>
#include "math.h"
#include <sys/ioctl.h>
#include <fcntl.h>
#include <QFile>
#include <QDataStream>    //引入头文件
/*定义常量*/
#define DIS_SMALL 278;     //定义小臂长度 单位cm
#define DIS_BIG 213.5;     //定义臂长度 单位cm
#define PI 3.1415926;      //定义PI
/*定义用到的全局变量*/
int angfix_big=0;             //定义大臂
int angfix_small=0;
int current_big=560-117;=433/667-550=117//553-433=120  大臂
int current_small=650-(-71);//=695//553-624=-71623-695=-72

int current_page=1;
int page_size=1;
QString save_index="dat0.dat";
int motor_speed=1500;//delay time

int flag_writing=0;//writing标志
int flag_lock[10];//0 当前页锁定标志,锁定后不可修改
int cont_replay[10];//0 屏幕复写计数
int temp_replay[10];//0 屏幕复写用到临时变量
int timems[10];//延时计数变量,每页单独一个数组元素由计数器1修改数值
int xx[10][100][1000];//记录x坐标 当前页-笔画数-点数
int yy[10][100][1000];//记录y坐标 当前页-笔画数-点数
int angle_big[10][100][1000];  //记录当前点的大臂角度值 当前页-笔画数-点数
int angle_small[10][100][1000];//记录当前点的小臂角度值 当前页-笔画数-点数
int dian_delay[10][100][1000];//记录每个点之间到延时时间 当前页-笔画数-点数
int step[10][100];//记录每个笔画到点数 当前页-笔画数
int bihua_num[10];//-1 用前先加1所以初始值为-1,记录当前页的总笔画数 当前页
int dian_num[10];//记录当前页的总点数 当前页
int flag_go[10];//0 用于go标记,每次go之后用此标记清除画板

int bihua_delay[10][100];//记录笔画间隔时间 当前页-笔画数
double A1,A2,A,B,C,a,b,c;//坐标与电机角度转换用到变量、常量

/********************************************************************************
* 函数名称:主函数
* 功    能:主函数
*********************************************************************************/
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)//主函数入口
{
    /*初始化变量*/
    ui->setupUi(this);
    ui->radioButton_2->setEnabled(0);
    ui->radioButton_3->setEnabled(0);
    ui->radioButton_4->setEnabled(0);
    ui->radioButton_5->setEnabled(0);
    ui->radioButton_6->setEnabled(0);
    ui->radioButton_7->setEnabled(0);
    ui->radioButton_8->setEnabled(0);
    ui->radioButton_9->setEnabled(0);
    for(int con1=0;con1<10;con1++)
    {
        flag_lock[con1]=0;
        cont_replay[con1]=0;
        bihua_num[con1]=-1;
        dian_num[con1]=0;
        flag_go[con1]=0;
        temp_replay[con1]=0;
        timems[con1]=1;
    }
    a=DIS_SMALL;
    c=DIS_BIG;

    /*初始化GPIO状态*/
    int fd=::open("/dev/leds",0);
    int fd2=::open("/dev/step",0);
    ::ioctl(fd2,0,0);//  con6 PIN9  CK1
    ::ioctl(fd2,0,1);//  con6 PIN10 CK2
    ::ioctl(fd2,0,2);//  con6 PIN11 CW1
    ::ioctl(fd2,0,3);//  con6 PIN12 CW2
    ::ioctl(fd2,1,6);//  con6 PIN15 HAND
    ::close(fd2);
    ::ioctl(fd,0,0);//
    ::ioctl(fd,0,1);//
    ::ioctl(fd,0,2);//
    ::ioctl(fd,0,3);//
    ::close(fd);

    /*初始化画板*/
    pix = QPixmap(200,200);
    pix.fill(Qt::gray);

    /*初始化定时器*/
    timer1 = new QTimer(this);
    timer4 = new QTimer(this);
    timer2 = new QTimer(this);
    timer3 = new QTimer(this);
    connect(timer1,SIGNAL(timeout()),this,SLOT(timer1UpDate())); //
    connect(timer2,SIGNAL(timeout()),this,SLOT(timer2UpDate()));
    connect(timer3,SIGNAL(timeout()),this,SLOT(timer3UpDate()));
    connect(timer4,SIGNAL(timeout()),this,SLOT(timer4UpDate()));
    timer1->start(1);
    timer4->start(10);//启动遥控接收器监视定时器,每10ms检测一次是否有按键被按下
}

/********************************************************************************
* 函数名称:退出函数
* 功    能:退出应用
*********************************************************************************/
MainWindow::~MainWindow() //主退出函数
{
    delete ui;
}

/********************************************************************************
* 函数名称:鼠标按下事件
* 功    能:完成坐标记录、角度转换、延时数据记录、绘制起始点等功能
* 参    数:事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        x = event->x()-20;//获得当前x坐标并修正
        y = event->y()-10;//获得当前y坐标并修正
        if(x>=0&&x<=200&&y>=0&&y<=200&&!flag_lock[current_page]) //判断是否符合绘画条件
        {
            bihua_num[current_page]++;//当前页到笔画数加1
            xx[current_page][bihua_num[current_page]][dian_num[current_page]]=x;//记录当前x坐标
            yy[current_page][bihua_num[current_page]][dian_num[current_page]]=y;//记录当前y坐标

            /*绘制当前坐标*/
            QPainter pp11(&pix);
            pp11.drawLine(x,y,x,y);
            update();

            /*屏幕坐标换算成电机角度并记录*/
            x1=320-x;//当前坐标转化为机械臂坐标
            y1=290-y;//当前坐标转化为机械臂坐标
            b=sqrt(x1*x1+y1*y1);
            B=acos((c*c+a*a-b*b)/(2*a*c))*180/PI;
            A1=atan(y1/x1)*180/PI;;
            A2=acos((c*c+b*b-a*a)/(2*c*b))*180/PI;
            A=A1+A2;
            angle_big[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(A/0.1286)+angfix_big;    //记录当前坐标的大臂角度数
            angle_small[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(B/0.1286)+angfix_small;//记录当前坐标的小臂角度数
            dian_num[current_page]++;//点数加1
            path1.moveTo(x,y);//将绘图坐标系原点转换到当前坐标
            bihua_delay[current_page][bihua_num[current_page]]=timems[current_page];//记录笔画间隔时间
            timems[current_page]=1;//重置计时变量
            flag_go[current_page]=0;//清除go标记
        }
    }
}

/********************************************************************************
* 函数名称:鼠标按下并移动事件
* 功    能:完成坐标记录、角度转换、延时数据记录、绘制相邻两点构成的直线等功能
* 参    数:事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons()&Qt::LeftButton) //注释同“鼠标按下事件函数”
    {
        x = event->x()-20;
        y = event->y()-10;
        if(x>=0&&x<=200&&y>=0&&y<=200&&!flag_lock[current_page])
        {
            QPainter pp11(&pix);
            xx[current_page][bihua_num[current_page]][dian_num[current_page]]=x;
            yy[current_page][bihua_num[current_page]][dian_num[current_page]]=y;
            pp11.drawLine(xx[current_page][bihua_num[current_page]][dian_num[current_page]-1],yy[current_page][bihua_num[current_page]][dian_num[current_page]-1],xx[current_page][bihua_num[current_page]][dian_num[current_page]],yy[current_page][bihua_num[current_page]][dian_num[current_page]]);//绘制上一坐标到本次坐标的直线
            update();
            dian_delay[current_page][bihua_num[current_page]][dian_num[current_page]]=timems[current_page];

            x1=320-x;
            y1=290-y;

            b=sqrt(x1*x1+y1*y1);
            B=acos((c*c+a*a-b*b)/(2*a*c))*180/PI;
            A1=atan(y1/x1)*180/PI;;
            A2=acos((c*c+b*b-a*a)/(2*c*b))*180/PI;
            A=A1+A2;

            angle_big[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(A/0.1286)+angfix_big;
            angle_small[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(B/0.1286)+angfix_small;;
            dian_num[current_page]++;
            timems[current_page]=1;
        }
    }
}

/********************************************************************************
* 函数名称:鼠标按下事件
* 功    能:完成坐标记录、角度转换、延时数据记录、绘制结束点点功能
* 参    数:事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton) //注释同“鼠标按下事件函数”
    {
        x = event->x()-20;
        y = event->y()-10;

        if(x>=0&&x<=200&&y>=0&&y<=200&&!flag_lock[current_page])
        {
            xx[current_page][bihua_num[current_page]][dian_num[current_page]]=x;
            yy[current_page][bihua_num[current_page]][dian_num[current_page]]=y;
            dian_delay[current_page][bihua_num[current_page]][dian_num[current_page]]=timems[current_page];

            x1=320-x;
            y1=290-y;

            b=sqrt(x1*x1+y1*y1);
            B=acos((c*c+a*a-b*b)/(2*a*c))*180/PI;
            A1=atan(y1/x1)*180/PI;;
            A2=acos((c*c+b*b-a*a)/(2*c*b))*180/PI;
            A=A1+A2;

            angle_big[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(A/0.1286)+angfix_big;
            angle_small[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(B/0.1286)+angfix_small;
            step[current_page][bihua_num[current_page]]=dian_num[current_page];
            dian_num[current_page]=0;

            timems[current_page]=1;
        }
    }
}

/********************************************************************************
* 函数名称:go按钮点击函数
* 功    能:完成当前页的绘制机械臂动作并且打开timer2完成在屏幕上复写的功能
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_clicked()
{
    /*为变量、标志赋值*/
    flag_go[current_page]=1;
    cont_replay[current_page]=0;
    flag_lock[current_page]=1;
    /*打开step步进电机驱动,并进行相应操作*/
    int fd2=::open("/dev/step",0);
    for(int b11=0;b11<=bihua_num[current_page];b11++)
    {
        go(angle_big[current_page][b11][0],angle_small[current_page][b11][0]);//使机械臂走到指定的角度坐标
        usleep(50000);
        ::ioctl(fd2,0,6);
        for(int b22=1;b22<=step[current_page][b11];b22++)
        {
            usleep(1000*dian_delay[current_page][b11][b22]);
            move(angle_big[current_page][b11][b22]-angle_big[current_page][b11][b22-1],angle_small[current_page][b11][b22]-angle_small[current_page][b11][b22-1]);//按照记录数据依次向后一点坐标移动
        }
        usleep(50000);
        ::ioctl(fd2,1,6);
        if(b11<bihua_num[current_page]){usleep(1000*bihua_delay[current_page][b11+1]);}//笔画延时
    }
    ::close(fd2);
    timer2->start(100);//go复写定时器打开
}

/********************************************************************************
* 函数名称:屏幕复写函数
* 功    能:利用定时器绘制,能够准确复现绘制点之间、笔画之间的延时效果
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer2UpDate()//屏幕复写定时器
{
    QPainter pp11(&pix);
    if(temp_replay[current_page]<=bihua_num[current_page])
    {
        if(cont_replay[current_page]<step[current_page][temp_replay[current_page]])
        {
            pp11.drawLine(xx[current_page][temp_replay[current_page]][cont_replay[current_page]],yy[current_page][temp_replay[current_page]][cont_replay[current_page]],xx[current_page][temp_replay[current_page]][cont_replay[current_page]+1],yy[current_page][temp_replay[current_page]][cont_replay[current_page]+1]);
            update();
            timer2->start(dian_delay[current_page][temp_replay[current_page]][cont_replay[current_page]+1]);
            cont_replay[current_page]++;
        }
        else
        {
            temp_replay[current_page]++;
            cont_replay[current_page]=0;
            timer2->start(bihua_delay[current_page][temp_replay[current_page]]);
        }
    }
    else
    {
        timer2->stop();//绘制完成关闭定时器
        update();
        /*恢复复写变量的初值*/
        cont_replay[current_page]=0;
        temp_replay[current_page]=0;
    }
}
/********************************************************************************
* 函数名称:画板更新事件函数
* 功    能:更新画板
* 参    数:绘画事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter pp(this);
    pp.drawPixmap(20,10,200,200,pix); //将全局画布pix绘制在画板上
    /*根据go标记清除画板*/
    if(flag_go[current_page])
    {
        pix.fill(Qt::gray);
        flag_go[current_page]=0;
    }
}

/********************************************************************************
* 函数名称:延时计数定时器1更新事件
* 功    能:将延时计数变量自加
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer1UpDate()
{
    timems[current_page]++;
}

/********************************************************************************
* 函数名称:机械臂移动函数
* 功    能:将机械臂按照参数运动指定步数
* 参    数:move_temp_big,move_temp_small 分别为大臂与小臂运动的步数,若为正直则向正方向
*           运动对应步数反之则向相反方向运动对应步数
* 返 回 值:无
*********************************************************************************/
void MainWindow::move(int move_temp_big,int move_temp_small)
{
    current_big+=move_temp_big;
    current_small+=move_temp_small;
    int fd=::open("/dev/leds",0);
    int fd2=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平
    int direction1,direction2;

    if(move_temp_big==0&&move_temp_small==0)
    {
        ::close(fd);
        return;
    }

    if(move_temp_big<0)
    {
        direction1=0;
        move_temp_big=-move_temp_big;
        ::ioctl(fd,1,2);
        ::ioctl(fd2,1,2);
    }
    else
    {
        direction1=1;
        ::ioctl(fd,0,2);
        ::ioctl(fd2,0,2);
    }

    if(move_temp_small<0)
    {
        direction2=0;
        move_temp_small=-move_temp_small;
        ::ioctl(fd,1,3);
        ::ioctl(fd2,1,3);
    }
    else
    {
        direction2=1;
        ::ioctl(fd,0,3);
        ::ioctl(fd2,0,3);
    }

    if(move_temp_big==0)
    {
        for(int tmp=0;tmp<move_temp_small;tmp++)
        {
            ::ioctl(fd,1,1);
            ::ioctl(fd2,1,1);
            usleep(10);
            ::ioctl(fd,0,1);
            ::ioctl(fd2,0,1);
            usleep(motor_speed);
        }
        ::close(fd);
        ::close(fd2);
        return;
    }

    if(move_temp_small==0)
    {
        for(int tmp=0;tmp<move_temp_big;tmp++)
        {
            ::ioctl(fd,1,0);
            ::ioctl(fd2,1,0);
            usleep(10);
            ::ioctl(fd,0,0);
            ::ioctl(fd2,0,0);
            usleep(motor_speed);
        }
        ::close(fd);
        ::close(fd2);
        return;
    }

    int go_loop=move_temp_big*move_temp_small;

    for (int go_temp=1;go_temp<=go_loop;go_temp++)
    {
        if((go_temp%move_temp_big==0)&&(go_temp%move_temp_small==0))
        {
            ::ioctl(fd,1,1);
            ::ioctl(fd,1,0);
            ::ioctl(fd2,1,1);
            ::ioctl(fd2,1,0);
            usleep(10);
            ::ioctl(fd,0,1);
            ::ioctl(fd,0,0);
            ::ioctl(fd2,0,1);
            ::ioctl(fd2,0,0);
            usleep(motor_speed);
        }
        else
        {
            if(go_temp%move_temp_big==0)
            {
                ::ioctl(fd,1,1);
                ::ioctl(fd2,1,1);
                usleep(10);
                ::ioctl(fd,0,1);
                ::ioctl(fd2,0,1);
                usleep(motor_speed);
            }
            if(go_temp%move_temp_small==0)
            {
                ::ioctl(fd,1,0);
                ::ioctl(fd2,1,0);
                usleep(10);
                ::ioctl(fd,0,0);
                ::ioctl(fd2,0,0);
                usleep(motor_speed);
            }
        }
    }

    ::close(fd);
    ::close(fd2);
}

/********************************************************************************
* 函数名称:机械臂移动到指定角度函数
* 功    能:将机械臂移动到指定步数
* 参    数:go_temp_big,go_temp_small 分别为大臂与小臂的目的角度值,经过与当前角度比较,得出
*           运动对应步数反和方向,并移动
* 返 回 值:无
*********************************************************************************/
void MainWindow::go(int go_temp_big,int go_temp_small)
{
    go_temp_big=go_temp_big-current_big;      //计算大臂当前角度与指定的角度之间的差值
    go_temp_small=go_temp_small-current_small;//计算小臂当前角度与指定的角度之间的差值

    current_big+=go_temp_big;    //更新当前角度
    current_small+=go_temp_small;//更新当前角度

    int fd=::open("/dev/leds",0);//打开led驱动,便于观察程序运行状态
    int fd2=::open("/dev/step",0);//打开step驱动
    /*判断如果两个电机需要运动的角度均为0则退出函数*/
    if(go_temp_big==0&&go_temp_small==0)
    {
        ::close(fd);return;
    }
    /*判断如果大臂需要运动的角度为负数,则将大臂运行方向置为反并且将负数转为正数;否则大臂运行方向为正*/
    if(go_temp_big<0)
    {
        go_temp_big=-go_temp_big;
        ::ioctl(fd,1,2);
        ::ioctl(fd2,1,2);
    }
    else
    {
        ::ioctl(fd,0,2);
        ::ioctl(fd2,0,2);
    }
    /*判断如果小臂需要运动的角度为负数,则将小臂运行方向置为反并且将负数转为正数;否则小臂运行方向为正*/
    if(go_temp_small<0)
    {
        go_temp_small=-go_temp_small;
        ::ioctl(fd,1,3);
        ::ioctl(fd2,1,3);
    }
    else
    {
        ::ioctl(fd,0,3);
        ::ioctl(fd2,0,3);
    }

    /*判断如果大臂需要运动的角度大于等于小臂需要的,则用大臂度数作为循环计数值,
      这里需要说明以下,本函数是两个电机同时动作的所以需要用运动数大的作为计数。*/
    if(go_temp_big>=go_temp_small)
    {
        for(int tmp=0;tmp<go_temp_big;tmp++)
        {
            ::ioctl(fd,1,0);
            ::ioctl(fd2,1,0);

            /*判断小臂是否运行结束,若没结束则小臂运动*/
            if(tmp<go_temp_small)
            {
                ::ioctl(fd,1,1);
                ::ioctl(fd2,1,1);
            }

            usleep(10);

            /*判断小臂是否运行结束,若没结束则小臂运动*/
            if(tmp<go_temp_small)
            {
                ::ioctl(fd,0,1);
                ::ioctl(fd2,0,1);
            }

            ::ioctl(fd,0,0);
            ::ioctl(fd2,0,0);
            usleep(motor_speed);//调整脉冲周期以调节电机转速
        }
    }
    else //否则与上述相反
    {
        for(int tmp=0;tmp<go_temp_small;tmp++)
        {
            ::ioctl(fd,1,1);
            ::ioctl(fd2,1,1);

            if(tmp<go_temp_big)
            {
                ::ioctl(fd,1,0);
                ::ioctl(fd2,1,0);
            }

            usleep(10);

            if(tmp<go_temp_big)
            {
                ::ioctl(fd,0,0);
                ::ioctl(fd2,0,0);
            }

            ::ioctl(fd,0,1);
            ::ioctl(fd2,0,1);

            usleep(motor_speed);
        }
    }
    ::close(fd);
    ::close(fd2);
}

/********************************************************************************
* 函数名称:clear按钮函数
* 功    能:清除当前页的画板信息,并解除当前页的锁定可以重新绘制
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_2_clicked()
{
    bihua_num[current_page]=-1;
    timer1->start(1);
    flag_lock[current_page]=0;
    pix.fill(Qt::gray);
    update();
}

/********************************************************************************
* 函数名称:ADD按钮点击函数
* 功    能:增加绘制页面
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_ADD_clicked()
{
    switch (current_page)
    {
    case 1:
        current_page=2;
        ui->radioButton_2->setChecked(1);
        ui->radioButton_2->setEnabled(1);
        page_size=2;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        flag_lock[current_page]=0;
        timems[current_page]=1;
        break;

    case 2:
        current_page=3;
        ui->radioButton_3->setChecked(1);
        ui->radioButton_3->setEnabled(1);
        page_size=3;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        flag_lock[current_page]=0;
        timems[current_page]=1;
        break;

    case 3:
        current_page=4;
        ui->radioButton_4->setChecked(1);
        ui->radioButton_4->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=4;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 4:
        current_page=5;
        ui->radioButton_5->setChecked(1);
        ui->radioButton_5->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=5;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 5:
        current_page=6;
        ui->radioButton_6->setChecked(1);
        ui->radioButton_6->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=6;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 6:
        current_page=7;
        ui->radioButton_7->setChecked(1);
        ui->radioButton_7->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=7;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 7:
        current_page=8;
        ui->radioButton_8->setChecked(1);
        ui->radioButton_8->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=8;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 8:
        current_page=9;
        ui->radioButton_9->setChecked(1);
        ui->radioButton_9->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=9;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;
    case 9:flag_lock[current_page]=1;break;
    }
}

/********************************************************************************
* 函数名称:RM按钮点击函数
* 功    能:从后向前删除页面,同时删除页面上所储存的信息
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_RM_clicked()
{
    switch (page_size)
    {
    case 1:timer2->start(1);update();break;
    case 2:
        current_page=1;
        ui->radioButton_1->setChecked(1);
        ui->radioButton_2->setEnabled(0);
        page_size=1;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 3:
        current_page=2;
        ui->radioButton_2->setChecked(1);
        ui->radioButton_3->setEnabled(0);
        page_size=2;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    case 4:
        current_page=3;
        ui->radioButton_3->setChecked(1);
        ui->radioButton_4->setEnabled(0);
        page_size=3;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    case 5:
        current_page=4;
        ui->radioButton_4->setChecked(1);
        ui->radioButton_5->setEnabled(0);
        page_size=4;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    case 6:
        current_page=5;
        ui->radioButton_5->setChecked(1);
        ui->radioButton_6->setEnabled(0);
        page_size=5;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 7:
        current_page=6;
        ui->radioButton_6->setChecked(1);
        ui->radioButton_7->setEnabled(0);
        page_size=6;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 8:
        current_page=7;
        ui->radioButton_7->setChecked(1);
        ui->radioButton_8->setEnabled(0);
        page_size=7;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 9:
        current_page=8;
        ui->radioButton_8->setChecked(1);
        ui->radioButton_9->setEnabled(0);
        page_size=8;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    }
}

/********************************************************************************
* 函数名称:radioButton点击函数
* 功    能:根据被点击的radioButton更改当前页面,并且在点击的时候调用复写函数完成本页信息的预览
* 参    数:checked 代表是否被选中
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_radioButton_1_clicked(bool checked)
{
    if(checked)current_page=1;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_2_clicked(bool checked)
{
    if(checked)current_page=2;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_3_clicked(bool checked)
{
    if(checked)current_page=3;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_4_clicked(bool checked)
{
    if(checked)current_page=4;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_5_clicked(bool checked)
{
    if(checked)current_page=5;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_6_clicked(bool checked)
{
    if(checked)current_page=6;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}


void MainWindow::on_radioButton_7_clicked(bool checked)
{
    if(checked)current_page=7;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_8_clicked(bool checked)
{
    if(checked)current_page=8;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_9_clicked(bool checked)
{
    if(checked)current_page=9;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

/********************************************************************************
* 函数名称:quit按钮点击函数
* 功    能:退出程序
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_3_clicked()
{
    close();
}

/********************************************************************************
* 函数名称:SV按钮点击函数
* 功    能:在当前储存位置储存当前的一切数据
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_4_clicked()
{

    QFile file(save_index);
    if(!file.open(QIODevice::WriteOnly))
    {
        qDebug()<<"Can't open the file!"<<endl;
    }
    QDataStream in(&file);
    for(int con3=0;con3<10;con3++)
    {
        for(int con1=0;con1<=bihua_num[con3];con1++)
        {
            for(int con2=0;con2<=step[con3][con1];con2++)
            {
                in
                        <<1
                        <<con3
                        <<con1
                        <<con2
                        <<xx[con3][con1][con2]
                        <<yy[con3][con1][con2]
                        <<angle_big[con3][con1][con2]
                        <<angle_small[con3][con1][con2]
                        <<step[con3][con1]
                        <<bihua_delay[con3][con1]
                        <<0
                        <<0;
            }
        }
    }
    for(int con1=0;con1<10;con1++)
    {
        in
                <<2
                <<con1
                <<con1
                <<flag_lock[con1]
                <<cont_replay[con1]
                <<bihua_num[con1]
                <<dian_num[con1]
                <<flag_go[con1]
                <<temp_replay[con1]
                <<timems[con1]
                <<current_page
                <<page_size;
    }

    file.close();
}

/********************************************************************************
* 函数名称:LD按钮点击函数
* 功    能:读取当前储存位置的数据作为当前数据
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_5_clicked()
{
    return;
    QFile file(save_index);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"Can't open the file!"<<endl;
    }

    QDataStream in(&file);
    int t_xx,t_yy,t_axx,t_ayy,con1,con2,fn,curpage,noth1,noth2,noth3,noth4;

    while(!in.atEnd())
    {
        in
                >>fn
                >>curpage
                >>con1
                >>con2
                >>t_xx
                >>t_yy
                >>t_axx
                >>t_ayy
                >>noth1
                >>noth2
                >>noth3
                >>noth4;
        if(fn==1)
        {
            xx[curpage][con1][con2]=t_xx;
            yy[curpage][con1][con2]=t_yy;
            angle_big[curpage][con1][con2]=t_axx;
            angle_small[curpage][con1][con2]=t_ayy;
            step[curpage][con1]=noth1;
            bihua_delay[curpage][con1]=noth2;
        }
        if(fn==2)
        {
            flag_lock[curpage]=con2;
            cont_replay[curpage]=t_xx;
            bihua_num[curpage]=t_yy;
            dian_num[curpage]=t_axx;
            flag_go[curpage]=t_ayy;
            temp_replay[curpage]=noth1;
            timems[curpage]=noth2;
            current_page=noth3;
            page_size=noth4;
        }
    }

    file.close();

    switch(current_page)
    {
    case 1:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(0);
        ui->radioButton_3->setEnabled(0);
        ui->radioButton_4->setEnabled(0);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_1->setChecked(1);
        break;

    case 2:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(0);
        ui->radioButton_4->setEnabled(0);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_2->setChecked(1);
        break;

    case 3:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(0);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_3->setChecked(1);
        break;

    case 4:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_4->setChecked(1);
        break;

    case 5:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_5->setChecked(1);
        break;

    case 6:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_6->setChecked(1);
        break;

    case 7:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(1);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_7->setChecked(1);
        break;

    case 8:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(1);
        ui->radioButton_8->setEnabled(1);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_8->setChecked(1);
        break;

    case 9:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(1);
        ui->radioButton_8->setEnabled(1);
        ui->radioButton_9->setEnabled(1);
        ui->radioButton_9->setChecked(1);
        break;
    }
}

/********************************************************************************
* 函数名称:run all按钮点击函数
* 功    能:利用timer3定时器准确的完成从页面前向后的写作动作
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_6_clicked()
{
    int fd=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平
    ::ioctl(fd,1,11);//  con6 PIN19 LED L
    ::close(fd);
    ui->pushButton_6->setText("Running");
    timer3->start(100);
    current_page=0;
    ui->radioButton_1->setChecked(1);
}

/********************************************************************************
* 函数名称:timer3更新函数
* 功    能:依次完成每个页面的书写动作,并且没写完一页都调用lefthand()进行换纸
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer3UpDate()
{
    timer3->stop();
    pix.fill(Qt::gray);
    update();
    current_page++;
    on_pushButton_clicked();
    usleep(100000);
    lefthand();

    switch(current_page)
    {
        case 1:ui->radioButton_1->setChecked(1);break;
        case 2:ui->radioButton_2->setChecked(1);break;
        case 3:ui->radioButton_3->setChecked(1);break;
        case 4:ui->radioButton_4->setChecked(1);break;
        case 5:ui->radioButton_5->setChecked(1);break;
        case 6:ui->radioButton_6->setChecked(1);break;
        case 7:ui->radioButton_7->setChecked(1);break;
        case 8:ui->radioButton_8->setChecked(1);break;
        case 9:ui->radioButton_9->setChecked(1);break;
    }

    if(current_page!=page_size)
    {
        timer3->start(100);
        switch(current_page)
        {
            case 1:ui->radioButton_2->setChecked(1);break;
            case 2:ui->radioButton_3->setChecked(1);break;
            case 3:ui->radioButton_4->setChecked(1);break;
            case 4:ui->radioButton_5->setChecked(1);break;
            case 5:ui->radioButton_6->setChecked(1);break;
            case 6:ui->radioButton_7->setChecked(1);break;
            case 7:ui->radioButton_8->setChecked(1);break;
            case 8:ui->radioButton_9->setChecked(1);break;
            case 9:;break;
        }
    }
    else
    {
        ui->pushButton_6->setText("RUN ALL");
        int fd=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平
        ::ioctl(fd,0,11);//  con6 PIN19 LED M
        ::close(fd);
        flag_writing=0;
        timer4->start(10);
    }
}

/********************************************************************************
* 函数名称:存储位置变化函数
* 功    能:根据spinBox的值修改当前的存储文件名称
* 参    数:cont spinBox的值
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_spinBox_valueChanged(QString cont)
{
    save_index="dat"+cont+".dat";
}

/********************************************************************************
* 函数名称:lefthand辅助机械臂运动函数
* 功    能:完成一系列的辅助机械臂动作,完成更换纸张的动作
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::lefthand()
{
    return; //test
    go(1000,1000);
    usleep(10000);
    int fd2=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平

    ::ioctl(fd2,1,4);//  con6 PIN13 M3T K
    ::ioctl(fd2,1,7);//  con6 PIN16 M1W K
    usleep(100000);
    ::ioctl(fd2,1,10);//  con6 PIN19 M2L K
    usleep(1000000);
    ::ioctl(fd2,0,7);//  con6 PIN16 M1W G
    ::ioctl(fd2,0,10);//  con6 PIN19 M2L G
    usleep(10000);
    ::ioctl(fd2,0,4);//  con6 PIN13 M3T G
    usleep(10000);
    ::ioctl(fd2,1,5);//  con6 PIN14 M3L K//准备
    usleep(100000);
    ::ioctl(fd2,1,8);//  con6 PIN17 M1L k//开始
    ::ioctl(fd2,1,9);//  con6 PIN18 M2W k 小臂 -6000
    usleep(100000);
     ::ioctl(fd2,0,9);//  con6 PIN18 M2W g 小臂 -6000
    usleep(100000);
    ::ioctl(fd2,1,9);//  con6 PIN18 M2W k 小臂 -6000
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(650000);
    ::ioctl(fd2,0,8);//  con6 PIN17 M1L g//结束
    ::ioctl(fd2,0,9);//  con6 PIN18 M2W g 小臂
    usleep(100000);
    ::ioctl(fd2,0,5);//  con6 PIN14 M3L g
    usleep(10000);
    ::ioctl(fd2,1,4);//  con6 PIN13 M3T K
    usleep(800000);
    ::ioctl(fd2,1,7);//  con6 PIN16 M1W 大臂 k
    ::ioctl(fd2,1,10);//  con6 PIN19 M2L K
    usleep(150000);
    ::ioctl(fd2,0,10);//  con6 PIN19 M2L g
    usleep(1400000);
    ::ioctl(fd2,0,7);//  con6 PIN16 M1W 大臂 g
    ::ioctl(fd2,0,4);//  con6 PIN13 M3T g
    ::close(fd2);
}

/********************************************************************************
* 函数名称:left按钮点击函数
* 功    能:调用lefthand()函数
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_7_clicked()//left hand
{
    lefthand();
}

/********************************************************************************
* 函数名称:遥控输入监视函数
* 功    能:利用timer4定时触发事件来监视遥控接收器是否有按键被按下,若有则读取对应存储位置的数据
*           并且调用run all函数完成整套动作
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer4UpDate()
{
    timer4->stop();
    char current_buttons[6];

    int fd = ::open("/dev/buttons", 0);

    ::read(fd, current_buttons, 6);
    ::close(fd);

    if(!flag_writing)
    {
        timer4->start(10);
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160487.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android获取分辨率和像素密度「建议收藏」

    Android获取分辨率和像素密度「建议收藏」看了网上好多的代码说是获取的分辨率其实得到的是屏幕的宽和高。1.如何获取分辨率和像素密度2..实现代码如下 DisplayMetricslocalDisplayMetrics=newDisplayMetrics(); try{ DisplaylocalDisplay=getWindow().getWindowManager().getDefaultDispl

  • 在线代理(Web ProxyServer)完全详解

    在线代理(Web ProxyServer)完全详解在线代理(WebProxy)原理可以简单的概述为:用户(A)-在线代理服务器(B)-目标网站(C),即:A向B发送浏览请求-B执行请求发送给C-C收到请求,回应。什么是在线代理  在线代理英文全称是(WebProxyServer),又称在线代理。代理服务器其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他

  • AllinOne安装OpenStack

    AllinOne安装OpenStack1.虚拟机的配置准备内存:8G+CPU:2|2网络设置:NAT硬盘设置:100G+2.启动虚拟机3.网络配置vi/etc/sysconfig/network添加内容:NETWORKING=yes

    2022年10月25日
  • sql文件怎么导入sql server数据库_sql怎么导入数据库

    sql文件怎么导入sql server数据库_sql怎么导入数据库展开全部其实导入的方法很简单,可32313133353236313431303231363533e78988e69d8331333365633836以采用工具导入和只用mysql命令界面导入两种方式,mysql的数据库图形界面工具是很多的,用起来也比较方便。工具/原料NavicatforMySQLMySQL命令行界面SQL脚本方法一:1、首先使用MySQL提供的命令行界面来导入数据库,确保电脑…

  • 如何遍历ArrayList集合,并安全删除其中的元素[通俗易懂]

    如何遍历ArrayList集合,并安全删除其中的元素[通俗易懂]如何遍历ArrayList集合,并安全删除其中的元素?1、遍历ArrayList集合有三种方式(1)for循环(2)增强for循环,也就是foreach(3)迭代器iterator2、普通for循环遍历删除元素,list集合的大小会变小,而索引也会发生改变,所以利用ffor循环遍历删除元素会漏调某些元素。例如我for循环遍历删除第一个元素,接着按照…

  • jqGrid基本用法与示例「建议收藏」

    jqGrid基本用法与示例「建议收藏」转自:https://chuanlu.iteye.com/blog/1953544一、jqGrid的基本用法1、html页面Html代码<!DOCTYPE html 

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号