package com.aelitis.azureus.core.speedmanager.impl.v2; import com.aelitis.azureus.core.util.average.AverageFactory; import com.aelitis.azureus.core.util.average.Average; import com.aelitis.azureus.core.speedmanager.SpeedManagerPingSource; /** * Created on May 8, 2007 * Created by Alan Snyder * Copyright (C) 2007 Aelitis, All Rights Reserved. * <p/> * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * <p/> * AELITIS, SAS au capital de 63.529,40 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. */ /** * Keeps the ping time stats for a single source. Should calculate averages for the data. * */ public class PingSourceStats { final SpeedManagerPingSource source; double currPing; Average shortTerm = AverageFactory.MovingImmediateAverage( 3 ); Average medTerm = AverageFactory.MovingImmediateAverage( 6 ); Average longTerm = AverageFactory.MovingImmediateAverage( 10 ); Average forChecks = AverageFactory.MovingImmediateAverage( 100 ); public PingSourceStats(SpeedManagerPingSource _source){ source = _source; } public void madeChange(){ //want to make all the values NAN until it is ready to compare again. } public void addPingTime(int ping){ currPing = (double) ping; shortTerm.update( (double)ping ); medTerm.update( (double)ping ); longTerm.update( (double)ping ); } /** * Speculative method to see if it can determine a trend. The larger the number * the stronger the trend. * @return current - interger. A positive number is an increasing trend. A negative number is a decreasing trend. */ public int getTrend(){ int retVal = 0; //based on current ping values. if(currPing<0.0){ retVal--; }else{ if( currPing < shortTerm.getAverage() ){ retVal++; }else{ retVal--; } if( currPing < medTerm.getAverage() ){ retVal++; }else{ retVal--; } if( currPing < longTerm.getAverage() ){ retVal++; }else{ retVal--; } } //compare shortTerm and medium term averages. if(shortTerm.getAverage() < medTerm.getAverage() ){ retVal++; }else{ retVal--; } //compare short-term with long term. if(shortTerm.getAverage() < longTerm.getAverage() ){ retVal++; }else{ retVal--; } //compare medium-term with long-term. if(medTerm.getAverage() < longTerm.getAverage() ){ retVal++; }else{ retVal--; } //modify results based on absolute ping values. final int ABSOLUTE_GOOD_PING_VALUE = 30; if(currPing<ABSOLUTE_GOOD_PING_VALUE){ retVal++; } if(shortTerm.getAverage()<ABSOLUTE_GOOD_PING_VALUE){ retVal++; } if(medTerm.getAverage()<ABSOLUTE_GOOD_PING_VALUE){ retVal++; } if(longTerm.getAverage()<ABSOLUTE_GOOD_PING_VALUE){ retVal++; } //modify results based on absolute ping values that are too long. final int ABSOLUTE_BAD_PING_VALUE = 300; if(currPing>ABSOLUTE_BAD_PING_VALUE){ retVal--; } if(shortTerm.getAverage()>ABSOLUTE_BAD_PING_VALUE){ retVal--; } if(medTerm.getAverage()>ABSOLUTE_BAD_PING_VALUE){ retVal--; } if(longTerm.getAverage()>ABSOLUTE_BAD_PING_VALUE){ retVal--; } return retVal; }//getTrend /** * Get the long-term average. * @return Average - longTerm */ public Average getLongTermAve(){ return longTerm; } /** * Get the average that should be used for checking ping times. * @return - ping time of history. */ public Average getHistory(){ return forChecks; } }