184 std::uint32_t notificationSize(
ReadUint32(receivedData.data() + 10));
185 std::uint32_t newValueSize = notificationSize - 28;
186 if (newValueSize < 1)
190 std::uint32_t targetOno(
ReadUint32(receivedData.data() + 14));
195 std::uint16_t methodDefLevel(
ReadUint16(receivedData.data() + 18));
196 if (methodDefLevel < 1)
200 std::uint16_t methodIdx(
ReadUint16(receivedData.data() + 20));
205 std::uint8_t paramCount = receivedData[22];
209 std::uint16_t contextSize(
ReadUint16(receivedData.data() + 23));
212 std::uint32_t emitterOno(
ReadUint32(receivedData.data() + 25 + contextSize));
217 std::uint16_t eventDefLevel(
ReadUint16(receivedData.data() + 29 + contextSize));
218 if (eventDefLevel != 1)
222 std::uint16_t eventIdx(
ReadUint16(receivedData.data() + 31 + contextSize));
227 std::uint16_t propDefLevel(
ReadUint16(receivedData.data() + 33 + contextSize));
228 if (propDefLevel == 0)
232 std::uint16_t propIdx(
ReadUint16(receivedData.data() + 35 + contextSize));
236 const auto parameterData =
ByteVector(receivedData.begin() + 37 + contextSize,
237 receivedData.begin() + 37 + contextSize + newValueSize);
239 return std::make_unique<Ocp1Notification>(emitterOno, propDefLevel, propIdx, paramCount, parameterData);
244 std::uint32_t responseSize(
ReadUint32(receivedData.data() + 10));
245 std::uint32_t parameterDataLength = responseSize - 10;
246 if (responseSize < 10)
250 std::uint32_t handle(
ReadUint32(receivedData.data() + 14));
254 const std::uint8_t status = receivedData[18];
255 const std::uint8_t paramCount = receivedData[19];
257 const auto parameterData = [&receivedData, ¶meterDataLength]() {
258 if (parameterDataLength == 0)
261 return ByteVector(receivedData.begin() + 20, receivedData.end());
263 jassert(parameterData.size() == parameterDataLength);
265 return std::make_unique<Ocp1Response>(handle, status, paramCount, parameterData);
270 std::uint16_t heartbeat(
ReadUint16(receivedData.data() + 10));
272 return std::make_unique<Ocp1KeepAlive>(heartbeat);
283 constexpr std::size_t handleOffset = commandSizeOffset + 4;
284 constexpr std::size_t targetOnoOffset = handleOffset + 4;
285 constexpr std::size_t methodDefLevelOffset = targetOnoOffset + 4;
286 constexpr std::size_t methodIdxOffset = methodDefLevelOffset + 2;
287 constexpr std::size_t paramCountOffset = methodIdxOffset + 2;
288 constexpr std::uint32_t minimumCommandSize = 16;
289 constexpr std::size_t parameterDataOffset = paramCountOffset + 1;
291 const std::uint32_t commandSize(
ReadUint32(receivedData.data() + commandSizeOffset));
292 if (commandSize < minimumCommandSize)
298 std::uint32_t handle(
ReadUint32(receivedData.data() + handleOffset));
299 const bool isInvalidHandle = (handle == 0);
303 const std::uint32_t targetOno(
ReadUint32(receivedData.data() + targetOnoOffset));
304 const bool isInvalidTargetOno = (targetOno == 0);
305 if (isInvalidTargetOno)
308 const std::uint16_t methodDefLevel(
ReadUint16(receivedData.data() + methodDefLevelOffset));
309 const bool isInvalidMethodDefLevel = (methodDefLevel < 1);
310 if (isInvalidMethodDefLevel)
313 const std::uint16_t methodIdx(
ReadUint16(receivedData.data() + methodIdxOffset));
314 const bool isInvalidMethodIdx = (methodIdx < 1);
315 if (isInvalidMethodIdx)
318 const std::uint8_t paramCount = receivedData[paramCountOffset];
320 const auto parameterData = [&receivedData, ¶mCount, ¶meterDataOffset]() {
323 else if(receivedData.begin() + parameterDataOffset >= receivedData.end())
326 return ByteVector(receivedData.begin() + parameterDataOffset, receivedData.end());
329 auto result = std::make_unique<Ocp1CommandResponseRequired>(targetOno, methodDefLevel, methodIdx, paramCount, parameterData);
330 result->SetHandle(handle);
349 serializedData.push_back(
static_cast<std::uint8_t
>(commandSize >> 24));
350 serializedData.push_back(
static_cast<std::uint8_t
>(commandSize >> 16));
351 serializedData.push_back(
static_cast<std::uint8_t
>(commandSize >> 8));
352 serializedData.push_back(
static_cast<std::uint8_t
>(commandSize));
353 serializedData.push_back(
static_cast<std::uint8_t
>(
m_handle >> 24));
354 serializedData.push_back(
static_cast<std::uint8_t
>(
m_handle >> 16));
355 serializedData.push_back(
static_cast<std::uint8_t
>(
m_handle >> 8));
356 serializedData.push_back(
static_cast<std::uint8_t
>(
m_handle));
357 serializedData.push_back(
static_cast<std::uint8_t
>(
m_targetOno >> 24));
358 serializedData.push_back(
static_cast<std::uint8_t
>(
m_targetOno >> 16));
359 serializedData.push_back(
static_cast<std::uint8_t
>(
m_targetOno >> 8));
360 serializedData.push_back(
static_cast<std::uint8_t
>(
m_targetOno));
363 serializedData.push_back(
static_cast<std::uint8_t
>(
m_methodIndex >> 8));
364 serializedData.push_back(
static_cast<std::uint8_t
>(
m_methodIndex));
365 serializedData.push_back(
static_cast<std::uint8_t
>(
m_paramCount));
371 return serializedData;
414 serializedData.push_back(
static_cast<std::uint8_t
>(notificationSize >> 24));
415 serializedData.push_back(
static_cast<std::uint8_t
>(notificationSize >> 16));
416 serializedData.push_back(
static_cast<std::uint8_t
>(notificationSize >> 8));
417 serializedData.push_back(
static_cast<std::uint8_t
>(notificationSize));
418 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno >> 24));
419 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno >> 16));
420 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno >> 8));
421 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno));
422 std::uint16_t methodDefLevel = 3;
423 serializedData.push_back(
static_cast<std::uint8_t
>(methodDefLevel >> 8));
424 serializedData.push_back(
static_cast<std::uint8_t
>(methodDefLevel));
425 std::uint16_t methodIdx = 1;
426 serializedData.push_back(
static_cast<std::uint8_t
>(methodIdx >> 8));
427 serializedData.push_back(
static_cast<std::uint8_t
>(methodIdx));
428 std::uint16_t paramCount = 2;
429 serializedData.push_back(
static_cast<std::uint8_t
>(paramCount));
430 std::uint16_t contextLength = 0;
431 serializedData.push_back(
static_cast<std::uint8_t
>(contextLength >> 8));
432 serializedData.push_back(
static_cast<std::uint8_t
>(contextLength));
433 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno >> 24));
434 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno >> 16));
435 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno >> 8));
436 serializedData.push_back(
static_cast<std::uint8_t
>(
m_emitterOno));
437 std::uint16_t eventDefLevel = 1;
438 serializedData.push_back(
static_cast<std::uint8_t
>(eventDefLevel >> 8));
439 serializedData.push_back(
static_cast<std::uint8_t
>(eventDefLevel));
440 std::uint16_t eventIdx = 1;
441 serializedData.push_back(
static_cast<std::uint8_t
>(eventIdx >> 8));
442 serializedData.push_back(
static_cast<std::uint8_t
>(eventIdx));
451 serializedData.push_back(
static_cast<std::uint8_t
>(1));
453 return serializedData;