/* Learning Net - shlomy boshy 031868912
 * Reinforcement Learning network simulation  
 */
package learnnet;

public class PacketCreator extends Thread {
   /** thread for creating packets in a node */
  
  Node mynode;
  Network NT;  
  
  protected static double msgNum=0;
     /* num of total messages created and sent in the system */
  protected static double totalTime=0;
       /* total delivery time of messages */
  protected static double deliveredMsgNum=0;
  /* num messages delivered to dest */

  
  PacketCreator(Node N,Network NT){
     this.mynode = N; 
     this.NT = NT;
  }
  
  public void run(){
    double msgN;
    Message M=null;
   
     while (!NT.networkStarted){
       try {sleep(50);} catch(InterruptedException e){break;};
     }    
 
     while ((!isInterrupted()) && (msgNum<NT.numMsgParam)){       
       msgN = newMsgNum();       
       M = new Message(null,new String("Msg"+ msgN ));           
       M.sender = mynode; /* will appear on node 'mynode' */
       M.source = mynode;
       
       if (NT.inputPattern.equals("ONEDEST"))
         M.dest = (Node)(NT.elements().nextElement()); /* the first */
       else if (NT.inputPattern.equals("UPLEFTTODOWNRIGHT")) {
          M.sender = (Node)(NT.firstElement()); /* the first */
          M.source = M.sender;
          M.dest = (Node)(NT.lastElement()); /* the last */
         }
        else M.dest = NT.chooseNode();       
        
       while (M.dest == M.sender)
           M.dest = NT.chooseNode();
       M.type = Message.TYPE_DATA; 
       if (Network.Debug_Nodes)
          Network.debugPrint("Packet "+(String)M.Data+" created at node "+M.sender+" with destination "+M.dest+"...");               
           (M.sender).nodeQueue.putMessage(M);   
       try {sleep(50);} catch(InterruptedException e){};
       /* the sleep time controls the network load
        * less sleep time -> higher network load
        */
     }
         if (!NT.packetsEnded) 
              NT.packetsEnded = true;     
     if (Network.Debug_Nodes)
         Network.debugPrint("Packet Creator "+this+" ended.");     
  }
 
 static synchronized double newMsgNum(){
     msgNum ++;
     if (((int)msgNum)%(Network.printEvery)==0)
        Network.debugPrint(msgNum+" messages sent...");
     return msgNum;
   }
   
 static synchronized double getMsgNum(){
     return msgNum;
   }  
   
 static synchronized double addToTotalTime(double time){      
  if (deliveredMsgNum>=Network.startCount)
                  totalTime += time;
    deliveredMsgNum += 1;
    if (((int)deliveredMsgNum)%(Network.printEvery)==0)
        Network.debugPrint(deliveredMsgNum+" messages delivered...");            
    return totalTime;
  }
  
 static synchronized double getAvgTime(){
     return totalTime/(deliveredMsgNum-Network.startCount);
   } 
   
 static synchronized double getDeliveredMsgNum(){
     return deliveredMsgNum;
   }  
}
