# f.Scanner

## 개요

f.Scenner 는 바코드 입력 처리를 위한 스캐너 함수입니다.

PDA 를 통한 스캔을 지원하며, 디버거에서는 카메라를 통한 스캔으로 동작합니다.

## 기능요소

<table><thead><tr><th width="253.3203125">요소</th><th>설명</th></tr></thead><tbody><tr><td><a href="f.scanner/f.scanner.init">init()</a></td><td>스캐너 설정 초기화 함수</td></tr><tr><td><a href="f.scanner/f.scanner.startscan">startScan()</a></td><td>스캔 시작 함수</td></tr><tr><td><a href="f.scanner/f.scanner.stopscan">stopScan()</a></td><td>스캔 종료 함수</td></tr><tr><td><a href="f.scanner/f.scanner.getstatus">getStatus()</a></td><td>현재 스캐너 상태 조회 함수</td></tr><tr><td><a href="f.scanner/f.scanner.getlastscanneddata">getLastScannedData()</a></td><td>마지막으로 스캔된 값 반환 함수</td></tr><tr><td><a href="f.scanner/f.scanner.getlastscannedtimestamp">getLastScannedTimestemp()</a></td><td>마지막 스캔 시각 반환 (timestamp) 함수</td></tr><tr><td><a href="f.scanner/f.scanner.getscanhistory">getScanHistory()</a></td><td>전체 스캔 이력 배열 반환 함수</td></tr><tr><td><a href="f.scanner/f.scanner.getlasterror">getLastError()</a></td><td>마지막 오류 객체 반환 함수</td></tr><tr><td><a href="#scan_status">SCAN_STATUS</a></td><td>스캐너 상태값</td></tr></tbody></table>

## SCAN\_STATUS

<table><thead><tr><th width="255">유형</th><th>설명</th></tr></thead><tbody><tr><td>DISABLED</td><td>초기 상태, 비활성화됨</td></tr><tr><td>IDLE</td><td>초기화 완료, 스캔 대기 중 아님</td></tr><tr><td>SCANNING</td><td>스캔 대기 중</td></tr><tr><td>SUCCESS</td><td>스캔 성공</td></tr><tr><td>AFTER_EVENT</td><td>스캔 후 이벤트 처리 중</td></tr><tr><td>STOPPED</td><td>조건 또는 타임아웃으로 스캔 중단됨</td></tr><tr><td>ERROR</td><td>스캔 중 오류 발생</td></tr></tbody></table>

### 상태 전이 흐름 (State Transition Flow)

1. **초기화 및 대기**
   * `DISABLED` → `IDLE`\
     (`init()` 호출 시 스캐너가 준비됨)
2. **스캔 대기 진입**
   * `IDLE` → `SCANNING`\
     (`startScan()` 호출 시 스캔 대기 상태 진입)
3. **스캔 처리**
   * 사용자가 바코드 입력(스캔)
   * 입력값이 **유효**하고 **eventName**이 있을 때:\
     `SCANNING` → `SUCCESS` → `AFTER_EVENT` (이벤트 실행 후 다시 스캔 대기 또는 종료 조건 확인)
   * 입력값이 **유효**하지만 **eventName**이 없을 때:\
     `SCANNING` → `SUCCESS` (이벤트 실행 없이 성공 처리)
   * 입력값이 **유효성 검사(scanValidator) 실패** 시:\
     `SCANNING` → `ERROR` (오류 콜백 실행 후 스캔 대기 복귀)
4. **스캔 종료 조건 확인**
   * 종료 조건(예: 최대 스캔 횟수, scanStopCondition 등) **만족** 시:\
     `SCANNING` 또는 `AFTER_EVENT` → `STOPPED`
   * 종료 조건 **미만족** 시:\
     다시 `SCANNING` 상태로 반복 (다음 스캔 대기)
5. **오류 발생 시 처리**
   * 스캔 도중 **입력값 오류(scanValidator 실패)**\
     `SCANNING` → `ERROR` → `SCANNING`\
     (오류 콜백 실행 후 다시 스캔 대기)

```
[DISABLED]
    |
    | (init)
    v
[IDLE]
    |
    | (startScan)
    v
[SCANNING]
    |
    |-- [입력값 정상 + eventName 있음] ------> [SUCCESS]
    |                                            |
    |                                            v
    |                                      [AFTER_EVENT]
    |                                            |
    |                             (종료조건) Yes / No
    |                                 |          |
    |                            [STOPPED]   [SCANNING]
    |
    |-- [입력값 정상 + eventName 없음] ------> [SUCCESS]
    |                                            |
    |                             (종료조건) Yes / No
    |                                 |          |
    |                            [STOPPED]   [SCANNING]
    |
    |-- [입력값 오류(scanValidator 실패)] ---> [ERROR]
                                              |
                              (오류 콜백 후) <---|
                                              |
                                          [SCANNING]

```

## 사용 주의사항

* **init 호출 필수**\
  스캐너를 사용하기 전에 반드시 `init()`으로 초기화를 진행해야 합니다.
* **스캔 중 입력 제한**\
  스캔이 활성화된 동안에는 별도의 input 컨트롤 등에서 직접 입력이 불가능합니다.
* **스캔 종료 처리 권장**\
  화면 이동, 탭 전환 등 페이지를 떠날 때(`OnLeave` 이벤트 등)에는 반드시 `stopScan()`으로 스캔을 종료하도록 처리하는 것을 권장합니다.
* **기기 호환성**\
  PDA 기기 설정에 따라 스캐너 동작이 달라질 수 있습니다. 공식적으로 지원하는 **DS60S, PM95** 기기 이외의 PDA를 사용할 경우 정상적인 지원이 어려울 수 있습니다.
