重新构建的批检仪主板程序

This commit is contained in:
andy
2023-11-26 23:05:35 +08:00
parent b1b69d307f
commit 4a70f64693
29 changed files with 2565 additions and 64 deletions

View File

@@ -21,7 +21,7 @@ public:
char operator [](int index){
int size=this->size();
if(index<0) index=size+index;
if(index>=size) return char(0);
if(index<0||index>=size) return char(0);
return QByteArray::operator [](index);
}
myarray &operator =(const myarray &b){

582
base/check_cfg.cpp Normal file
View File

@@ -0,0 +1,582 @@
#include "base/check_cfg.h"
#include "base/mycfg.h"
#include "base/crc.h"
#include "QDir"
// 配置路径
#define CFG_PATH mystring("/home/root/config/")
#define CHECK_CFG_FILE_NAME cfg_->def_check_cfg
check_range my_json::json_to_range(QJsonValue v){
if(v.type()==QJsonValue::Object)
return check_range(v.toObject());
else{
qWarning()<<"json not a object"<<endl;
return check_range(0,0);
}
}
check_task my_json::json_to_task(QJsonValue v){
if(v.type()==QJsonValue::Object)
return check_task(v.toObject());
else{
qWarning()<<"json not a object"<<endl;
return check_task();
}
}
check_err my_json::json_to_err(QJsonValue v)
{
if(v.type()==QJsonValue::Object)
return check_err(v.toObject());
else{
qWarning()<<"json not a object"<<endl;
return check_err();
}
}
check_suberr my_json::json_to_suberr(QJsonValue v)
{
if(v.type()==QJsonValue::Object)
return check_suberr(v.toObject());
else{
qWarning()<<"json not a object"<<endl;
return check_suberr();
}
}
check_cfg::check_cfg()
{
this->cfg_=syscfg();
this->scheme_=nullptr;
QDir path;
if (!path.exists(CFG_PATH)) {
path.mkdir(CFG_PATH);
}
reload();
}
check_cfg::~check_cfg(){
if(scheme_!=nullptr){
free(scheme_);
scheme_=nullptr;
}
}
// 把方案转化为结构体
void check_cfg::scheme_json_to_struct(){
if(scheme_!=nullptr){
free(scheme_);
scheme_=nullptr;
}
scheme_struct_size=sizeof(scheme_def)+sizeof(scheme_task_def)*get_check_task_num();
scheme_=(scheme_def *)calloc(1,scheme_struct_size);
if(scheme_){
scheme_->plan_id=get_plan_id();
scheme_->task_num=get_check_task_num();
scheme_->timeout_m=get_check_time_out();
scheme_->marerr_num=errs.size();
qDebug()<<"scheme,id,task_num="<<scheme_->plan_id<<scheme_->task_num<<endl;
for(int i=0;i<scheme_->task_num;i++){
scheme_task_def *st=&scheme_->task[i];
check_task ct=tasks[i];
st->err=ct.get_failed_code();
st->item_num=ct.get_return_num();
st->taskid=ct.get_task_id();
st->taskindex=ct.get_index();
QList<uint8_t> ret_errs=ct.get_ret_failed_code();
QList<check_range> rangs=ct.get_ranges();
int rangs_num=rangs.size();
int err_num=ret_errs.size();
qDebug()<<"st,err,item_num,taskid,taskindex="<<st->item_num<<st->taskid<<st->taskindex<<endl;
for(int i=0;i<st->item_num;i++){
qDebug()<<"i="<<i<<endl;
if(rangs_num>i){
st->range[i].err=0;
if(err_num>i){
st->range[i].err=ret_errs[i];
}
st->range[i].max=rangs[i].max;
st->range[i].min=rangs[i].min;
}else{
st->range[i].err=0;
st->range[i].max=65535;
st->range[i].min=0;
}
}
}
qDebug()<<"tran err list."<<endl;
for(int i=0;i<scheme_->marerr_num;i++){
marerr_def *merr=&scheme_->marerr[i];
QList<uint8_t> suberr=errs[i].get_subcodes();
merr->err=errs[i].get_code();
merr->suberr_num=suberr.size();
for(int j=0;j<merr->suberr_num;j++){
merr->suberr[j]=suberr[j];
}
}
qDebug()<<"tran slave array."<<endl;
QByteArray slave_array=scheme_to_byte_array();
uint32_t crc32=crc::crc32(slave_array);
slave_array.append(crc32&0xff);
slave_array.append((crc32>>8)&0xff);
slave_array.append((crc32>>16)&0xff);
slave_array.append((crc32>>24)&0xff);
memcpy(scheme_->slave_data,slave_array.data(),slave_array.size());
qDebug()<<"tran end."<<endl;
}else{
qWarning()<<"can not calloc."<<endl;
}
}
// 升级
bool check_cfg::updata(QString jstring)
{
QFile file;
QJsonDocument json_doc;
QJsonParseError err;
file.setFileName(CHECK_CFG_FILE_NAME);
json_doc = QJsonDocument::fromJson(jstring.toUtf8(),&err);
if(err.error != QJsonParseError::NoError)
{
qWarning()<<"parse json failed:"<<err.errorString();
qWarning()<<jstring<<endl;
return false;
}
if(file.exists())
{
if(file.remove()!=true)
qWarning()<<"remove file "<<file.fileName()<<"err"<<endl;
}
if(!file.exists())
{
file.open(QIODevice::ReadWrite);
QTextStream stream(&file);
stream.setCodec("utf-8");
stream<<json_doc.toJson();
file.flush();
file.close();
system((char *)"sync");
}
reload();
return true;
}
void check_cfg::reload()
{
QFile file;
file.setFileName(CHECK_CFG_FILE_NAME);
if(file.exists())
{
file.open(QIODevice::ReadOnly);
QTextStream stream(&file);
stream.setCodec("utf-8");
QString json_str = stream.readAll();
QJsonParseError err;
json_doc = QJsonDocument::fromJson(json_str.toUtf8(),&err);
if(err.error != QJsonParseError::NoError)
{
qWarning()<<"parse json failed:"<<err.errorString();
qWarning()<<json_str<<endl;
}
else
{
clear();
my_json m;
QJsonObject json = json_doc.object();
JVALUE_TO_INT(plan_id,json.value("PlanID"));
JVALUE_TO_STR(brief,json.value("PlanBrief"));
m.json_to_list(json,"CheckSoftVersion",slave_soft_versions,&my_json::json_to_u16);
m.json_to_list(json,"CheckHardVersion",slave_hard_versions,&my_json::json_to_u16);
JVALUE_TO_INT(time_out_s,json.value("TimeOutS"));
JVALUE_TO_INT(time_out_m,json.value("TimeOutM"));
JVALUE_TO_U8(task_id_max,json.value("TaskIDMax"));
m.json_to_list(json,"MajorErrInfo",errs,&my_json::json_to_err);
m.json_to_list(json,"SubErrInfo",suberrs,&my_json::json_to_suberr);
m.json_to_list(json,"TaskArray",tasks,&my_json::json_to_task);
m.json_to_list(json,"CheckerRtvName",check_ret_items,&my_json::json_to_str);
// 如果返回参数字段为空,则依次统计
if(check_ret_items.size()==0){
for(int i=0;i<tasks.size();i++){
check_ret_items.append(tasks[i].get_return_info());
}
}
// task index应该从0开始依次递增
for(int i=0;i<tasks.size();i++)
{
if(tasks[i].get_index()!=i)
{
qWarning()<<"name="<<tasks[i].get_brief()<<" task_index!=[i]"<<endl;
}
}
// 检查子错误与主错误的对应关系
ch_errcode.clear();
for(int i=0;i<tasks.size();i++){
ch_errcode.append(tasks[i].get_failed_code());
ch_errcode.append(tasks[i].get_ret_failed_code());
}
// 查找子错误是否都有对应的描述
QSet<uint8_t> s=ch_errcode.toSet();
if(s.contains(uint8_t(0)))
s.remove(uint8_t(0));
QList<uint8_t> d=s.toList();
for(int i=0;i<suberrs.size();i++){
for(int j=0;j<d.size();j++){
if(suberrs[i]==d[j]){
d.removeAt(j);
break;
}
}
}
if(!d.isEmpty())
{
qWarning()<<"many suberr have not brief."<<d<<endl;
}
// 匹配主错误
get_ch_merrcode();
// 把剩下的子错误全部添加到优先级最低的主错误中
errs.last().append(ch_errcode);
// 生成方案结构体
scheme_json_to_struct();
}
qInfo()<<"check id:"<<planid_to_String(0);
file.close();
}
else
{
qWarning()<<"check cfg file "<<file.fileName()<<" had lossed"<<endl;
}
}
#define TASKS_MAX_SIZE (0x700-4)
// 把任务数据转化为字节数组
QByteArray check_cfg::tasks_to_byte_array()
{
QByteArray t;
for(int i=0;i<tasks.size();i++)
{
t.append(tasks[i].to_byte_array());
}
int size=t.size();
if(size<TASKS_MAX_SIZE)
{
t.append(TASKS_MAX_SIZE-size,char(0xff));
}
else
{
qWarning()<<"tasks array size too larg."<<endl;
}
return t;
}
#define TASKSID_MAX_SIZE (0x100-4)
// 把任务序号转化为数组
QByteArray check_cfg::tasksid_to_byte_array()
{
QByteArray t;
t.append(plan_id&0xff);
t.append((plan_id>>8)&0xff);
t.append((plan_id>>16)&0xff);
t.append((plan_id>>24)&0xff);
for(int i=0;i<tasks.size();i++)
{
t.append(tasks[i].get_task_id());
}
int size=t.size();
if(size<TASKSID_MAX_SIZE)
{
t.append(TASKSID_MAX_SIZE-size,char(0xff));
}
else
{
qWarning()<<"tasksid array size too larg."<<endl;
}
return t;
}
// 方案转化为数组
QByteArray check_cfg::scheme_to_byte_array()
{
QByteArray t;
t.append(tasksid_to_byte_array());
t.append(4,char(0xff));
t.append(tasks_to_byte_array());
return t;
}
// 获取检测方案id
int check_cfg::get_plan_id()
{
return plan_id;
}
// 根据方案获取具体信息id为0时填充本机方案
QString check_cfg::planid_to_String(int id)
{
if(id==0) id=plan_id;
// 日bit0~bit4 月bit5~bit8 年bit9~bit15
int sid=(id>>0)&0x7f;
int modele=(id>>7)&0x1f;
int chip=(id>>12)&0xf;
int day=(id>>16)&0x1f;
int month=(id>>21)&0xf;
int year=((id>>25)&0x7f)+2022;
QString s="%1-%2-%3 id=%4,modele=%5,chip=%6";
return s.arg(year).arg(month).arg(day).arg(sid).arg(modele).arg(chip);
}
// 获取适配的从机软件版本号
QList<uint16_t>& check_cfg::get_slave_soft_versions()
{
return slave_soft_versions;
}
// 获取适配的从机硬件版本号
QList<uint16_t>& check_cfg::get_slave_hard_versions()
{
return slave_hard_versions;
}
// 获取方案执行最长时间
int check_cfg::get_check_time_out()
{
return time_out_m;
}
// 获取任务id最大值
uint8_t check_cfg::get_task_id_max()
{
return task_id_max;
}
// 根据错误号返回错误字符串
QString check_cfg::get_err_string(int err)
{
QString r;
for(int i=0;i<errs.size();i++)
{
if(errs[i]==err)
r=errs[i]();
}
if(!r.isEmpty())
return r;
for(int i=0;i<suberrs.size();i++)
{
if(suberrs[i]==err)
r=suberrs[i]();
}
if(!r.isEmpty())
return r;
return QString("未知错误");
}
// 获取检测任务个数
int check_cfg::get_check_task_num()
{
return tasks.size();
}
// 根据序列指获取对应的任务参数
check_task check_cfg::get_task(int index)
{
for(int i=0;i<tasks.size();i++)
{
if(tasks[i].get_index()==index)
return tasks[i];
}
return check_task();
//return tasks[index];
}
QJsonObject check_cfg::returns_to_json(QByteArray data)
{
QJsonObject j;
QJsonArray a;
// 先是8字节错误结果再是8字节执行状态1已执行
QByteArray d=data.mid(16,data.size()-16);
//j.insert("PlanID",plan_id);
j.insert("TasksExecuteCode",QString(data.mid(0,8).toHex().toUpper()));
ch_errcode.clear();
for(int i=0;i<get_check_task_num();)
{
QJsonObject t;
bool ack=get_return_ack_by_index(data,i);
check_task task=get_task(i);
t=task.returns_to_json(ack,d);
ch_errcode.append(task.get_ch_errcode());
//qDebug()<<"append err code="<<ch_errcode<<endl;
//if(ack==true)
{
d.remove(0,get_task(i).get_return_num()*2);
i++;
}
// else
// {
// i=get_task(i).get_err_jump();
// }
a.append(t);
}
j.insert("TaskArray",a);
QList<check_err> e=get_ch_merrcode();
// QJsonArray err_code;
// QString err_str;
// for(int i=0;i<e.size();i++)
// {
// err_str=err_str+e[i]()+";";
// err_code.append(e[i].get_code());
// }
// if(err_code.isEmpty()){
// j.insert("ErrInfo","ok");
// err_code.append(0);
// }
// else{
// j.insert("ErrInfo",err_str);
// }
// j.insert("ErrCode",err_code);
if(e.isEmpty()){
j.insert("ErrInfo","ok");
j.insert("ErrCode",0);
}
else{
j.insert("ErrInfo",e[0]());
j.insert("ErrCode",e[0].get_code());
}
return j;
}
QList<check_err> check_cfg::get_ch_merrcode()
{
QList<check_err> l;
QSet<uint8_t> s=ch_errcode.toSet();
if(s.contains(uint8_t(0)))
s.remove(uint8_t(0));
ch_errcode=s.toList();
//qDebug()<<"mejor errs="<<errs<<endl;
for(int i=0;i<ch_errcode.size();)
{
if(in_err_range(l,ch_errcode[i])==true)
{
ch_errcode.removeAt(i);
}
else
{
i++;
}
}
if(!ch_errcode.isEmpty()){
// 有子错误没找到主错误
qWarning()<<"many suberr left."<<ch_errcode<<endl;
}
return l;
}
bool check_cfg::in_err_range(QList<check_err> &l,uint8_t code)
{
for(int j=0;j<errs.size();j++)
{
if(errs[j].in_range(code))
{
//qDebug()<<"find subcode="<<code<<" in mcode="<<errs[j].get_code()<<endl;
l.append(errs[j]);
return true;
}
}
qDebug()<<"can not find mcode,subcode="<<code<<endl;
return false;
}
bool check_cfg::get_return_ack_by_index(QByteArray data,int index)
{
if(data.size()<8)
{
qWarning()<<"check values too less."<<endl;
return false;
}
if(index<0||index>=64){
qWarning()<<"index out of range."<<endl;
return false;
}
if((data[index/8]&(1<<(index%8)))!=0)
{return false;}else{return true;}
}
QByteArray check_cfg::returns_to_paramerr(QByteArray data)
{
QByteArray p;
int len=(get_return_num()+7)/8;
int index=0;
p.append(len,char(0xff));
if(data.size()<get_return_num()*2){
qWarning()<<"data too less"<<endl;
return p;
}
for(int i=0;i<tasks.size();i++)
{
QList<check_range> ranges=tasks[i].get_ranges();
for(int j=0;j<ranges.size();j++)
{
int temp=data[index*2]|(data[index*2+1]<<8);
if(temp>=ranges[j].min&&temp<=ranges[j].max){
p[index/8]=p[index/8]& (~(1<<(index%8)));
}else{
p[index/8]=p[index/8]|(1<<(index%8));
}
index++;
}
}
return p;
}
static check_cfg *g_check_cfg;
check_cfg *check_plan()
{
if(g_check_cfg==nullptr){
g_check_cfg = new check_cfg();
}
return g_check_cfg;
}

651
base/check_cfg.h Normal file
View File

@@ -0,0 +1,651 @@
#ifndef CHECK_CFG_H
#define CHECK_CFG_H
#include <QFile>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include "QJsonValue"
#include <QJsonArray>
#include "QByteArray"
#include "stdint-gcc.h"
#include "QList"
#include "QString"
#include <QDebug>
#include "base/mycfg.h"
#define JVALUE_TO_BOOL(v,j) \
{\
if(j.type() == QJsonValue::Bool)\
v=j.toBool();\
else\
qWarning()<<#j<<"json not a bool value"<<endl;\
}
#define JVALUE_TO_INT(v,j) \
{\
if(j.type() == QJsonValue::Double)\
v=j.toInt();\
else\
{\
v=0;\
qWarning()<<#j<<"json not a int value"<<endl;\
}\
}
#define JVALUE_TO_U8(v,j) \
{\
if(j.type() == QJsonValue::Double)\
v=(uint8_t)j.toInt();\
else\
{\
v=0;\
qWarning()<<#j<<"json not a int value"<<endl;\
}\
}
#define JVALUE_TO_U16(v,j) \
{\
if(j.type() == QJsonValue::Double)\
v=(uint16_t)j.toInt();\
else\
{\
v=0;\
qWarning()<<#j<<"json not a int value"<<endl;\
}\
}
#define JVALUE_TO_STR(v,j) \
{\
if(j.type() == QJsonValue::String)\
v=j.toString();\
else\
qWarning()<<#j<<"json not a string value"<<endl;\
}
#define JVALUE_IS_ARRAY(j) \
if(j.type()!=QJsonValue::Array){\
qWarning()<<#j<<"json not a array"<<endl;\
}else\
class check_range;
class check_task;
class check_err;
class check_suberr;
class my_json
{
public:
my_json(){}
~my_json(){}
template <typename T>
void json_to_list(QJsonObject j,QString key,QList<T> &list,
T (my_json::*json_to_value)(QJsonValue v))
{
QJsonValue value = j.value(key);
JVALUE_IS_ARRAY(value)
{
QJsonArray array = value.toArray();
for (int i = 0; i < array.size(); i++) {
QJsonValue item = array.at(i);
list.append((this->*json_to_value)(item));
}
}
}
uint8_t json_to_u8(QJsonValue v){
uint8_t r;
JVALUE_TO_U8(r,v);
return r;
}
uint16_t json_to_u16(QJsonValue v){
uint16_t r;
JVALUE_TO_U16(r,v);
return r;
}
int json_to_int(QJsonValue v){
int r;
JVALUE_TO_INT(r,v);
return r;
}
QString json_to_str(QJsonValue v){
QString r;
JVALUE_TO_STR(r,v);
return r;
}
check_range json_to_range(QJsonValue v);
check_task json_to_task(QJsonValue v);
check_err json_to_err(QJsonValue v);
check_suberr json_to_suberr(QJsonValue v);
};
// 范围
class check_range
{
public:
check_range(uint16_t min,uint16_t max)
{
this->min=min;
this->max=max;
}
check_range(QJsonObject j)
{
JVALUE_TO_U16(min,j.value("Min"));
JVALUE_TO_U16(max,j.value("Max"));
if(min>max)
qWarning()<<"the range min="<<min<<"max="<<max<<"is empty."<<endl;
}
check_range(const check_range& b)
{
min=b.min;
max=b.max;
}
~check_range()
{
}
check_range& operator=(const check_range& b)
{
min=b.min;
max=b.max;
return *this;
}
// 如果在范围内则范围true
bool in_range(uint16_t a)
{
if(a>=min&&a<=max)
return true;
else
return false;
}
//private:
uint16_t min;
uint16_t max;
};
// 任务参数
class check_task
{
public:
check_task()
{
task_id=0;
index=0;
param_num=0;
return_num=0;
err_jump=0;
retry=0;
}
check_task(QJsonObject j)
{
my_json m;
JVALUE_TO_STR(brief,j.value("TaskBrief"));
JVALUE_TO_U8(task_id,j.value("TaskID"));
JVALUE_TO_U8(index,j.value("TaskIndex"));
JVALUE_TO_U8(err_jump,j.value("ErrJumpTo"));
JVALUE_TO_U8(retry,j.value("RetryCount"));
JVALUE_TO_U8(param_num,j.value("ParamCount"));
JVALUE_TO_U8(return_num,j.value("ReturnCount"));
m.json_to_list(j,"ParamInfo",params_info,&my_json::json_to_str);
m.json_to_list(j,"ReturnInfo",returns_info,&my_json::json_to_str);
m.json_to_list(j,"ParamVal",params,&my_json::json_to_u16);
m.json_to_list(j,"TestStandard",ranges,&my_json::json_to_range);
JVALUE_TO_U8(failed_code,j.value("ExecuteErrCode"));
m.json_to_list(j,"ResultErrCode",ret_failed_code,&my_json::json_to_u8);
}
check_task(const check_task& b)
{
brief=b.brief;
task_id=b.task_id;
index=b.index;
param_num=b.param_num;
params_info=b.params_info;
params=b.params;
ranges=b.ranges;
return_num=b.return_num;
returns_info=b.returns_info;
err_jump=b.err_jump;
retry=b.retry;
failed_code=b.failed_code;
ret_failed_code=b.ret_failed_code;
}
~check_task()
{
}
check_task& operator=(const check_task& b)
{
brief=b.brief;
task_id=b.task_id;
index=b.index;
param_num=b.param_num;
params_info=b.params_info;
params=b.params;
ranges=b.ranges;
return_num=b.return_num;
returns_info=b.returns_info;
err_jump=b.err_jump;
retry=b.retry;
failed_code=b.failed_code;
ret_failed_code=b.ret_failed_code;
return *this;
}
QByteArray to_byte_array()
{
QByteArray t;
t.append(task_id);
t.append(index);
t.append(retry);
t.append(err_jump);
t.append((param_num&0x0f)|(return_num<<4));
for(int i=0;i<params.size();i++)
{
t.append(uint8_t(params[i]&0xff));
t.append(uint8_t(params[i]>>8));
}
if(param_num!=params.size())
{
qWarning()<<"name="<<brief<<" param_num!=params.size()."<<endl;
}
if(return_num>returns_info.size())
{
qWarning()<<"name="<<brief<<" return_num>returns_info.size()."<<endl;
}
if(ch_errcode.size()!=ranges.size())
{
qWarning()<<"name="<<brief<<" ch_errcode.size()!=ranges.size()."<<endl;
}
return t;
}
QList<check_range> get_ranges()
{
return ranges;
}
QJsonObject returns_to_json(bool ack,QByteArray data)
{
QJsonObject j;
QJsonArray a;
QJsonArray ret_err;
ch_errcode.clear();
j.insert("TaskBrief",brief);
j.insert("TaskIndex",get_index());
j.insert("TaskID",get_task_id());
j.insert("Ack",ack);
if(ack!=true)
{
// 添加流程错误
j.insert("ExecuteErrCode",failed_code);
ch_errcode.append(failed_code);
}
else{
j.insert("ExecuteErrCode",0);
}
{
if((data.size()/2)<return_num)
qWarning()<<"data size too less."<<endl;
else
{
for(int i=0;i<return_num;i++)
{
QJsonObject t;
int value=data[i*2]|(data[i*2+1]<<8);
if(returns_info.size()>i)
t.insert("ReturnInfo",returns_info[i]);
else
t.insert("ReturnInfo","unknown");
t.insert("Return",value);
// 判断值域
if(ranges.size()>i)
{
//qDebug()<<"rang:"<<ranges[i].min<<ranges[i].max<<value<<endl;
bool b=ranges[i].in_range(value);
t.insert("InRange",b);
if(b==true) ret_err.append(0);
else {
if(ret_failed_code.size()>i)
{
ret_err.append(ret_failed_code[i]);
ch_errcode.append(ret_failed_code[i]);
}
else
ret_err.append(0);
}
}
else
{
t.insert("InRange",true);
ret_err.append(0);
}
a.append(t);
}
}
}
//qDebug()<<"task="<<get_brief()<<"ch_errcode="<<ch_errcode<<endl;
j.insert("Returns",a);
j.insert("ResultErrCode",ret_err);
return j;
}
QList<uint8_t> get_ch_errcode(){
//qDebug()<<"task="<<get_brief()<<"ch_errcode="<<ch_errcode<<endl;
return ch_errcode;
}
QString get_brief(){return brief;}
uint8_t get_task_id(){return task_id;}
uint8_t get_index(){return index;}
int get_return_num(){return return_num;}
QList<QString> get_return_info(){return returns_info;}
int get_err_jump(){return err_jump;}
uint8_t get_failed_code(){return failed_code;}
QList<uint8_t> get_ret_failed_code(){return ret_failed_code;}
private:
// 任务简要描述
QString brief;
// 对应从机的检测项目
uint8_t task_id;
// 此任务执行的次序
uint8_t index;
// 此任务参数个数
uint8_t param_num;
// 参数介绍
QList<QString> params_info;
// 参数指
QList<uint16_t> params;
// 参数范围
QList<check_range> ranges;
// 返回值个数
uint8_t return_num;
// 返回值说明
QList<QString> returns_info;
// 失败时跳转到任务
uint8_t err_jump;
// 失败后重试次数
uint8_t retry;
// 此任务失败时的错误代码
uint8_t failed_code;
// 此任务返回值错误时的错误代码
QList<uint8_t> ret_failed_code;
// 解析时此任务产生的错误代码
QList<uint8_t> ch_errcode;
};
class check_err
{
public:
check_err(){}
check_err(QJsonObject j){
my_json m;
JVALUE_TO_STR(info,j.value("Info"));
JVALUE_TO_U8(code,j.value("MajorErrCode"));
m.json_to_list(j,"SubErrCode",sub_errs,&my_json::json_to_u8);
}
check_err(const check_err& b)
{
info=b.info;
code=b.code;
sub_errs=b.sub_errs;
}
~check_err(){}
check_err& operator=(const check_err& b)
{
info=b.info;
code=b.code;
sub_errs=b.sub_errs;
return *this;
}
void append(uint8_t suberr){
sub_errs.append(suberr);
}
void append(QList<uint8_t> suberrs){
this->sub_errs.append(suberrs);
}
bool operator ==(const uint8_t code)
{
return this->code==code;
}
QString get_err_string()
{
return info;
}
QString operator ()()
{
return info;
}
bool in_range(uint8_t err){
foreach (uint8_t i, sub_errs) {
if(i==err) return true;
}
return false;
}
uint8_t get_code(){return code;}
QList<uint8_t> get_subcodes(){return sub_errs;}
private:
QString info;
uint8_t code;
QList<uint8_t> sub_errs;
};
class check_suberr
{
public:
check_suberr(){}
check_suberr(QJsonObject j)
{
JVALUE_TO_STR(info,j.value("Info"));
JVALUE_TO_U8(code,j.value("ErrCode"));
}
check_suberr(const check_suberr& b)
{
info=b.info;
code=b.code;
}
~check_suberr(){}
check_suberr& operator=(const check_suberr& b)
{
info=b.info;
code=b.code;
return *this;
}
bool operator ==(const uint8_t code)
{
return this->code==code;
}
QString get_err_string()
{
return info;
}
QString operator ()()
{
return info;
}
private:
QString info;
uint8_t code;
};
class check_value
{
public:
check_value(){
}
~check_value(){
}
private:
QString info;
uint16_t value;
};
#pragma pack(1)
typedef struct{
uint16_t max;
uint16_t min;
uint8_t err;
}scheme_range_def;
typedef struct
{
uint8_t taskid;
uint8_t taskindex;
uint8_t item_num;
uint8_t err;
scheme_range_def range[16];
}scheme_task_def;
typedef struct{
uint8_t err;
uint8_t suberr_num;
uint8_t suberr[30];
}marerr_def;
typedef struct{
uint8_t slave_data[2048];
uint32_t plan_id;
uint32_t timeout_m;
uint32_t task_num;
uint32_t marerr_num;
marerr_def marerr[21];
scheme_task_def task[0];
}scheme_def;
#pragma pack()
// 检测序列
class check_cfg
{
public:
check_cfg();
~check_cfg();
void reload();
bool updata(QString jstring);
QByteArray tasks_to_byte_array();
QByteArray tasksid_to_byte_array();
QByteArray scheme_to_byte_array();
void scheme_json_to_struct();
const scheme_def *check_scheme(void){
if(scheme_==nullptr){
qWarning()<<"scheme_ ptr is null,application will failed."<<endl;
}
return scheme_;
}
int check_scheme_size(){
return scheme_struct_size;
}
// 获取检测方案id
int get_plan_id();
// 把方案id转化为具体信息
QString planid_to_String(int id);
QString get_brief(){return brief;}
// 获取适配的从机软件版本号
QList<uint16_t>& get_slave_soft_versions();
// 获取适配的从机硬件版本号
QList<uint16_t>& get_slave_hard_versions();
// 获取方案执行最长时间
int get_check_time_out();
// 获取任务id最大值
uint8_t get_task_id_max();
// 根据错误号返回错误字符串
QString get_err_string(int err);
// 获取检测任务个数
int get_check_task_num();
// 根据序列指获取对应的任务参数
check_task get_task(int index);
// 返回返回值个数
int get_return_num(){
int ret=0;
for (int i=0;i<tasks.size();i++){
ret+=tasks[i].get_return_num();
}
return ret;
}
// 返回返回值参数
QStringList get_return_info(){
return check_ret_items;
}
// 返回参数错误位 data为原始检测数据去除16字节执行结果
QByteArray returns_to_paramerr(QByteArray data);
// 返回任务执行结果的json data为原始检测数据(包含16字节执行结果)
QJsonObject returns_to_json(QByteArray data);
// 返回执行结果的json字符串
QString returns_to_jstring(QByteArray data)
{
QJsonDocument doc;
doc.setObject(returns_to_json(data));
return doc.toJson();
}
QString scheme_to_jstring()
{
return json_doc.toJson();
}
// 返回主错误列表
QList<check_err> get_ch_merrcode();
// 错误代码在范围内时返回true并把对应主错误代码添加进l
bool in_err_range(QList<check_err> &l,uint8_t code);
private:
// 提取指定任务的执行结果
bool get_return_ack_by_index(QByteArray data,int index);
void clear()
{
slave_soft_versions.clear();
slave_hard_versions.clear();
errs.clear();
suberrs.clear();
tasks.clear();
check_ret_items.clear();
}
private:
mycfg *cfg_;
QJsonDocument json_doc;
QByteArray check_cfg_data;
int plan_id;
QString brief;
QList<uint16_t> slave_soft_versions;
QList<uint16_t> slave_hard_versions;
int time_out_s;// 小板超时时间
int time_out_m;// 主板超时时间
uint8_t task_id_max;
QList<check_err> errs;
QList<check_suberr> suberrs;
QList<check_task> tasks;
// 检测时产生的错误代码
QList<uint8_t> ch_errcode;
// 返回值项目
QStringList check_ret_items;
// 把方案解析为结构体的形式
scheme_def *scheme_;
int scheme_struct_size;
};
check_cfg *check_plan();
#endif // CHECK_CFG_H

View File

@@ -18,7 +18,6 @@
// 配置文件
#define CFG_FILE_NAME CFG_PATH+"cfg.json"
#define CHECK_CFG_FILE_NAME cfg_->def_check_cfg
// 自启动路径
#define AUTO_START_PATH "/usr/local/QDesktop-fb"
@@ -282,20 +281,111 @@ void mycfg::init_env()
void mycfg::restart()
{
system("systemctl restart atk-qtapp-start.service");
}
void mycfg::reload()
{
QFile file;
file.setFileName(CFG_FILE_NAME);
if(!file.exists())
{
file.open(QIODevice::ReadWrite);
QTextStream stream(&file);
stream.setCodec("utf-8");
stream<<to_json();
file.close();
}
else
{
file.open(QIODevice::ReadOnly);
QTextStream stream(&file);
stream.setCodec("utf-8");
mystring json_str = stream.readAll();
to_class(json_str);
file.close();
}
}
// 把配置写入json文件
void mycfg::save()
{
QFile file;
file.setFileName(CFG_FILE_NAME);
if(file.exists())
{
if(file.remove()!=true)
qWarning()<<"remove file "<<file.fileName()<<"err"<<endl;
}
file.open(QIODevice::ReadWrite);
QTextStream stream(&file);
stream.setCodec("utf-8");
stream<<to_json();
file.flush();
file.close();
system((char *)"sync");
}
// 把文件保存到配置路径下
bool mycfg::save_file(mystring name,myarray data){
QFile file;
file.setFileName(CFG_PATH+name);
if(file.exists())
{
if(file.remove()!=true){
qWarning()<<"remove file "<<file.fileName()<<"err"<<endl;
return false;
}
}
file.open(QIODevice::ReadWrite);
file.write(data);
file.flush();
file.close();
system((char *)"sync");
return true;
}
mycfg g_syscfg;
mycfg *syscfg(){
return &g_syscfg;
// 更新生产信息
void mycfg::updata_produc_info(myarray data)
{
production_info.clear();
for(int i=0;i<data.size();i++){
production_info.append(data[i]);
}
}
void mycfg::updata_produc_info(QList<int> data)
{
production_info.clear();
for(int i=0;i<data.size();i++){
production_info.append(data[i]);
}
}
mycfg *g_syscfg;
mycfg *syscfg(){
if(g_syscfg==nullptr){
g_syscfg=new mycfg();
}
return g_syscfg;
}

View File

@@ -11,8 +11,14 @@ public:
mycfg();
void to_class(mystring str);
mystring to_json();
void init_env();
mystring to_json();
void restart();
void reload();
void save();
bool save_file(mystring name,myarray data);
void updata_produc_info(myarray data);
void updata_produc_info(QList<int> data);
bool tcp_enable;//tcp使能
mystring server_ip;