기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요? ODROID 배터리 게이지 작업을 하고 있는데요..
처음 부팅시에 한번만 잘 읽어내고 그 뒤로는 업데이트가 안되네요..
아래 최종환님 글의 댓글을 보면 work_queue로 해결하신것 같은데..
http://www.aesop.or.kr/?mid=board_android_platform&document_srl=54231
실제 어떻게 구현하셨는지 알려주시길 부탁드립니다..
감사합니다.
네 저도 같은 경험을 한적이 있습니다.
그래서 그 부분을 수정해서 동작 했던 기억이 납니다.
그 부분을 어디다 적어뒀는데..-.-;;
예전 문서에 다음과 같은 부분이 있었습니다.
BatteryService.java registers itself as a UEvent observer for the path “/sys/class/power_supply”. If anything is changed in this path, it gets current state through JNI and then broadcasts ACTION_BATTERY_CHANGED intent.
com_android_server_BatteryService.cpp is the JNI native implementation for BatteryService.java. It gets current battery state through reading from the following files
실제 코드에도 다음과 같은 부분이 있구요
public BatteryService(Context context) {
mContext = context;
mBatteryStats = BatteryStatsService.getService();
mUEventObserver.startObserving("SUBSYSTEM=power_supply");
// set initial status
update();
}
제가 보드가 없어서 확인은 못해보지만 battery driver부분의 power_supply_changed()
이 함수 였던거 같은데요..
static void power_supply_changed_work(struct work_struct *work)
{
struct power_supply *psy = container_of(work, struct power_supply,
changed_work);
dev_dbg(psy->dev, "%sn", __func__);
class_for_each_device(power_supply_class, NULL, psy,
__power_supply_changed_work);
power_supply_update_leds(psy);
kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
}
void power_supply_changed(struct power_supply *psy)
{
dev_dbg(psy->dev, "%sn", __func__);
schedule_work(&psy->changed_work);
}
uevent에 반응하여 java쪽에서 읽어 가는것으로 알고 있습니다.~
frameworks/base/services/java/com/android/server$ vi BatteryService.java
파일의
private synchronized final void update() {
native_update();
boolean logOutlier = false;
long dischargeDuration = 0;
mBatteryLevelCritical = mBatteryLevel <= CRITICAL_BATTERY_LEVEL;
if (mAcOnline) {
mPlugType = BatteryManager.BATTERY_PLUGGED_AC;
} else if (mUsbOnline) {
mPlugType = BatteryManager.BATTERY_PLUGGED_USB;
} else {
mPlugType = BATTERY_PLUGGED_NONE;
}
if (mBatteryStatus != mLastBatteryStatus ||
mBatteryHealth != mLastBatteryHealth ||
mBatteryPresent != mLastBatteryPresent ||
mBatteryLevel != mLastBatteryLevel ||
mPlugType != mLastPlugType ||
mBatteryVoltage != mLastBatteryVoltage ||
mBatteryTemperature != mLastBatteryTemperature) {
함수에 LOG 찍어 보시는것은 어떨까요?
mLastBatteryStatus = mBatteryStatus;
mLastBatteryHealth = mBatteryHealth;
mLastBatteryPresent = mBatteryPresent;
mLastBatteryLevel = mBatteryLevel;
mLastPlugType = mPlugType;
mLastBatteryVoltage = mBatteryVoltage;
mLastBatteryTemperature = mBatteryTemperature;
mLastBatteryLevelCritical = mBatteryLevelCritical;
sendIntent();
의 sendIntent()가 호출이 되어야 밧데리 정보의 ui쪽이 변경되는것으로 알고 있습니다.
방금 쪽지로 보냈습니다. 저도 정리를 잘 해 놓지 않아서요.-> 바뀔때 마다 읽어 가지 않아서 뭐 했던것 기억이 나는데 그 부분을 정리 해 놓지 않아서 가물 가물 합니다..^^;;
최종 소스는.. 못찾아서..초기에 짰던거 보냈습니다.
다시 한번 찾아보겠습니다~