public PEQMessageSubscribe(PEQMessage BaseMessage, VarID SinkID,
     Byte HopCount, PEQSubscriptionInfo SubscriptionInfo)
     : base(BaseMessage._DestinationID, BaseMessage._SenderID, 
       BaseMessage._SequenceNumber)
 {
     _MessageType = 0x01;
     _SinkID = SinkID;
     _HopCount = HopCount;
     _SubscriptionInfo = SubscriptionInfo;
 }
 public PEQMessageResponse(PEQMessage BaseMessage, Byte HopCount, VarID SinkID)
     : base(BaseMessage._DestinationID, BaseMessage._SenderID, 
       BaseMessage._SequenceNumber)
 {
     _MessageType = 0x05;
     _HopCount = HopCount;
     _SinkID = SinkID;
 }
 public PEQMessageSearch(PEQMessage BaseMessage, VarID SinkID)
     : base(BaseMessage._DestinationID, BaseMessage._SenderID, 
       BaseMessage._SequenceNumber)
 {
     _MessageType = 0x04;
     _SinkID = SinkID;
 }
 public PEQMessageBuildTree(PEQMessage BaseMessage, VarID SinkID,
     Byte HopCount)
     : base(BaseMessage._DestinationID, BaseMessage._SenderID, 
       BaseMessage._SequenceNumber)
 {
     _MessageType = 0x00;
     _SinkID = SinkID;
     _HopCount = HopCount;
 }
 public PEQMessageNotify(PEQMessage BaseMessage, VarID SinkID, 
     PEQData Data)
     : base(BaseMessage._DestinationID, BaseMessage._SenderID, 
       BaseMessage._SequenceNumber)
 {
     _MessageType = 0x02;
     _SinkID = SinkID;
     _Data = Data;
 }
 private void processHello(PEQMessage msg)
 {
     VarID neighborID = msg._SenderID;
     if (!_tableNeighbor.Contains(neighborID))
         _tableNeighbor.Add(neighborID);
 }
 /***********************************************\
 |******************* WARNING *******************|
 |***********************************************|
 |* See warning in PEQMessageHello!!             |
 \***********************************************/
 public object Clone()
 {
     PEQMessage outmsg = new PEQMessage(_DestinationID, _SenderID,
         _SequenceNumber, _MessageType);
     outmsg._nextHopCheat = _nextHopCheat;
     return outmsg;
 }
 IInfoReport GeneratePEQNodeInfoReport(bool isSending, PEQMessage msg)
 {
     if (msg is PEQMessageAck)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.ACK);
     if (msg is PEQMessageApplication)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.Application);
     if (msg is PEQMessageBuildTree)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.BuildTree);
     if (msg is PEQMessageHello)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.Hello);
     if (msg is PEQMessageNotify)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.Notify);
     if (msg is PEQMessageResponse)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.Response);
     if (msg is PEQMessageSearch)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.Search);
     if (msg is PEQMessageSubscribe)
         return GeneratePEQNodeInfoReport(isSending, PEQMessageType.Subscribe);
     else return null;
 }
 private void expectAck(PEQMessage msg)
 {
     // Add the ACK info to the ACK Table and create a timer event to kill
     // the neighbor entry upon ACK failure.
     PEQTableEntryMessageAck ackEntry = new
         PEQTableEntryMessageAck(msg._SequenceNumber, msg._DestinationID, msg);
     _tableAck.Add(ackEntry);
     PEQTimerAck ackTimer = new PEQTimerAck(_eventManager.CurrentClock +
         _physicalProcessor.MaximumRange * _TIMER_ACK / _physicalProcessor.PropagationSpeed,
         this, ackEntry);
     _eventManager.AddEvent(ackTimer);
 }
        private void startSearch(VarID SinkID, PEQMessage dataMessage)
        {
            clearTableSearch(SinkID);

            // Set all neighbors to 0xFF hops (unreachable)
            foreach (VarID neighborID in _tableNeighbor)
            {
                PEQTableEntrySearch entry = new PEQTableEntrySearch();
                entry._SinkID = SinkID;
                entry._HopCount = 0xFF;
                entry._DestinationID = neighborID;
                entry._DataMessage = dataMessage;

                _tableSearch.Add(entry);
            }

            sendSearch(SinkID);

            _searchAggregator.IncrementSearches();

            updateRoutingTable();
        }
        private void sendAck(PEQMessage msg)
        {
            if (msg._DestinationID == msg._SenderID)
                return;

            PEQMessageAck ackMessage = new PEQMessageAck(msg._SenderID,
                msg._DestinationID, msg._SequenceNumber);

            ackMessage._nextHopCheat = _location;   // Just add this to all msgs

            PEQTimerMessage timerEvent = new PEQTimerMessage(ackMessage,
                _eventManager.CurrentClock + _TIMER_WAIT_SEND, this);
            _eventManager.AddEvent(timerEvent);
        }
 public PEQTableEntryMessageAck(Byte SequenceNumber, VarID DestinationID, PEQMessage dataMessage)
 {
     _SequenceNumber = SequenceNumber;
     _DestinationID = DestinationID;
     _DataMessage = dataMessage;
 }