From a0b0f41c3914a000a2f6fdf1b085177dc515c2e9 Mon Sep 17 00:00:00 2001 From: ranchuan Date: Mon, 27 Nov 2023 14:31:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E7=A0=94=E6=89=B9?= =?UTF-8?q?=E6=A3=80=E4=BB=AA=E6=A3=80=E6=B5=8B=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + base/base.cpp | 38 +- base/base.h | 133 ++--- base/check_cfg.cpp | 916 ++++++++++++++++---------------- base/check_cfg.h | 1047 ++++++++++++++++++------------------- base/crc.cpp | 274 +++++----- base/crc.h | 34 +- base/file.h | 377 ++++++------- base/mycfg.cpp | 577 ++++++++++---------- base/mycfg.h | 95 ++-- checker_host.pro | 8 + complier_info.h | 17 + elec/elec_judge.cpp | 453 ++++++++++++++++ elec/elec_judge.h | 44 ++ elec/mystring.cpp | 128 +++++ elec/mystring.h | 30 ++ info.json | 10 + interface/codec.cpp | 23 +- interface/codec.h | 48 +- interface/codec_m4.cpp | 129 +++-- interface/codec_m4.h | 16 +- interface/codec_slave.cpp | 130 +++-- interface/codec_slave.h | 18 +- interface/codec_ym.cpp | 316 ++++++----- interface/codec_ym.h | 10 +- interface/if_tcp.cpp | 229 ++++---- interface/if_tcp.h | 2 +- interface/interface.cpp | 19 +- interface/interface.h | 32 +- main.cpp | 4 +- mycopy.py | 100 ++++ mysql.py | 167 ++++++ prebuild.py | 51 ++ prot/prot_m4.cpp | 127 ++--- prot/prot_m4.h | 50 +- prot/prot_pc.cpp | 93 ++-- prot/prot_pc.h | 89 ++-- prot/prot_slave.cpp | 120 ++--- prot/prot_slave.h | 107 ++-- prot_cmd/cmd_pc.cpp | 181 +++++-- prot_cmd/cmd_pc.h | 29 +- prot_cmd/cmd_slave.cpp | 34 +- prot_cmd/cmd_slave.h | 2 + quest.py | 97 ++++ quest_info.txt | 0 45 files changed, 3778 insertions(+), 2628 deletions(-) create mode 100644 complier_info.h create mode 100644 elec/elec_judge.cpp create mode 100644 elec/elec_judge.h create mode 100644 elec/mystring.cpp create mode 100644 elec/mystring.h create mode 100644 info.json create mode 100644 mycopy.py create mode 100644 mysql.py create mode 100644 prebuild.py create mode 100644 quest.py create mode 100644 quest_info.txt diff --git a/.gitignore b/.gitignore index fab7372..cbfbe4c 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,5 @@ Thumbs.db *.dll *.exe +.vscode/ + diff --git a/base/base.cpp b/base/base.cpp index 78f02bc..cde4528 100644 --- a/base/base.cpp +++ b/base/base.cpp @@ -3,28 +3,27 @@ #include "base/base.h" #include "QList" - - - - // 字符串转化为数字列表 -template -QList str_to_nums(mystring str,char c){ - QStringList snums = str.split(c); - QList nums; - for(int i=0;i +QList str_to_nums(mystring str, char c) +{ + QStringList snums = str.split(c); + QList nums; + for (int i = 0; i < snums.size(); i++) + nums.append(T(snums[i].toInt(nullptr, 10))); + return nums; } // 字符串转化为数组 -myarray str_to_data(mystring str,char c){ - QStringList snums = str.split(c); - myarray d; - for(int i=0;isize(); - if(index<0) index=size+index; - if(index<0||index>=size) return char(0); - return QByteArray::operator [](index); - } - myarray &operator =(const myarray &b){ - QByteArray::operator =(b); - return *this; - } -// myarray &operator =(const myarray b){ -// QByteArray::operator =(b); -// return *this; -// } - myarray &operator =(const QByteArray &b){ - QByteArray::operator =(b); - return *this; - } -// myarray &operator =(const QByteArray b){ -// QByteArray::operator =(b); -// return *this; -// } - + QByteArray::append(data, len); + } + myarray(int size, char data) : QByteArray(size, data) {} + myarray(const myarray &data) : QByteArray(data) {} + virtual ~myarray() {} + char &operator[](int index) + { + int size = this->size(); + if (index < 0) + index = size + index; + if (index < 0 || index >= size) + return data()[size-1]; + return data()[index]; + } + myarray &operator=(const myarray &b) + { + QByteArray::operator=(b); + return *this; + } + // myarray &operator =(const myarray b){ + // QByteArray::operator =(b); + // return *this; + // } + myarray &operator=(const QByteArray &b) + { + QByteArray::operator=(b); + return *this; + } + // myarray &operator =(const QByteArray b){ + // QByteArray::operator =(b); + // return *this; + // } + myarray right(qsizetype index){ + return myarray(QByteArray::right(index)); + } + myarray left(qsizetype index){ + return myarray(QByteArray::left(index)); + } + myarray mid(qsizetype index,qsizetype len=-1LL){ + return myarray(QByteArray::mid(index,len)); + } }; - - -class mystring:public QString +class mystring : public QString { public: - mystring(){} - mystring(const char *data):QString(data){} - mystring(myarray &data):QString(data.data()){} - mystring(QByteArray &data):QString(data.data()){} - mystring(QByteArray data):QString(data.data()){} - mystring(QString &data):QString(data){} - mystring(QString data):QString(data){} - virtual ~mystring(){} - const char *data(){ - localdata=QString::toLocal8Bit(); - return localdata.data(); - } - mystring &operator =(const QString &b){ - QString::operator =(b); - return *this; - } + mystring() {} + mystring(const char *data) : QString(data) {} + mystring(myarray &data) : QString(data.data()) {} + mystring(QByteArray &data) : QString(data.data()) {} + mystring(QByteArray data) : QString(data.data()) {} + mystring(QString &data) : QString(data) {} + mystring(QString data) : QString(data) {} + virtual ~mystring() {} + const char *data() + { + localdata = QString::toLocal8Bit(); + return localdata.data(); + } + mystring &operator=(const QString &b) + { + QString::operator=(b); + return *this; + } + protected: - myarray localdata; + myarray localdata; }; +template +QList str_to_nums(mystring str, char c); -template -QList str_to_nums(mystring str,char c); - -myarray str_to_data(mystring str,char c); - - +myarray str_to_data(mystring str, char c); #endif // BASE_H diff --git a/base/check_cfg.cpp b/base/check_cfg.cpp index be1356e..8034603 100644 --- a/base/check_cfg.cpp +++ b/base/check_cfg.cpp @@ -3,580 +3,578 @@ #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"<cfg_=syscfg(); - this->scheme_=nullptr; + this->cfg_ = syscfg(); + this->scheme_ = nullptr; - QDir path; - if (!path.exists(CFG_PATH)) { - path.mkdir(CFG_PATH); - } - - reload(); + QDir path; + if (!path.exists(CFG_PATH)) + { + path.mkdir(CFG_PATH); + } + reload(); } -check_cfg::~check_cfg(){ - if(scheme_!=nullptr){ - free(scheme_); - scheme_=nullptr; - } +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="<plan_id<task_num<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 ret_errs=ct.get_ret_failed_code(); - QList rangs=ct.get_ranges(); - int rangs_num=rangs.size(); - int err_num=ret_errs.size(); - qDebug()<<"st,err,item_num,taskid,taskindex="<item_num<taskid<taskindex<item_num;i++){ - qDebug()<<"i="<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; - } - } +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=%d,task_num=%d",scheme_->plan_id,scheme_->task_num); + 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 ret_errs = ct.get_ret_failed_code(); + QList rangs = ct.get_ranges(); + int rangs_num = rangs.size(); + int err_num = ret_errs.size(); + qDebug("st,err,item_num=%d,taskid=%d,taskindex=%d",st->item_num,st->taskid,st->taskindex); + for (int i = 0; i < st->item_num; i++) + { + qDebug("\ti=%d",i); + 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; } - qDebug()<<"tran err list."<marerr_num;i++){ - marerr_def *merr=&scheme_->marerr[i]; - QList suberr=errs[i].get_subcodes(); - merr->err=errs[i].get_code(); - merr->suberr_num=suberr.size(); - for(int j=0;jsuberr_num;j++){ - merr->suberr[j]=suberr[j]; - } + else + { + st->range[i].err = 0; + st->range[i].max = 65535; + st->range[i].min = 0; } - qDebug()<<"tran slave array."<>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."<marerr_num; i++) + { + marerr_def *merr = &scheme_->marerr[i]; + QList 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."); + myarray 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."); + } + else + { + qWarning("can not calloc."); + } } - - // 升级 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:"< s=ch_errcode.toSet(); - if(s.contains(uint8_t(0))) - s.remove(uint8_t(0)); - QList d=s.toList(); - for(int i=0;i s = ch_errcode.toSet(); + if (s.contains(uint8_t(0))) + s.remove(uint8_t(0)); + QList 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; + } + // 匹配主错误 + 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"; + } } - - - - -#define TASKS_MAX_SIZE (0x700-4) +#define TASKS_MAX_SIZE (0x700 - 4) // 把任务数据转化为字节数组 -QByteArray check_cfg::tasks_to_byte_array() +myarray check_cfg::tasks_to_byte_array() { - QByteArray t; - for(int i=0;i>8)&0xff); - t.append((plan_id>>16)&0xff); - t.append((plan_id>>24)&0xff); - for(int i=0;i> 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."; + } + return t; } - // 方案转化为数组 -QByteArray check_cfg::scheme_to_byte_array() +myarray 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; + myarray 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; + 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); + 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& check_cfg::get_slave_soft_versions() +QList &check_cfg::get_slave_soft_versions() { - return slave_soft_versions; + return slave_soft_versions; } // 获取适配的从机硬件版本号 -QList& check_cfg::get_slave_hard_versions() +QList &check_cfg::get_slave_hard_versions() { - return slave_hard_versions; + return slave_hard_versions; } // 获取方案执行最长时间 int check_cfg::get_check_time_out() { - return time_out_m; + return time_out_m; } // 获取任务id最大值 uint8_t check_cfg::get_task_id_max() { - return task_id_max; + return task_id_max; } // 根据错误号返回错误字符串 QString check_cfg::get_err_string(int err) { - QString r; - for(int i=0;i e=get_ch_merrcode(); -// QJsonArray err_code; -// QString err_str; -// for(int i=0;i e = get_ch_merrcode(); + // QJsonArray err_code; + // QString err_str; + // for(int i=0;i check_cfg::get_ch_merrcode() { - QList l; - QSet s=ch_errcode.toSet(); - if(s.contains(uint8_t(0))) - s.remove(uint8_t(0)); - ch_errcode=s.toList(); - //qDebug()<<"mejor errs="< l; + QSet s = ch_errcode.toSet(); + if (s.contains(uint8_t(0))) + s.remove(uint8_t(0)); + ch_errcode = s.toList(); + // qDebug()<<"mejor errs="< &l,uint8_t code) +bool check_cfg::in_err_range(QList &l, uint8_t code) { - for(int j=0;j= 64) + { + qWarning("index out of range."); + return false; + } + if ((data[index / 8] & (1 << (index % 8))) != 0) + { + return false; + } + else + { + return true; + } } - -bool check_cfg::get_return_ack_by_index(QByteArray data,int index) +myarray check_cfg::returns_to_paramerr(myarray data) { - if(data.size()<8) - { - qWarning()<<"check values too less."<=64){ - qWarning()<<"index out of range."< ranges=tasks[i].get_ranges(); - for(int j=0;j=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++; - } - } + myarray 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"); return p; + } + for (int i = 0; i < tasks.size(); i++) + { + QList 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; + if (g_check_cfg == nullptr) + { + g_check_cfg = new check_cfg(); + } + return g_check_cfg; } - - - - - diff --git a/base/check_cfg.h b/base/check_cfg.h index 2b893e8..a236e75 100644 --- a/base/check_cfg.h +++ b/base/check_cfg.h @@ -1,9 +1,6 @@ #ifndef CHECK_CFG_H #define CHECK_CFG_H - - - #include #include #include @@ -17,58 +14,56 @@ #include #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"< - void json_to_list(QJsonObject j,QString key,QList &list, - T (my_json::*json_to_value)(QJsonValue v)) + my_json() {} + ~my_json() {} + template + void json_to_list(QJsonObject j, QString key, QList &list, + T (my_json::*json_to_value)(QJsonValue v)) + { + QJsonValue value = j.value(key); + JVALUE_IS_ARRAY(value) { - 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)); - } - } + 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); + } + 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&&a<=max) - return true; - else - return false; - } -//private: - uint16_t min; - uint16_t max; + 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."; + } + 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() + 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; + } + myarray to_byte_array() + { + myarray 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++) { - task_id=0; - index=0; - param_num=0; - return_num=0; - err_jump=0; - retry=0; + t.append(uint8_t(params[i] & 0xff)); + t.append(uint8_t(params[i] >> 8)); } - check_task(QJsonObject j) + if (param_num != params.size()) { - 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); + qWarning() << "name=" << brief << " param_num!=params.size()."; } - check_task(const check_task& b) + if (return_num > returns_info.size()) { - 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; + qWarning() << "name=" << brief << " return_num>returns_info.size()."; } - ~check_task() + if (ch_errcode.size() != ranges.size()) { - + qWarning() << "name=" << brief << " ch_errcode.size()!=ranges.size()."; } - check_task& operator=(const check_task& b) + return t; + } + QList get_ranges() + { + return ranges; + } + QJsonObject returns_to_json(bool ack, myarray 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) { - 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; + // 添加流程错误 + j.insert("ExecuteErrCode", failed_code); + ch_errcode.append(failed_code); } - QByteArray to_byte_array() + else { - 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>8)); - } - if(param_num!=params.size()) - { - qWarning()<<"name="<returns_info.size()) - { - qWarning()<<"name="<returns_info.size()."< 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) i) + t.insert("ReturnInfo", returns_info[i]); + else + t.insert("ReturnInfo", "unknown"); + t.insert("Return", value); + // 判断值域 + if (ranges.size() > i) + { + // qDebug()<<"rang:"<i) - t.insert("ReturnInfo",returns_info[i]); - else - t.insert("ReturnInfo","unknown"); - t.insert("Return",value); - // 判断值域 - if(ranges.size()>i) - { - //qDebug()<<"rang:"<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); - } + 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_ch_errcode(){ - //qDebug()<<"task="< get_return_info(){return returns_info;} - int get_err_jump(){return err_jump;} - uint8_t get_failed_code(){return failed_code;} - QList get_ret_failed_code(){return ret_failed_code;} + // qDebug()<<"task="< get_ch_errcode() + { + // qDebug()<<"task="< get_return_info() { return returns_info; } + int get_err_jump() { return err_jump; } + uint8_t get_failed_code() { return failed_code; } + QList get_ret_failed_code() { return ret_failed_code; } + private: - // 任务简要描述 - QString brief; - // 对应从机的检测项目 - uint8_t task_id; - // 此任务执行的次序 - uint8_t index; - // 此任务参数个数 - uint8_t param_num; - // 参数介绍 - QList params_info; - // 参数指 - QList params; - // 参数范围 - QList ranges; - // 返回值个数 - uint8_t return_num; - // 返回值说明 - QList returns_info; - // 失败时跳转到任务 - uint8_t err_jump; - // 失败后重试次数 - uint8_t retry; - // 此任务失败时的错误代码 - uint8_t failed_code; - // 此任务返回值错误时的错误代码 - QList ret_failed_code; + // 任务简要描述 + QString brief; + // 对应从机的检测项目 + uint8_t task_id; + // 此任务执行的次序 + uint8_t index; + // 此任务参数个数 + uint8_t param_num; + // 参数介绍 + QList params_info; + // 参数指 + QList params; + // 参数范围 + QList ranges; + // 返回值个数 + uint8_t return_num; + // 返回值说明 + QList returns_info; + // 失败时跳转到任务 + uint8_t err_jump; + // 失败后重试次数 + uint8_t retry; + // 此任务失败时的错误代码 + uint8_t failed_code; + // 此任务返回值错误时的错误代码 + QList ret_failed_code; - // 解析时此任务产生的错误代码 - QList ch_errcode; + // 解析时此任务产生的错误代码 + QList 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) + 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 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) { - info=b.info; - code=b.code; - sub_errs=b.sub_errs; + if (i == err) + return true; } - ~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 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 get_subcodes(){return sub_errs;} + return false; + } + uint8_t get_code() { return code; } + QList get_subcodes() { return sub_errs; } + private: - QString info; - uint8_t code; - QList sub_errs; + QString info; + uint8_t code; + QList 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; - } + 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; + QString info; + uint8_t code; }; - - class check_value { public: - check_value(){ + check_value() + { + } + ~check_value() + { + } - } - ~check_value(){ - - } private: - QString info; - uint16_t value; + QString info; + uint16_t value; }; - #pragma pack(1) -typedef struct{ +typedef struct +{ uint16_t max; uint16_t min; uint8_t err; -}scheme_range_def; +} scheme_range_def; typedef struct { @@ -509,17 +505,17 @@ typedef struct uint8_t item_num; uint8_t err; scheme_range_def range[16]; -}scheme_task_def; +} scheme_task_def; -typedef struct{ +typedef struct +{ uint8_t err; uint8_t suberr_num; uint8_t suberr[30]; -}marerr_def; +} marerr_def; - - -typedef struct{ +typedef struct +{ uint8_t slave_data[2048]; uint32_t plan_id; uint32_t timeout_m; @@ -527,125 +523,128 @@ typedef struct{ uint32_t marerr_num; marerr_def marerr[21]; scheme_task_def task[0]; -}scheme_def; +} 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."<& get_slave_soft_versions(); - // 获取适配的从机硬件版本号 - QList& 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 &get_slave_soft_versions(); + // 获取适配的从机硬件版本号 + QList &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++) { - return json_doc.toJson(); + ret += tasks[i].get_return_num(); } - // 返回主错误列表 - QList get_ch_merrcode(); - // 错误代码在范围内时返回true并把对应主错误代码添加进l - bool in_err_range(QList &l,uint8_t code); + return ret; + } + // 返回返回值参数 + QStringList get_return_info() + { + return check_ret_items; + } + // 返回参数错误位 data为原始检测数据(去除16字节执行结果) + myarray returns_to_paramerr(myarray data); + // 返回任务执行结果的json data为原始检测数据(包含16字节执行结果) + QJsonObject returns_to_json(myarray data); + // 返回执行结果的json字符串 + QString returns_to_jstring(myarray data) + { + QJsonDocument doc; + doc.setObject(returns_to_json(data)); + return doc.toJson(); + } + QString scheme_to_jstring() + { + return json_doc.toJson(); + } + // 返回主错误列表 + QList get_ch_merrcode(); + // 错误代码在范围内时返回true并把对应主错误代码添加进l + bool in_err_range(QList &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(); - } + // 提取指定任务的执行结果 + bool get_return_ack_by_index(myarray 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; + mycfg *cfg_; + QJsonDocument json_doc; + myarray check_cfg_data; - int plan_id; - QString brief; - QList slave_soft_versions; - QList slave_hard_versions; - int time_out_s;// 小板超时时间 - int time_out_m;// 主板超时时间 - uint8_t task_id_max; - QList errs; - QList suberrs; - QList tasks; + int plan_id; + QString brief; + QList slave_soft_versions; + QList slave_hard_versions; + int time_out_s; // 小板超时时间 + int time_out_m; // 主板超时时间 + uint8_t task_id_max; + QList errs; + QList suberrs; + QList tasks; - // 检测时产生的错误代码 - QList ch_errcode; + // 检测时产生的错误代码 + QList ch_errcode; - // 返回值项目 - QStringList check_ret_items; + // 返回值项目 + QStringList check_ret_items; - // 把方案解析为结构体的形式 - scheme_def *scheme_; - int scheme_struct_size; + // 把方案解析为结构体的形式 + scheme_def *scheme_; + int scheme_struct_size; }; - check_cfg *check_plan(); - - - #endif // CHECK_CFG_H diff --git a/base/crc.cpp b/base/crc.cpp index f9daceb..efd921c 100644 --- a/base/crc.cpp +++ b/base/crc.cpp @@ -2,191 +2,179 @@ #include #include "QString" - crc::crc() { - } -uint8_t crc::crc8(uint8_t *Ptr,uint8_t num) +uint8_t crc::crc8(uint8_t *Ptr, uint8_t num) { - uint8_t crc = 0; - uint16_t j,i; + uint8_t crc = 0; + uint16_t j, i; - for (j = 0; j < num; j++) + for (j = 0; j < num; j++) + { + crc ^= *(Ptr + j); + for (i = 0; i < 8; i++) { - crc ^= *(Ptr+j); - for ( i = 0; i < 8; i++) - { - if ((crc & 0x01) != 0) - { - crc >>= 1; - crc ^= 0x8c; - } - else - { - crc >>= 1; - } - } + if ((crc & 0x01) != 0) + { + crc >>= 1; + crc ^= 0x8c; + } + else + { + crc >>= 1; + } } - return crc; - + } + return crc; } - - - - void crc::crc16(uint8_t *data, int offset, int len,uint8_t *lb,uint8_t *hb) +void crc::crc16(uint8_t *data, int offset, int len, uint8_t *lb, uint8_t *hb) { - if (len > 0) + if (len > 0) + { + uint16_t crc = 0xFFFF; + int i = offset; + for (; i < len; i++) { - uint16_t crc = 0xFFFF; - int i = offset; - for (; i < len; i++) - { - crc = (uint16_t)(crc ^ (data[i])); - for (int j = 0; j < 8; j++) - { - crc = (crc & 1) != 0 ? (uint16_t)((crc >> 1) ^ 0xA001) : (uint16_t)(crc >> 1); - } - } - uint8_t hi = (uint8_t)((crc & 0xFF00) >> 8); //高位置 - uint8_t lo = (uint8_t)(crc & 0x00FF); //低位置 - *lb=lo;*hb=hi; + crc = (uint16_t)(crc ^ (data[i])); + for (int j = 0; j < 8; j++) + { + crc = (crc & 1) != 0 ? (uint16_t)((crc >> 1) ^ 0xA001) : (uint16_t)(crc >> 1); + } } + uint8_t hi = (uint8_t)((crc & 0xFF00) >> 8); // 高位置 + uint8_t lo = (uint8_t)(crc & 0x00FF); // 低位置 + *lb = lo; + *hb = hi; + } } - int8_t crc::CheckSumCode(uint8_t CODEMODE, uint8_t *pBuffer, uint16_t Len, uint16_t offset, uint8_t *CHKA, uint8_t *CHKB) { - uint16_t i = 0; - uint8_t _CHKA = 0x00,_CHKB = 0x00; + uint16_t i = 0; + uint8_t _CHKA = 0x00, _CHKB = 0x00; + for (i = offset; i < Len; i++) + { + _CHKA += pBuffer[i]; + _CHKB += _CHKA; + } + if (CODEMODE == DECODE) + { + if (_CHKA != *CHKA) + return -1; + if (_CHKB != *CHKB) + return -2; + } + else + { + *CHKA = _CHKA; - for(i=offset;i #include "QByteArray" #include "stdint-gcc.h" #include "QList" #include "base.h" #include -#include +#include #include "base/crc.h" #include "QDateTime" #include "base/mycfg.h" - /* Type for a 16-bit quantity. */ typedef uint16_t Elf32_Half; typedef uint32_t Elf32_Word; @@ -31,210 +27,215 @@ typedef uint32_t Elf32_Off; typedef struct { - unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ - Elf32_Half e_type; /* Object file type */ - Elf32_Half e_machine; /* Architecture */ - Elf32_Word e_version; /* Object file version */ - Elf32_Addr e_entry; /* Entry point virtual address */ - Elf32_Off e_phoff; /* Program header table file offset */ - Elf32_Off e_shoff; /* Section header table file offset */ - Elf32_Word e_flags; /* Processor-specific flags */ - Elf32_Half e_ehsize; /* ELF header size in bytes */ - Elf32_Half e_phentsize; /* Program header table entry size */ - Elf32_Half e_phnum; /* Program header table entry count */ - Elf32_Half e_shentsize; /* Section header table entry size */ - Elf32_Half e_shnum; /* Section header table entry count */ - Elf32_Half e_shstrndx; /* Section header string table index */ + unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ + Elf32_Half e_type; /* Object file type */ + Elf32_Half e_machine; /* Architecture */ + Elf32_Word e_version; /* Object file version */ + Elf32_Addr e_entry; /* Entry point virtual address */ + Elf32_Off e_phoff; /* Program header table file offset */ + Elf32_Off e_shoff; /* Section header table file offset */ + Elf32_Word e_flags; /* Processor-specific flags */ + Elf32_Half e_ehsize; /* ELF header size in bytes */ + Elf32_Half e_phentsize; /* Program header table entry size */ + Elf32_Half e_phnum; /* Program header table entry count */ + Elf32_Half e_shentsize; /* Section header table entry size */ + Elf32_Half e_shnum; /* Section header table entry count */ + Elf32_Half e_shstrndx; /* Section header string table index */ } Elf32_Ehdr; - - - -class app_file:public QObject +class app_file : public QObject { - Q_OBJECT + Q_OBJECT public: - app_file(QString name){ - QFile file; - file.setFileName(name); - if(file.exists()) - { - file.open(QIODevice::ReadOnly); - data = file.readAll(); - file.close(); - } - } - ~app_file(){} - void set_file_point() + app_file(QString name) + { + QFile file; + file.setFileName(name); + if (file.exists()) { - Elf32_Ehdr h; - memcpy((void *)&h,data.data(),sizeof(h)); - addr= h.e_shoff+h.e_shnum*h.e_shentsize; - //qDebug()<<"ext file addr="<cfg_=cfg_; - - bool new_file=true; - file_ = new QFile(COMM_FILE_PATH+find_file()); - qInfo()<<"save comm_log at "<fileName()<exists()) - { - new_file=false; - } - - if (!file_->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)){ - return; - } - if(new_file==true){ - QTextStream tWrite(file_); -// QStringList ret_infos=cfg_->get_return_info(); - QStringList ret_infos; - qDebug()<<"ret_info:"<flush(); - file_->close(); - delete file_; - file_=nullptr; - } - } - QString find_file(){ - // 找到检测日志文件,超过7天则删除 - QDir dir=QDir(COMM_FILE_PATH); - QStringList list; - list.append("*.csv"); - QStringList files=dir.entryList(list,QDir::NoFilter,QDir::NoSort); - qDebug()<<"files="<0){ - // 删除超时的记录 - foreach (QString name, files) { - if(dateout(name)==true){ - QFile fi; - fi.setFileName(COMM_FILE_PATH+name); - qDebug()<<"will remove "<get_plan_id())+".csv"; - return t.toString("yyyy_MM_dd")+"-"+QString::number(0)+".csv"; - } - // 是否超时,true超时 - bool dateout(QString file){ - QStringList name=file.split("."); - qDebug()<<"name="<30)||(!t.isValid())){ - return true; - } - return false; - } - void save(uint8_t src,QByteArray data) + comm_file(mycfg *cfg_) + { + QDir tempDir; + if (!tempDir.exists(COMM_FILE_PATH)) { - if(file_){ - QTextStream tWrite(file_); - QString str=QString("%1,").arg(src); - str.append(QString("%1,").arg(crc::byte_array_to_string(data.mid(0,8)))); - str.append(QString("%1\n").arg(crc::byte_array_to_int_string(data.mid(16,data.size()-16)))); - QDateTime t=QDateTime::currentDateTime(); - tWrite<cfg_ = cfg_; + + bool new_file = true; + file_ = new QFile(COMM_FILE_PATH + find_file()); + qInfo() << "save comm_log at " << file_->fileName() << endl; + if (file_->exists()) + { + new_file = false; + } + + if (!file_->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) + { + return; + } + if (new_file == true) + { + QTextStream tWrite(file_); + // QStringList ret_infos=cfg_->get_return_info(); + QStringList ret_infos; + qDebug() << "ret_info:" << ret_infos << "size=" << ret_infos.size() << endl; + tWrite << QString("时间,序号,流程结果,"); + for (int i = 0; i < ret_infos.size(); i++) + { + tWrite << ret_infos[i]; + tWrite << ","; + } + tWrite << "\n"; + } + } + ~comm_file() + { + if (file_ != nullptr) + { + file_->flush(); + file_->close(); + delete file_; + file_ = nullptr; + } + } + QString find_file() + { + // 找到检测日志文件,超过7天则删除 + QDir dir = QDir(COMM_FILE_PATH); + QStringList list; + list.append("*.csv"); + QStringList files = dir.entryList(list, QDir::NoFilter, QDir::NoSort); + qDebug() << "files=" << files << endl; + if (files.size() > 0) + { + // 删除超时的记录 + foreach (QString name, files) + { + if (dateout(name) == true) + { + QFile fi; + fi.setFileName(COMM_FILE_PATH + name); + qDebug() << "will remove " << fi.fileName() << endl; + if (fi.remove() != true) + { + qWarning() << "remove file " << fi.fileName() << "err" << endl; + } + } + } + } + QDate t = QDate::currentDate(); + // return t.toString("yyyy_MM_dd")+"-"+QString::number(cfg_->get_plan_id())+".csv"; + return t.toString("yyyy_MM_dd") + "-" + QString::number(0) + ".csv"; + } + // 是否超时,true超时 + bool dateout(QString file) + { + QStringList name = file.split("."); + qDebug() << "name=" << name << endl; + QDate t = QDate::fromString(name[0].split("-")[0], "yyyy_MM_dd"); + QDate t2 = QDate::currentDate(); + qDebug() << "t=" << t.toString("yyyy_MM_dd") << " t2=" << t2.toString("yyyy_MM_dd") << endl; + if ((t.daysTo(t2) > 30) || (!t.isValid())) + { + return true; + } + return false; + } + void save(uint8_t src, QByteArray data) + { + if (file_) + { + QTextStream tWrite(file_); + QString str = QString("%1,").arg(src); + str.append(QString("%1,").arg(crc::byte_array_to_string(data.mid(0, 8)))); + str.append(QString("%1\n").arg(crc::byte_array_to_int_string(data.mid(16, data.size() - 16)))); + QDateTime t = QDateTime::currentDateTime(); + tWrite << t.toString("yyyy.MM.dd hh:mm:ss.zzz ddd"); + tWrite << ","; + tWrite << str; + } + } + private: - QFile *file_; - mycfg *cfg_; + QFile *file_; + mycfg *cfg_; }; - - - - - #endif - - - - diff --git a/base/mycfg.cpp b/base/mycfg.cpp index 8666a79..b818bc0 100644 --- a/base/mycfg.cpp +++ b/base/mycfg.cpp @@ -10,385 +10,368 @@ #include #include - - // 配置路径 #define CFG_PATH QString("/home/root/config/") -//#define CFG_PATH qApp->applicationDirPath()+"/config/" +// #define CFG_PATH qApp->applicationDirPath()+"/config/" // 配置文件 -#define CFG_FILE_NAME CFG_PATH+"cfg.json" +#define CFG_FILE_NAME CFG_PATH + "cfg.json" // 自启动路径 #define AUTO_START_PATH "/usr/local/QDesktop-fb" // 方案配置文件关键字段,用于生成默认方案文件名 -#define CHECK_CFG_FILE_KEY "checker_ye_cfg" +#define CHECK_CFG_FILE_KEY "checker_ye_cfg" // mcu程序关键字段,用于生成默认程序文件名 -#define MCU_APP_FILE_KEY "JQChecker" +#define MCU_APP_FILE_KEY "JQChecker" // shell脚本关键字段,用于运行shell脚本 -#define SHELL_FILE_KEY "checker_app_pre" +#define SHELL_FILE_KEY "checker_app_pre" // 程序信息 -#define APP_INFO_FILE "info.json" +#define APP_INFO_FILE "info.json" // 判断脚本 -#define APP_JUDGE_FILE "judge.lua" +#define APP_JUDGE_FILE "judge.lua" // 软件版本 #define SOFT_VERSION "unknown" #define HARD_VERSION "unknown" - - - - - - - -QList jarray_to_intlist(QJsonValue j){ - QJsonArray arr; - if(j.isArray()){ - arr= j.toArray(); - } - QList intl; - for(int i=0;i jarray_to_intlist(QJsonValue j) +{ + QJsonArray arr; + if (j.isArray()) + { + arr = j.toArray(); + } + QList intl; + for (int i = 0; i < arr.size(); i++) + { + QJsonValue item = arr.at(i); + intl.append(item.toInt(0)); + } + return intl; } -QList jarray_to_strlist(QJsonValue j){ - QJsonArray arr; - if(j.isArray()){ - arr= j.toArray(); - } - QList strl; - for(int i=0;i jarray_to_strlist(QJsonValue j) +{ + QJsonArray arr; + if (j.isArray()) + { + arr = j.toArray(); + } + QList strl; + for (int i = 0; i < arr.size(); i++) + { + QJsonValue item = arr.at(i); + strl.append(item.toString()); + } + return strl; } - QJsonArray intlist_to_jarray(QList intl) { - QJsonArray a; - for(int i=0;i privates; + app_info(QJsonObject json) + { + build_date = json.value("build_date").toString("default"); + hard_version = json.value("hard_version").toString("default"); + soft_version = json.value("soft_version").toString("default"); + privates = jarray_to_strlist(json.value("private")); + } + mystring build_date; + mystring hard_version; + mystring soft_version; + QList privates; }; - - - - - mycfg::mycfg() { } void mycfg::to_class(mystring str) { - QJsonParseError err; - QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(),&err); - QJsonObject j; - if(err.error != QJsonParseError::NoError) - { - qWarning()<<"parse json failed:"<applicationFilePath()); + QByteArray d; + d = app.get_file(APP_INFO_FILE); + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(d, &err); + if (err.error != QJsonParseError::NoError) + { + qWarning() << "parse json failed:" << err.errorString(); + return; + } + QJsonObject j = doc.object(); + app_info info(j); + soft_version = info.soft_version; + hard_version = info.hard_version; - // 把附加文件释放到工作文件夹 - app_file app(qApp->applicationFilePath()); - QByteArray d; - d=app.get_file(APP_INFO_FILE); - QJsonParseError err; - QJsonDocument doc = QJsonDocument::fromJson(d,&err); - if(err.error != QJsonParseError::NoError) + QList list_files = app.get_file_list(); + for (int i = 0; i < list_files.size(); i++) + { + QFile file; + mystring name = list_files[i]; + d = app.get_file(name); + file.setFileName(CFG_PATH + name); + if ((!file.exists()) || (file.size() == 0)) { - qWarning()<<"parse json failed:"< list_files=app.get_file_list(); - for(int i=0;iapplicationFilePath()); - if(file_dst.exists()) + // 复制程序文件 + QFile file_dst; + file_dst.setFileName(AUTO_START_PATH); + QFile file_src; + file_src.setFileName(qApp->applicationFilePath()); + if (file_dst.exists()) + { + if (file_dst.open(QIODevice::ReadOnly) && file_src.open(QIODevice::ReadOnly)) { - if(file_dst.open(QIODevice::ReadOnly)&&file_src.open(QIODevice::ReadOnly)) - { - QByteArray c1=file_src.readAll(); - QByteArray c2=file_dst.readAll(); - QByteArray md5_1=QCryptographicHash::hash(c1, QCryptographicHash::Md5); - QByteArray md5_2=QCryptographicHash::hash(c2, QCryptographicHash::Md5); - if(md5_1!=md5_2) - { - if(file_dst.remove()!=true) - qWarning()<<"remove file "< data) { - production_info.clear(); - for(int i=0;i mycfg::calc_slave_addrs() +{ + QList r; + for(int i=0;i data); - - bool tcp_enable;//tcp使能 - mystring server_ip; - int server_port; - mystring local_ip; - int local_port; - mystring gateway_ip; - mystring netmask; - int local_id;// 用于区分不同批检仪的id号 - int can_bitrate;//can bps - int slave_num;// 从机个数 - int mcu_timeout;// 从机通信超时时间 - mystring debug_ip;// debug信息输出地址 - int debug_port;// debug输出端口 - mystring build_date; - mystring soft_version; - mystring hard_version; - int cmd_port;// 命令端口 - mystring log_redirect;// 日志重定向 - mystring def_check_cfg;// 默认方案文件 - mystring def_mcu_app;// 默认mcu程序 - mystring def_shell; // 默认shell脚本 - QList lua_libs;// lua库 - mystring def_lua_judge;// lua判断异常脚本 - bool use_lua_judge;// 是否使用lua脚本 - mystring config_path;// 配置文件夹 - mystring device_type;// 设备类型 - int moter_count;// 电机步数 - int uart_bsp;// 串口波特率 - int auto_test;// 自动测试 - int coder_return_mode;// 赋码仪返回模式0精简,1完整 - int slave_addr_start;// 赋码仪起始地址0,1 - QList production_info;// 生产信息 - mystring def_jwt_app;// 默认jwt程序 - int slave_scheme_ext;// 小板使用方案扩展 + void to_class(mystring str); + 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 data); + QList calc_slave_addrs(); + bool tcp_enable; // tcp使能 + mystring server_ip; + int server_port; + mystring local_ip; + int local_port; + mystring gateway_ip; + mystring netmask; + int local_id; // 用于区分不同批检仪的id号 + int can_bitrate; // can bps + int slave_num; // 从机个数 + int mcu_timeout; // 从机通信超时时间 + mystring debug_ip; // debug信息输出地址 + int debug_port; // debug输出端口 + mystring build_date; + mystring soft_version; + mystring hard_version; + int cmd_port; // 命令端口 + mystring log_redirect; // 日志重定向 + mystring def_check_cfg; // 默认方案文件 + mystring def_mcu_app; // 默认mcu程序 + mystring def_shell; // 默认shell脚本 + QList lua_libs; // lua库 + mystring def_lua_judge; // lua判断异常脚本 + bool use_lua_judge; // 是否使用lua脚本 + mystring config_path; // 配置文件夹 + mystring device_type; // 设备类型 + int moter_count; // 电机步数 + int uart_bsp; // 串口波特率 + int auto_test; // 自动测试 + int coder_return_mode; // 赋码仪返回模式0精简,1完整 + int slave_addr_start; // 赋码仪起始地址0,1 + QList production_info; // 生产信息 + mystring def_jwt_app; // 默认jwt程序 + int slave_scheme_ext; // 小板使用方案扩展 }; - - mycfg *syscfg(); - #endif // MYCFG_H diff --git a/checker_host.pro b/checker_host.pro index ee8c3f2..f9e0b9c 100644 --- a/checker_host.pro +++ b/checker_host.pro @@ -4,6 +4,10 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 + +QMAKE_CXXFLAGS +=-Wno-unused-but-set-variable -Wno-unused-function -Wno-unused-variable -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable + + # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the @@ -20,6 +24,8 @@ SOURCES += \ base/check_cfg.cpp \ base/crc.cpp \ base/mycfg.cpp \ + elec/elec_judge.cpp \ + elec/mystring.cpp \ interface/codec.cpp \ interface/codec_m4.cpp \ interface/codec_slave.cpp \ @@ -40,6 +46,8 @@ HEADERS += \ base/crc.h \ base/file.h \ base/mycfg.h \ + elec/elec_judge.h \ + elec/mystring.h \ interface/codec.h \ interface/codec_m4.h \ interface/codec_slave.h \ diff --git a/complier_info.h b/complier_info.h new file mode 100644 index 0000000..fb9ebe2 --- /dev/null +++ b/complier_info.h @@ -0,0 +1,17 @@ +#ifndef compiler_info__ +#define compiler_info__ + + + + + + +#define BUILD_DATE "2023-11-27 14:29:56" + + + + + + + +#endif diff --git a/elec/elec_judge.cpp b/elec/elec_judge.cpp new file mode 100644 index 0000000..d06bac8 --- /dev/null +++ b/elec/elec_judge.cpp @@ -0,0 +1,453 @@ + + +#include "base/check_cfg.h" +#include "string.h" +//#include "debug.h" +//#include "mystring.h" +#include "elec_judge.h" +#include "stdlib.h" + + +// 通用异常判定逻辑 + + +//-- 检测器异常,1 +//-- 主电容异常,2 +//-- 接触异常,3 +//-- 桥丝阻值异常,4 +//-- 芯片异常,5 +//-- 判定任务缺失,6 +//-- 过流,7 +//-- 短路,8 + + + +#define CHECKER_MAXID_COUNT 100 +#define CHECKER_EXTID_COUNT 10 + + + +// 任务序号校验 +#define INDEX_CHECK(index)\ + if(index<0||index>=e->scheme->task_num) {\ + elec_add_errcode(e,6);\ + return ;} +// 任务判定标志校验 +#define TASK_FLAG_CHECK(index){\ + if(e->judge_flag[index/8]&(1<<(index%8))){\ + return;}\ + else{\ + e->judge_flag[index/8]|=(1<<(index%8));}}\ +// 任务执行结果校验 +#define EXE_ACK_CHECK(index)\ + (e->exe_ack[index/8]&(1<<(index%8)))?1:0 +// 取任务结果的第index位 +#define GET_RET_DATA(i)\ + (data[i*2]|(data[i*2+1]<<8)) +// 获取第i位是否置位 +#define BIT_CHECK(d,i)\ + ((d)[i/8]&(1<<(i%8)))?1:0 + + +// 添加错误代码 +static void elec_add_errcode(elec_judge_def *e,int err) +{ + int index=-1; + for(int i=0;ierr_list[i]==0){ + if(index<0) index=i; + } + if(e->err_list[i]==err){ + return; + } + } + if(index>=0){ + e->err_list[index]=err; + } +} + + +// 根据子错误找到主错误 +int elec_err_classify(const scheme_def *s,int err) +{ + const marerr_def *marerr; + if(err<=20){ + return err; + } + for(int i=0;imarerr_num;i++){ + marerr=&s->marerr[i]; + for(int j=0;jsuberr_num;j++){ + if(marerr->suberr[j]==err) + return marerr->err; + } + } + return err; +} + +// 如果有指定主类错误则返回1 +int elec_find_marerr(elec_judge_def *e,uint8_t err){ + for(int i=0;ischeme,e->err_list[i])){ + qDebug("index=%d,err=%d",i,e->err_list[i]); + return 1; + } + } + return 0; +} + + +// 计算方案有多少个返回值 +//static int elec_get_ret_num(void) +//{ +// const scheme_def *s=check_scheme(); +// const scheme_task_def *t; +// int index=0; +// for(int i=0;itask_num;i++) +// { +// t=&s->task[i]; +// index+=t->item_num; +// } +// return index; +//} + + + + +// 通用任务判定函数 +static void elec_task_judge(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp; + qDebug("task index=%d.",index); + if(EXE_ACK_CHECK(index)){ + elec_add_errcode(e,task->err); + qDebug("task execute err:%d.",task->err); + } + for(int i=0;iitem_num;i++){ + temp=data[i*2]|(data[i*2+1]<<8); + if(temprange[i].min||temp>task->range[i].max){ + elec_add_errcode(e,task->range[i].err); + qDebug("task ret_index:%d vaule=%d,err:%d",i,temp,task->range[i].err); + } + } +} + + +// 检测电流 +static void elec_current(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp,temp2; + uint16_t short_c=e->short_circuited; + uint16_t open_c=e->open_circuited; + qDebug("task index=%d.",index); + if(EXE_ACK_CHECK(index)){ + elec_add_errcode(e,task->err); + qDebug("task execute err:%d.",task->err); + } + temp=GET_RET_DATA(0); + temp2=GET_RET_DATA(1); + qDebug("task curr1:%d,curr2:%d",temp,temp2); + if((temptask->range[0].max)&&(temptask->range[1].max)&&(temp2short_c)&&(temp2>short_c)) + { + // 短路 + elec_add_errcode(e,8); + }else{ + if((temprange[0].min||temp>task->range[0].max)|| + (temp2range[1].min||temp2>task->range[1].max)) + { + // 芯片异常 + elec_add_errcode(e,5); + } + } +} + +// jq检测dac +// 如果之前已存在电容异常则返回电容异常,否则返回桥丝异常 +static void elec_jq_dac_check(elec_judge_def *e,int index,uint8_t *data) +{ + INDEX_CHECK(index); + TASK_FLAG_CHECK(index); + const scheme_task_def *task=&e->scheme->task[index]; + uint16_t temp; + uint8_t err_table[]={4,task->err}; + uint8_t err=err_table[elec_find_marerr(e,2)]; + qDebug("err=%d",err); + if(EXE_ACK_CHECK(index)){ + elec_add_errcode(e,err); + } + err=(err==4)?4:task->range[0].err; + temp=GET_RET_DATA(0); + if(temprange[0].min||temp>task->range[0].max){ + elec_add_errcode(e,err); + } + +} + + + + + + +const static elec_judge_fun g_jq_judge_table[]={ +elec_task_judge, //0 电源准备 +elec_task_judge, //1 上电充能 +elec_task_judge, //2 设置总线电压 +elec_current, //3 获取总线电流 +elec_task_judge, //4 扫描UID +elec_task_judge, //5 密码验证 +elec_task_judge, //6 读取芯片代码 +elec_task_judge, //7 OTP检测 +elec_task_judge, //8 工厂测试检测 +elec_task_judge, //9 读取状态 +elec_task_judge, //10 写工厂信息 +elec_task_judge, //11 充能统计 +elec_task_judge, //12 充电电压检测 +elec_task_judge, //13 延时等待 +elec_task_judge, //14 设置延时 +elec_task_judge, //15 读取延时 +elec_task_judge, //16 时钟校准 +elec_task_judge, //17 放电 +elec_task_judge, //18 复位 +elec_task_judge, //19 起爆使能 +elec_task_judge, //20 起爆充能 +elec_task_judge, //21 使能通讯末电流采集 +elec_task_judge, //22 获取通讯末电流 +elec_task_judge, //23 写OTP +elec_task_judge, //24 读OTP +elec_task_judge, //25 清除起爆计数 +elec_task_judge, //26 关总线 +elec_task_judge, //27 将缓存区数据写入OTP +elec_task_judge, //28 三码写入错误 +elec_task_judge, //29 三码验证错误 +elec_task_judge, //30 测量电容压差 +elec_task_judge, //31 测量桥丝阻值 +elec_task_judge, //32 使能OTP写 +elec_task_judge, //33 写模块版本 +elec_task_judge, //34 读取版本号 +elec_task_judge, //35 写缓存数据 +elec_task_judge, //36 验证缓存数据 +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +0, +}; + + +const static elec_judge_fun g_xt_judge_table[]={ +elec_task_judge, //0 电源准备 +elec_task_judge, //1 上电充能 +elec_task_judge, //2 设置总线电压 +elec_current, //3 获取总线电流 +elec_task_judge, //4 扫描UID +elec_task_judge, //5 写配置参数 +elec_task_judge, //6 验证配置 +elec_task_judge, //7 模拟注码 +elec_task_judge, //8 充能统计 +elec_task_judge, //9 写现场值 网络id 延时 +elec_task_judge, //10比对现场值 +elec_task_judge, //11 桥丝通断检测 +elec_task_judge, //12 电容容量统计 +elec_task_judge, //13 延时等待 +elec_task_judge, //14 写管壳号/工厂信息 +elec_task_judge, //15 写UID +elec_task_judge, //16 写密码 +elec_task_judge, //17 写入/检测备份区标志 +elec_task_judge, //18 读取备份区数据 +elec_task_judge, //19 校准 +elec_task_judge, //20 使能通讯末电流采集 +elec_task_judge, //21 获取通讯末电流 +elec_task_judge, //22 放电 +elec_task_judge, //23 在线检测 +elec_task_judge, //24 状态检测 +elec_task_judge, //25 起爆 +elec_task_judge, //26 复位 +elec_task_judge, //27 关总线 +elec_task_judge, //28 芯片锁存 +elec_task_judge, //29 使能赋码设备 +elec_task_judge, //30 在线检测 +elec_task_judge, //31 密码验证 +elec_task_judge, //32 加载芯片配置 +elec_task_judge, //33 电容压差测试 +elec_task_judge, //34 桥丝电阻测试 +elec_task_judge, //35 检测过程中注码 +elec_task_judge, //36 验证注码 +elec_task_judge, //37 模块在线检测 +elec_task_judge, //38 验证管壳码 +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +elec_task_judge, +0, +}; + + + +const static elec_judge_fun g_ew_judge_table[]={ +elec_task_judge, //0 电源准备 +elec_task_judge, //1 上电充能 +elec_task_judge, //2 设置总线电压 +elec_task_judge, //3 扫描UID +elec_task_judge, //4 写配置参数 +elec_current, //5 获取总线电流 +elec_task_judge, //6 验证配置 +elec_task_judge, //7 模拟注码 +elec_task_judge, //8 充能统计 +elec_task_judge, //9 写现场值 网络id 延时 +elec_task_judge, //10比对现场值 +elec_task_judge, //11 桥丝通断检测 +elec_task_judge, //12 电容容量统计 +elec_task_judge, //13 延时等待 +elec_task_judge, //14 写管壳号/工厂信息 +elec_task_judge, //15 写UID +elec_task_judge, //16 写密码 +elec_task_judge, //17 写入/检测备份区标志 +elec_task_judge, //18 读取备份区数据 +elec_task_judge, //19 校准 +elec_task_judge, //20 使能通讯末电流采集 +elec_task_judge, //21 获取通讯末电流 +elec_task_judge, //22 放电 +elec_task_judge, //23 在线检测 +elec_task_judge, //24 状态检测 +elec_task_judge, //25 起爆 +elec_task_judge, //26 复位 +elec_task_judge, //27 关总线 +elec_task_judge, //28 芯片锁存 +elec_task_judge, //29 使能赋码设备 +elec_task_judge, //30 在线检测 +elec_task_judge, //31 密码验证 +elec_task_judge, //32 加载芯片配置 +elec_task_judge, //33 电容压差测试 +elec_task_judge, //34 桥丝电阻测试 +elec_task_judge, //35 检测过程中注码 +elec_task_judge, //36 验证注码 +elec_task_judge, //37 模块在线检测 +elec_task_judge, //38 升级 +0, +}; + + +static const elec_judge_fun *g_judge_fun_table[]={g_jq_judge_table,g_xt_judge_table,g_ew_judge_table}; + +static int elec_calc_judge_fun_num(const elec_judge_fun *table) +{ + int i=0; + while(table[i]){ + i++; + } + return i; +} + + +// 根据方案获取模块芯片类型 +int elec_extract_chip(int id) +{ +// const scheme_def *s=check_scheme(); +// if(id==0) id=s->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; + return chip; +} + + + + +// 找到异常代码序号 +int elec_report_err(elec_judge_def *e) +{ + static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,20,0}; + uint8_t index=0; + for (int i=0;imarerr_list[j]==pro_table[i]) + return j; + if((index==0)&&(e->marerr_list[j]!=0)){ + index=j; + } + } + } + return index; +} + + + +// 异常判断 +// task_num,要判断的任务数 +void elec_judge(const scheme_def *s,int task_num,uint8_t *exe_ack, + uint8_t *exe_flag,uint8_t *data,uint8_t *marerr,uint8_t *suberr) +{ + elec_judge_def *e=(elec_judge_def *)calloc(1,sizeof(elec_judge_def)); + const scheme_task_def *task; + e->scheme=s; + e->judge_fun_table=g_judge_fun_table[elec_extract_chip(e->scheme->plan_id)]; + e->judge_fun_num=elec_calc_judge_fun_num(e->judge_fun_table); + e->short_circuited=1500; + e->open_circuited=80; + e->exe_ack=exe_ack; + if(task_num>e->scheme->task_num) + task_num=e->scheme->task_num; + for(int i=0;ischeme->task[i]; + if(BIT_CHECK(exe_flag,i)){ + if(task->taskidjudge_fun_num){ + e->judge_fun_table[task->taskid](e,i,data); + }else if((task->taskid>=CHECKER_MAXID_COUNT)&& + (task->taskid<(CHECKER_MAXID_COUNT+CHECKER_EXTID_COUNT))) + { + // 忽略扩展任务 + }else{ + elec_add_errcode(e,6); + } + } + data+=task->item_num*2; + } + qDebug("err_table:%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4], + e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9] + ); + for(int i=0;imarerr_list[i]=elec_err_classify(e->scheme,e->err_list[i]); + } + qDebug("err_table2:%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + e->marerr_list[0],e->marerr_list[1],e->marerr_list[2],e->marerr_list[3],e->marerr_list[4], + e->marerr_list[5],e->marerr_list[6],e->marerr_list[7],e->marerr_list[8],e->marerr_list[9] + ); + + int index=elec_report_err(e); + qDebug("marerr report=%d",e->marerr_list[index]); + qDebug("suberr report=%d",e->err_list[index]); + if(marerr) *marerr=e->marerr_list[index]; + if(suberr) *suberr=e->err_list[index]; + free(e); +} + + + diff --git a/elec/elec_judge.h b/elec/elec_judge.h new file mode 100644 index 0000000..7af68d0 --- /dev/null +++ b/elec/elec_judge.h @@ -0,0 +1,44 @@ + +#ifndef elec_judge_h__ +#define elec_judge_h__ + +#include "base/mycfg.h" +#include "base/check_cfg.h" +#include "stdint-gcc.h" + +// 定义错误列表长度 +#define ERR_LIST_LEN 10 + + + +struct _elec_judge_def; +typedef void (*elec_judge_fun)(struct _elec_judge_def *e,int index,uint8_t *data); + +typedef struct _elec_judge_def{ + const scheme_def *scheme; + uint8_t judge_fun_num; + uint8_t judge_flag[8]; + uint8_t *exe_ack; + uint8_t err_list[ERR_LIST_LEN]; + uint8_t marerr_list[ERR_LIST_LEN]; + uint16_t short_circuited; + uint16_t open_circuited; + const elec_judge_fun *judge_fun_table; +}elec_judge_def; + + + + +void elec_judge(const scheme_def *s,int task_num,uint8_t *exe_ack, + uint8_t *exe_flag,uint8_t *data,uint8_t *marerr,uint8_t *suberr); + + + + +#endif + + + + + + diff --git a/elec/mystring.cpp b/elec/mystring.cpp new file mode 100644 index 0000000..cdfa621 --- /dev/null +++ b/elec/mystring.cpp @@ -0,0 +1,128 @@ + +/* +* +* 把整数字符串传化为int,直到遇到非数字字符 +* +*/ +static int str_ainttoi(const char *s) +{ + int ret=0; + int sig=1; + if(*s=='-'){ + s++; + sig=-1; + } + while(*s) + { + if(*s>='0'&&*s<='9') + { + ret*=10; + ret+=*s-'0'; + } + else return ret; + s++; + } + return ret*sig; +} + + + + +int str_ahextoi(const char *s) +{ + int ret=0; + while(*s) + { + if(*s>='0'&&*s<='9') + { + ret*=16; + ret+=*s-'0'; + } + else if(*s>='a'&&*s<='f') + { + ret*=16; + ret+=*s-'a'+10; + } + else if(*s>='A'&&*s<='F') + { + ret*=16; + ret+=*s-'A'+10; + } + else return ret; + s++; + } + return ret; +} + + + + + +int str_atoi(const char *s) +{ + if(s[0]=='0'&&((s[1]=='x')||(s[1]=='X'))){ + return str_ahextoi(&s[2]); + }else{ + return str_ainttoi(s); + } +} + + + +/* +* +* 从左向右找到字符串s中首次出现字符c的指针,没找到返回0 +* 例如 char *s=str_find_char_right("abcdef",'c') +* s="cdef" +* +*/ +const char *str_find_char_right(const char *s,char c) +{ + while(*s){ + if(*s==c) return s; + s++; + } + return 0; +} + + + +/* +* +* 判断字符是否是空白字符,是返回1,不是返回0 +* +*/ +static inline int str_is_empty_char(char c) +{ + const char table[]="\t\n\v\f\r "; + if(str_find_char_right(table,c)!=0) + return 1; + else + return 0; +} + + + + + +/* +* +* 判断字符串是否是可打印,是返回1,不是返回0 +* +*/ +int str_is_print_str(const char *str,int len) +{ + if(len==0){ + return 0; + } + for(int i=0;i=' '&&str[i]<='~'))) + return 0; + } + return 1; +} + + + diff --git a/elec/mystring.h b/elec/mystring.h new file mode 100644 index 0000000..c3ec3a9 --- /dev/null +++ b/elec/mystring.h @@ -0,0 +1,30 @@ + +#ifndef mystring_h__ +#define mystring_h__ + + +#include "stdint.h" + + + +int str_ahextoi(const char *s); + +int str_atoi(const char *s); + +int str_is_print_str(const char *str,int len); + + + + + + + + + +#endif + + + + + + diff --git a/info.json b/info.json new file mode 100644 index 0000000..7490d5c --- /dev/null +++ b/info.json @@ -0,0 +1,10 @@ +{ + "build_date": "2023-11-27 14:29:56", + "hard_version": "MHPZ2_V1.00", + "private": [ + "info.json", + "json.lua", + "prints.lua" + ], + "soft_version": "V1.09" +} diff --git a/interface/codec.cpp b/interface/codec.cpp index cf2cbd5..6359e4f 100644 --- a/interface/codec.cpp +++ b/interface/codec.cpp @@ -1,20 +1,14 @@ #include "interface/codec.h" - - - - - - Codec *codecFind(const char *name) { - extern const int __start_codecdef; - extern const int __stop_codecdef; - codec_def *start=(codec_def *)&__start_codecdef; - codec_def *end=(codec_def *)&__stop_codecdef; + extern const int __start_codecdef; + extern const int __stop_codecdef; + codec_def *start = (codec_def *)&__start_codecdef; + codec_def *end = (codec_def *)&__stop_codecdef; codec_def *item = 0; - for (item=start;item0&&num_to_read==data.size()) - { - data.remove(0,2); - qDebug()<<"recv_m4:"< 0 && num_to_read == data.size()) + { + data.remove(0, 2); + qDebug() << "recv_m4:" << QString(data) << endl; + ack = true; + num_to_read = 0; + } + fullFrame = ack; + return fullFrame; } - - bool codec_m4::packCheck(myarray data) { - if(data[0]!=0xff){ - return false; - } - if(data.size()>=2&&(data.size()==(data[1]+2))){ - return true; - } + if (data[0] != 0xff) + { return false; + } + if (data.size() >= 2 && (data.size() == (data[1] + 2))) + { + return true; + } + return false; } myarray codec_m4::encode(int srcAddr, int dstAddr, int cmd, myarray data) { - myarray r; - r.append(0xff); - r.append(char(data.size())); - r.append(data); - return r; + myarray r; + r.append(0xff); + r.append(char(data.size())); + r.append(data); + return r; } myarray codec_m4::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) { - if(packCheck(data)){ - return myarray(data.mid(2)); - } + if (packCheck(data)) + { + return data.mid(2); + } + return myarray(); } - - Codec *codec_get() { - static Codec *codec_=nullptr; - if(codec_==nullptr){ - codec_=new codec_m4(); - } - return codec_; + static Codec *codec_ = nullptr; + if (codec_ == nullptr) + { + codec_ = new codec_m4(); + } + return codec_; } - -codec_export(codec_m4,codec_get); - - - - - +codec_export(codec_m4, codec_get); diff --git a/interface/codec_m4.h b/interface/codec_m4.h index 5bfeb60..5604807 100644 --- a/interface/codec_m4.h +++ b/interface/codec_m4.h @@ -2,17 +2,17 @@ #define CODEC_M4_H #include "interface/codec.h" - -class codec_m4:public Codec +class codec_m4 : public Codec { public: - codec_m4(){num_to_read=0;} - virtual bool packCheck(myarray data); - virtual bool recvByte(int byte); - virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data); - virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data); + codec_m4() { num_to_read = 0; } + virtual bool packCheck(myarray data); + virtual bool recvByte(int byte); + virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data); + virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data); + protected: - int num_to_read; + int num_to_read; }; #endif // CODEC_M4_H diff --git a/interface/codec_slave.cpp b/interface/codec_slave.cpp index 22cba98..fdf5c1e 100644 --- a/interface/codec_slave.cpp +++ b/interface/codec_slave.cpp @@ -1,86 +1,78 @@ #include "codec_slave.h" #include "base/crc.h" - myarray codec_slave::encode(int srcAddr, int dstAddr, int cmd, myarray data) { - Q_UNUSED(srcAddr); - myarray t; - uint16_t len=data.size()+10; - cmd_no++; + Q_UNUSED(srcAddr); + myarray t; + uint16_t len = data.size() + 10; + cmd_no++; - t.append('Y'); - t.append('e'); - t.append(len&0xff); - t.append(len>>8); - t.append(char(0));// 源地址 - t.append(char(dstAddr&0xff));// 目标地址 - t.append(cmd);// 命令码 - t.append(cmd_no&0xff); - t.append(cmd_no>>8); - t.append(data); - t.append(crc::crc8((uint8_t *)t.data(),t.size())); - return t; + t.append('Y'); + t.append('e'); + t.append(len & 0xff); + t.append(len >> 8); + t.append(char(0)); // 源地址 + t.append(char(dstAddr & 0xff)); // 目标地址 + t.append(cmd); // 命令码 + t.append(cmd_no & 0xff); + t.append(cmd_no >> 8); + t.append(data); + t.append(crc::crc8((uint8_t *)t.data(), t.size())); + return t; } - myarray codec_slave::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) { - myarray r; - QString str_err="ok"; - if(data.size()<10) - { - // 一帧数据至少10字节 - qWarning("recv data len too less"); - str_err="recv data len too less."; - return r; - } - uint16_t len=data[2]|(data[3]<<8); - uint8_t crc=crc::crc8((uint8_t *)data.data(),data.size()-1); - if(len!=data.size()) - { - // 如果长度不相等则产生了数据丢失 - qWarning("recv data have lossed"); - str_err="recv data have lossed."; - return r; - } - srcAddr=data[4]; - dstAddr=data[5]; - uint16_t no=data[7]|(data[8]<<8); - uint16_t h_no=cmd_no; - if(no!=h_no) - { - // 发送一条指令应等待其返回,此时流水号应相同 - //qWarning()<<"alave_addr="< 0 && num_to_read == data.size()) - { - ack = true; - num_to_read = 0; - } - - fullFrame = ack; return fullFrame; } - // 重载解码函数 - myarray CodecYm::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) + data.append(uint8_t(byte)); + switch (data.size()) { - Q_UNUSED(srcAddr); - Q_UNUSED(dstAddr); - myarray r; - if(packCheck(data)==true){ - cmd=this->cmd; - if (is_big_data == false) - r = data.mid(7, len - 3); - else - r = data.mid(11, len - 7); - } - return r; - } - bool CodecYm::packCheck(myarray data) - { - bool ack=false; - if (data.size() < 9) + case 2: + if (uint8_t(data[0]) == 0x59u && uint8_t(data[1]) == 0x6du) { - // 主机一帧数据至少9字节 - qWarning("recv data len too less"); - return ack; - } - - if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du)) - { - // 帧头不对 - qWarning("frame head not 0x59 0x6d"); - return ack; - } - - len = (data[2] | (data[3] << 8)); - if (len == 65535) - { - // 重新设置数据长度 - len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24); - is_big_data = true; + is_big_data = false; + num_to_read = 4; // 帧头+2byte负载长度 } else { - is_big_data = false; + data.remove(0, 1); + num_to_read = 0; } - if (len + 6 != data.size()) - { - // 如果长度不相等则产生了数据丢失 - qWarning("recv data have lossed"); - return ack; - } - uint8_t chk_a = 0, chk_b = 0; - crc::crc16((uint8_t *)data.data(),2,len+4,&chk_a,&chk_b); - if (chk_a != uint8_t(data[data.size() - 2]) || chk_b != uint8_t(data[data.size() - 1])) - { - // crc校验不对 - qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]), - int(data[data.size() - 1])); - } - // 保存此流水号 - cmd_no = data[5] | (data[6] << 8); - cmd = data[4]; - // 数据负载 - return true; - } - myarray CodecYm::encode(int srcAddr, int dstAddr, int cmd, myarray data) + break; + case 4: { - Q_UNUSED(srcAddr); - Q_UNUSED(dstAddr); - myarray t; - uint32_t len=data.size()+3; - - t.append(0x59u); - t.append(0x6du); - t.append(0x43u); - if(len<65535) - { - t.append((len)&0xff); - t.append((len)>>8); - t.append(cmd); - t.append(cmd_no&0xff); - t.append(cmd_no>>8); - }else{ - len+=4; - t.append(0xff); - t.append(0xff); - t.append(cmd); - t.append(cmd_no&0xff); - t.append(cmd_no>>8); - t.append(len&0xff); - t.append((len>>8)&0xff); - t.append((len>>16)&0xff); - t.append((len>>24)&0xff); - } - t.append(data); - uint8_t chk_a,chk_b; - crc::crc16((uint8_t *)t.data(),3,len+5,&chk_a,&chk_b); - t.append(chk_a); - t.append(chk_b); - return t; + int len = data[2] | (data[3] << 8); + if (len < 65535) + { + is_big_data = false; + num_to_read += len + 2; // 负载+2byte校验 + qDebug("normal data. len=%d", len); + } + else + { + is_big_data = true; + num_to_read = 11; // 扩展数据长度 + qDebug("big data."); + } + } + break; + case 11: + { + if (is_big_data == true) + { + int len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24); + num_to_read = 4 + len + 2; // 负载+2byte校验 + qDebug("big data. len=%d", len); + } + } + default: + break; + } + // 此时一帧数据已完成 + if (num_to_read > 0 && num_to_read == data.size()) + { + ack = true; + num_to_read = 0; } + fullFrame = ack; + return fullFrame; +} +// 重载解码函数 +myarray CodecYm::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) +{ + Q_UNUSED(srcAddr); + Q_UNUSED(dstAddr); + myarray r; + if (packCheck(data) == true) + { + cmd = this->cmd; + if (is_big_data == false) + r = data.mid(7, len - 3); + else + r = data.mid(11, len - 7); + } + return r; +} +bool CodecYm::packCheck(myarray data) +{ + bool ack = false; + if (data.size() < 9) + { + // 主机一帧数据至少9字节 + qWarning("recv data len too less"); + return ack; + } + if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du)) + { + // 帧头不对 + qWarning("frame head not 0x59 0x6d"); + return ack; + } + len = (data[2] | (data[3] << 8)); + if (len == 65535) + { + // 重新设置数据长度 + len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24); + is_big_data = true; + } + else + { + is_big_data = false; + } + if (len + 6 != data.size()) + { + // 如果长度不相等则产生了数据丢失 + qWarning("recv data have lossed"); + return ack; + } + uint8_t chk_a = 0, chk_b = 0; + crc::crc16((uint8_t *)data.data(), 2, len + 4, &chk_a, &chk_b); + if (chk_a != uint8_t(data[data.size() - 2]) || chk_b != uint8_t(data[data.size() - 1])) + { + // crc校验不对 + qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]), + int(data[data.size() - 1])); + } + // 保存此流水号 + cmd_no = data[5] | (data[6] << 8); + cmd = data[4]; + // 数据负载 + return true; +} +myarray CodecYm::encode(int srcAddr, int dstAddr, int cmd, myarray data) +{ + Q_UNUSED(srcAddr); + Q_UNUSED(dstAddr); + myarray t; + uint32_t len = data.size() + 3; + + t.append(0x59u); + t.append(0x6du); + t.append(0x43u); + if (len < 65535) + { + t.append((len) & 0xff); + t.append((len) >> 8); + t.append(cmd); + t.append(cmd_no & 0xff); + t.append(cmd_no >> 8); + } + else + { + len += 4; + t.append(0xff); + t.append(0xff); + t.append(cmd); + t.append(cmd_no & 0xff); + t.append(cmd_no >> 8); + t.append(len & 0xff); + t.append((len >> 8) & 0xff); + t.append((len >> 16) & 0xff); + t.append((len >> 24) & 0xff); + } + t.append(data); + uint8_t chk_a, chk_b; + crc::crc16((uint8_t *)t.data(), 3, len + 5, &chk_a, &chk_b); + t.append(chk_a); + t.append(chk_b); + return t; +} Codec *codec_ym_get() { - static Codec *codec_=nullptr; - if(codec_==nullptr){ - codec_=new CodecYm(); - } - return codec_; + static Codec *codec_ = nullptr; + if (codec_ == nullptr) + { + codec_ = new CodecYm(); + } + return codec_; } - -codec_export(codec_ym,codec_ym_get); - - +codec_export(codec_ym, codec_ym_get); diff --git a/interface/codec_ym.h b/interface/codec_ym.h index f354b39..7afc0ae 100644 --- a/interface/codec_ym.h +++ b/interface/codec_ym.h @@ -19,6 +19,7 @@ public: myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data); bool packCheck(myarray data); myarray encode(int srcAddr, int dstAddr, int cmd, myarray data); + private: bool is_big_data; int num_to_read; @@ -27,13 +28,4 @@ private: int len; }; - - - - - - - - - #endif // CODEC_YM_H diff --git a/interface/if_tcp.cpp b/interface/if_tcp.cpp index 0ab1372..8fa26f7 100644 --- a/interface/if_tcp.cpp +++ b/interface/if_tcp.cpp @@ -4,183 +4,168 @@ if_tcp::if_tcp() { - this->connect_state=false; - this->timer_reconnect_=nullptr; - this->tcp_socket_=nullptr; - this->reconnect_timeout_ms=10000; - this->cfg_=syscfg(); + this->connect_state = false; + this->timer_reconnect_ = nullptr; + this->tcp_socket_ = nullptr; + this->reconnect_timeout_ms = 10000; + this->cfg_ = syscfg(); - this->timer_recv_end_=nullptr; - this->recv_end_timeout_ms=100; - qDebug("tcp created."); + this->timer_recv_end_ = nullptr; + this->recv_end_timeout_ms = 100; + qDebug("tcp created."); } if_tcp::~if_tcp() { - } - void if_tcp::init() { - if(nullptr == timer_reconnect_) - { - timer_reconnect_ = new QTimer(this); + if (nullptr == timer_reconnect_) + { + timer_reconnect_ = new QTimer(this); - connect(timer_reconnect_, &QTimer::timeout, this, &if_tcp::reconnect_cb); - } - timer_reconnect_->start(reconnect_timeout_ms); + connect(timer_reconnect_, &QTimer::timeout, this, &if_tcp::reconnect_cb); + } + timer_reconnect_->start(reconnect_timeout_ms); + if (nullptr == tcp_socket_) + { + tcp_socket_ = new QTcpSocket(this); + connect(tcp_socket_, SIGNAL(connected()), this, SLOT(connected_cb())); + connect(tcp_socket_, SIGNAL(disconnected()), this, SLOT(disconnected_cb())); + connect(tcp_socket_, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(state_changed_cb(QAbstractSocket::SocketState))); + connect(tcp_socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(on_error_cb(QAbstractSocket::SocketError))); + connect(tcp_socket_, SIGNAL(readyRead()), this, SLOT(ready_read_cb())); - if(nullptr == tcp_socket_) - { - tcp_socket_ = new QTcpSocket(this); - connect(tcp_socket_, SIGNAL(connected()), this, SLOT(connected_cb())); - connect(tcp_socket_, SIGNAL(disconnected()), this, SLOT(disconnected_cb())); - connect(tcp_socket_, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(state_changed_cb(QAbstractSocket::SocketState))); - connect(tcp_socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(on_error_cb(QAbstractSocket::SocketError))); - connect(tcp_socket_, SIGNAL(readyRead()), this, SLOT(ready_read_cb())); - - - tcp_socket_->setSocketOption(QAbstractSocket::LowDelayOption, 1);// 禁用Nagle算法. - tcp_socket_->setSocketOption(QAbstractSocket::KeepAliveOption, 1); - if(cfg_->tcp_enable) - tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port); - } - + tcp_socket_->setSocketOption(QAbstractSocket::LowDelayOption, 1); // 禁用Nagle算法. + tcp_socket_->setSocketOption(QAbstractSocket::KeepAliveOption, 1); + if (cfg_->tcp_enable) + tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port); + } } - - // 获取本机地址 QString if_tcp::get_local_ip() { - QList network =QNetworkInterface::allInterfaces(); - foreach (QNetworkInterface net, network) + QList network = QNetworkInterface::allInterfaces(); + foreach (QNetworkInterface net, network) + { + QString netName = net.humanReadableName(); + if (netName == "eth0") { - QString netName=net.humanReadableName(); - if(netName=="eth0") + QList list = net.addressEntries(); // 获取IP地址与子掩码等 + foreach (QNetworkAddressEntry address, list) + { + if (address.ip().protocol() == QAbstractSocket::IPv4Protocol) // 获取IPv4的地址 { - QList list=net.addressEntries(); // 获取IP地址与子掩码等 - foreach(QNetworkAddressEntry address,list) - { - if(address.ip().protocol()==QAbstractSocket::IPv4Protocol) // 获取IPv4的地址 - { - return address.ip().toString(); - } - } - + return address.ip().toString(); } + } } - return QString(); + } + return QString(); } - - void if_tcp::reconnect_cb() { - if(connect_state!=true) + if (connect_state != true) + { + QNetworkConfigurationManager mgr; + if (mgr.isOnline() == true) { - QNetworkConfigurationManager mgr; - if(mgr.isOnline()==true) - { - if(cfg_->tcp_enable){ - qDebug("network is online."); - tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port); - } - } - else - { - if(cfg_->tcp_enable){ - qDebug("network is not online."); - } - } - // 设置为配置的ip地址 - //if(QHostAddress(get_local_ip())!=QHostAddress(local_ip)) - if(get_local_ip().isEmpty()) - { - qDebug("modify local ip addr."); - QString str="ifconfig eth0 %1"; - system(str.arg(cfg_->local_ip).toLocal8Bit().data()); - str="route add default gw %1"; - system(str.arg(cfg_->gateway_ip).toLocal8Bit().data()); - } + if (cfg_->tcp_enable) + { + qDebug("network is online."); + tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port); + } } + else + { + if (cfg_->tcp_enable) + { + qDebug("network is not online."); + } + } + // 设置为配置的ip地址 + // if(QHostAddress(get_local_ip())!=QHostAddress(local_ip)) + if (get_local_ip().isEmpty()) + { + qDebug("modify local ip addr."); + QString str = "ifconfig eth0 %1"; + system(str.arg(cfg_->local_ip).toLocal8Bit().data()); + str = "route add default gw %1"; + system(str.arg(cfg_->gateway_ip).toLocal8Bit().data()); + } + } } - - void if_tcp::connected_cb() { - timer_reconnect_->start(); - connect_state=true; - emit tcp_connected_signal(); - qInfo("connected"); + timer_reconnect_->start(); + connect_state = true; + emit tcp_connected_signal(); + qInfo("connected"); } void if_tcp::disconnected_cb() { - connect_state=false; - qInfo("disconnected"); + connect_state = false; + qInfo("disconnected"); } void if_tcp::state_changed_cb(QAbstractSocket::SocketState nSocketState) { - qInfo("state changed:%d",nSocketState); + qInfo("state changed:%d", nSocketState); } - void if_tcp::on_error_cb(QAbstractSocket::SocketError nErrCode) { - connect_state=false; - qWarning("on error:%d",nErrCode); + connect_state = false; + qWarning("on error:%d", nErrCode); } - - void if_tcp::ready_read_cb() { - QByteArray data = tcp_socket_->readAll(); - timer_reconnect_->start(); - if(irq_fun){ - irq_fun(myarray(data)); - } -// qInfo()<< "recv data from tcp:"<readAll(); + timer_reconnect_->start(); + if (irq_fun) + { + irq_fun(myarray(data)); + } + // qInfo()<< "recv data from tcp:"<write(data); - if(!tcp_socket_->flush()) - { - //connect_state=false; - qWarning("write fial:[%s]",data.toHex(' ').data()); - } - else - { - timer_reconnect_->start(); - } - return wb; + int wb = tcp_socket_->write(data); + if (!tcp_socket_->flush()) + { + // connect_state=false; + qWarning("write fial:[%s]", data.toHex(' ').data()); + } + else + { + timer_reconnect_->start(); + } + return wb; } - InterFace *if_tcp_get() { - static InterFace *if_=nullptr; - if(if_==nullptr){ - if_=new if_tcp(); - QTimer::singleShot(0,if_,&if_->init); - } - return if_; + static InterFace *if_ = nullptr; + if (if_ == nullptr) + { + if_ = new if_tcp(); + QTimer::singleShot(0, if_, &InterFace::init); + } + return if_; } - -if_export(tcp,if_tcp_get); +if_export(tcp, if_tcp_get); diff --git a/interface/if_tcp.h b/interface/if_tcp.h index 95fb90a..008de2f 100644 --- a/interface/if_tcp.h +++ b/interface/if_tcp.h @@ -33,6 +33,7 @@ protected slots: void ready_read_cb(); signals: void tcp_connected_signal(); + protected: mycfg *cfg_; QTimer *timer_reconnect_; @@ -42,7 +43,6 @@ protected: QTimer *timer_recv_end_; int recv_end_timeout_ms; - }; #endif // IF_TCP_H diff --git a/interface/interface.cpp b/interface/interface.cpp index fc3df85..2f19c19 100644 --- a/interface/interface.cpp +++ b/interface/interface.cpp @@ -3,19 +3,14 @@ #include "string.h" #include "QDebug" - - - - - InterFace *interFaceFind(const char *name) { - extern const int __start_ifdef; - extern const int __stop_ifdef; - if_def *start=(if_def *)&__start_ifdef; - if_def *end=(if_def *)&__stop_ifdef; + extern const int __start_ifdef; + extern const int __stop_ifdef; + if_def *start = (if_def *)&__start_ifdef; + if_def *end = (if_def *)&__stop_ifdef; if_def *item = 0; - for (item=start;itemirq_fun=fun; + virtual void set_irq(irq_cb fun) + { + this->irq_fun = fun; } + protected: irq_cb irq_fun; }; InterFace *interFaceFind(const char *name); +typedef struct +{ + const char *name; + InterFace *(*if_get_fun)(); +} if_def; -typedef struct{ - const char *name; - InterFace *(*if_get_fun)(); -}if_def; - - -#define if_export(name_,fun_) \ +#define if_export(name_, fun_) \ const static char __if_##name_##_name[] __attribute__((section(".rodata.ifstr"))) = #name_; \ - __attribute__((used)) static if_def _if_##name_ __attribute__((section("ifdef")))={\ - .name=__if_##name_##_name,\ - .if_get_fun=fun_,\ -} - - - + __attribute__((used)) static if_def _if_##name_ __attribute__((section("ifdef"))) = { \ + .name = __if_##name_##_name, \ + .if_get_fun = fun_, \ + } #endif // INTERFACE_H diff --git a/main.cpp b/main.cpp index 0088a1e..acb7e6c 100644 --- a/main.cpp +++ b/main.cpp @@ -53,8 +53,8 @@ int main(int argc, char *argv[]) // Test test; // test.bind(); - qDebug("local ip=%s",syscfg()->local_ip.data()); - InterFace *if_=interFaceFind("tcp"); + qDebug("local ip=%s", syscfg()->local_ip.data()); + InterFace *if_ = interFaceFind("tcp"); return app.exec(); } diff --git a/mycopy.py b/mycopy.py new file mode 100644 index 0000000..3f18b6f --- /dev/null +++ b/mycopy.py @@ -0,0 +1,100 @@ +import shutil +import sys +import os +import prebuild as time +import mysql +import quest + + + +# 定义数据库目录 +SQL_APP_PATH = "checker_host_app" + + + +def find_type(str): + path = os.getcwd() + #print(path) + list=os.listdir(path) + file_list=[] + for i in list: + if(i[-len(str):]==str): + file_list.append(i) + return file_list + + +# 把ext_name打包到name之后 +def pack_file(name,ext_name): + with open(name, "ab") as f: + data=bytearray(256) + data[4:len(ext_name)+4]=bytearray(ext_name,"utf-8") + with open(ext_name,"rb") as g: + g.seek(0, os.SEEK_END) + size=g.tell()+256 + g.seek(0, os.SEEK_SET) + data[0]=size&0xff + data[1]=(size>>8)&0xff + data[2]=(size>>16)&0xff + data[3]=(size>>24)&0xff + print("name:",ext_name,"size=",size) + f.write(data) + f.write(g.read()) + + + +def main(): + #src ="~/QtWorkSpace/build-QtTcpClient-ATK_MP157-Debug/QtTcpClient" + #dst="~/linux/nfs/qt_tcp_client.app" + if(len(sys.argv)<3): + print("argv num too less") + return + src=sys.argv[1] + dst=sys.argv[2] + cp="" + if(len(sys.argv)>3): + cp=sys.argv[3] + + if not os.path.exists(src): + print(src+' File Error!!!') + else: + + if os.path.exists(dst): + os.remove(dst) + shutil.copy(src,dst) + #os.remove(src) + file = open(dst,"ab") + file.seek(0, os.SEEK_END) + print("File Size is :", file.tell()) + list_file=find_type('.sh') + for i in list_file: + pack_file(dst,i) + list_file=find_type('.json') + for i in list_file: + pack_file(dst,i) + list_file=find_type('.bin') + for i in list_file: + pack_file(dst,i) + list_file=find_type('.lua') + for i in list_file: + pack_file(dst,i) + file.seek(0, os.SEEK_END) + print("File Size is :", file.tell()) + file.close() + if(len(cp)>0): + cp=cp+'/'+"checker_"+time.get_date()+".elf" + print(cp) + shutil.copy(dst,cp) + sql=mysql.sql() + if(sql.init(SQL_APP_PATH)==True): + q=quest.quest_text("请输入本次提交的描述信息") + ack,text=q.show() + if(ack==True): + sql.insert(cp,text) + else: + print("user cancelled.") + print("time:",time.get_time()) + print(dst+' File copy success.') + + +if __name__=="__main__": + main() diff --git a/mysql.py b/mysql.py new file mode 100644 index 0000000..a82e539 --- /dev/null +++ b/mysql.py @@ -0,0 +1,167 @@ +import pymysql as mysql +import datetime +from datetime import datetime, timedelta +import hashlib +import os + +def connect(): + try: + db=mysql.connect(host='124.70.178.159',user='admin',passwd='Rc5345750.',port=3306) + print("connect mysql success.") + return db + except Exception as e: + print("can not connect service.") + return None + + +# 获取北京时间 +def get_date(): + now_time = datetime.utcnow() + utc_time = now_time + timedelta(hours=8) # UTC只是比北京时间提前了8个小时 + utc_time = utc_time.strftime("%Y%m%d") + return utc_time + +# 获取北京时间 +def get_time(): + now_time = datetime.utcnow() + utc_time = now_time + timedelta(hours=8) # UTC只是比北京时间提前了8个小时 + utc_time = utc_time.strftime("%Y-%m-%d %H:%M:%S") + return utc_time + + +# 获取数据md5 +def md5(data:bytearray): + m=hashlib.md5(data).hexdigest() + # print(m) + return m + + +# 获得主板sn号 +def get_computer_sn(): + sn = os.popen("wmic bios get serialnumber").readlines() + return sn[2].strip() + + +class sql: + def __init__(self) -> None: + self.download_path="download/" + if not os.path.exists(self.download_path): + os.makedirs(self.download_path) + + + # 初始化返回True成功 + def init(self,table_name:str): + self.db=connect() + self.table_name=table_name + if(self.db!=None): + self.cur=self.db.cursor() + self.cur.execute("use andy_data") + self.cur.execute("select version()") + a=self.cur.fetchone() + print(a) + self.create_table(self.table_name) + return True + return False + + # 创建表 + def create_table(self,table_name:str): + cmd="""CREATE TABLE IF NOT EXISTS `{d1}`( + `id` INT UNSIGNED AUTO_INCREMENT, + `time` VARCHAR(30) NOT NULL, + `name` VARCHAR(256) NOT NULL, + `md5` VARCHAR(33) NOT NULL, + `data` MEDIUMBLOB NOT NULL, + `info` VARCHAR(512), + PRIMARY KEY ( `id` ) + )ENGINE=InnoDB DEFAULT CHARSET=utf8;""".format(d1=table_name) + + self.cur.execute(cmd) + + # 插入数据 + def insert(self,file_name:str,info:str=""): + s=file_name.split('.') + if(len(s)<2): + print("file name without type suffix,will not insert.") + return + with open(file_name,"rb") as f: + d=f.read() + md=md5(d) + lis=self.show() + if(len(lis)>0): + if(lis[-1][3]==md): + print("the same file was saved,will not insert.") + return + try: + cmd="INSERT INTO {d1} (time,name,md5,data,info) VALUES (%s,%s,%s,%s,%s);".format(d1=self.table_name) + self.db.begin() + self.cur.execute(cmd,([get_time(),file_name,md,d,info])) + self.db.commit() + print("insert file success.") + except Exception as e: + self.db.rollback() + print(str(e)) + + # 查看数据 + def show(self): + cmd= "select id,time,name,md5 from {d1};".format(d1=self.table_name) + self.cur.execute(cmd) + a=self.cur.fetchall() + # for i in a: + # print(i[0],i[1],i[2],i[3]) + return a + # 下载指定文件,返回文件路径 + def download(self,id:int): + ack,name=self.exists(id) + if(ack==True): + print("the same file is exists,will not download.") + return name + cmd="select name,data from {d1} WHERE id={d2};".format(d1=self.table_name,d2=id) + self.cur.execute(cmd) + a=self.cur.fetchall() + for i in a: + ss=i[0].replace('\\','/') + ss=ss.split('/')[-1].split('.') + name=self.download_path+ss[0]+' -'+str(id)+'.'+ss[1] + with open(name,'+bw') as f: + f.write(i[1]) + return name + print("can not find the file with id:",id) + return "" + + # 获取md5 + def get_md5(self,id:int): + cmd="select md5 from {d1} WHERE id={d2};".format(d1=self.table_name,d2=id) + self.cur.execute(cmd) + a=self.cur.fetchall()[0] + return a[0] + + # 扫描文件 + def scan_files(self): + path = self.download_path + if not os.path.exists(path): + os.makedirs(path) + list=os.listdir(path) + return list + # 判断文件是否存在 + def exists(self,id:int): + for i in self.scan_files(): + s=i.split('.')[-2].split('-')[-1] + if(int(s)==id): + with open(self.download_path+i,"rb") as f: + md=md5(f.read()) + if(md==self.get_md5(id)): + return True,i + return False,"" + + +if __name__ == "__main__": + s=sql() + if(s.init("test_data")==True): + s.insert("file\\check_result.csv") + s.show() + file=s.download(1) + print("save file:",file) + + + + diff --git a/prebuild.py b/prebuild.py new file mode 100644 index 0000000..7b2c354 --- /dev/null +++ b/prebuild.py @@ -0,0 +1,51 @@ + +import time +import shutil +import sys +import os +import datetime +from datetime import datetime, timedelta +import json + + +def get_date(): + now_time = datetime.utcnow() + utc_time = now_time + timedelta(hours=8) # UTC只是比北京时间提前了8个小时 + utc_time = utc_time.strftime("%Y%m%d") + return utc_time + +def get_time(): + now_time = datetime.utcnow() + utc_time = now_time + timedelta(hours=8) # UTC只是比北京时间提前了8个小时 + utc_time = utc_time.strftime("%Y-%m-%d %H:%M:%S") + return utc_time + +def main(): + if(len(sys.argv)<2): + print("argv num too less") + return + dst=sys.argv[1] + info="" + if(len(sys.argv)>=3): + info=sys.argv[2] + utc_time=get_time() + if os.path.exists(dst): + os.remove(dst) + with open(dst,"w") as f: + f.write("#ifndef compiler_info__\n") + f.write("#define compiler_info__\n\n\n\n\n\n\n") + f.write("#define BUILD_DATE \""+utc_time+"\"\n") + f.write("\n\n\n\n\n\n\n#endif\n") + if(len(info)>0): + if not os.path.exists(info): + print("file:",info,"not exist.") + with open(info,"r+") as f: + json_obj=json.loads(f.read()) + json_obj["build_date"]=utc_time + list_str=["info.json","json.lua","prints.lua"] + json_obj["private"]=list_str + f.seek(0, os.SEEK_SET) + f.write(json.dumps(json_obj, sort_keys=True, indent=4, separators=(',', ': '))) +if __name__=="__main__": + main() + diff --git a/prot/prot_m4.cpp b/prot/prot_m4.cpp index 358a00c..9895a70 100644 --- a/prot/prot_m4.cpp +++ b/prot/prot_m4.cpp @@ -1,88 +1,91 @@ #include "prot_m4.h" #include "QDebug" - - void prot_m4::init() { - if_=interFaceFind("uart_m4"); - codec_=codecFind("codec_m4"); + if_ = interFaceFind("uart_m4"); + codec_ = codecFind("codec_m4"); - if_->set_irq([=](myarray recv){ - if(codec_->packCheck(recv_data)==true){ - int cmd,src,dst; - myarray data=codec_->decode(src,dst,cmd,recv_data); - if(exe_cb_fun(data)==false){ - qWarning("can not find cb fun with:\"%s\"",data); - } - recv_data.clear(); - } + if_->set_irq([=](myarray recv) + { + if(codec_->packCheck(recv_data)==true){ + int cmd,src,dst; + myarray data=codec_->decode(src,dst,cmd,recv_data); + if(exe_cb_fun(data)==false){ + qWarning("can not find cb fun with:\"%s\"",data.data()); + } + recv_data.clear(); + } }); } void prot_m4::send_data_slot(myarray data) { - if((if_!=nullptr)&&(codec_!=nullptr)){ - myarray send=codec_->encode(0,0,0,data); - if_->write(send); - } + if ((if_ != nullptr) && (codec_ != nullptr)) + { + myarray send = codec_->encode(0, 0, 0, data); + if_->write(send); + } } - bool prot_m4::exe_cb_fun(myarray data) { - int left; - for (int i=0;iinit(); - } - return g_protm4; -} - - - -bool prot_m4::set_irq_fun(prot_m4_cb fun,myarray data) +prot_m4 *protM4() { - int left; - for (int i=0;iinit(); + } + return g_protm4; } -bool prot_m4::del_irq_fun(prot_m4_cb fun,myarray data) +bool prot_m4::set_irq_fun(prot_m4_cb fun, myarray data) { - int left; - for (int i=0;i prot_m4_cb; +typedef struct +{ + prot_m4_cb fun; + myarray cmd; +} HandleM4_def; -typedef struct{ - prot_m4_cb fun; - myarray cmd; -}HandleM4_def; - - - -class prot_m4:public QObject +class prot_m4 : public QObject { public: - prot_m4(){if_=nullptr;} - ~prot_m4(){} - void init(); - bool set_irq_fun(prot_m4_cb fun,myarray data); - bool del_irq_fun(prot_m4_cb fun,myarray data); + prot_m4() { if_ = nullptr; } + ~prot_m4() {} + void init(); + bool set_irq_fun(prot_m4_cb fun, myarray data); + bool del_irq_fun(prot_m4_cb fun, myarray data); public slots: - void send_data_slot(myarray data); -protected: - bool exe_cb_fun(myarray data); -protected: - InterFace *if_; - QList funs; - Codec *codec_; - QThread thread; - myarray recv_data; -}; + void send_data_slot(myarray data); +protected: + bool exe_cb_fun(myarray data); + +protected: + InterFace *if_; + QList funs; + Codec *codec_; + QThread thread; + myarray recv_data; +}; prot_m4 *protM4(); #endif // PROT_M4_H - - diff --git a/prot/prot_pc.cpp b/prot/prot_pc.cpp index 7034160..d9cfdfb 100644 --- a/prot/prot_pc.cpp +++ b/prot/prot_pc.cpp @@ -3,19 +3,18 @@ #include "prot_pc.h" #include "QDebug" - HandlePc *handlePcFind(int cmd) { - extern const int __start_protpc; - extern const int __stop_protpc; - handlepc_def *start=(handlepc_def *)&__start_protpc; - handlepc_def *end=(handlepc_def *)&__stop_protpc; + extern const int __start_protpc; + extern const int __stop_protpc; + handlepc_def *start = (handlepc_def *)&__start_protpc; + handlepc_def *end = (handlepc_def *)&__stop_protpc; handlepc_def *item = 0; - for (item=start;itemcmd==cmd) + if (item->cmd == cmd) return item->handle_get_fun(); } } @@ -23,57 +22,53 @@ HandlePc *handlePcFind(int cmd) return nullptr; } -protpc_export(0xff,nullptr); - void ProtPc::init() { - if_=interFaceFind("tcp"); - codec_=codecFind("codec_ym"); + if_ = interFaceFind("tcp"); + codec_ = codecFind("codec_ym"); - if_->set_irq([=](myarray recv){ - recv_data+=recv; - if(codec_->packCheck(recv_data)==true){ - int cmd,src,dst; - myarray data=codec_->decode(src,dst,cmd,recv_data); - if(handle_!=nullptr){ - if(handle_->busy==0){ - disconnect(handle_,&HandlePc::send_data_signal,this,send_data_slot); - delete handle_; - }else{ - qWarning("prot_pc is busy."); - return; - } - } - handle_=handlePcFind(cmd); - if(handle_!=nullptr){ - connect(handle_,&HandlePc::send_data_signal,this,send_data_slot); - handle_->dolater(cmd,data); - } - recv_data.clear(); - } + if_->set_irq([=](myarray recv) + { + recv_data+=recv; + if(codec_->packCheck(recv_data)==true){ + int cmd,src,dst; + myarray data=codec_->decode(src,dst,cmd,recv_data); + if(handle_!=nullptr){ + if(handle_->busy==0){ + disconnect(handle_,&HandlePc::send_data_signal,this,&ProtPc::send_data_slot); + delete handle_; + }else{ + qWarning("prot_pc is busy."); + return; + } + } + handle_=handlePcFind(cmd); + if(handle_!=nullptr){ + connect(handle_,&HandlePc::send_data_signal,this,&ProtPc::send_data_slot); + handle_->dolater(cmd,data); + } + recv_data.clear(); + } }); } -void ProtPc::send_data_slot(int cmd,myarray data) +void ProtPc::send_data_slot(int cmd, myarray data) { - if((if_!=nullptr)&&(codec_!=nullptr)){ - myarray send=codec_->encode(0,0,cmd,data); - if_->write(send); - } + if ((if_ != nullptr) && (codec_ != nullptr)) + { + myarray send = codec_->encode(0, 0, cmd, data); + if_->write(send); + } } - - static ProtPc *g_protpc; -ProtPc *protPc(){ - if(g_protpc==nullptr){ - g_protpc=new ProtPc(); - g_protpc->init(); - } - return g_protpc; +ProtPc *protPc() +{ + if (g_protpc == nullptr) + { + g_protpc = new ProtPc(); + g_protpc->init(); + } + return g_protpc; } - - - - diff --git a/prot/prot_pc.h b/prot/prot_pc.h index 9d4709e..ffc470c 100644 --- a/prot/prot_pc.h +++ b/prot/prot_pc.h @@ -10,33 +10,59 @@ #include "interface/interface.h" #include "base/mycfg.h" #include "QThread" - +#include "QTimer" // 定义处理命令的类 -class HandlePc:public QObject{ +class HandlePc : public QObject +{ Q_OBJECT public: - HandlePc(){busy=0;} - virtual ~HandlePc(){} - virtual int dolater(int cmd,myarray data)=0; + HandlePc() { + busy = 0; + timer_ = nullptr; + } + virtual ~HandlePc() { + if(timer_!=nullptr){ + delete timer_; + } + } + virtual int dolater(int cmd, myarray data) = 0; + virtual void timeout()=0; int busy; +protected: + void timeout_start(int ms){ + if(timer_==nullptr){ + timer_=new QTimer(); + connect(timer_,&QTimer::timeout,this,&HandlePc::timeout); + } + timer_->start(ms); + } + void timeout_stop(){ + if(timer_!=nullptr){ + timer_->stop(); + } + } +private: + QTimer *timer_; signals: - void send_data_signal(int cmd,myarray data); + void send_data_signal(int cmd, myarray data); }; - - - - - -class ProtPc:public QObject{ +class ProtPc : public QObject +{ Q_OBJECT public: - ProtPc(){if_=nullptr;codec_=nullptr;handle_=nullptr;} - ~ProtPc(){} + ProtPc() + { + if_ = nullptr; + codec_ = nullptr; + handle_ = nullptr; + } + ~ProtPc() {} void init(); protected slots: - void send_data_slot(int cmd,myarray data); + void send_data_slot(int cmd, myarray data); + protected: InterFace *if_; Codec *codec_; @@ -45,31 +71,18 @@ protected: myarray recv_data; }; - ProtPc *protPc(); +typedef struct +{ + int cmd; + HandlePc *(*handle_get_fun)(); +} handlepc_def; - - - -typedef struct{ - int cmd; - HandlePc *(*handle_get_fun)(); -}handlepc_def; - - - -#define protpc_export(cmd_,fun_) \ - __attribute__((used)) static handlepc_def _handlepc_##name_ __attribute__((section("protpc")))={\ - .cmd=cmd_,\ - .handle_get_fun=fun_,\ -} - - - - +#define protpc_export(cmd_, fun_) \ + __attribute__((used)) static handlepc_def _handlepc_##name_ __attribute__((section("protpc"))) = { \ + .cmd = cmd_, \ + .handle_get_fun = fun_, \ + } #endif - - - diff --git a/prot/prot_slave.cpp b/prot/prot_slave.cpp index 66b1af2..1e23032 100644 --- a/prot/prot_slave.cpp +++ b/prot/prot_slave.cpp @@ -1,77 +1,77 @@ #include "prot_slave.h" #include "QDebug" - - - void prot_slave::init() { - if_=interFaceFind("can"); - codec_=codecFind("codec_slave"); - mycfg *cfg_=syscfg(); - for(int i=0;islave_num;i++){ - slaves.append(nullptr); - } - if_->set_irq([=](myarray recv){ - if(codec_->packCheck(recv)==true){ - int cmd,src,dst; - HandleSlave *handle=nullptr; - myarray data=codec_->decode(src,dst,cmd,recv); - if((src>slaves.size())||(src<=0)){ - qWarning("slave addr err:%d",src); - }else{ - handle=slaves[src-1]; - if(handle!=nullptr){ - handle->dolater(cmd,data); - }else{ - qWarning("slave addr=%d not have handle.",src); - } - } - } + if_ = interFaceFind("can"); + codec_ = codecFind("codec_slave"); + mycfg *cfg_ = syscfg(); + for (int i = 0; i < cfg_->slave_num; i++) + { + slaves.append(nullptr); + } + if_->set_irq([=](myarray recv) + { + if(codec_->packCheck(recv)==true){ + int cmd,src,dst; + HandleSlave *handle=nullptr; + myarray data=codec_->decode(src,dst,cmd,recv); + if((src>slaves.size())||(src<=0)){ + qWarning("slave addr err:%d",src); + }else{ + handle=slaves[src-1]; + if(handle!=nullptr){ + handle->dolater(cmd,data); + }else{ + qWarning("slave addr=%d not have handle.",src); + } + } + } }); } - -bool prot_slave::set_slave_handle(int addr,HandleSlave *handle) +bool prot_slave::set_slave_handle(int addr, HandleSlave *handle) { - if((addr>slaves.size())||(addr<=0)){ - delete handle; - return false; + if ((addr > slaves.size()) || (addr <= 0)) + { + delete handle; + return false; + } + HandleSlave *temp; + temp = slaves[addr - 1]; + if (temp != nullptr) + { + if (temp->busy != 0) + { + delete handle; + return false; } - HandleSlave *temp; - temp=slaves[addr-1]; - if(temp!=nullptr){ - if(temp->busy!=0){ - delete handle; - return false; - }else{ - delete temp; - } + else + { + delete temp; } - connect(handle,&HandleSlave::send_data_signal,this,&prot_slave::send_data_slot); - slaves.replace(addr-1,handle); - return true; + } + connect(handle, &HandleSlave::send_data_signal, this, &prot_slave::send_data_slot); + slaves.replace(addr - 1, handle); + return true; } - -void prot_slave::send_data_slot(int addr,int cmd,myarray data){ - if((if_!=nullptr)&&(codec_!=nullptr)){ - myarray send=codec_->encode(0,addr,cmd,data); - if_->write(send); - } +void prot_slave::send_data_slot(int addr, int cmd, myarray data) +{ + if ((if_ != nullptr) && (codec_ != nullptr)) + { + myarray send = codec_->encode(0, addr, cmd, data); + if_->write(send); + } } - - static prot_slave *g_protslave; -prot_slave *protSlave(){ - if(g_protslave==nullptr){ - g_protslave=new prot_slave(); - //g_protslave->init(); - } - return g_protslave; +prot_slave *protSlave() +{ + if (g_protslave == nullptr) + { + g_protslave = new prot_slave(); + // g_protslave->init(); + } + return g_protslave; } - - - - diff --git a/prot/prot_slave.h b/prot/prot_slave.h index 53c1036..188e764 100644 --- a/prot/prot_slave.h +++ b/prot/prot_slave.h @@ -1,7 +1,6 @@ #ifndef PROT_SLAVE_H #define PROT_SLAVE_H - #include "QObject" #include "base/base.h" #include "QList" @@ -9,52 +8,80 @@ #include "interface/interface.h" #include "base/mycfg.h" #include "QThread" +#include "QTimer" - -class HandleSlave:public QObject{ - Q_OBJECT - public: - HandleSlave(){busy=0;} - virtual ~HandleSlave(){} - virtual int start(myarray data)=0; - virtual int dolater(int cmd,myarray data)=0; - int busy; - signals: - void send_data_signal(int addr,int cmd,myarray data); -}; - - - - - - - - - - - - -class prot_slave:public QObject +class HandleSlave : public QObject { - Q_OBJECT + Q_OBJECT public: - prot_slave(){if_=nullptr;codec_=nullptr;busy=0;addr=0;} - ~prot_slave(){} - void init(); - bool set_slave_handle(int addr,HandleSlave *handle); - int busy; - int addr; -protected slots: - void send_data_slot(int addr,int cmd,myarray data); + HandleSlave() { + busy = 0; + addr = 0; + cmd=0; + timer_=nullptr; + } + virtual ~HandleSlave() { + if(timer_!=nullptr){ + delete timer_; + } + } +public: + virtual int start(myarray data) = 0; + virtual int dolater(int cmd, myarray data) = 0; + virtual void timeout()=0; + int busy; + int addr; + int cmd; +public: + int send_data(int cmd,myarray data){ + emit send_data_signal(addr,cmd,data); + return 0; + } + int end(int ack,myarray data){ + emit end_signal(addr,ack,data); + return 0; + } protected: - InterFace *if_; - Codec *codec_; - QList slaves; + void timeout_start(int ms){ + if(timer_==nullptr){ + timer_=new QTimer(); + connect(timer_,&QTimer::timeout,this,&HandleSlave::timeout); + } + timer_->start(ms); + } + void timeout_stop(){ + if(timer_!=nullptr){ + timer_->stop(); + } + } +private: + QTimer *timer_; +signals: + void send_data_signal(int addr, int cmd, myarray data); + void end_signal(int addr,int ack,myarray data); }; +class prot_slave : public QObject +{ + Q_OBJECT +public: + prot_slave() + { + if_ = nullptr; + codec_ = nullptr; + } + ~prot_slave() {} + void init(); + bool set_slave_handle(int addr, HandleSlave *handle); +protected slots: + void send_data_slot(int addr, int cmd, myarray data); + +protected: + InterFace *if_; + Codec *codec_; + QList slaves; +}; prot_slave *protSlave(); - - #endif // PROT_SLAVE_H diff --git a/prot_cmd/cmd_pc.cpp b/prot_cmd/cmd_pc.cpp index 2459eba..6822fe8 100644 --- a/prot_cmd/cmd_pc.cpp +++ b/prot_cmd/cmd_pc.cpp @@ -1,70 +1,155 @@ #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; +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; - QString s=QString("moter %1").arg(count); - r=s.toLocal8Bit(); - }else{ - qWarning()<<"moter count out of range."<moter_countmoter_count){ - moter->moter_run=1; - count=cfg_->moter_count-moter->moter_count; - moter->moter_count+=count; - QString s=QString("moter %1").arg(count); - r=s.toLocal8Bit(); - }else{ - qWarning()<<"moter count out of range."<moter_count > 0) + { + moter->moter_run = 1; + count = -moter->moter_count - 100; + moter->moter_count = 0; + QString s = QString("moter %1").arg(count); + r = s.toLocal8Bit(); } - return 0; -} - - - -int selfdev_check::dolater(int cmd, myarray data) -{ - prot_m4 *m4=protM4(); - connect(this,send_to_m4_signal,m4,&prot_m4::send_data_slot); - m4->set_irq_fun([=](myarray data){ - m4->del_irq_fun(nullptr,"moter "); - if(data=="down"){ - // 这里开始检测 - } - },"moter "); - emit send_to_m4_signal(moter_ctrl("up")); + 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; + QString s = QString("moter %1").arg(count); + r = s.toLocal8Bit(); + } + else + { + qWarning("moter count out of range.") ; + return r; + } + } return 0; } +// 自研批检仪检测 +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); + m4->set_irq_fun([=](myarray data) + { + m4->del_irq_fun(nullptr,"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); + } + } + } + },"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 slave_acked; + int slave_acked_num; signals: - void send_to_m4_signal(myarray data); + void send_to_m4_signal(myarray data); }; - - - - - - - - - #endif - diff --git a/prot_cmd/cmd_slave.cpp b/prot_cmd/cmd_slave.cpp index 27c219d..00cf8ff 100644 --- a/prot_cmd/cmd_slave.cpp +++ b/prot_cmd/cmd_slave.cpp @@ -1,12 +1,40 @@ #include "cmd_slave.h" - - +#include "base/mycfg.h" +#include "base/check_cfg.h" +#include "QDebug" int slave_check::start(myarray data) { - return 0; + mycfg *cfg_=syscfg(); + int timeout=100000; + busy=1; + cmd=0x0c; + qDebug("addr %d start check,timeout=%d",addr,timeout); + send_data(cmd,myarray()); + timeout_start(timeout); + return 0; +} + +void slave_check::timeout() +{ + qWarning("addr %d check timeout.",addr); + end(1,myarray()); + busy=0; +} + +int slave_check::dolater(int cmd, myarray data) +{ + if(cmd!=this->cmd){ + qWarning("addr %d recv err cmd:%02x",addr,cmd); + return 1; + } + end(0,data); + busy=0; + return 0; } + + diff --git a/prot_cmd/cmd_slave.h b/prot_cmd/cmd_slave.h index 87fa4f1..8fa9915 100644 --- a/prot_cmd/cmd_slave.h +++ b/prot_cmd/cmd_slave.h @@ -9,6 +9,8 @@ class slave_check:public HandleSlave public: slave_check():HandleSlave(){} int start(myarray data); + int dolater(int cmd, myarray data); + void timeout(); }; #endif // CMD_SLAVE_H diff --git a/quest.py b/quest.py new file mode 100644 index 0000000..e5ea70e --- /dev/null +++ b/quest.py @@ -0,0 +1,97 @@ +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +import sys +import os + + + + +# 定义询问字符文件 +QUEST_FILE = "quest_info.txt" + + +def load_info(): + if os.path.exists(QUEST_FILE): + with open(QUEST_FILE,"r") as f: + return f.read() + return "" +def save_info(text:str): + with open(QUEST_FILE,'+w') as f: + print("save:",text) + f.write(text) + +class quest_text(QObject): + def __init__(self,title:str): + QObject.__init__(self) + self.app = QApplication(sys.argv) + self.w=QDialog() + self.w.resize(800,400) + self.w.setWindowTitle(title) + self.w.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose) + self.w.setWindowModality(Qt.WindowModality.ApplicationModal) + self.text=load_info() + self.text_edit = QTextEdit(self.w) + self.text_edit.setObjectName(u"text") + self.text_edit.setGeometry(QRect(20, 20, 760, 320)) + self.text_edit.setFrameShape(QFrame.Shape.Box) + self.text_edit.setMidLineWidth(1) + self.text_edit.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded) + self.text_edit.setPlainText(self.text) + self.text_edit.moveCursor(QTextCursor.MoveOperation.End, QTextCursor.MoveMode.MoveAnchor) + self.ok_but_init() + self.cancel_but_init() + + def ok_but_init(self): + self.ok_but=QPushButton(self.w) + self.ok_but.setObjectName(u"ok_but") + self.ok_but.setGeometry(QRect(700, 350, 93, 28)) + self.ok_but.clicked.connect(self.ok_but_clicked) + self.ok_but.setText("确认") + self.ok_but.setCheckable(True) + self.ok_but.setChecked(True) + self.ok_state=False + + def cancel_but_init(self): + self.cancel_but=QPushButton(self.w) + self.cancel_but.setObjectName(u"cancel_but") + self.cancel_but.setGeometry(QRect(600, 350, 93, 28)) + self.cancel_but.clicked.connect(self.cancel_but_clicked) + self.cancel_but.setText("取消") + self.ok_but.setCheckable(True) + self.ok_state=False + + def ok_but_clicked(self): + self.text=self.text_edit.toPlainText() + self.ok_state=True + self.w.done(QDialog.DialogCode.Accepted) + self.w.close() + + def cancel_but_clicked(self): + self.text=self.text_edit.toPlainText() + self.ok_state=False + self.w.done(QDialog.DialogCode.Accepted) + self.w.close() + + def item_clicked(self,item:QListWidgetItem ): + self.select_item=item.text() + self.w.done(QDialog.DialogCode.Accepted) + self.w.close() + def show(self): + # if(self.w.exec()==QDialog.DialogCode.Accepted): + # return self.ok_state,self.text + self.w.show() + a=self.app.exec() + # sys.exit() + save_info(self.text) + return self.ok_state,self.text + + + + + + +if __name__=="__main__": + q=quest_text("输入本次提交的描述") + ack,text=q.show() + print("ack=",ack,"text=",text) diff --git a/quest_info.txt b/quest_info.txt new file mode 100644 index 0000000..e69de29