#include "GearModeStructData.h" #include #include #include #include "Utils.h" GearModeStructData::GearModeStructData() : m_prefixLength(1) // 档位等级数量 , m_data(nullptr) { } GearModeStructData::GearModeStructData(GearModeParam_t *data) : m_prefixLength(1) // 档位等级数量 , m_data(nullptr) { setData(data); } GearModeStructData::~GearModeStructData() { if(m_data != nullptr) { m_data->datas.clear(); delete m_data; m_data = nullptr; } } // 从本对象clone一个对象并返回 Data* GearModeStructData::clone() { Data* data = new GearModeStructData(m_data); GearModeStructData *dt = dynamic_cast(data); dt->copyData(m_data); return data; } // 从其他对象复制数据到本对象 void GearModeStructData::copy(Data* data) { GearModeStructData *dt = dynamic_cast(data); if(dt->getData() == nullptr) { return; } if(m_data == nullptr) { m_data = new GearModeParam_t(); } m_data->datas.clear(); std::copy(dt->getData()->datas.begin(), dt->getData()->datas.end(), std::back_inserter(m_data->datas)); } void GearModeStructData::copy(Data& data) { copy(&data); } // 1字节的档位等级数量 // 1字节的档位等级 // 4字节的档位取值 int GearModeStructData::length() { return (m_prefixLength + (1 + 4) * m_data->datas.size()); } std::string GearModeStructData::toStr() { std::stringstream ss; ss << "level count : " << m_data->datas.size() << std::endl; int levelIndex = 0; std::list::iterator iter = m_data->datas.begin(); while(iter != m_data->datas.end()) { ss << "level " << levelIndex << " : " << (*iter).getLevel() << ", value : " << (*iter).getValue() << std::endl; levelIndex++; iter++; } return ss.str(); } // 1. 第1个字节/共1字节: 档位等级数量 // 2. 第2个字节/共1字节: 档位等级 // 3. 第3,4,5,6字节/共4字节:档位取值*10000 // 重复2和3 std::string GearModeStructData::toByteStr() { std::string s; unsigned char nCount = m_data->datas.size() >= 255 ? 255 : m_data->datas.size(); s.append(Utils::charToByteStr(nCount)); std::list::iterator iter = m_data->datas.begin(); while(iter != m_data->datas.end()) { unsigned char level; unsigned int value; level = (*iter).getLevel(); value = (*iter).getValue(); s.append(Utils::charToByteStr(level)); s.append(Utils::intToByteStr(value)); iter++; } return s; } std::string GearModeStructData::toHexStr() { std::string s = toByteStr(); return Utils::strToHexStr(s); } bool GearModeStructData::fromByteStr(std::string str) { if(str.length() < (size_t)m_prefixLength) { return false; } std::string s; s = str.substr(0, 1); unsigned char nCount = Utils::byteStrToChar(s); if(str.length() < (size_t)(m_prefixLength + (1 + 4) * nCount)) { return false; } for(unsigned char i=0; idatas.push_back(param); } return true; } void GearModeStructData::setData(GearModeParam_t* data) { if(m_data != nullptr) { m_data->datas.clear(); delete m_data; m_data = nullptr; } m_data = data; } void GearModeStructData::copyData(GearModeParam_t* data) { if(m_data == nullptr) { m_data = new GearModeParam_t(); } m_data->datas.clear(); std::copy(data->datas.begin(), data->datas.end(), std::back_inserter(m_data->datas)); }