设为首页 加入收藏

TOP

在Android中加入充电指示(一)
2014-11-24 07:48:44 来源: 作者: 【 】 浏览:4
Tags:Android 加入 充电 指示

基于Andriod系统的平台在没有硬件充电指示的情况下只有进入andriod系统才能进行充电指示,而我们有时候仅仅需要充电而不需要进入系统,本文介绍了实现这种功能的方法。


具体过程如下:当内核启动后调用充电指示控制程序。充电指示程序发现如果外部供电就开始显示充电的画面,同时将设备的电源控制锁定为关闭状态(这样当拔掉电源时候系统自动关闭),如果在充电指示过程中又按了开机键,就重新开启电源按键。这个过程在单片机等简单系统上不值得一提,因为每个人都会想的比我好,这里重点介绍如何融合到andriod系统以及其中的我认为可以让别人参考的方法。


方法一 ui显示部分。显然我们不能让系统跑的太深,否则控制起来就过于麻烦,充电显示等老半天才启动别人也觉得奇怪。所以有必要仅仅使用微型系统,微型系统自然能用的功能就少,在图像显示上面只能使用c语言操作framebuff,我的方法是参考bootable/recovery/minui/里面的库,其支持png的图片也文本显示,对于充电指示足够用了。一个可能遇到的问题是andriod提供的minui显示使用驱动的双buffer机制,在有的系统上不具备该功能,你可以强制只使用一个,修改graphics.c的函数gr_flip,将gr_active_fb 赋值为0。


方法二 电池检测。 可以参考com_andriod_server_batteryService.cpp文件,基本上把里面的函数复制过来就可以使用。


完成的charge充电程序必须加入到init.rc中才能被调用,我把它当做一个只运行一次的服务运行。


service console /system/bin/busybox sh


console


#shuaiwen added,init.c has been hacked to block to wait this process to finish


service charge /system/bin/charge


oneshot


在init启动服务的过程都是非阻塞型的(新开一个线程运行),这会导致虽然服务已经被加入,但是系统还会完整启动,显然不能满足要求,实际的需求为当charge运行起来不应该运行其他服务。要实现这个目的,必须对init.c进行一点修改。我的方法是让init对启动的服务名称做判断,如果为charge就等待到该程序结束才继续运行。具体修改为改动init.c的函数service_start:


if (pid == 0) {


……..


}


//shuaiwen added begin


else{


int status;


if(strcmp(svc->name,"charge")==0)


{


wait(&status); //wait child to exist


load_565rle_image(INIT_IMAGE_FILE);//redraw background


}


// else printf("shuaiwen skip process %s.",svc->name);


}


//shuaiwen added end


if (pid < 0) {


….}


这样系统就会被charge阻塞住。Init.rc中排在charge后面的服务就暂时不会被启动。我上面改动的init.rc把charge服务放在console服务后面是因为我还是需要控制台调试。经过这样的改动,基本的充电服务就可以实现。我这里仅仅是举了一个例子,文中的例子仅仅供参考,请酌情参考。


我写的一个简单的充电指示文件内容列在下面供大家参考。


/*


Copyright:GNU


charge monitor.


revision history:


2010/5/10 create shuaiwen


icon path:


/res/images/%s.png


*/


#include


#include


#include



#include


#include


#include


#include


#include


#include


#include


#include


#include


#include



#include "minui/minui.h"


#include "minzip/Zip.h"


#define KEY_PWR 116



#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online"


#define USB_ONLINE_PATH "/sys/class/power_supply/usb/online"


#define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status"


#define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health"


#define BATTERY_PRESENT_PATH "/sys/class/power_supply/battery/present"


#define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity"


#define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/batt_vol"


#define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/batt_temp"


#define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/technology"



enum {


BACKGROUND_ICON_CHARGE0,


BACKGROUND_ICON_CHARGE1,


BACKGROUND_ICON_CHARGE2,


BACKGROUND_ICON_CHARGE3,


BACKGROUND_ICON_CHARGE4,


BACKGROUND_ICON_CHARGE5,


BACKGROUND_ICON_END,


};



enum {


STATUSCHARGING,


STATUSDISCHARGING,


STATUSFULL,


STATUSNOTCHARGING,


STATUSUNKNOWN


};



enum{


HEALTHDEAD,


HEALTHGOOD,


HEALTHOVERHEAT,


HEALTHOVERVOLTAGE,


HEALTHUNKNOWN,


HEALTHUNSPECIFIEDFAILURE,


};



static gr_surface gBackgroundIcon[BACKGROUND_ICON_END];


static const struct { gr_surface* surface; const char *name; } BITMAPS[] = {


{ &gBackgroundIcon[BACKGROUND_ICON_CHARGE0], "battery001" },


{ &gBackgroundIcon[BACKGROUND_ICON_CHARGE1], "battery002" },


{ &gBackgroundIcon[BACKGROUND_ICON_CHARGE2], "batt

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇利用BLCR加快Android的启动过程 下一篇Android上拔出sd卡导致flash上媒..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)