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++

1 year ago
#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));
}
}