# f.Scanner.init()

## 개요

init() 을 통해 스캐너 설정 초기화 할 수 있습니다.

## 파라미터

<table><thead><tr><th width="164.7109375">파라미터명</th><th width="86">필수여부</th><th width="114">타입</th><th width="106.8125">제약사항</th><th>설명</th></tr></thead><tbody><tr><td>options</td><td>Yes</td><td>JSON</td><td></td><td>설정할 옵션 JSON</td></tr></tbody></table>

## 설정 가능 옵션 목록

<table><thead><tr><th width="168.234375">파라미터명</th><th width="86">필수여부</th><th width="114">타입</th><th width="107.27734375">제약사항</th><th width="273.9140625">설명</th></tr></thead><tbody><tr><td>categoryName</td><td></td><td>String</td><td></td><td>스캔한 값이 저장될 카테고리명</td></tr><tr><td>ckey</td><td></td><td>String</td><td></td><td>스캔한 값이 저장될 콜렉션 키</td></tr><tr><td>eventName</td><td></td><td>String</td><td></td><td>스캔 후 실행할 이벤트명</td></tr><tr><td>scanSuffix</td><td></td><td>String</td><td></td><td>스캔 종료 문자<br>(기본: #)</td></tr><tr><td>scanTimeout</td><td></td><td>Number</td><td></td><td>스캔 대기 시간 (ms)<br>(기본 : 무제한)</td></tr><tr><td>maxScanCount</td><td></td><td>Number</td><td></td><td>최대 스캔 허용 횟수<br>(기본 : 무제한)</td></tr><tr><td>usePDAModels</td><td></td><td>Array</td><td></td><td>DS60S, PM95 외의 PDA 기기를 사용할 경우, 사용할 기기명 배열</td></tr><tr><td><a href="#onscanerror">onScanError</a></td><td></td><td>Function</td><td></td><td>스캔 오류 시 호출되는 콜백 함수</td></tr><tr><td><a href="#scanvalidator">scanValidator</a></td><td></td><td>Function</td><td></td><td>스캔값 유효성 검증 함수</td></tr><tr><td><a href="#scanstopcondition">scanStopCondition</a></td><td></td><td>Function</td><td></td><td>스캔 중단 조건 함수</td></tr></tbody></table>

{% hint style="warning" %}

* eventName(스캔 후 실행할 이벤트)에서 f.Event().brack()를 통해 이벤트 중단하는경우 PDA 스캔이 `AFTER_EVENT`단계에서 중단되게됩니다.
  {% endhint %}

### onScanError

스캔 중 오류가 발생했을 때 호출되는 함수입니다.

**파라미터**:

* `err: Error` (에러 객체)
* `state: object` (현재 상태 전체 복사본)

<pre class="language-javascript"><code class="lang-javascript"><strong>// Sample code
</strong>{
    onScanError: function (err, state) {
        console.error("스캔 오류:", err.message);
    }
}
</code></pre>

### scanValidator

스캔된 값이 유효한지 확인하는 함수입니다.

스캔이 완료된 직후 자동 호출되고, 유효하지않은 값인경우 무시됩니다. (스캔횟수로 카운트되지 않습니다.)

**파라미터**:

* `value: string` (스캔된 값)
* `state: object` (현재 상태 전체 복사본)

**반환값**: `true` (유효) 또는 `false` (무효)

<pre class="language-javascript"><code class="lang-javascript">// Sample code
{
    scanValidator: function (value, state) {
<strong>        // 숫자만 허용
</strong>        return /^[0-9]+$/.test(value);
    }
}
</code></pre>

### scanStopCondition

스캔 완료 후 스캔을 계속 진행할지 중단할지 결정하는 함수입니다.

**호출 시점**: 스캔 후 카테고리에 값을 추가하고, 이벤트를 호출하기전에 실행됩니다.

**파라미터**:

* `value: string` (스캔된 값)
* `state: object` (현재 상태 전체 복사본)

**반환값**: `true` (스캔 중단), `false` (스캔 계속)

<pre class="language-javascript"><code class="lang-javascript">// Sample code
{
    scanStopCondition: function (value, state) {
<strong>        // 예시: 같은 값이 연속 2번 입력되면 스캔 중단
</strong>        const last = state.scanHistory[state.scanHistory.length - 2];
        return last === value;
    }
}
</code></pre>

## 예시

```javascript
// Sample code
f.Scanner.init({
    categoryName : 'tempScanItem',
    ckey: "BarcodeString",
    scanSuffix: "#",
    eventName : "Check_ScanItem",
    usePDAModels : ["PM84"],
    maxScanCount : 3,
    scanValidator: function (value, state) {
        return /^[0-9]+$/.test(value);
    },
    scanStopCondition: function (value, state) {
        const last = state.scanHistory[state.scanHistory.length - 2];
        return last === value;
    }
    
})
```
