launcher、kdesktop源码注释

一、launcher

有远程桌面client正连接着时,安装launcher.apk,无论是用android自带的资源管理器中安装,还是调用SDL_UpdateApp安装,安装完apk后,android自动运行新版本laucher,很快。这个新启动launcher会被android杀死。

没找到原因,但发现一个方法:若当前没有远程桌面client正连接着,这个安装后自动运行的新版本launcher不会被android杀死

正是因为这方法,launcher源码,在实现升级时,调用SDL_UpdateApp前会执行instance->unregister_server(server_rdpd),目的是关闭所有正连接着client。这里关闭没用更直接的像RdpServer::CloseAllConnection(),是既然升级后肯定要退出原launcher,那不如简单、彻底地关server_rdpd服务。

但是,升级时遇到另一个问题。安装完后launcher.apk后,android随机会发生没有自动运行新版本launcher。测试下来,即使一直没有client连接着,也会出现这个问题。而在出问题时,android确定是调用了startActivity。

<aosp>/packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java
------
public class InstallAppProgress extends Activity implements View.OnClickListener, OnCancelListener {
        if (getIntent().getBooleanExtra("AutoInstall", false) && enabled) {
            // [leagor added]
            // copy from onClick(View v).v==mLaunchButton
            try {
                // 在出现随机没有自动运行新版本launcher时,也会进入这在
                // 而且生成mLaunchIntent时用的mAppInfo.packageName是com.kos.launcher
                startActivity(mLaunchIntent);
            } catch (ActivityNotFoundException e) {
                Log.e(TAG, "Could not start activity", e);
            }
            clearCachedApkIfNeededAndFinish();
            return;

        } else if (enabled) {
            mLaunchButton.setOnClickListener(InstallAppProgress.this);
        } else {
           mLaunchButton.setEnabled(false);
        }
    }
}

没到找这问题原因。要是一直没解决,只能建议用户若是1分钟后,client还是无法连接,那重启设备。

 

二、trotate_to_yaw

对trotate_to_yaw,是360度转时。

  1. 总是以逆时针方向转。
  2. 到某个中间goal,不会认为转得太大,导致超过它太多,然后为缩小误差又转回来。也就是说,只会逆时针转。
  3. step_degree。用于设置此次360度会有哪些中间点goal。app可以让在“到”了那些中间点时,做一些特定操作。像抓拍任务把setp_degre设为了90,表示在90、180、270时要各抓拍一张,加上一开始“0”时一张,此次抓拍四张。

在使用

  1. <apps-src>/apps/libleagor_khome/camera2.cpp。抓拍任务,用于实最一次最多抓拍4张图像。
  2. <apps-src>/apps/launcher/moveit_calculator.cpp。机械臂,用于最多转一图,以查到目标物在哪。

app判断是否转到goal时,建议用以下逻辑。

void tsnapshot::rtyaw_slice()
{
  ...
  if (rtyaw_.reaching_goal) {

reaching_goal是true,表示正在转向某个中间点goal

    double ang_diff = angles::shortest_angular_distance(curr_yaw, rtyaw_.goal);
    const double threshold = DEG2RAD(10);
    if (ang_diff <= threshold) {

      认为符合转到goal了。

    }
    ...
   }
  ...
}

判断是否转到goal,用的条件是“ang_diff <= threshold”,不是fabs(ang_diff) <= threshold。也就是说,要是ang_diff < 0,那不管多小,都认为符合条件。这对应用了上面(2),"不会认为转得太大,导致超过它太多,然后为缩小误差又转回来"。

app要修改step_degree,不要直接改字段,像rtyaw.step_degree = 90,而是调用set_step_degree。对180时,为什么要改到179?这是为避免angles::shortest_angular_distance(...)算出-180。举个例子,如果step_degree是180,那初始角度是0,下个goal就是180,shortest_angular_distance(0, 180)会算出是-180,而不是180,导致认为要顺时针转。改为179,是小了1,但trotate_to_yaw转到角度本不那么严密,小个2度没啥影响。

 

 

全部评论: 0

    写评论: