-
Notifications
You must be signed in to change notification settings - Fork 0
/
CognexScanner.js
174 lines (156 loc) · 5.07 KB
/
CognexScanner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import React, {useEffect, useState} from 'react';
import {
NativeEventEmitter,
ActivityIndicator,
StyleSheet,
View,
Platform,
} from 'react-native';
import {useRecoilValue} from 'recoil';
import {CMBReader, cmb} from 'cmbsdk-react-native';
import {globaAppState} from './RecoilState';
export default CognexScanner = ({onBarCodeScanned, onClose}) => {
const {changeToActive} = useRecoilValue(globaAppState);
const [scannerState, setScannerState] = useState({
isScanning: false,
connected: false,
results: [],
});
// set up the lister for the QR being readed
useEffect(() => {
const cmbEventEmitter = new NativeEventEmitter(cmb);
const resultListner = cmbEventEmitter.addListener(
CMBReader.EVENT.ReadResultReceived,
results => {
const data = results?.readResults[0]?.readString;
data ? onBarCodeScanned(data) : onClose();
},
);
const connectionListner = cmbEventEmitter.addListener(
CMBReader.EVENT.ConnectionStateChanged,
connectionState => {
connectionStateChanged(connectionState);
},
);
return () => {
resultListner.remove();
connectionListner.remove();
};
}, [onBarCodeScanned, onClose, changeToActive]);
// set up the camera as the reader device
useEffect(() => {
createReaderDevice();
return () => {
cmb.stopScanning();
};
}, [onBarCodeScanned, onClose, changeToActive]);
function createReaderDevice() {
if (scannerState.connected == CMBReader.CONNECTION_STATE.Connected) {
cmb.disconnect();
}
cmb.setCameraMode(CMBReader.CAMERA_MODE.NoAimer);
if (Platform.OS === 'ios') {
cmb.setPreviewContainerBelowStatusBar(true);
cmb.setPreviewContainerPositionAndSize([0,0,100,100]);
} else {
cmb.setPreviewContainerFullScreen().then(result => {
console.log('ok setPreviewContainerFullScreen:', result);
}).catch(problem => {
console.log('fail setPreviewContainerFullScreen:', problem);
});
}
cmb.loadScanner(CMBReader.DEVICE_TYPE.Camera).then(response => {
connectToReaderDevice();
});
}
// Before the self.readerDevice can be configured or used, a connection needs to be established
function connectToReaderDevice() {
cmb
.getAvailability()
.then(response => {
if (response == CMBReader.AVAILABILITY.Available) {
cmb
.connect()
.then(connectMethodResult => {})
.catch(failure => {
console.log(
'CMB - connectReader failed: ' + JSON.stringify(failure),
);
});
}
})
.catch(rejecter => {
console.log(
'CMB - getAvailability failed: ' + JSON.stringify(rejecter),
);
});
}
// This is called when a connection with the Camera has been changed.
// The self.readerDevice is usable only in the "CMBReader.CONNECTION_STATE.Connected" state
function connectionStateChanged(connectionState) {
setScannerState(prev => ({
...prev,
connected: connectionState == CMBReader.CONNECTION_STATE.Connected,
}));
if (connectionState == CMBReader.CONNECTION_STATE.Connected) {
configureReaderDevice();
}
}
function configureReaderDevice() {
//----------------------------------------------
// Explicitly enable the QR symbols to be scanned
cmb.setSymbology(CMBReader.SYMBOLOGY.QR, true, CMBReader.SYMBOLOGY_NAME.QR);
//---------------------------------------------------------------------------
// We are going to explicitly turn off image results (although this is the
// default). The reason is that enabling image results with an MX-1xxx
// scanner is not recommended unless your application needs the scanned
// image--otherwise scanning performance can be impacted.
//---------------------------------------------------------------------------
cmb
.enableImage(false)
.then(resolve => {})
.catch(failure => {
console.log('CMB - enableImage failed: ' + JSON.stringify(failure));
});
cmb
.enableImageGraphics(false)
.then(resolve => {})
.catch(failure => {
console.log(
'CMB - enableImageGraphics failed: ' + JSON.stringify(failure),
);
});
// Do not interrupt scan if application rotates
cmb.setStopScannerOnRotate(false);
// For Phone/tablet set the SDK's decoding effort to level 3
cmb.sendCommand('SET DECODER.EFFORT 3', 'DECODER.EFFORT');
setTimeout(() => {
cmb.startScanning().then((resolver) => {
setScannerState(prev => ({
...prev,
isScanning: true,
}));
}).catch((rejecter) => {
setScannerState(prev => ({
...prev,
isScanning: false,
}));
});
}, 20);
}
return (
<View
style={styles.container}>
<ActivityIndicator size="large" color="#b6b9bd" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
height: '100%',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#FFFFFF',
},
});