From f05cdc46f23bf28d31dfc4fc2ebe4d20e4d6f961 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Wed, 1 Sep 2010 23:36:15 +0000 Subject: [PATCH] Android: don't compile powermgmt-sim.c Instead implement a bit of battery monitoring. Currently it only fetches the battery level (in %) every 30s, but it could do more like battery status, charger connected, voltage... Theoretically, we could also exit/quit after some time of inactivity too (perhaps not a bad idea since Rockbox puts a slight but still non-zero CPU load even if doing nothing). Ironically, Rockbox is now the only way to get the exact battery level (at least I haven't found anything yet) on my phone :-) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27974 a1c6a512-1295-4272-9138-f99709370657 --- android/src/org/rockbox/RockboxService.java | 45 +++++++++++++++++++ apps/settings.c | 3 ++ apps/settings.h | 2 + apps/settings_list.c | 2 +- firmware/SOURCES | 1 + .../target/hosted/android/system-android.c | 3 ++ uisimulator/common/SOURCES | 2 +- 7 files changed, 56 insertions(+), 2 deletions(-) diff --git a/android/src/org/rockbox/RockboxService.java b/android/src/org/rockbox/RockboxService.java index 8ef6b5a302..6dc69b3404 100644 --- a/android/src/org/rockbox/RockboxService.java +++ b/android/src/org/rockbox/RockboxService.java @@ -9,6 +9,8 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Enumeration; +import java.util.Timer; +import java.util.TimerTask; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -16,7 +18,10 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.IBinder; import android.util.Log; @@ -36,6 +41,9 @@ public class RockboxService extends Service private Method mStopForeground; private Object[] mStartForegroundArgs = new Object[2]; private Object[] mStopForegroundArgs = new Object[1]; + private IntentFilter itf; + private BroadcastReceiver batt_monitor; + private int battery_level; @Override public void onCreate() { @@ -161,6 +169,43 @@ public class RockboxService extends Service return null; } + + @SuppressWarnings("unused") + /* + * Sets up the battery monitor which receives the battery level + * about each 30 seconds + */ + private void initBatteryMonitor() + { + itf = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + batt_monitor = new BroadcastReceiver() + { + @Override + public void onReceive(Context context, Intent intent) + { + /* we get literally spammed with battery statuses + * if we don't delay the re-attaching + */ + TimerTask tk = new TimerTask() { + public void run() { + registerReceiver(batt_monitor, itf); + } + }; + Timer t = new Timer(); + context.unregisterReceiver(this); + int rawlevel = intent.getIntExtra("level", -1); + int scale = intent.getIntExtra("scale", -1); + if (rawlevel >= 0 && scale > 0) + battery_level = (rawlevel * 100) / scale; + else + battery_level = -1; + /* query every 30s should be sufficient */ + t.schedule(tk, 30000); + } + }; + registerReceiver(batt_monitor, itf); + } + /* all below is heavily based on the examples found on * http://developer.android.com/reference/android/app/Service.html */ diff --git a/apps/settings.c b/apps/settings.c index 3a851df0ff..e9f0dc9330 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -852,7 +852,10 @@ void settings_apply(bool read_disk) #endif set_poweroff_timeout(global_settings.poweroff); +#if defined(BATTERY_CAPACITY_INC) && BATTERY_CAPACITY_INC > 0 set_battery_capacity(global_settings.battery_capacity); +#endif + #if BATTERY_TYPES_COUNT > 1 set_battery_type(global_settings.battery_type); #endif diff --git a/apps/settings.h b/apps/settings.h index 7deb2def41..3ba8fe9868 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -619,7 +619,9 @@ struct user_settings /* power settings */ int poweroff; /* idle power off timer */ +#if defined(BATTERY_CAPACITY_INC) && BATTERY_CAPACITY_INC > 0 int battery_capacity; /* in mAh */ +#endif #if BATTERY_TYPES_COUNT > 1 int battery_type; /* for units which can take multiple types (Ondio). */ diff --git a/apps/settings_list.c b/apps/settings_list.c index cab326671a..5a9eeb90ce 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -763,7 +763,7 @@ const struct settings_list settings[] = { #endif "max files in dir", UNIT_INT, 50, 10000, 50, NULL, NULL, NULL), -#if BATTERY_CAPACITY_INC > 0 +#if defined(BATTERY_CAPACITY_INC) && BATTERY_CAPACITY_INC > 0 INT_SETTING(0, battery_capacity, LANG_BATTERY_CAPACITY, BATTERY_CAPACITY_DEFAULT, "battery capacity", UNIT_MAH, BATTERY_CAPACITY_MIN, BATTERY_CAPACITY_MAX, diff --git a/firmware/SOURCES b/firmware/SOURCES index 8b71674b36..ac1a3e1be4 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -1709,6 +1709,7 @@ target/hosted/android/lc-android.c target/hosted/android/button-android.c target/hosted/android/kernel-android.c target/hosted/android/pcm-android.c +target/hosted/android/powermgmt-android.c target/hosted/android/system-android.c #ifdef APPLICATION target/hosted/android/app/button-application.c diff --git a/firmware/target/hosted/android/system-android.c b/firmware/target/hosted/android/system-android.c index 1fb69b3465..87b6584135 100644 --- a/firmware/target/hosted/android/system-android.c +++ b/firmware/target/hosted/android/system-android.c @@ -55,5 +55,8 @@ Java_org_rockbox_RockboxService_main(JNIEnv *env, jobject this) env_ptr = env; RockboxService_instance = this; RockboxService_class = (*env)->GetObjectClass(env, this); + + + powermgmt_init_target(); main(); } diff --git a/uisimulator/common/SOURCES b/uisimulator/common/SOURCES index db5b22fa42..5f068c5bdc 100644 --- a/uisimulator/common/SOURCES +++ b/uisimulator/common/SOURCES @@ -12,7 +12,7 @@ backlight-sim.c #if (CONFIG_PLATFORM & PLATFORM_SDL) io.c sim_tasks.c +powermgmt-sim.c #endif /* this is still needed for application since it has some stubs */ -powermgmt-sim.c stubs.c