/******************************addpar.cpp文件说明**********************************
* Descript	:源文件，包含C运动参数配置窗口的函数实现
* Author    :caitiancheng
* Date      :2021_12_19
*******************************************************************************/


/***********************************头文件****************************************/
#include "addpar.h"
#include "ui_addpar.h"
#include <QCloseEvent>
#include <QMessageBox>


/***********************************类的声明和继承****************************************/
AddPar::AddPar(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AddPar)
{
    ui->setupUi(this);
    //初始化配置
    InitTree();
    //设置窗口标题
    setWindowTitle("C运动参数配置");
}


/****************************closeEvent函数*********************************
Function    :窗口关闭事件函数
Output      :
*********************************************************************/
void AddPar::closeEvent(QCloseEvent *event)
{
    QMessageBox::StandardButton Value=QMessageBox::question(this,QStringLiteral("退出提示"),QStringLiteral("确认数据已经同步到设备?"));
      if(Value==QMessageBox::Yes)
      {
          emit CloseWin();
          event->accept();
      }else
      {
          event->ignore();
      }
}

/****************************showEvent函数*********************************
Function    :如果从站连接上，更新数据
Output      :
*********************************************************************/
void AddPar::showEvent(QShowEvent *event)
{
    if(ConStatus())
    {
        event->accept();
        Updata();
    }
}

/****************************ReadArgRunCrl函数*********************************
Function    :读取从站数据
Output      :
*********************************************************************/
void AddPar::ReadArgRunCrl(QStandardItem *Item,int Addr,int Row)
 {
    int Value;
    Value=ReadSFDInt(Addr);
    Item->child(Row,2)->setText(QString::number(Value));
 }


/****************************FreeQList函数*********************************
Function    :删除列表参数
Output      :
*********************************************************************/
void AddPar::FreeQList(QList<QStandardItem *> *Item)
{
    for(int i=0;i<Item->length();i++)
    {
        delete Item->at(i);
    }
}

/****************************InitTree函数*********************************
Function    :初始化函数
Output      :
*********************************************************************/
void AddPar::InitTree()
{
     //定义数据行对象
     QStringList QStrListTemp;
     //初始化模型
     Model=new QStandardItemModel();
     //配置分类选择信号
     connect(Model,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(TreeItemChanged(QStandardItem*)));
     //建立列名
     TreeHead.push_back(QStringLiteral("名称"));
     TreeHead.push_back(QStringLiteral("离线值"));
     TreeHead.push_back(QStringLiteral("在线值"));
     TreeHead.push_back(QStringLiteral("单位"));
     TreeHead.push_back(QStringLiteral("备注"));
     Model->setHorizontalHeaderLabels(TreeHead);
     //建立行分类
     BaseClass=new QStandardItem(QStringLiteral("基础参数"));
     RunCtrlClass=new QStandardItem(QStringLiteral("运动限制"));
     //建立分类可选择
     BaseClass->setCheckable(true);
     BaseClass->setEditable(false);
     RunCtrlClass->setCheckable(true);
     RunCtrlClass->setEditable(false);

     //分类加入模型
     Model->appendRow(BaseClass);
     Model->appendRow(RunCtrlClass);


     //建立数据行
     //编码器的旋转计数
     QStrListTemp.clear();
     QStrListTemp.push_back(QStringLiteral("单圈脉冲"));
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("");
     QStrListTemp.push_back("编码器旋转一圈的计数值，根据电机编码器设定，如果17位，设置成131072");
     NewChildLine(BaseClass,&BaseOtp,QStrListTemp);

     //每圈移动量
     QStrListTemp.clear();
     QStrListTemp.push_back(QStringLiteral("移动量"));
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("脉冲");
     QStrListTemp.push_back("每圈移动需要的脉冲");
     NewChildLine(BaseClass,&BaseMnum,QStrListTemp);

     //最高速度
     QStrListTemp.clear();
     QStrListTemp.push_back(QStringLiteral("最大速度"));
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("脉冲/秒");
     QStrListTemp.push_back("电机可以运行的最大速度");
     NewChildLine(RunCtrlClass,&RunSpeed,QStrListTemp);

     //最快加速度
     QStrListTemp.clear();
     QStrListTemp.push_back(QStringLiteral("最快加速度时间"));
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("毫秒");
     QStrListTemp.push_back("最快加速时间，根据该时间，系统自动计算对应加速相关参数");
     NewChildLine(RunCtrlClass,&RunAddSpeed,QStrListTemp);

     //最快减速度
     QStrListTemp.clear();
     QStrListTemp.push_back(QStringLiteral("最快减速度时间"));
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("0");
     QStrListTemp.push_back("毫秒");
     QStrListTemp.push_back("最快减速时间，根据该时间，系统自动计算对应减速相关参数");
     NewChildLine(RunCtrlClass,&RunSubSpeed,QStrListTemp);

     //加载模型到树
     ui->ArgDataTreeView->setModel(Model);
     ui->ArgDataTreeView->expandAll();
}



/****************************TreeItemChanged函数*********************************
Function    :模型数参数改变
Output      :
*********************************************************************/
void AddPar::TreeItemChanged(QStandardItem *Item)
{
    if (Item->isCheckable()&&Item->hasChildren())
        {
            Qt::CheckState status = Item->checkState ();
             for(int i = 0;i<Item->rowCount();++i)
             {
                 QStandardItem* ItemChild = Item->child(i);
                 ItemChild->setCheckState(status);
             }
        }
}


/****************************NewChildLine函数*********************************
Function    :新子行建立
Output      :
*********************************************************************/
 void AddPar::NewChildLine(QStandardItem *Item,QList<QStandardItem *> *ItemList,QStringList Data)
 {
     int RowCount;
     ItemList->clear();
     for(int i=0;i<Data.length();i++)
     {
         ItemList->push_back(new QStandardItem(Data.at(i)));
         if(i!=1)
         {
             ItemList->at(i)->setEditable(false);
         }
     }

     RowCount=Item->rowCount();
     ItemList->at(0)->setCheckable(true);
     Item->appendRow(ItemList->at(0));
     for(int i=1;i<Data.length();i++)
     {
         Item->setChild(RowCount,i,ItemList->at(i));
     }
 }


/****************************DownLoadData函数*********************************
 Function    :下载从站数据
 Output      :
*********************************************************************/
int AddPar::DownLoadData(QStandardItem *Item,QString Name,int Addr,int Row)
{
    bool ok=true;
    int Value=0;
    if(Item->child(Row)->checkState()==Qt::Checked)
    {
        Value=Item->child(Row,1)->text().toInt(&ok);
        if(!ok)
        {
             QMessageBox::information(this,Name,QStringLiteral("写入失败"));
             return ReFild;
        }
        WriteSFDInt(Addr,Value);
        return ReSuess;
    }
    return ReUncheck;
}


/****************************下载按钮槽函数*********************************
Function    :点击下载按钮，会触发该槽函数
Output      :
*********************************************************************/
void AddPar::on_DownloadBtn_clicked()
{
    int count=0;
    int value=0;
    if(!ConStatus())
    {
         QMessageBox::information(this,QStringLiteral("连接提示"),QStringLiteral("当前处于未连接状态"));
    }
    else
    {
        value=DownLoadData(BaseClass,"单圈脉冲",3002,0);
        count+=value==1?1:0;
        value=DownLoadData(BaseClass,"移动量",3004,1);
        count+=value==1?1:0;
        value=DownLoadData(RunCtrlClass,"最大速度",3018,0);
        count+=value==1?1:0;
        value=DownLoadData(RunCtrlClass,"最快加速度时间",3020,1);
        count+=value==1?1:0;
        value=DownLoadData(RunCtrlClass,"最快减速度时间",3022,2);
        count+=value==1?1:0;
        QMessageBox::information(this,QStringLiteral("下载提示"),QStringLiteral("写入成功：")+QString::number(count));
    }
}

/****************************Updata函数*********************************
Function    :更新数据的函数
Output      :
*********************************************************************/
 void AddPar::Updata()
 {
     ReadArgRunCrl(BaseClass,3002,0);
     ReadArgRunCrl(BaseClass,3004,1);
     ReadArgRunCrl(RunCtrlClass,3018,0);
     ReadArgRunCrl(RunCtrlClass,3020,1);
     ReadArgRunCrl(RunCtrlClass,3022,2);
 }




/****************************上载参数按钮槽函数*********************************
Function    :点击上载参数按钮，会触发该槽函数
Output      :
*********************************************************************/
void AddPar::on_UploadBtn_clicked()
{
    if(!ConStatus())
    {
         QMessageBox::information(this,QStringLiteral("连接提示"),QStringLiteral("当前处于未连接状态"));
    }
    else
    {
        Updata();
    }
}



/******************************************************析构函数*****************************************************/
AddPar::~AddPar()
{
    delete Model;
    delete BaseClass;
    FreeQList(&BaseOtp);
    FreeQList(&BaseMnum);
    delete RunCtrlClass;
    FreeQList(&RunSpeed);
    FreeQList(&RunAddSpeed);
    FreeQList(&RunSubSpeed);
    delete ui;
}


