16 #include <nn/pia/common/common_PacketDefine.h>
17 #include <nn/pia/common/common_OffsetTreeMap.h>
18 #include <nn/pia/common/common_OffsetList.h>
19 #include <nn/pia/transport/transport_Protocol.h>
20 #include <nn/pia/clone/clone_Definitions.h>
21 #include <nn/pia/clone/clone_SendClone.h>
22 #include <nn/pia/clone/clone_ReceiveClone.h>
23 #include <nn/pia/clone/clone_AtomicSharingClone.h>
24 #include <nn/pia/clone/clone_SequentialSharingClone.h>
36 class CompressDataUnpacker;
45 PIA_PROTOCOL_TYPE_INFO(nn::pia::transport::ProtocolTypeClone);
241 return m_ElementSizeMax;
256 return RegisterClone(SendClone::ToKey(cloneId), pClone);
272 return UnregisterClone(pClone);
288 return UnregisterClone(SendClone::ToKey(cloneId));
299 return static_cast<SendClone*
>(m_CloneCollection.Find(SendClone::ToKey(cloneId)));
310 return static_cast<const SendClone*
>(m_CloneCollection.Find(SendClone::ToKey(cloneId)));
340 return UnregisterClone(pClone);
389 return RegisterClone(AtomicSharingClone::ToKey(cloneId), pClone);
406 return UnregisterClone(pClone);
423 return UnregisterClone(AtomicSharingClone::ToKey(cloneId));
434 return static_cast<AtomicSharingClone*
>(m_CloneCollection.Find(AtomicSharingClone::ToKey(cloneId)));
445 return static_cast<const AtomicSharingClone*
>(m_CloneCollection.Find(AtomicSharingClone::ToKey(cloneId)));
460 return RegisterClone(SequentialSharingClone::ToKey(cloneId), pClone);
476 return UnregisterClone(pClone);
492 return UnregisterClone(SequentialSharingClone::ToKey(cloneId));
503 return static_cast<SequentialSharingClone*
>(m_CloneCollection.Find(SequentialSharingClone::ToKey(cloneId)));
514 return static_cast<const SequentialSharingClone*
>(m_CloneCollection.Find(SequentialSharingClone::ToKey(cloneId)));
538 virtual void CleanupWithStationAddress();
548 virtual Result Dispatch();
563 virtual Result UpdateProtocolEvent(
const transport::ProtocolEvent& event);
585 return static_cast<State>(m_InnerState & StateMask);
760 return m_pSendProfiler;
771 return m_pReceiveProfiler;
970 return m_AckMessageBufferUsedNumMax;
978 virtual void Trace(uint64_t flag)
const;
986 SystemTime GetResendSpan()
const
996 SystemTime GetResendSpanForUnicast(
StationIndex stationIndex)
const
998 return m_ResendSpanForUnicast[stationIndex];
1002 uint32_t GetStationNum()
const
1004 return m_StationNum;
1016 return m_LocalStationIndex;
1018 uint32_t GetParticipantBitmap()
const
1020 return m_ParticipantBitmap;
1022 SystemTime GetSystemTime()
const
1024 return m_SystemTime;
1026 uint32_t GetDispatchCount()
const
1028 return m_DispatchCount;
1031 void ErrorEventDropped()
1037 uint32_t GetValidStationBitmap()
const
1039 return m_ValidStationBitmap;
1042 uint32_t GetNoticeParticipationBitmap()
const
1044 return m_NoticeParticipationBitmap;
1047 bool IsBroadcastSupported()
const
1049 return m_IsBroadcastSupported;
1055 return (m_StationNum > 0);
1057 bool IsInCommunication()
const
1071 InnerState GetInnerState()
const
1073 return m_InnerState;
1076 void UpdateCloneState();
1078 void UpdateResendSpan();
1079 SystemTime CalcResendSpan(
int rtt)
const;
1081 void ReceiveMessages();
1082 void ReceiveMessage(
StationIndex src,
const void* cpMessage, uint32_t size);
1083 bool CheckReceivedMessageDestStationBitmap(
const void* cpMessage);
1084 bool UpdateReceivedMessageSequentialId(
StationIndex src,
const void* cpMessage);
1086 void SerializeMessage(
void* pMessage, uint32_t messageSize, uint32_t noCompressedMessageSize, uint8_t* serializedMessageBuf, uint32_t* serializedMessageSize, uint32_t* noCompressedSerializedMessageSize);
1087 template <
typename MessageStruct>
1088 void SerializeMessageCore(
void* pMessage, uint8_t* serializedMessageBuf, uint32_t* headerSize, uint32_t* serializedHeaderSize);
1089 void CalcSerializedMessageSize(
void* pMessage, uint32_t messageSize, uint32_t noCompressedMessageSize, uint32_t* serializedMessageSize, uint32_t* noCompressedSerializedMessageSize);
1090 bool SendUnicastMessage(
StationIndex dest,
void* pMessage, uint32_t messageSize, uint32_t noCompressedMessageSize,
bool isSystem);
1091 bool SendBroadcastMessage(uint32_t destBitmap,
void* pMessage, uint32_t messageSize, uint32_t noCompressedMessageSize,
bool isSystem);
1092 void SetSequentialIdToMessage(
void* pMessage);
1093 void SetDestStationBitmapToMessage(
void* pMessage, uint16_t destStationBitmap);
1098 bool SendBroadcastClockAndCountAndParticipantCloneCommand(
StationIndex dest, CloneBase::Type cloneType,
StationIndex cloneStationIndex,
CloneBase::Id cloneId, uint8_t command,
ClockValue clock, uint8_t count, uint32_t participantBitmap);
1100 void UpdateSystemTime();
1102 void SendClockRequest();
1103 void ReceiveClockRequest(
StationIndex src,
const void* cpMessage, uint32_t size);
1104 void ReceiveClockReplyMessage(
StationIndex src,
const void* cpMessage, uint32_t size);
1106 void NoticeParticipation();
1107 void ReceiveEnterMessage(
StationIndex src,
const void* cpMessage, uint32_t size);
1108 void ReceiveExitMessage(
StationIndex src,
const void* cpMessage, uint32_t size);
1109 void ReceiveEnterAckMessage(
StationIndex src,
const void* cpMessage, uint32_t size);
1110 void ReceiveExitAckMessage(
StationIndex src,
const void* cpMessage, uint32_t size);
1112 struct DispatchCountData
1117 m_MyCount = InvalidDispatchCount;
1118 m_ReceivedCount = 0;
1121 uint16_t m_ReceivedCount;
1125 uint32_t m_ElementSizeMax;
1127 uint32_t m_StationNum;
1129 uint32_t m_ValidStationBitmap;
1130 uint32_t m_ParticipantBitmap;
1131 InnerState m_InnerState;
1135 SystemTime m_SystemTime;
1136 SystemTime m_ResendSpan;
1138 float m_ResendSpanRatio;
1139 float m_MillisecondsPerFrame;
1140 int m_MillisecondsPerFrameSamplingNum;
1141 static const int MillisecondsPerFrameSamplingNumMax = 10;
1142 common::Time m_MillisecondsPerFramePreTime;
1144 SystemTime m_LastUpdateResendSpanTime;
1145 SystemTime m_LastParticipationCommandTime;
1146 SystemTime m_LastClockCommandTime;
1148 uint32_t m_SendPeriod;
1150 static const SystemTime DefaultResendSpan = 500;
1152 uint32_t m_DispatchCount;
1153 DispatchCountData* m_paReceivedDispatchCount;
1154 static const uint32_t CheckDispatchCount = 0x00003fff;
1157 static const uint32_t InvalidDispatchCount = 0xffffffff;
1165 uint32_t m_NoticeParticipationBitmap;
1168 Result RegisterClone(CloneBase::Key key, CloneBase* pClone);
1169 Result UnregisterClone(CloneBase::Key key);
1170 Result UnregisterClone(CloneBase* pClone);
1172 typedef common::OffsetTreeMap<CloneBase::Key, CloneBase> CloneCollection;
1173 CloneCollection m_CloneCollection;
1177 void AddSendCommand(CloneBase::CommandToken* pToken);
1178 void CancelSendCommand(CloneBase::CommandToken* pToken);
1182 uint32_t SendCommandCore(CloneBase::CommandToken* pToken,
bool isUnicast, uint32_t destBitmap,
void* pMessage, uint32_t messageSize);
1184 typedef common::OffsetList<CloneBase::CommandToken> CommandTokenList;
1185 CommandTokenList m_SendCommandTokenList;
1186 CommandTokenList m_ResendCommandTokenList;
1189 void AddSendData(CloneBase::DataToken* pToken);
1190 void CancelSendData(CloneBase::DataToken* pToken);
1195 bool SendCloneData(CloneBase::DataToken* pToken);
1196 void ReceiveData(
StationIndex src, CloneBase* pClone,
const void* cpMessage, uint32_t messageSize);
1198 typedef common::OffsetList<CloneBase::DataToken> DataTokenList;
1199 DataTokenList m_DataTokenList;
1201 struct DataMessageBuffer
1210 uint32_t m_DestBitmap;
1212 uint16_t m_NoCompressedSize;
1214 uint8_t m_Message[common::ProtocolMessgaePayloadSizeMax + MessageHeaderSerializeDiffSizeMax];
1217 DataMessageBuffer m_DataMessageBuffer;
1218 IDataPacker* m_pDataPacker;
1219 IDataUnpacker* m_pDataUnpacker;
1220 CompressDataUnpacker* m_pCompressedDataUnpacker;
1227 return m_ClockPriorityJudgeFunction;
1239 CloneProfilerBase* m_pSendProfiler;
1240 CloneProfilerBase* m_pReceiveProfiler;
1242 uint32_t m_SendMessageSequentialId;
1244 #if NN_PIA_ENABLE_TRACE
1246 struct MessageHeaderForDebug
1248 uint8_t m_FormatVersion;
1249 uint8_t m_MessageType;
1250 uint16_t m_DispatchCount;
1252 MessageHeaderForDebug m_ReceivedMessageHeaderForDebug[
MaxStationNum];
1256 typedef bool (*ReceiveElementFunction)(CloneElementBase* pElement, IDataPacker* pAckPacker,
const void* cpChunk, uint16_t chunkSize,
CloneElementBase::Id elementId,
StationIndex src,
StationIndex localStationIndex, uint32_t dispatchCount);
1258 class ElementDefinition
1261 ElementDefinition();
1262 void Register(uint16_t type, ReceiveElementFunction receiveFunction, uint32_t dataChunkHeaderSize);
1263 ReceiveElementFunction GetReceiveFunction(uint16_t type)
const;
1264 uint32_t GetDataChunkHeaderSizeMax()
const
1266 return m_DataChunkHeaderSizeMax;
1268 static const uint32_t TypeNum = 16;
1271 ReceiveElementFunction m_aReceiveFunction[TypeNum];
1272 uint32_t m_DataChunkHeaderSizeMax;
1275 static ElementDefinition* GetElementDefinition();
1279 virtual Clock* CreateRtcClock(
float clockPerSec,
float regulationRate);
1280 virtual uint16_t TransportGetMaxStationNum();
1281 virtual uint32_t PayloadSizeManagerGetMtuSize();
1282 virtual uint32_t SignatureManagerGetSignatureSizeMax();
1283 virtual const common::Time& TransportGetDispatchedTime();
1284 virtual int32_t StationGetRtt(
StationIndex stationIndex);
1285 virtual int32_t StationGetRttPulseInterval();
1286 virtual uint32_t PacketHandlerGetPayloadSizeLimit();
1287 virtual bool PacketHandlerSendMessageById(
StationIndex dest,
const void* cpData, uint32_t size);
1288 virtual bool PacketHandlerSendMessageByBitmap(uint32_t destBitmap,
const void* cpData, uint32_t size);
1289 virtual void PacketHandlerReadIterationBegin(
void** ppIterator);
1290 virtual bool PacketHandlerReadIterationIsEnd(
const void* cpIterator);
1291 virtual void PacketHandlerReadIterationNext(
void* pIterator);
1292 virtual void PacketHandlerReadIteratorGet(
StationIndex* pSrc,
const void** cppPayloadPtr, uint32_t* pPayloadSize,
const void* cpIterator);
1295 template <
int TestId,
typename Arg>
1296 static void Test(
const CloneProtocol& obj, Arg* pArg = NULL);
1300 uint32_t m_UpdateCount;
1301 uint32_t m_ResendCount;
1303 uint32_t m_CompCount;
1304 float m_CompRateTotal;
1305 float m_CompAverage;
1306 uint32_t m_SendCount;
1307 uint32_t m_SendDataTotal;
1309 uint32_t m_UpdateCountOffset;
1310 bool m_IsSendProcessNeeded;
1312 bool m_IsBroadcastSupported;
1315 static const uint32_t AckMessageBufferSize = common::ProtocolMessgaePayloadSizeMax + MessageHeaderSerializeDiffSizeMax;
1316 struct AckMessageInfo
1318 uint8_t messageBuffer[AckMessageBufferSize];
1319 uint32_t messageSize;
1320 uint32_t noCompressedMessageSize;
1323 AckMessageInfo* m_pAckMessageInfoArray;
1324 int m_AckMessageBufferNum;
1325 int m_AckMessageBufferHeadIndex;
1326 int m_AckMessageBufferUsedNum;
1327 int m_AckMessageBufferUsedNumMax;
1329 NN_PIA_DISALLOW_COPY(CloneProtocol);