|
|
@@ -3,6 +3,8 @@
|
|
|
|
|
|
#include "CDiandanAIShibieWorker.h"
|
|
|
|
|
|
+#include "../tool/CAppEnv.h"
|
|
|
+
|
|
|
CChengzhongWorker::CChengzhongWorker()
|
|
|
{
|
|
|
}
|
|
|
@@ -10,9 +12,14 @@ CChengzhongWorker::CChengzhongWorker()
|
|
|
//启动工作线程
|
|
|
void CChengzhongWorker::StartWork()
|
|
|
{
|
|
|
+ m_worker_mutex.lock();
|
|
|
+
|
|
|
m_is_work = true;
|
|
|
|
|
|
+ m_worker_mutex.unlock();
|
|
|
+
|
|
|
std::thread(&CChengzhongWorker::HandleWork, this).detach();
|
|
|
+ CAppEnv::GetInstance()->AddWorkerNum();
|
|
|
}
|
|
|
|
|
|
//结束工作线程
|
|
|
@@ -32,88 +39,82 @@ void CChengzhongWorker::StopWork()
|
|
|
|
|
|
void CChengzhongWorker::RestartWork()
|
|
|
{
|
|
|
- StopWork();
|
|
|
+ //重新获取型号,重新连接串口
|
|
|
+ m_dianzicheng_lianjie = CSetting::GetInstance()->GetParam("setting_dianzicheng_is_lianjie");
|
|
|
+ m_dianzicheng_xinghao = CSetting::GetInstance()->GetParam("setting_dianzicheng_xinghao");
|
|
|
|
|
|
- StartWork();
|
|
|
+ if (m_dianzicheng_lianjie == "1")
|
|
|
+ {
|
|
|
+ this->RestartSerial();
|
|
|
+ }
|
|
|
+
|
|
|
+ this->UpdateShow("0.000");
|
|
|
}
|
|
|
|
|
|
void CChengzhongWorker::HandleWork()
|
|
|
{
|
|
|
- std::string setting_dianzicheng_xinghao = CSetting::GetInstance()->GetParam("setting_dianzicheng_xinghao");
|
|
|
- std::string dianzicheng_com = CSetting::GetInstance()->GetParam("setting_dianzicheng_com");
|
|
|
- std::string setting_dianzicheng_botelv = CSetting::GetInstance()->GetParam("setting_dianzicheng_botelv");
|
|
|
+ m_dianzicheng_lianjie = CSetting::GetInstance()->GetParam("setting_dianzicheng_is_lianjie");
|
|
|
+ m_dianzicheng_xinghao = CSetting::GetInstance()->GetParam("setting_dianzicheng_xinghao");
|
|
|
|
|
|
- m_serial.setPortNum(CLewaimaiString::UTF8ToUnicode(dianzicheng_com));
|
|
|
- m_serial.setBaudRate(atoi(setting_dianzicheng_botelv.c_str()));
|
|
|
-
|
|
|
- bool ret = m_serial.openComm();
|
|
|
- if (!ret)
|
|
|
+ if (m_dianzicheng_lianjie == "1")
|
|
|
{
|
|
|
- //连接电子秤失败了
|
|
|
- m_is_work = false;
|
|
|
-
|
|
|
- return;
|
|
|
+ this->RestartSerial();
|
|
|
}
|
|
|
|
|
|
- std::string m_chuankou_string = "";
|
|
|
-
|
|
|
while (m_is_work)
|
|
|
{
|
|
|
+ if (m_dianzicheng_lianjie == "0")
|
|
|
+ {
|
|
|
+ Sleep(200);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
std::string new_weight;
|
|
|
|
|
|
+ std::string chuankou_string = "";
|
|
|
+
|
|
|
//不同型号的电子秤,数据格式可能不一样,处理方式不一样
|
|
|
- if (setting_dianzicheng_xinghao == "dahua_acs")
|
|
|
+ if (m_dianzicheng_xinghao == "dahua_acs")
|
|
|
{
|
|
|
- char a[100] = { 0 };
|
|
|
+ char a[22] = { 0 };
|
|
|
|
|
|
- memset(a, 0, 100);
|
|
|
+ memset(a, 0, 22);
|
|
|
|
|
|
//开始读取串口的数据
|
|
|
DWORD nReaded = 0;
|
|
|
|
|
|
- m_serial.readFromComm(a, 100, &nReaded);
|
|
|
+ m_serial.readFromComm(a, 22, &nReaded);
|
|
|
if (nReaded <= 0)
|
|
|
{
|
|
|
Sleep(200);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //把所有读到的内容,拼接到m_chuankou_string后面,避免有的数据中间截断导致格式混乱
|
|
|
- m_chuankou_string += a;
|
|
|
+ //把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
|
|
|
+ chuankou_string = a;
|
|
|
|
|
|
- std::string show_command = "\n\r";
|
|
|
-
|
|
|
- size_t nPos = m_chuankou_string.find(show_command);
|
|
|
- if (nPos == m_chuankou_string.npos)
|
|
|
+ if (a[20] != 0x0A || a[21] != 0x0D)
|
|
|
{
|
|
|
- //没有读到足够的长度,继续读
|
|
|
- continue;
|
|
|
- }
|
|
|
+ //说明这22个字节的数据不是完整的,这个时候处理方式是把错误数据全部读完,但是不处理,然后下次接着处理
|
|
|
+ std::string show_command = "\n\r";
|
|
|
|
|
|
- std::string weight;
|
|
|
-
|
|
|
- //如果前2个不是标志符,那么就判断标志符后面的数字长度够不够5个
|
|
|
- if (m_chuankou_string.length() >= nPos + 7)
|
|
|
- {
|
|
|
- //这个情况是,标志符后面有5个数字
|
|
|
- weight = m_chuankou_string.substr(nPos + 2, 5);
|
|
|
+ size_t nPos = chuankou_string.find(show_command);
|
|
|
+ if (nPos == chuankou_string.npos)
|
|
|
+ {
|
|
|
+ //不存在标志符,数据错误
|
|
|
+ this->UpdateShow("0.000");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- //然后把前面的字符都删掉
|
|
|
- m_chuankou_string = m_chuankou_string.substr(nPos + 7);
|
|
|
- }
|
|
|
- else if (nPos >= 20)
|
|
|
- {
|
|
|
- //说明前面有20个字符,首先肯定不是稳定模式而是极速模式,另外在极速模式下可以直接得到重量了
|
|
|
- weight = m_chuankou_string.substr(nPos - 20, 5);
|
|
|
+ //把废数据读出来,不处理,下次重新读16个完整的
|
|
|
+ m_serial.readFromComm(a, nPos + 2, &nReaded);
|
|
|
|
|
|
- m_chuankou_string = m_chuankou_string.substr(nPos + 2);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //标志符后面前面都不够读取重量,继续读取串口
|
|
|
+ this->UpdateShow("0.000");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+ std::string weight = chuankou_string.substr(0, 5);
|
|
|
+
|
|
|
if (weight.at(0) == ' ')
|
|
|
{
|
|
|
weight = weight.substr(1);
|
|
|
@@ -135,12 +136,13 @@ void CChengzhongWorker::HandleWork()
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ this->UpdateShow("0.000");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
new_weight = zhengshu + "." + xiaoshu;
|
|
|
}
|
|
|
- else if (setting_dianzicheng_xinghao == "dingjian_os2x")
|
|
|
+ else if (m_dianzicheng_xinghao == "dingjian_os2x")
|
|
|
{
|
|
|
char a[16] = { 0 };
|
|
|
|
|
|
@@ -156,30 +158,30 @@ void CChengzhongWorker::HandleWork()
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //把所有读到的内容,拼接到m_chuankou_string后面,避免有的数据中间截断导致格式混乱
|
|
|
- m_chuankou_string = a;
|
|
|
+ //把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
|
|
|
+ chuankou_string = a;
|
|
|
|
|
|
if (a[0] != 0x01 || a[1] != 0x02 || a[13] != 0x03 || a[14] != 0x04)
|
|
|
{
|
|
|
//说明这16个字节的数据不是完整的,这个时候处理方式是把错误数据全部读完,但是不处理,然后下次接着处理
|
|
|
std::string show_command = "\x01\x02";
|
|
|
|
|
|
- size_t nPos = m_chuankou_string.find(show_command);
|
|
|
- if (nPos == m_chuankou_string.npos)
|
|
|
+ size_t nPos = chuankou_string.find(show_command);
|
|
|
+ if (nPos == chuankou_string.npos)
|
|
|
{
|
|
|
//不存在标志符,数据错误
|
|
|
- m_chuankou_string = "";
|
|
|
+ this->UpdateShow("0.000");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
//把废数据读出来,不处理,下次重新读16个完整的
|
|
|
m_serial.readFromComm(a, nPos, &nReaded);
|
|
|
|
|
|
- m_chuankou_string = "";
|
|
|
+ this->UpdateShow("0.000");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- std::string new_weight = m_chuankou_string.substr(4, 6);
|
|
|
+ std::string new_weight = chuankou_string.substr(4, 6);
|
|
|
|
|
|
if (new_weight.at(0) == '0')
|
|
|
{
|
|
|
@@ -189,40 +191,67 @@ void CChengzhongWorker::HandleWork()
|
|
|
else
|
|
|
{
|
|
|
//暂时不支持的其他型号
|
|
|
+ this->UpdateShow("0.000");
|
|
|
+
|
|
|
Sleep(200);
|
|
|
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //开始更新重量显示
|
|
|
- if (m_weight != new_weight)
|
|
|
- {
|
|
|
- //说明重量有变化了
|
|
|
- m_weight = new_weight;
|
|
|
+ this->UpdateShow(new_weight);
|
|
|
+ }
|
|
|
|
|
|
- m_is_wending = false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //重量没有变化了,说明稳定了
|
|
|
- if (m_is_wending == false)
|
|
|
- {
|
|
|
- //说明目前是从不稳定变为稳定,那么这里可以发起AI识别
|
|
|
- CDiandanAIShibieWorker::GetInstance()->AddAIShibieTask();
|
|
|
- }
|
|
|
+ CAppEnv::GetInstance()->DelWorkerNum();
|
|
|
+}
|
|
|
|
|
|
- m_is_wending = true;
|
|
|
- }
|
|
|
+void CChengzhongWorker::RestartSerial()
|
|
|
+{
|
|
|
+ //重新连接串口
|
|
|
+ m_serial.closeComm();
|
|
|
|
|
|
- if (m_hwnd != NULL)
|
|
|
- {
|
|
|
- PostMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
|
|
|
- }
|
|
|
+ std::string dianzicheng_com = CSetting::GetInstance()->GetParam("setting_dianzicheng_com");
|
|
|
+ std::string setting_dianzicheng_botelv = CSetting::GetInstance()->GetParam("setting_dianzicheng_botelv");
|
|
|
+
|
|
|
+ m_serial.setPortNum(CLewaimaiString::UTF8ToUnicode(dianzicheng_com));
|
|
|
+ m_serial.setBaudRate(atoi(setting_dianzicheng_botelv.c_str()));
|
|
|
+
|
|
|
+ bool ret = m_serial.openComm();
|
|
|
+ if (ret == false)
|
|
|
+ {
|
|
|
+ this->UpdateShow("0.000");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void CChengzhongWorker::UpdateShow(std::string new_weight)
|
|
|
+{
|
|
|
+ //开始更新重量显示
|
|
|
+ if (m_weight != new_weight)
|
|
|
+ {
|
|
|
+ //说明重量有变化了
|
|
|
+ m_weight = new_weight;
|
|
|
|
|
|
- if (m_MainHWND != NULL)
|
|
|
+ m_is_wending = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //重量没有变化了,说明稳定了
|
|
|
+ if (m_is_wending == false)
|
|
|
{
|
|
|
- PostMessage(m_MainHWND, WM_CHENGZHONG_SUCCESS, 0, 0);
|
|
|
+ //说明目前是从不稳定变为稳定,那么这里可以发起AI识别
|
|
|
+ CDiandanAIShibieWorker::GetInstance()->AddAIShibieTask();
|
|
|
}
|
|
|
+
|
|
|
+ m_is_wending = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (m_hwnd != NULL)
|
|
|
+ {
|
|
|
+ PostMessage(m_hwnd, WM_CHENGZHONG_SUCCESS, 0, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (m_MainHWND != NULL)
|
|
|
+ {
|
|
|
+ PostMessage(m_MainHWND, WM_CHENGZHONG_SUCCESS, 0, 0);
|
|
|
}
|
|
|
}
|
|
|
|