키보드 제어
키를 누른 순간뿐 아니라 놓거나 통신이 끊긴 뒤의 동작도 정해야 움직이는 장치를 멈출 수 있습니다.
실습 전에
01 키를 놓은 사건을 처리하지 않으면 어떻게 될까요?
설명
마지막 이동 상태가 남아 의도보다 오래 움직일 수 있습니다.
02 입력이 끊긴 경우와 종료 명령을 받은 경우를 어떻게 구분할까요?
설명
무응답은 Timeout으로, 명시적 종료는 종료 사건으로 처리하되 둘 다 안전한 정지 상태로 연결합니다.
실행 조건
입력 이벤트 목록으로 동작을 재현합니다. 실제 키보드·장치 연결은 같은 처리 함수를 이벤트 수신부와 연결하는 별도 단계입니다.
1. 키 입력을 속도 명령으로
시작 조건
s, key=[w,w,release,d,quit,w]. w=(1,0), d=(0,-1) m/s로 둡니다.
진행 방법
- 각 입력을 vx·vy·종료 상태로 바꾸는 순수 함수를 만드세요.
- release에서는 속도를 0으로, quit 이후에는 모든 입력을 무시하도록 처리하세요.
- 입력 행별로 명령 벡터와 상태를 기록하세요.
남길 결과
기록 항목과 확인할 점
- t [s]
-
- key
-
- vx [m/s]
-
- vy [m/s]
-
- 종료 상태
-
확인할 점
- quit 뒤의 w에서 속도가 다시 켜지지 않는가?
- 정의하지 않은 키는 정지 또는 명시한 무시 규칙으로 처리되는가?
2. 시간 간격과 누적 이동
시작 조건
활동 1의 속도를 다음 입력 시점까지 유지한다고 가정합니다. 초기 위치는 (0,0) m입니다.
진행 방법
- 각 구간에서 Δ위치=v*Δt를 계산하세요.
- 시간별 위치 표와 xy 궤적을 그리세요.
- 입력 간격을 모두 .2 s로 바꾼 결과와 비교하세요.
남길 결과
기록 항목과 확인할 점
- 구간
-
- Δt [s]
-
- 속도 [m/s]
-
- 누적 위치 [m]
-
확인할 점
- 속도와 이동 거리를 구분했는가?
- 종료 이후 위치가 고정되는가?
3. 중복 입력과 긴 공백
시작 조건
w 키가 s에 반복되고, 이후 .5 s 동안 입력이 없는 기록을 추가합니다. Timeout은 .2 s로 둡니다.
진행 방법
- 중복 입력은 속도 설정으로 해석하고 누적 가속 명령으로 해석하지 않도록 비교하세요.
- 마지막 입력 이후 .2 s가 지나면 정지하는 규칙을 넣으세요.
- Timeout 전후 명령과 위치가 어떻게 달라지는지 기록하세요.
남길 결과
- Timeout 적용 전후 그림과 동작 규칙 3문장.
기록 항목과 확인할 점
- 시점
-
- 마지막 입력과 간격 [s]
-
- Timeout 여부
-
- 속도
-
- 위치
-
확인할 점
- 실제 OS 키보드 입력을 보내지 않고 기록된 events로 재현 가능한가?
- 입력 처리·시간 갱신·장치 전송이 서로 구분되어 있는가?