#include "XNDDSInterface.h" #include "XNObject_p.h" #include using json = nlohmann::json; XNByteArray XNDDSInterface::getUDPPackage() { XNByteArray result; size_t currentPos = 0; // 复制头部 result.append(header, headerSize); currentPos = headerSize; // 复制数据 { std::lock_guard lock(dataMutex); for (auto func : getByteArrayFunction) { XNByteArray byteArray = func(); size_t byteArraySize = byteArray.size(); if (currentPos + byteArraySize <= MAX_UDP_PACKET_SIZE) { result.append(byteArray); currentPos += byteArraySize; // 使用实际返回的字节数组大小 } else { break; // 超出最大包大小 } } } // 更新包大小 if (currentPos >= 8 && currentPos < MAX_UDP_PACKET_SIZE) { result[6] = static_cast((currentPos >> 8) & 0xFF); result[7] = static_cast(currentPos & 0xFF); } return result; } void XNDDSInterface::setDataByUDPPackage(const XNByteArray &package) { if (package.size() < headerSize) { return; } // 获取包大小 uint16_t packageSize = (package[6] << 8) | package[7]; if (packageSize > MAX_UDP_PACKET_SIZE) { return; } uint32_t currentPos = 8; // 设置数据 { std::lock_guard lock(outDataMutex); clearOutData(); for (auto &func : setByteArrayFunction) { func(package, currentPos); } } sendOutData(); } std::unordered_map XNDDSInterface::getStringData(std::vector varNames) { std::unordered_map result; { std::lock_guard lock(dataMutex); for (const auto &varName : varNames) { auto it = getDataFunction.find(varName); if (it == getDataFunction.end()) { continue; } result[varName] = it->second(); } } return result; } void XNDDSInterface::setDataByString(std::unordered_map data) { std::lock_guard lock(outDataMutex); clearOutData(); for (const auto &[varName, value] : data) { auto it = setDataFunction.find(varName); if (it == setDataFunction.end()) { continue; } it->second(value); } sendOutData(); }