You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

327 lines
9.6 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "BoltModeStructData.h"
#include <sstream>
#include <iomanip>
#include <ctime>
#include "Utils.h"
BoltModeStructData::BoltModeStructData()
: m_data(nullptr)
{
}
BoltModeStructData::BoltModeStructData(BoltModeParam_t *data)
: m_data(nullptr)
{
setData(data);
}
BoltModeStructData::~BoltModeStructData()
{
if(m_data != nullptr)
{
for(int i=0; i<2; i++)
{
m_data->format[i].diameterList.clear();
m_data->format[i].typeList.clear();
m_data->format[i].torqueList.clear();
}
delete m_data;
m_data = nullptr;
}
}
Data* BoltModeStructData::clone()
{
Data* data = new BoltModeStructData();
data->copy(this);
return data;
}
void BoltModeStructData::copy(Data* data)
{
BoltModeStructData *dt = dynamic_cast<BoltModeStructData *>(data);
if(dt->getData() == nullptr)
{
return;
}
if(m_data == nullptr)
{
m_data = new BoltModeParam_t();
}
m_data->name = dt->getData()->name;
for(int i=0; i<2; i++)
{
m_data->format[i].diameterList.clear();
m_data->format[i].typeList.clear();
m_data->format[i].torqueList.clear();
//m_data->format = dt->getData()->format;
std::copy(dt->getData()->format[i].diameterList.begin(), dt->getData()->format[i].diameterList.end(), std::back_inserter(m_data->format[i].diameterList));
std::copy(dt->getData()->format[i].typeList.begin(), dt->getData()->format[i].typeList.end(), std::back_inserter(m_data->format[i].typeList));
std::copy(dt->getData()->format[i].torqueList.begin(), dt->getData()->format[i].torqueList.end(), std::back_inserter(m_data->format[i].torqueList));
}
}
void BoltModeStructData::copy(Data& data)
{
BoltModeStructData *dt = dynamic_cast<BoltModeStructData *>(&data);
if(dt->getData() == nullptr)
{
return;
}
if(m_data == nullptr)
{
m_data = new BoltModeParam_t();
}
m_data->name = dt->getData()->name;
for(int i=0; i<2; i++)
{
m_data->format[i].diameterList.clear();
m_data->format[i].typeList.clear();
m_data->format[i].torqueList.clear();
//m_data->format = dt->getData()->format;
std::copy(dt->getData()->format[i].diameterList.begin(), dt->getData()->format[i].diameterList.end(), std::back_inserter(m_data->format[i].diameterList));
std::copy(dt->getData()->format[i].typeList.begin(), dt->getData()->format[i].typeList.end(), std::back_inserter(m_data->format[i].typeList));
std::copy(dt->getData()->format[i].torqueList.begin(), dt->getData()->format[i].torqueList.end(), std::back_inserter(m_data->format[i].torqueList));
}
}
int BoltModeStructData::length()
{
int length = 0;
length += 10; // 扳手名称
for(int i=0; i<2; i++)
{
length += 1; // 制式
length += 1; // 直径数量
length += 10 * m_data->format[i].diameterList.size(); // 直径名称
length += 1; // 等级数量
length += 10 * m_data->format[i].typeList.size(); // 等级名称
length += 4 * m_data->format[i].diameterList.size() * m_data->format[i].typeList.size(); // 扭矩值
}
return length;
}
std::string BoltModeStructData::toStr()
{
std::stringstream ss;
ss << "name : " << m_data->name << std::endl;
for(int i=0; i<2; i++)
{
//ss << "format : " << ((m_data->format == 0) ? (std::string("公制")) : (std::string("英制"))) << std::endl;
ss << "format : " << ((i == 0) ? std::string("公制") : std::string("英制")) << std::endl;
ss << "diameter : ";
std::list<std::string>::iterator diameterIter = m_data->format[i].diameterList.begin();
while(diameterIter != m_data->format[i].diameterList.end())
{
ss << *diameterIter << ", ";
diameterIter++;
}
ss << std::endl;
std::list<std::string>::iterator typeIter = m_data->format[i].typeList.begin();
while(typeIter != m_data->format[i].typeList.end())
{
ss << *typeIter << ", ";
typeIter++;
}
ss << std::endl;
std::list<int>::iterator torqueIter = m_data->format[i].torqueList.begin();
while(torqueIter != m_data->format[i].torqueList.end())
{
ss << *torqueIter << ", ";
torqueIter++;
}
ss << std::endl;
}
return ss.str();
}
// 1. 0 共 1 字节: 制式
// 2. 1-10 共 10 字节: 扳手名称
// 3. 11 共 1 字节: 直径数量
// 4. 12-21 共10字节直径名称
// 5. 重复4
// 6. 22 共 1 字节:等级数量
// 7. 23-32 共10字节等级名称
// 8. 4 共4字节 扭矩
// 9. 重复 8
std::string BoltModeStructData::toByteStr()
{
std::string s;
// 名称
char name[11];
memset(name, 0, sizeof(name));
memcpy(name, m_data->name.c_str(), m_data->name.length() <= 10 ? m_data->name.length() : 10);
name[10] = '\0';
s.append(name, 10);
for(unsigned char i=0; i<2; i++)
{
// 制式
//s.append(Utils::charToByteStr(m_data->format));
s.append(Utils::charToByteStr(i));
// 螺栓直径数量
unsigned char diameterCount = m_data->format[i].diameterList.size();
s.append(Utils::charToByteStr(diameterCount));
std::list<std::string>::iterator diameterIter = m_data->format[i].diameterList.begin();
while(diameterIter != m_data->format[i].diameterList.end())
{
char diameter[11];
memset(diameter, 0, sizeof(diameter));
memcpy(diameter, (*diameterIter).c_str(), (*diameterIter).length() <= 10 ? (*diameterIter).length() : 10);
diameter[10] = '\0';
s.append(diameter, 10);
diameterIter++;
}
// 螺栓等级数量
unsigned char typeCount = m_data->format[i].typeList.size();
s.append(Utils::charToByteStr(typeCount));
std::list<std::string>::iterator typeIter = m_data->format[i].typeList.begin();
while(typeIter != m_data->format[i].typeList.end())
{
char type[11];
memset(type, 0, sizeof(type));
memcpy(type, (*typeIter).c_str(), (*typeIter).length() <= 10 ? (*typeIter).length() : 10);
type[10] = '\0';
s.append(type, 10);
typeIter++;
}
// 扭矩
// 检查扭矩数量是否正确如果缺少后续补0如果有多调整数量
int torqueCount = m_data->format[i].torqueList.size();
if(torqueCount < diameterCount * typeCount)
{
for(int i=torqueCount; i<diameterCount * typeCount; i++)
{
m_data->format[i].torqueList.push_back(0);
}
}
torqueCount = diameterCount * typeCount;
//s.append(Utils::charToByteStr(torqueCount)); -- 协议中无扭矩数量
std::list<int>::iterator torqueIter = m_data->format[i].torqueList.begin();
int nCount = 0;
while(torqueIter != m_data->format[i].torqueList.end())
{
int torque = *torqueIter;
s.append(Utils::intToByteStr(torque));
nCount++;
if(nCount >= torqueCount)
{
break;
}
torqueIter++;
}
}
return s;
}
std::string BoltModeStructData::toHexStr()
{
std::string s = toByteStr();
return Utils::strToHexStr(s);
}
bool BoltModeStructData::fromByteStr(std::string str)
{
if(str.length() < 13) // 名称10制式1直径数量1型号数量1,。。。制式1直径数量1型号数量1
{
return false;
}
unsigned int pos = 0;
// name
m_data->name = str.substr(pos, 10);
pos += 10;
for(int i=0; i<2; i++)
{
// format
//m_data->format = str.at(pos);
unsigned char format = str.at(pos);
pos++;
// diameter
unsigned char diameterCount = str.at(pos);
pos++;
for(int i = 0; i<diameterCount; i++)
{
std::string diameter = str.substr(pos, 10);
pos += 10;
m_data->format[i].diameterList.push_back(diameter);
}
// type
unsigned char typeCount = str.at(pos);
pos++;
for(int i = 0; i<typeCount; i++)
{
std::string type = str.substr(pos, 10);
pos += 10;
m_data->format[i].typeList.push_back(type);
}
// torque
for(int i=0; i<diameterCount * typeCount; i++)
{
std::string torque = str.substr(pos, 4);
pos += 4;
m_data->format[i].torqueList.push_back(Utils::byteStrToInt(torque));
}
}
return true;
}
void BoltModeStructData::setData(BoltModeParam_t* data)
{
if(m_data != nullptr)
{
delete m_data;
m_data = nullptr;
}
m_data = data;
}
void BoltModeStructData::copyData(BoltModeParam_t* data)
{
if(m_data == nullptr)
{
m_data = new BoltModeParam_t();
}
m_data->name = data->name;
for(int i=0; i<2; i++)
{
m_data->format[i].diameterList.clear();
m_data->format[i].typeList.clear();
m_data->format[i].torqueList.clear();
//m_data->format = data->format;
std::copy(data->format[i].diameterList.begin(), data->format[i].diameterList.end(), std::back_inserter(m_data->format[i].diameterList));
std::copy(data->format[i].typeList.begin(), data->format[i].typeList.end(), std::back_inserter(m_data->format[i].typeList));
std::copy(data->format[i].torqueList.begin(), data->format[i].torqueList.end(), std::back_inserter(m_data->format[i].torqueList));
}
}