程序

来源:互联网 发布:逆波兰计算器java 编辑:程序博客网 时间:2024/04/20 10:03
#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=-71////623-695=-72int current_page=1;int page_size=1;QString save_index="dat0.dat";int motor_speed=1500;//delay timeint 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);    }}