private StateChanges PollForMaster()
{
BacnetMstpFrameTypes frame_type;
byte destination_address;
byte source_address;
int msg_length;
while (true)
{
//send
SendFrame(BacnetMstpFrameTypes.FRAME_TYPE_POLL_FOR_MASTER, m_PS);
//wait
GetMessageStatus status = GetNextMessage(T_USAGE_TIMEOUT, out frame_type, out destination_address, out source_address, out msg_length);
if (status == GetMessageStatus.Good)
{
try
{
if (frame_type == BacnetMstpFrameTypes.FRAME_TYPE_REPLY_TO_POLL_FOR_MASTER && destination_address == m_TS)
{
m_sole_master = false;
m_NS = source_address;
m_PS = (byte)m_TS;
m_token_count = 0;
return StateChanges.ReceivedReplyToPFM;
}
else
return StateChanges.ReceivedUnexpectedFrame;
}
finally
{
RemoveCurrentMessage(msg_length);
}
}
else
{
if (m_sole_master)
{
/* SoleMaster */
m_frame_count = 0;
return StateChanges.SoleMaster;
}
else
{
if (m_NS != m_TS)
{
/* DoneWithPFM */
return StateChanges.DoneWithPFM;
}
else
{
if ((m_PS + 1) % (m_max_master + 1) != m_TS)
{
/* SendNextPFM */
m_PS = (byte)((m_PS + 1) % (m_max_master + 1));
continue;
}
else
{
/* DeclareSoleMaster */
m_sole_master = true;
m_frame_count = 0;
return StateChanges.DeclareSoleMaster;
}
}
}
}
}
}