#include "cmd_pc.h" #include "cmd_slave.h" #include "prot/prot_m4.h" #include "prot/prot_pc.h" #include "prot/prot_slave.h" #include "base/mycfg.h" #include "base/check_cfg.h" #include "QDebug" #include "elec/elec_judge.h" typedef struct { int moter_count; int moter_run; } moter_def; static moter_def g_moter; // 电机控制 myarray moter_ctrl(myarray op) { mycfg *cfg_ = syscfg(); moter_def *moter = &g_moter; myarray r; if (op == "up") { int count = 0; if (moter->moter_count > 0) { moter->moter_run = 1; count = -moter->moter_count - 100; moter->moter_count = 0; mystring s = mystring("moter %1").arg(count); r = myarray(s.data()); } else { qWarning("moter count out of range."); return r; } } else if (op == "down") { int count = 0; if (moter->moter_count < cfg_->moter_count) { moter->moter_run = 1; count = cfg_->moter_count - moter->moter_count; moter->moter_count += count; mystring s = mystring("moter %1").arg(count); r = myarray(s.data()); qDebug("moter down:%s",s.data()); } else { qWarning("moter count out of range.") ; return r; } } qDebug("moter ctrl:%s",op.data()); return r; } // 自研批检仪检测 int selfdev_check::dolater(int cmd, myarray data) { prot_m4 *m4 = protM4(); prot_slave *slave=protSlave(); mycfg *cfg=syscfg(); busy=1; connect(this, &selfdev_check::send_to_m4_signal, m4, &prot_m4::send_data_slot); moter_down_cb_fun=[=](myarray data) { m4->del_irq_fun(moter_down_cb_fun,"moter "); if(data=="down"){ // 这里开始检测 QList addrs=cfg->calc_slave_addrs(); HandleSlave *s=new slave_check(); foreach(int addr, addrs){ bool ack=slave->set_slave_handle(addr,s); if(ack==false){ qWarning("addr %d handle is busy.",addr); }else{ connect(s,&HandleSlave::end_signal,this,&selfdev_check::slave_end_slot); } } } }; m4->set_irq_fun(moter_down_cb_fun,"moter "); emit send_to_m4_signal(moter_ctrl("down")); slave_acked.clear(); for(int i=0;islave_num;i++){ slave_acked.append(myarray()); } slave_acked_num=0; return 0; } void selfdev_check::timeout() { } // 把小板的返回数据转化为自研批检仪上位机的格式 static myarray tran_slave_to_selfdev_check(myarray &data) { check_cfg *ccfg_=check_plan(); // 返回值个数 int return_num=ccfg_->get_return_num(); // 参数错误字节数 int paramerr_num=(return_num+7)/8; // 每个通道占用的长度 int len_for_each=1+8+paramerr_num+return_num*2; myarray r; if(data.size()<17){ r.append(char(208)); r.append((len_for_each-1),char(0xff)); }else{ myarray paramerr=ccfg_->returns_to_paramerr(data.right(return_num*2)); r=data.left(8)+paramerr+data.right(return_num*2); uint8_t marerr=0,suberr=0; uint8_t *d=(uint8_t *)data.data(); elec_judge(ccfg_->check_scheme(),ccfg_->get_check_task_num(), d,d+8,d+16,&marerr,&suberr); r.insert(0,uint8_t(marerr)); } return r; } void selfdev_check::slave_end_slot(int addr,int ack, myarray data) { if(addr<=0||addr>slave_acked.size()){ slave_acked.replace(addr-1,data); } slave_acked_num++; if(slave_acked_num>=slave_acked.size()){ myarray r; r.append(char(0)); for(int i=0;i