/*
* This file is part of Sensorium.
*
* Sensorium is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Sensorium 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Sensorium. If not, see
* <http://www.gnu.org/licenses/>.
*
*
*/
package at.univie.sensorium.sensors;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.StringWriter;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
import android.os.Handler;
import android.telephony.TelephonyManager;
import android.util.Log;
import at.univie.sensorium.SensorRegistry;
/**
* Provides information tied to the device/model, i.e. vendor and model name, TAC, ...
*
*/
public class DeviceInfoSensor extends AbstractSensor {
private SensorValue androidversion;
private SensorValue sensoriumversion;
private SensorValue tac;
private SensorValue vendorname;
private SensorValue modelname;
private SensorValue totalMem;
private SensorValue availMem;
private SensorValue memThreshold;
private SensorValue cpu;
private MemoryInfo memoryInfo;
private Handler handler = new Handler();
private int scan_interval = 30; // sec
public DeviceInfoSensor() {
super();
setName("Device Information");
androidversion = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.ANDROID_VERSION);
sensoriumversion = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.SENSORIUM_VERSION);
tac = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.TAC);
modelname = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.MODEL_NAME);
vendorname = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.VENDOR_NAME);
totalMem = new SensorValue(SensorValue.UNIT.MEM, SensorValue.TYPE.TOTAL_MEM);
availMem = new SensorValue(SensorValue.UNIT.MEM, SensorValue.TYPE.AVAL_MEM);
memThreshold = new SensorValue(SensorValue.UNIT.MEM, SensorValue.TYPE.THD_MEM);
cpu = new SensorValue(SensorValue.UNIT.RELATIVE, SensorValue.TYPE.CPU);
}
private Runnable memCPUTask = new Runnable() {
@Override
public void run() {
availMem.setValue(memoryInfo.availMem/1048576L);
cpu.setValue(cpuUpdate()*100);
notifyListeners();
handler.postDelayed(this, scan_interval*1000);
}
};
@Override
protected void _enable() {
TelephonyManager telephonyManager = ((TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE));
String imei = telephonyManager.getDeviceId();
if (imei != null)
tac.setValue(imei.substring(0, 6));
androidversion.setValue(Build.VERSION.RELEASE);
try {
String versionName = getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), 0).versionName;
sensoriumversion.setValue(versionName);
} catch (NameNotFoundException e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
Log.d(SensorRegistry.TAG, sw.toString());
}
vendorname.setValue(Build.MANUFACTURER);
modelname.setValue(Build.MODEL);
ActivityManager activityManager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
totalMem.setValue(getTotalMemory());
memThreshold.setValue(memoryInfo.threshold/1048576L);
handler.postDelayed(memCPUTask, 0);
}
public long getTotalMemory() {
int tm=1000;
try {
RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r");
String load = reader.readLine();
String[] totrm = load.split(" kB");
String[] trm = totrm[0].split(" ");
tm=Integer.parseInt(trm[trm.length-1]);
tm=Math.round(tm/1024);
reader.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
return tm;
}
public float cpuUpdate() {
try {
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
String load = reader.readLine();
String[] toks = load.split(" ");
long idle1 = Long.parseLong(toks[5]);
long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
+ Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
try {
Thread.sleep(360);
} catch (Exception e) {}
reader.seek(0);
load = reader.readLine();
reader.close();
toks = load.split(" ");
long idle2 = Long.parseLong(toks[5]);
long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
+ Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
return (float)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));
} catch (IOException ex) {
ex.printStackTrace();
}
return 0;
}
@Override
protected void _disable() {
handler.removeCallbacks(memCPUTask);
}
}