내비게이션 액션

01. 집으로 가기

재간둥이 알버트 로봇이 맘껏 뛰어 놀다가 집으로 돌아갈 시간이 되었다. 집으로 가면서 슈퍼마켓에도 들리도록 하자.

알버트 로봇을 주어진 위치로 이동시키는 프로그램을 작성하시오.

Activity 클래스의 onDestroy() 메소드를 상속받아 새로 구현하자. 프로젝트에 스마트 로봇 라이브러리를 포함하는 것을 잊지 않기를 바란다.

 public class SampleActivity extends RobotActivity
 {
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();
     }
 }

Navigation 액션의 객체를 얻기 위해서는 Action 클래스의 obtain(Context context, String actionId) 메소드에서 actionId에 Action.Navigation.ID를 입력하면 된다.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.Navigation.ID); // 액션 객체를 얻는다.
         mAction.activate(); // 액션을 시작한다.
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate(); // 액션을 중지한다.
         mAction.dispose(); // 액션을 폐기한다.
     }
 }

onCreate(Bundle savedInstanceState) 메소드에서 액션을 얻어서 시작하고 onDestroy() 메소드에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 애플리케이션을 종료하기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.

내비게이션 패드 위에서 움직여야 하므로 사용하는 내비게이션 패드의 크기를 입력하도록 하자. Navigation 액션에는 패드 크기를 나타내는 디바이스로 COMMAND_PAD_SIZE가 있다. 여기서는 가로 108, 세로 76 크기의 패드를 사용하였다.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;
     private Device mPadSizeDevice;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.Navigation.ID);
         mPadSizeDevice = mAction.findDeviceById(Action.Navigation.COMMAND_PAD_SIZE);
         mPadSizeDevice.write(0, 108); // 가로 크기
         mPadSizeDevice.write(1, 76); // 세로 크기
         mAction.activate();
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate();
         mAction.dispose();
     }
 }

Navigation 액션에는 이동할 위치를 쓰는 디바이스로 COMMAND_WAYPOINTS가 있다. 알버트 로봇이 이동하는 중간 경로와 마지막 위치를 나타내며, 입력하는 배열의 크기는 2의 배수이어야 한다. 홀수 번째 값은 X축 좌표, 짝수 번째 값은 Y축 좌표 값이며, 현재 위치에서 (80, 20)으로 이동한 후 다시 (90, 50)으로 이동하고자 한다면 배열 값을 [80, 20, 90, 50]으로 입력하면 된다.

또한, 마지막 위치에 도착한 후 알버트 로봇이 바라보는 방향을 쓰는 디바이스로 COMMAND_FINAL_ORIENTATION이 있다. -179도부터 180도까지의 값을 가질 수 있으며, 내비게이션 패드의 X축 방향이 0도이다.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;
     private Device mPadSizeDevice;
     private Device mWaypointsDevice;
     private Device mFinalOrientationDevice;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.Navigation.ID);
         mPadSizeDevice = mAction.findDeviceById(Action.Navigation.COMMAND_PAD_SIZE);
         mWaypointsDevice = mAction.findDeviceById(Action.Navigation.COMMAND_WAYPOINTS);
         mFinalOrientationDevice = mAction.findDeviceById(Action.Navigation.COMMAND_FINAL_ORIENTATION);
         mPadSizeDevice.write(0, 108);
         mPadSizeDevice.write(1, 76);
         mWaypointsDevice.write(new int[] {80, 20, 90, 50}); // (80, 20)으로 이동한 후 (90, 50)으로 이동한다.
         mFinalOrientationDevice.write(-90); // 마지막 위치에 도착한 후 -90도 방향을 바라본다.
         mAction.activate();
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate();
         mAction.dispose();
     }
 }

집에 도착한 후에는 저녁 식사를 해야 하는데 이를 위해서는 집에 도착했다는 것을 알아야 한다. Action 클래스의 setOnCompletedListener(Action.OnCompletedListener listener) 메소드를 사용하여 리스너를 설정하면 내비게이션이 완료되었을 때 Action.OnCompletedListeneronCompleted(Action action) 메소드가 호출된다.

 public class SampleActivity extends RobotActivity implements Action.OnCompletedListener
 {
     private Action mAction;
     private Device mPadSizeDevice;
     private Device mWaypointsDevice;
     private Device mFinalOrientationDevice;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.Navigation.ID);
         mAction.setOnCompletedListener(this);
         mPadSizeDevice = mAction.findDeviceById(Action.Navigation.COMMAND_PAD_SIZE);
         mWaypointsDevice = mAction.findDeviceById(Action.Navigation.COMMAND_WAYPOINTS);
         mFinalOrientationDevice = mAction.findDeviceById(Action.Navigation.COMMAND_FINAL_ORIENTATION);
         mPadSizeDevice.write(0, 108);
         mPadSizeDevice.write(1, 76);
         mWaypointsDevice.write(new int[] {80, 20, 90, 50});
         mFinalOrientationDevice.write(-90);
         mAction.activate();
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate();
         mAction.dispose();
     }

     @Override
     public void onCompleted(Action action)
     {
         // 액션이 완료되었다.
     }
 }