안드로이드 앱 개발기 5
이제 거의 끝이 보인다. 마지막으로 만든 state는 잘못 입력한 부분을 수정한다. 임의로 잡은 10개의 항목 중, 수정할 버튼을 눌러 다시 입력을 받는다. 음성인식 대기를 하다 에러가 나오면 다시 입력할 수 있도록 대기를 한다. 결과를 받으면 어느 버튼을 눌렀는지 기억을 했다가 그 내용을 새로운 부분으로 업데이트 한다. 이후 stateDecision으로 다시 돌아오게 했다.
stateModify
딱히 무슨 기능을 하는 상태는 아니다. 그냥 대기 상태이다. 아래 그림과 같이 관련된 state의 전이 조건을 설정했다.
State stateModify = new State(s0) { @Override public State fireInit() { Log.d("FSM", "Init>>stateModify;"); return stateModifyWhat; } @Override public void enter() { Log.d("FSM", "Entry>>stateModify;"); } @Override public State fireEvent(Event e) { return getParent(); } @Override public void exit() { Log.d("FSM", "Exit<<stateModify;"); } }; State stateModifyWhat = new State(stateModify) { @Override public State fireInit() { Log.d("FSM", "Init>>stateModifyWhat;"); return null; } @Override public void enter() { Log.d("FSM", "Entry>>stateModifyWhat;"); } @Override public State fireEvent(Event e) { switch (e.getID()) { case 5: printMessage(e, "stateModifyListening"); myHandle.sendEmptyMessage(1); myHsm.this.transition(stateModifyListening); } return getParent(); } @Override public void exit() { Log.d("FSM", "Exit<<stateModifyWhat;"); } }; State stateModifyUpdate = new State(stateModify) { @Override public State fireInit() { Log.d("FSM", "Init>>stateModifyUpdate;"); return null; } @Override public void enter() { Log.d("FSM", "Entry>>stateModifyUpdate;"); int i = myGapFlush.getIndexForGapUpdate(); myGapFlush.setGapIthwithN(i, myGapFlush.getTmpWord()); myGapFlush.emptyTmpWord(); //화면 업데이트.. myHandle.sendEmptyMessage(4); } @Override public State fireEvent(Event e) { //완료되면 판단상태로 다시 돌아감.. myHsm.this.transition(stateDecision); return getParent(); } @Override public void exit() { Log.d("FSM", "Exit<<stateModifyUpdate;"); } }; State stateModifyListening = new State(stateModify) { @Override public State fireInit() { Log.d("FSM", "Init>>stateModifyListening;"); return null; } @Override public void enter() { Log.d("FSM", "Entry>>stateModifyListening;"); } @Override public State fireEvent(Event e) { switch (e.getID()) { case 1: printMessage(e, "stateModifyUpdate"); myHsm.this.transition(stateModifyUpdate); return null; case 3: printMessage(e, "stateModifyUpdate"); myHsm.this.transition(stateModifyUpdate); return null; case 6: printMessage(e, "stateModifyWhat"); myHsm.this.transition(stateModifyWhat); return null; } return getParent(); } @Override public void exit() { Log.d("FSM", "Exit<<stateModifyListening;"); } };
이 state에 들어가면 초기로 stateModifyWhat으로 들어가도록 했다.
이전에 만들었던 부분을 재활용했다.
stateModifyWhat
수정 버튼을 눌렀을 경우, 어느 버튼을 눌렀는지를 데이터로 써주는 부분이다. 나중에 이 변수를 읽어 그 영역을 수정하도록 했다. gap과 flush 두 가지 경우가 있어 변수를 쉽게 사용하기 위해서 두 개를 썼다. 이 state에서 음성인식 버튼을 누르면 stateModifyListening으로 들어가도록 했다.
stateModifyListening
여기도 딱히 무슨 기능을 하는 영역은 아니다. 버튼을 눌렀을 때, 에러 처리를 하기 위해 임시로 만든 영역이다. 에러가 나면 다시 stateModifyWhat 영역으로 들어가고, 결과가 정상이면 stateModifyUpdate로 가도록 했다.
stateModifyUpdate
입력된 정보를 업데이트 하는 부분이다. 배열에 기록을 하고, 화면 업데이트도 한다.
전체적인 윤곽 마무리
이렇게 전체적인 윤곽이 마무리 되었다. 수정버튼을 테스트하기 위해 하나만 만들었는데, 모두 수정하기 위해서는 20개의 버튼이 필요하다. 또한 음성인식 대기 중인지, 아닌지를 사용자가 잘 알 수 없다. 소리로 구분이 되는데, 잘 안들린다. 이 부분을 화면으로 표시를 해줘야 겠다.
입력할 경우, SEQ를 입력할 텐데, 이 부분에 대한 처리도 없다.
file이 정상적으로 save가 되었을 경우, 경로와 처리 여부를 알려줘야 사용자가 쉽게 찾는다.
수정 버튼을 눌렀을 경우, 어느 버튼을 눌렀는지 표시를 해줘야 쉽게 수정이 가능해 보인다.
구글 음성인식 엔진을 사용하다 보니, 오만가지 소리를 지 맘대로 해석한다. 숫자를 하나씩 읽어주면 그나마 String이 숫자로 들어오는데, 가끔 한글로 그대로 들어올 때도 있다. 입력된 부분을 읽어서 한글로 되어 있으면 숫자로 바꿔주는 부분도 필요하다.
특성상 마이너스는 제대로 인식이 안되는데, 이를 쉽게 입력할 수 있는 방법이 필요해 보인다.
차량의 전체적인 위치표시와 LH/RH의 구분이 필요해 보인다. 측정위치는 모든 차량에 일관적으로 하여 일정한 기준으로 정리가 되어야 할 것 같다.
측정 포인트가 많으면 글자가 작아서 보이지가 않을텐데, 화면을 스크롤하여 보여주는 장치도 필요해 보인다.
화면에 모두 표시가 불가능하면 연속입력이 들어갈 경우, 해당 위치로 옮겨줘서 보여줘야 할텐데, 이 부분을 구현해야 될것으로 보인다.
전체적으로 끝났다고 몇 개만 더 하면 끝날 것 같아 보였는데, 아직도 멀어 보인다. 역시 detail이 어렵나보다.