package brn.swans.field;


public class TopologyGraph {

//  protected PrintCallback self;
//  
//  protected Field field;
//  
//
//  public TopologyGraph(Field field) {
//    this.field = field;
//    PrintCallback pcb = new PrintCallbackImpl();
//    self = (PrintCallback) JistAPI.proxy(pcb, PrintCallback.class);
//  }
//
//  
//  public interface PrintCallback extends JistAPI.Proxiable {
//    void printTopology(String fileNameBase, long interval);
//  }
//  
//  public class PrintCallbackImpl implements PrintCallback {
//
//    public void printTopology(String fileNameBase, long interval) {
//      TopologyGraph.this.printTopology(fileNameBase, interval);
//    }
//    
//  }
//  
//  /**
//   * Prints the current topology and installs a repeat timer, if interval > 0
//   * 
//   * @param fileName
//   * @param interval
//   */
//  public void printTopology(String fileNameBase, long interval) {
//    String fileName = fileNameBase + "-sense-" + JistAPI.getTime() + ".dot";
//    Graphviz.DiGraph graph = new Graphviz.DiGraph(fileName, 1, 1, true);
//    printTopology(graph, true);
//    graph.write();
//    
//    fileName = fileNameBase + "-comm-" + JistAPI.getTime() + ".dot";
//    graph = new Graphviz.DiGraph(fileName, .1, .1, true);
//    printTopology(graph, false);
//    graph.write();
//
//    if (0 < interval) {
//      JistAPI.sleep(interval);
//      self.printTopology(fileNameBase, interval);
//    }
//  }
//  
//  /**
//   * Connectivity visitor interface.
//   */
//  public class TopologyVisitor 
//      implements Spatial.SpatialTransmitVisitor, Spatial.SpatialVisitor {
//    
//    protected Graphviz.DiGraph graph;
//    
//    protected boolean sense;
//    
//    public TopologyVisitor(DiGraph graph, boolean sense) {
//      super();
//      this.graph = graph;
//      this.sense = sense;
//    }
//
//    public double computeSignal(RadioInfo srcInfo, Location srcLoc, Location dstLoc) {
//      return field.getTransmitVisitor().computeSignal(srcInfo, srcLoc, dstLoc);
//    }
//    
//    public void visitTransmit(RadioInfo srcInfo, Location srcLoc, 
//        RadioInfo dstInfo, RadioInterface dstEntity, Location dstLoc,
//        Message msg, Long durationObj) {
//      if(srcInfo.getUnique().getID()==dstInfo.getUnique().getID()) return;
//      
//      // compute signal strength
//      double loss = field.getPathloss().compute(srcInfo, srcLoc, dstInfo, dstLoc);
//      double fade = field.getFading().compute();
//      double dstPower = srcInfo.getShared().getPower() - loss + fade;
//      
//      // additional cuttoffs
//      double dstPower_mW = Util.fromDB(dstPower);
//      
//      // if(dstPower_mW < shared.getBackground_mW()) return;
//      if(dstPower_mW < (sense
//          ? dstInfo.getShared().getSensitivity_mW()
//          : dstInfo.getShared().getThreshold_mW())) return;
//      
//      graph.addLink(srcInfo.getUnique().getID().toString(), 
//          dstInfo.getUnique().getID().toString(), "" + (int)dstPower);
//    }
//    
//    public void visit(Field.RadioData dst) {
//      graph.addNode(dst.getInfo().getUnique().getID().toString(), 
//          (int)dst.getLoc().getX(), (int)dst.getLoc().getY(), 0);
//      field.getSpatial().visitTransmit(this, dst.getInfo(), dst.getLoc(), 
//          null, null, field.getLimit());
//    }
//  }
//  
//  /**
//   * Compute field connectivity.
//   *
//   * @param sense whether to use radio sensing or reception signal strength
//   * @return field connectivity
//   */
//  protected void printTopology(final Graphviz.DiGraph graph, final boolean sense)
//  {
//    // create new connectivity visitor
//    TopologyVisitor connectivityVisitor = new TopologyVisitor(graph, sense);
//
//    field.getSpatial().visit(connectivityVisitor);
//  }

}
