content: package com.android.internal.os;
  
  import android.content.Context;
  import android.util.Log;
  import edu.berkeley.cs.amplab.carat.android.sampling.SamplingLibrary;
  
  public class PowerProfileHelper {
      public static PowerProfile powCal = null;
      private static final String TAG = "Carat.PowerProfileHelper";
      
      public static double getBatteryCapacity(Context context){        
           if (powCal == null)
               powCal=new PowerProfile(context);
          return powCal.getBatteryCapacity();
      }
  
    public static double getAverageBluetoothPower(Context context){
        if (powCal == null)
            powCal=new PowerProfile(context);
          
          double bluetoothOnCost=powCal.getAveragePower(PowerProfile.POWER_BLUETOOTH_ON);
          Log.i("bluetoothOnCost", "Bluetooth on cost is:"+bluetoothOnCost); 
          double bluetoothActiveCost=powCal.getAveragePower(PowerProfile.POWER_BLUETOOTH_ACTIVE);
         // double bluetoothAtcmdCost=powCal.getAveragePower(PowerProfile.POWER_BLUETOOTH_AT_CMD);
          Log.i("bluetoothActiveCost", "Bluetooth active cost is:"+bluetoothActiveCost);
          double alpha = 0.5;
          double bluetoothPowerCost=bluetoothOnCost*alpha+bluetoothActiveCost*(1-alpha);
          Log.i("bluetoothPowerConsumption", "Bluetooth power consumption is:"+bluetoothPowerCost); 
          return bluetoothPowerCost;   
      }
      
      public static double getAverageWifiPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          
          //double wifiScanCost=powCal.getAveragePower(PowerProfile.POWER_WIFI_SCAN);
          double wifiOnCost=powCal.getAveragePower(PowerProfile.POWER_WIFI_ON);
          Log.i("wifiOnCost", "Wifi on cost is:"+wifiOnCost);
          double wifiActiveCost=powCal.getAveragePower(PowerProfile.POWER_WIFI_ACTIVE);
          Log.i("wifiActiveCost", "Wifi active cost is:"+wifiActiveCost);
          
          double alpha = 0.5;
          double wifiPowerCost=wifiOnCost*alpha+wifiActiveCost*(1-alpha);
          Log.i("wifiPowerConsumption", "Wifi power consumption is:"+wifiPowerCost); 
          return wifiPowerCost;   
      }
      
      public static double getAverageGpsPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          double gpsOnCost=powCal.getAveragePower(PowerProfile.POWER_GPS_ON);
          Log.i("gpsPowerConsumption", "Gps power consumption is:"+gpsOnCost);
          return gpsOnCost;   
      }
      
      public static double [] getAverageCpuPower(Context context){
          double result[]=new double[3];
          if (powCal == null)
              powCal=new PowerProfile(context);
          double cpuActiveCost=powCal.getAveragePower(PowerProfile.POWER_CPU_ACTIVE);
          double cpuIdleCost=powCal.getAveragePower(PowerProfile.POWER_CPU_IDLE);
          double cpuAwakeCost=powCal.getAveragePower(PowerProfile.POWER_CPU_AWAKE);
          
          result[0]=cpuActiveCost;
          result[1]=cpuIdleCost;
          result[2]=cpuAwakeCost;
          Log.i("cpuPowerConsumption", "When cpu is active:\n"+cpuActiveCost);
          Log.i("cpuPowerConsumption", "When cpu is idle:\n"+cpuIdleCost);
          Log.i("cpuPowerConsumption", "When cpu is awake:\n"+cpuAwakeCost);
          return result;   
      }
  
      public static double getAverageScreenPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          double screenCost=0;
          double screenOnCost=powCal.getAveragePower(PowerProfile.POWER_SCREEN_ON);
          
          if(SamplingLibrary.getScreenBrightness(context)==255){
              screenCost=powCal.getAveragePower(PowerProfile.POWER_SCREEN_FULL);
          }
          else{
              double curBrightness=SamplingLibrary.getScreenBrightness(context);
              screenCost=curBrightness/255.0*powCal.getAveragePower(PowerProfile.POWER_SCREEN_FULL);
          }
          
          double screenPowerCost=screenOnCost+screenCost;
          
          Log.i("screenPowerConsumption", "Screen power consumption is:"+screenPowerCost); 
          return screenPowerCost;   
      }
      
      public static double getAverageScreenOnPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          double screenOnCost=powCal.getAveragePower(PowerProfile.POWER_SCREEN_ON);
          return screenOnCost;   
      }
      
      public static double getAverageVideoPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          double videoOnCost=powCal.getAveragePower(PowerProfile.POWER_VIDEO);
          Log.i("videoPowerConsumption", "Video power consumption is:"+videoOnCost);
          return videoOnCost;
      }
      
      public static double getAverageAudioPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          double audioOnCost=powCal.getAveragePower(PowerProfile.POWER_AUDIO);
          Log.i("audioPowerConsumption", "Audio power consumption is:"+audioOnCost);
          return audioOnCost;   
      }
      
      public static double getAverageRadioPower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          
          //double radioScanCost=powCal.getAveragePower(PowerProfile.POWER_RADIO_SCANNING);
          double radioOnCost=powCal.getAveragePower(PowerProfile.POWER_RADIO_ON);
          double radioActiveCost=powCal.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE);
          
          double radioPowerCost=radioOnCost*0.05+radioActiveCost*0.05;
          Log.i("radioPowerConsumption", "Radio power consumption is:"+radioPowerCost); 
          return radioPowerCost;   
      }
      
      public static void printAverageFeaturePower(Context context){
          if (powCal == null)
              powCal=new PowerProfile(context);
          
          /**
           * Power consumption when CPU is in power collapse mode.
           */
          double powerCpuActive=powCal.getAveragePower(PowerProfile.POWER_CPU_ACTIVE);
          /**
           * Power consumption when CPU is awake (when a wake lock is held).  This
           * should be 0 on devices that can go into full CPU power collapse even
           * when a wake lock is held.  Otherwise, this is the power consumption in
           * addition to POWER_CPU_IDLE due to a wake lock being held but with no
           * CPU activity.
           */
          double powerCpuAwake=powCal.getAveragePower(PowerProfile.POWER_CPU_AWAKE);
          /**
           * Power consumption when CPU is in power collapse mode.
           */
          double powerCpuIdle=powCal.getAveragePower(PowerProfile.POWER_CPU_IDLE);
          /**
           * Power consumption when Bluetooth driver is on.
           */
          double powerBluetoothOn=powCal.getAveragePower(PowerProfile.POWER_BLUETOOTH_ON);
          /**
           * Power consumption when Bluetooth driver is transmitting/receiving.
           */
          double powerBluetoothActive=powCal.getAveragePower(PowerProfile.POWER_BLUETOOTH_ACTIVE);
          /**
           * Power consumption when Bluetooth driver gets an AT command.
           */
          double powerBluetoothAtCommand=powCal.getAveragePower(PowerProfile.POWER_BLUETOOTH_AT_CMD);
          /**
           * Power consumption when cell radio is on but not on a call.
           */
          double powerRadioOn=powCal.getAveragePower(PowerProfile.POWER_RADIO_ON);
          /**
           * Power consumption when talking on the phone.
           */
          double powerRadioActive=powCal.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE);
          /**
           * Power consumption when cell radio is hunting for a signal.
           */
          double powerRadioScanning=powCal.getAveragePower(PowerProfile.POWER_RADIO_SCANNING);
          /**
           * Power consumption when screen is on, not including the backlight power.
           */
          double powerScreenOn=powCal.getAveragePower(PowerProfile.POWER_SCREEN_ON);
          /**
           * Power consumption at full backlight brightness. If the backlight is at
           * 50% brightness, then this should be multiplied by 0.5
           */
          double powerScreenFull=powCal.getAveragePower(PowerProfile.POWER_SCREEN_FULL);
          /**
           * Power consumption when GPS is on.
           */
          double powerGpsOn=powCal.getAveragePower(PowerProfile.POWER_GPS_ON);
          /**
           * Power consumption when WiFi driver is on.
           */
          double powerWifiOn=powCal.getAveragePower(PowerProfile.POWER_WIFI_ON);
          /**
           * Power consumption when WiFi driver is transmitting/receiving.
           */
          double powerWifiActive=powCal.getAveragePower(PowerProfile.POWER_WIFI_ACTIVE);
          /**
           * Power consumption when WiFi driver is scanning for networks.
           */
          double powerWifiScan=powCal.getAveragePower(PowerProfile.POWER_WIFI_SCAN);
          /**
           * Power consumed by any media hardware when playing back video content. This is in addition
           * to the CPU power, probably due to a DSP.
           */
          double powerVideoOn=powCal.getAveragePower(PowerProfile.POWER_VIDEO);
          /**
           * Power consumed by the audio hardware when playing back audio content. This is in addition
           * to the CPU power, probably due to a DSP and / or amplifier.
           */
          double powerAudioOn=powCal.getAveragePower(PowerProfile.POWER_AUDIO);
          /**
           * Battery capacity in milliAmpHour (mAh).
           */
          double batteryCapacity=powCal.getBatteryCapacity();
          
          Log.i(TAG, "Power consumption when CPU is active"+powerCpuActive);
          Log.i(TAG, "Power consumption when CPU is awake"+powerCpuAwake);
          Log.i(TAG, "Power consumption when CPU is idle"+powerCpuIdle);
          Log.i(TAG, "Power consumption when bluetooth is on "+powerBluetoothOn);
          Log.i(TAG, "Power consumption when bluetooth is active "+powerBluetoothActive);
          Log.i(TAG, "Power consumption when bluetooth is at command "+powerBluetoothAtCommand);
          Log.i(TAG, "Power consumption when radio is on "+powerRadioOn);
          Log.i(TAG, "Power consumption when radio is active "+powerRadioActive);
          Log.i(TAG, "Power consumption when radio is scanning"+powerRadioScanning);
          Log.i(TAG, "Power consumption when screen is on "+powerScreenOn);
          Log.i(TAG, "Power consumption when screen is full "+powerScreenFull);
          Log.i(TAG, "Power consumption when Gps is on "+powerGpsOn);
          Log.i(TAG, "Power consumption when wifi is on "+powerWifiOn);
          Log.i(TAG, "Power consumption when wifi is active "+powerWifiActive);
          Log.i(TAG, "Power consumption when wifi is scanning "+powerWifiScan);
          Log.i(TAG, "Power consumption when video is on "+powerVideoOn);
          Log.i(TAG, "Power consumption when audio is on "+powerAudioOn);
          Log.i(TAG, "Battery capacity is "+batteryCapacity);
      }
      
      public static double bluetoothBenefit(Context context){
          double bluetoothPowerCost=getAverageBluetoothPower(context);
          Log.d("bluetoothPowerCost", "Bluetooth power cost: " + bluetoothPowerCost);
          double batteryCapacity=getBatteryCapacity(context);
          Log.d("batteryCapacity", "Battery capacity: " + batteryCapacity);
          
          double benefit=batteryCapacity/bluetoothPowerCost;
          Log.d("BluetoothPowerBenefit", "Bluetooth power benefit: " + benefit);
          return benefit;
          }
      
      public static double wifiBenefit(Context context){
          double wifiPowerCost= getAverageWifiPower(context);
          Log.d("wifiPowerCost", "wifi power cost: " + wifiPowerCost);
          double batteryCapacity= getBatteryCapacity(context);
          Log.d("batteryCapacity", "Battery capacity: " + batteryCapacity);
          
          // This is not that simple. We have to compare with Carat battery life or power profile battery life -- without wifi. --Eemil
          
          double benefit=(batteryCapacity/wifiPowerCost);
          Log.d("wifiPowerBenefit", "wifi power benefit: " + benefit);
          return benefit;
          }
      
      public static double gpsBenefit(Context context){
          double gpsPowerCost= getAverageGpsPower(context);
          Log.d("gpsPowerCost", "gps power cost: " + gpsPowerCost);
          double batteryCapacity= getBatteryCapacity(context);
          Log.d("batteryCapacity", "Battery capacity: " + batteryCapacity);
          double benefit=batteryCapacity/gpsPowerCost;
          Log.d("gpsPowerBenefit", "gps power benefit: " + benefit);
          return benefit;
         }
         
      public static double screenBrightnessBenefit(Context context){
           double screenPowerCost= getAverageScreenPower(context);
           Log.d("screenPowerCost", "screen power cost: " + screenPowerCost);
           double batteryCapacity= getBatteryCapacity(context);
           Log.d("batteryCapacity", "Battery capacity: " + batteryCapacity);
           double benefit=batteryCapacity/screenPowerCost;
           Log.d("screenPowerBenefit", "screen power benefit: " + benefit);
           return benefit;
         }
  }
  