现在有一个需求,在mt8735开发板上点亮指示灯,方便用户在无屏幕的情况下使用开发板的时候,能够了解开发板是否在正常工作。
一、工具:
使用的工具是Android Studio2.2,安装参考教程:Android Studio 2.2 安装教程
使用 Android Studio 新建项目的教程:使用 Android Studio 新建项目参考教程
二、具体实施:
开发板上有一个三色灯,可以显示红绿蓝三种颜色,现在是用于充电指示,充电时显示红色,充满电显示绿色。那么还有一个蓝色的灯,就可以用于系统运行指示。 因此,这个应用程序要实现的功能是,1. 系统启动之后,蓝色指示灯亮,表明系统在运行;2. 不干扰充电和充满电的指示灯的显示。这个APP需要有的逻辑的是,1. 接收开机广播,控制蓝色指示灯显示;2. 检测USB是否连上,USB连接时充电状态如何(充电/充满)。
我们可以在开发板连接电脑时,用 adb 控制灯的亮与不亮,具体操作如下:
$ adb shell "echo 0 > /sys/class/leds/green/brightness" // 绿色灯灭
$ adb shell "echo 1 > /sys/class/leds/green/brightness" // 绿色灯亮
那么,在写应用程序的时候,我调用了一个 ShellUtils.java 代码(未上传),进行类似 adb 操作。
关键部分测试代码如下:
复制代码
三、存在问题:
目前在MainActivity.java测试成功,还未完全实现作为系统程序,还存在不能够检测到USB是否插入的问题,这个问题会影响充电的指示灯的显示。1. 开机能够显示蓝灯,但是插入USB,不显示充电状态(充电/充满)指示灯;2. 重新拔插USB,充电指示灯正常显示;3. 拔出USB,工作指示灯(蓝灯),不显示。
一、工具:
使用的工具是Android Studio2.2,安装参考教程:Android Studio 2.2 安装教程
使用 Android Studio 新建项目的教程:使用 Android Studio 新建项目参考教程
二、具体实施:
开发板上有一个三色灯,可以显示红绿蓝三种颜色,现在是用于充电指示,充电时显示红色,充满电显示绿色。那么还有一个蓝色的灯,就可以用于系统运行指示。 因此,这个应用程序要实现的功能是,1. 系统启动之后,蓝色指示灯亮,表明系统在运行;2. 不干扰充电和充满电的指示灯的显示。这个APP需要有的逻辑的是,1. 接收开机广播,控制蓝色指示灯显示;2. 检测USB是否连上,USB连接时充电状态如何(充电/充满)。
我们可以在开发板连接电脑时,用 adb 控制灯的亮与不亮,具体操作如下:
$ adb shell "echo 0 > /sys/class/leds/green/brightness" // 绿色灯灭
$ adb shell "echo 1 > /sys/class/leds/green/brightness" // 绿色灯亮
那么,在写应用程序的时候,我调用了一个 ShellUtils.java 代码(未上传),进行类似 adb 操作。
关键部分测试代码如下:
- public class LedCtrlReceive extends BroadcastReceiver {
- private Handler handler=new Handler();
- // adb 操作
- private String cmdB = "echo 1 > /sys/class/leds/blue/brightness";
- private String cmdb = "echo 0 > /sys/class/leds/blue/brightness";
- private String cmdR = "echo 1 > /sys/class/leds/red/brightness";
- private String cmdr = "echo 0 > /sys/class/leds/red/brightness";
- private String cmdG = "echo 1 > /sys/class/leds/green/brightness";
- private String cmdg = "echo 0 > /sys/class/leds/green/brightness";
- private Context context;
- @Override
- public void onReceive(Context context, Intent intent) {
- this.context = context;
- String action = intent.getAction();
- // 显示蓝灯
- ShellUtils.execCommand(cmdb, true);
- ShellUtils.execCommand(cmdB, true);
- if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
- /*ShellUtils.execCommand(cmd,true);
- handler.postDelayed(runnable, 10000);
- ShellUtils.execCommand(cmdb, true);
- ShellUtils.execCommand(cmdB, true);*/
- Log.d("yjx","Boot_receive");
- try {
- Thread.sleep(5000);
- Log.d("yjx","sleep");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- new Thread(runnable).start();
- //handler.postDelayed(runnable, 5000);
- }
- Log.d("yjx","runnable_start");
- }
- private Runnable runnable = new Runnable() {
- @Override
- public void run() {
- /*ShellUtils.execCommand(cmdR,true);
- context.registerReceiver(mbatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));*/
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
- intentFilter.addAction("android.hardware.usb.action.USB_STATE");
- context.registerReceiver(mbatteryReceiver, intentFilter);
- Log.d("yjx","runnable");
- }
- };
- private BroadcastReceiver mbatteryReceiver=new BroadcastReceiver()
- {
- public void onReceive(Context context, Intent intent)
- {
- String action =intent.getAction();
- if(Intent.ACTION_BATTERY_CHANGED.equals(action)) {
- int status=intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN);
- if(status== BatteryManager.BATTERY_STATUS_CHARGING){
- ShellUtils.execCommand(cmdr,true);
- ShellUtils.execCommand(cmdR,true);
- int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);//电量最大值
- int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);//电量百分比
- float batteryPct = level / (float)scale;
- if (batteryPct > 0.95){
- ShellUtils.execCommand(cmdg,true);
- ShellUtils.execCommand(cmdG,true);
- }
- Log.d("yjx",batteryPct+"");
- }
- }
- if ("android.hardware.usb.action.USB_STATE".equals(action)){
- boolean connect = intent.getExtras().getBoolean("connected");
- if (connect){
- Log.d("yjx","USB IN");
- } else {
- ShellUtils.execCommand(cmdb, true);
- ShellUtils.execCommand(cmdB, true);
- Log.d("yjx","USB OUT");
- }
- }
- }
- };
- }
三、存在问题:
目前在MainActivity.java测试成功,还未完全实现作为系统程序,还存在不能够检测到USB是否插入的问题,这个问题会影响充电的指示灯的显示。1. 开机能够显示蓝灯,但是插入USB,不显示充电状态(充电/充满)指示灯;2. 重新拔插USB,充电指示灯正常显示;3. 拔出USB,工作指示灯(蓝灯),不显示。