16 #include <nn/pia/sync/sync_Definitions.h>
18 #include <nn/pia/transport/transport_Protocol.h>
20 #include <nn/pia/transport/transport_ProtocolEvent.h>
21 #include <nn/pia/common/common_PacketDefine.h>
22 #include <nn/pia/transport/transport_Definitions.h>
33 class ZlibUncompressor;
41 class DataMessageHeader;
81 PIA_PROTOCOL_TYPE_INFO(nn::pia::transport::ProtocolTypeSync);
91 static const uint32_t ReservedDataIdNum = 1;
92 static const uint32_t ReservedDataIdChangeDelay =
DataIdNum + 0;
95 static const uint32_t SendSkipMax = 2;
98 static const uint32_t DataFirstSendCount = 3;
209 return static_cast<uint32_t
>(m_MaxDelay);
219 return static_cast<uint32_t
>(m_Delay);
230 return static_cast<uint32_t
>(m_TimeoutFrame);
306 Result Start(uint32_t usingDataIdBitmap, uint32_t delay, uint32_t sendPeriod);
554 return this->
GetData(stationId, dataId, pBuffer, 0);
611 uint32_t GetReceivedDataNum(
StationId stationId)
const;
628 int32_t EstimateLeadingFrameNum(
StationId stationId, uint32_t frameRate)
const;
694 uint32_t GetMaxFrameOffsetDecidedIfNoDataFrameOrNot()
const;
721 Result StepWithoutSetData();
736 Result EndSetDataInNoProcessFrame();
744 int32_t GetSetDataOffset()
746 return m_SetDataOffset;
755 void SetUsingReceivedDataCheck(
bool isUsingReceivedDataCheck);
779 virtual void CleanupWithStationAddress();
789 virtual Result Dispatch();
804 virtual Result UpdateProtocolEvent(
const transport::ProtocolEvent& event);
813 virtual void Trace(uint64_t flag)
const;
819 MessageType_Start = 0x01,
820 MessageType_End = 0x02,
821 MessageType_StartEnd = 0x03,
822 MessageType_EndAlone = 0x04,
823 MessageType_StartAck = 0x11,
824 MessageType_EndAck = 0x12,
825 MessageType_StartEndAck = 0x13,
826 MessageType_EndAloneAck = 0x14,
827 MessageType_Data = 0x21,
828 MessageType_CompressedData = 0x22
846 uint32_t usingDataIdBitmap;
848 uint32_t preparedFrameNo;
849 uint32_t receivedDataBitmap;
851 uint32_t lastReceiveStepCount;
853 bool isEndAloneCalled;
855 bool isEndedAloneInCurrentSession;
858 bool IsInitialized()
const
860 return (m_StationNum > 0);
862 bool IsInCommunication()
const
869 void DispatchReceive();
870 void ReceiveStartMessage(
StationIndex stationIndex, uint16_t syncId, uint32_t usingDataIdBitmap, int32_t delay, uint16_t connectedStationBitmap);
871 void ReceiveEndMessage(
StationIndex stationIndex, uint16_t syncId);
872 void ReceiveStartEndMessage(
StationIndex stationIndex, uint16_t syncId);
873 void ReceiveEndAloneMessage(
StationIndex stationIndex, uint16_t syncId, uint32_t endFrameNo);
874 void ReceiveStartAckMessage(
StationIndex stationIndex, uint16_t syncId);
875 void ReceiveEndAckMessage(
StationIndex stationIndex, uint16_t syncId);
876 void ReceiveEndAloneAckMessage(
StationIndex stationIndex, uint16_t syncId);
877 void ReceiveDataMessage(
StationIndex stationIndex, uint16_t syncId,
const void* payloadPtr, uint32_t size,
bool isCompressedData);
880 bool SendCommand(
StationIndex stationIndex,
int type, uint16_t syncId = 0);
881 bool SendCommandMulti(uint32_t destBmp,
int type);
883 void ResetSendDataFrameNo();
884 bool CreateDataChunk(uint32_t* pSize,
bool isDisableDataCompressionForced =
false);
886 void UpdatePreparedFrameNo();
887 void UpdateReceivedDataBitmap();
888 bool IsAllReceivedData(uint32_t sendDataFrameNo);
890 uint64_t MakeSendFrameBitmap(uint32_t dataFirstSendCount)
const;
891 bool IsFrameNoSendNeeded(uint32_t sendDataFrameNo);
892 uint32_t* GetSendProcessCountPtr(uint32_t frameNo)
894 return &m_paSendProcessCnt[GetDataBufferIdx(m_LocalStationIndex, frameNo)];
898 const StationInfo* GetStationInfo(
StationIndex stationIndex)
const
900 return const_cast<SyncProtocol*
>(
this)->GetStationInfo(stationIndex);
903 int GetDataBufferIdx(
StationIndex stationIndex, uint32_t frameNo)
const;
905 uint32_t* GetValidDataFlag(
StationIndex stationIndex, uint32_t frameNo)
907 return &m_paValidDataFlag[stationIndex * m_BufferFrameNum + GetDataBufferIdx(stationIndex, frameNo)];
909 const uint32_t* GetValidDataFlag(
StationIndex stationIndex, uint32_t frameNo)
const
911 return const_cast<SyncProtocol*
>(
this)->GetValidDataFlag(stationIndex, frameNo);
914 uint32_t* GetNoDataFrameFlag(uint32_t frameNo)
916 return &m_paNoDataFrameFlag[GetDataBufferIdx(m_LocalStationIndex, frameNo)];
918 const uint32_t* GetNoDataFrameFlag(uint32_t frameNo)
const
920 return const_cast<SyncProtocol*
>(
this)->GetNoDataFrameFlag(frameNo);
923 void* GetDataBuffer(
StationIndex stationIndex, uint32_t frameNo, uint32_t dataId)
925 PIA_ASSERT(dataId <
DataIdNum + ReservedDataIdNum);
926 return &m_pDataBuffer[(stationIndex * m_BufferFrameNum + GetDataBufferIdx(stationIndex, frameNo)) * m_TotalDataSize + m_DataInfo[dataId].offset];
928 const void* GetDataBuffer(
StationIndex stationIndex, uint32_t frameNo, uint32_t dataId)
const
930 return const_cast<SyncProtocol*
>(
this)->GetDataBuffer(stationIndex, frameNo, dataId);
934 Result ChangeDelay(uint32_t newDelay);
935 bool IsChangeDelayEnabled()
const
937 return m_DataInfo[ReservedDataIdChangeDelay].size != 0;
942 void CheckEndedAlone();
944 uint16_t CalcConnectedStationBitmap()
const;
950 return this->
GetData(stationIndex, dataId, pBuffer, 0);
952 Result
GetData(
StationIndex stationIndex, uint32_t dataId,
void* pBuffer, uint32_t frameOffset)
const;
955 void RegisterDataMessageHeader(DataMessageHeader* pDMH, MessageType messageType);
958 uint32_t m_StationNum;
963 static const uint32_t MessageBufferSize = common::ProtocolMessgaePayloadSizeMax /
sizeof(uint32_t) *
sizeof(uint32_t);
965 uint32_t m_MessageBuffer[MessageBufferSize /
sizeof(uint32_t)];
966 uint32_t* m_pCompressedMessageBuffer;
968 StationInfo* m_paStationInfo;
969 uint32_t* m_paValidDataFlag;
970 uint32_t* m_paNoDataFrameFlag;
971 uint8_t* m_pDataBuffer;
972 int32_t* m_pDelayBuffer;
978 } m_DataInfo[
DataIdNum + ReservedDataIdNum];
980 uint32_t m_TotalDataSize;
984 int32_t m_BufferFrameNum;
985 uint32_t m_SendPeriod;
986 int32_t m_TimeoutFrame;
988 uint32_t m_CurrentFrameNo;
989 uint32_t m_PreparedFrameNo;
990 uint32_t m_ReceivedDataBitmap;
991 bool m_IsUsingReceivedDataCheck;
993 int32_t m_CurrentDataBufferIdx;
997 uint32_t m_StepCount;
998 uint32_t m_StepCountOffset;
999 bool m_IsSendStartNeeded;
1000 bool m_IsSendEndNeeded;
1001 bool m_IsSendEndAloneNeeded;
1002 uint32_t m_ParticipantBmp;
1003 uint32_t m_SendStartDestBmp;
1004 uint32_t m_SendEndDestBmp;
1005 uint32_t m_SendEndAloneDestBmp;
1006 uint32_t m_SendDataFrameNo;
1007 uint32_t m_SendDataId;
1008 bool m_IsResetSendDataFrameNoNeeded;
1012 uint32_t m_ChangeDelayRequestFrameNo;
1015 int32_t m_SetDataOffset;
1018 bool m_IsStepWithoutSetData;
1021 bool m_IsDataCompressionEnabled;
1022 uint32_t m_DataCompressionLevel;
1023 static const uint32_t ZlibCompressorWindowBits = 12;
1024 static const uint32_t ZlibCompressorMemLevel = 5;
1025 #if defined(NN_BUILD_TARGET_PLATFORM_ADDRESS_64) && NN_BUILD_TARGET_PLATFORM_ADDRESS_64 || NN_PIA_B
1029 static const uint32_t ZlibCompressorWorkMemorySize = 38704;
1031 static const uint32_t ZlibCompressorWorkMemorySize = 38596;
1033 common::ZlibCompressor* m_pZlibCompressor;
1034 uint32_t* m_paZlibCompressorMemory;
1035 common::ZlibUncompressor* m_pZlibUncompressor;
1036 uint32_t* m_paZlibUncompressorMemory;
1039 uint32_t m_SendSkipMax;
1040 uint32_t m_SendSkip;
1041 uint32_t m_SameDataCount;
1042 uint32_t m_PreSendFrameNoMin;
1043 uint32_t m_PreSendFrameNoMax;
1046 uint32_t* m_paSendProcessCnt;
1047 uint32_t m_SendProcessFrameNoMin;
1048 uint32_t m_SendProcessFrameNoMax;
1049 uint32_t m_DataFirstSendCount;
1050 uint64_t m_SendFrameBitmap;
1053 uint8_t m_MonitoringMinDelay;
1054 uint8_t m_MonitoringMaxDelay;
1055 uint8_t m_MonitoringMinSendPeriod;
1056 uint8_t m_MonitoringMaxSendPeriod;
1057 uint32_t m_MonitoringStepCount;
1058 uint32_t m_MonitoringPreSendFrameNoMaxBuf;
1059 uint32_t m_MonitoringResendCountedFrameNoMax;
1060 uint8_t m_MonitoringResendFrameCnt;
1061 uint8_t m_MonitoringMaxResendFrameNum;