lgq
3 天以前 081f12a52906abe6c2d139fdc144135978681009
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
import dxui from '../../../../../dxmodules/dxUi.js'
import std from '../../../../../dxmodules/dxStd.js'
import viewUtils from "../../../viewUtils.js"
import topView from "../../../topView.js"
import localUserAddView from './localUserAddView.js'
import fingerApplyView from './fingerApplyView.js'
import screen from '../../../../screen.js'
import log from '../../../../../dxmodules/dxLogger.js'
import common from '../../../../../dxmodules/dxCommon.js'
import config from '../../../../../dxmodules/dxConfig.js'
import i18n from '../../../i18n.js'
import * as os from "os"
import mainView from '../../../mainView.js'
import dxMap from '../../../../../dxmodules/dxMap.js'
 
const fingerEnterView = {}
 
// 指纹录入标志,用于判断是否退出指纹录入
fingerEnterView.enterFlag = true
// 指纹录入时,默认要读取3次指纹特征
fingerEnterView.count = 3
// 是否是远程指纹录入
fingerEnterView.isRemote = false
 
fingerEnterView.init = function () {
    /**************************************************创建屏幕*****************************************************/
    const screenMain = dxui.View.build('fingerEnterView', dxui.Utils.LAYER.MAIN)
    fingerEnterView.screenMain = screenMain
    screenMain.scroll(false)
    screenMain.bgColor(0xffffff)
 
    screenMain.on(dxui.Utils.ENUM.LV_EVENT_SCREEN_LOADED, () => {
        topView.changeTheme(true)
        if(fingerEnterView.isRemote){
            fingerEnterView.titleBox.backScreen = fingerApplyView.screenMain
        }else{
            fingerEnterView.titleBox.backScreen = localUserAddView.screenMain
        }
        fingerEnterView.enterFlag = true
        uiReset()
 
        // 设置指纹录入标志,防止指纹录入时触发通行认证
        dxMap.get("UI").put("isFingerEntering", true)
        log.info("开始指纹录入,设置 isFingerEntering 标志为 true")
        // 获取索引,获取第一个可用的索引ID
        let inx = screen.driver.finger.getIndex()
        log.info("搜索到的第一个未使用的索引ID: ", inx)
        // 传入索引ID,开始录入特征
        register(inx)
    })
 
    screenMain.on(dxui.Utils.ENUM.LV_EVENT_SCREEN_UNLOADED, () => {
        fingerEnterView.titleBox.backScreen = localUserAddView.screenMain
        // 退出指纹录入流程
        fingerEnterView.enterFlag = false
        fingerEnterView.isRemote = false
        // 清除指纹录入标志
        dxMap.get("UI").del("isFingerEntering")
        log.info("退出指纹录入,清除 isFingerEntering 标志")
        uiReset()
    })
 
    const titleBoxBg = dxui.View.build(screenMain.id + 'titleBoxBg', screenMain)
    viewUtils._clearStyle(titleBoxBg)
    titleBoxBg.setSize(screen.screenSize.width * (600 / 600), screen.screenSize.height * (70 / 1024))
    titleBoxBg.align(dxui.Utils.ALIGN.TOP_MID, 0, 0)
    titleBoxBg.bgColor(0xffffff)
 
    const titleBox = viewUtils.title(screenMain, localUserAddView.screenMain, 'fingerEnterViewTitle', 'fingerEnterView.title', fingerEnterView.backCb)
    titleBox.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (50 / 1024))
    fingerEnterView.titleBox = titleBox
 
    const fingerRecLbl = dxui.Label.build('fingerRecLbl', screenMain)
    fingerRecLbl.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (240 / 1024))
    fingerRecLbl.textFont(viewUtils.font(28))
    fingerRecLbl.dataI18n = "fingerEnterView.fingerAdd"
 
    // 指纹录入框
    const fingerBox = dxui.Image.build('fingerBox', screenMain)
    fingerBox.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (500 / 1024))
    fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxS.png')
    fingerEnterView.fingerBox = fingerBox
    
    // 指纹录入进度图片
    const fingerRec = dxui.Image.build('fingerRec', screenMain)
    fingerRec.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (525 / 1024))
    fingerRec.source(screen.resourcePath.imagePath + '/fingerRe0.png')
    fingerEnterView.fingerRec = fingerRec
 
    // 最下方进度计数Label
    const fingerCountLbl = dxui.Label.build('fingerCountLbl', screenMain)
    fingerCountLbl.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (900 / 1024))
    fingerCountLbl.textFont(viewUtils.font(28))
    fingerCountLbl.text("1/" + fingerEnterView.count)
    fingerEnterView.fingerCountLbl = fingerCountLbl
 
    // 最下方录入状态提示Label(录入完成、录入失败、录入超时、重复录入)
    const fingerStatusLbl = dxui.Label.build('fingerStatusLbl', screenMain)
    fingerStatusLbl.align(dxui.Utils.ALIGN.TOP_MID, 0, screen.screenSize.height * (800 / 1024))
    fingerStatusLbl.textFont(viewUtils.font(28))
    fingerStatusLbl.dataI18n = " "
    fingerEnterView.fingerStatusLbl = fingerStatusLbl
 
    // 重复录入情况下-退出按钮 默认隐藏
    const fingerExitBtn = dxui.Button.build('fingerExitBtn', screenMain)
    fingerExitBtn.setSize(screen.screenSize.width * (210 / 600), screen.screenSize.height * (50 / 1024))
    fingerExitBtn.align(dxui.Utils.ALIGN.TOP_LEFT, screen.screenSize.width * (87 / 600), screen.screenSize.height * (900 / 1024))
    fingerExitBtn.bgColor(0xEAEAEA)
    fingerExitBtn.radius(30)
    fingerExitBtn.on(dxui.Utils.EVENT.CLICK, () => {
        dxui.loadMain(localUserAddView.screenMain)
        fingerEnterView.backCb()
    })
    fingerEnterView.fingerExitBtn = fingerExitBtn
 
    const fingerExitBtnLbl = dxui.Label.build('fingerExitBtnLbl', fingerExitBtn)
    fingerExitBtnLbl.dataI18n = 'fingerEnterView.exit'
    fingerExitBtnLbl.textFont(viewUtils.font(26))
    fingerExitBtnLbl.align(dxui.Utils.ALIGN.CENTER, 0, 0)
    fingerExitBtnLbl.textColor(0x000000)
 
    // 重复录入情况下-重新录入按钮 默认隐藏
    const fingerResetBtn = dxui.Button.build('fingerResetBtn', screenMain)
    fingerResetBtn.setSize(screen.screenSize.width * (210 / 600), screen.screenSize.height * (50 / 1024))
    fingerResetBtn.align(dxui.Utils.ALIGN.TOP_RIGHT, -screen.screenSize.width * (76 / 600), screen.screenSize.height * (900 / 1024))
    fingerResetBtn.bgColor(0x000000)
    fingerResetBtn.radius(30)
    fingerResetBtn.on(dxui.Utils.EVENT.CLICK, () => {
        // 重新录入指纹
        fingerEnterView.enterFlag = true
        uiReset()
 
        log.info("指纹重新录入")
        // 获取索引,获取第一个可用的索引ID
        let inx = screen.driver.finger.getIndex()
        log.info("搜索到的第一个未使用的索引ID: ", inx)
        // 传入索引ID,开始录入特征
        register(inx)
    })
    fingerEnterView.fingerResetBtn = fingerResetBtn
 
    const fingerResetBtnLbl = dxui.Label.build('fingerResetBtnLbl', fingerResetBtn)
    fingerResetBtnLbl.dataI18n = 'fingerEnterView.reset'
    fingerResetBtnLbl.textFont(viewUtils.font(26))
    fingerResetBtnLbl.align(dxui.Utils.ALIGN.CENTER, 0, 0)
 
    fingerExitBtn.hide()
    fingerResetBtn.hide()
    fingerStatusLbl.hide()
}
 
function uiReset() {
    fingerEnterView.fingerCountLbl.text("1/" + fingerEnterView.count)
    fingerEnterView.fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxS.png')
    fingerEnterView.fingerRec.source(screen.resourcePath.imagePath + '/fingerRe0.png')
    fingerEnterView.fingerExitBtn.hide()
    fingerEnterView.fingerResetBtn.hide()
    fingerEnterView.fingerStatusLbl.hide()
    fingerEnterView.fingerCountLbl.show()
    std.clearInterval(fingerEnterView.fingerTimer)
    fingerEnterView.fingerTimer = null
}
 
// 注册指纹到指定的索引
function register(index, timeout = 50){
    // 循环生成N个特征、合并这N个特征为指纹模版、存储指纹模版
    // 1,注册用获取图像
    // 2,生成特征
    // 3,合并模版(合并N个特征)
    // 4,存储模版
    let bufferId = 1
    // let count = 0
    let startTime = Date.now()
    let language = config.get("base.language")||"CN";
    screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerInput1.wav`)
    fingerEnterView.fingerTimer = std.setInterval(() => {
 
        if(Date.now() - startTime > timeout * 1000){
            log.info("指纹录入失败、录入超时")
            screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerT.wav`)
            std.clearInterval(fingerEnterView.fingerTimer)
            fingerEnterView.fingerTimer = null
            fingerEnterView.enterFlag = false
            fingerEnterView.fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxF.png')
            fingerEnterView.fingerStatusLbl.dataI18n = "fingerEnterView.timeout"
            fingerEnterView.fingerStatusLbl.textColor(0xFF0000)
            i18n.refreshObj(fingerEnterView.fingerStatusLbl)
            fingerEnterView.fingerStatusLbl.show()
            // 超时后退出到主页面
            if(fingerApplyView.timeOut){
                std.clearTimeout(fingerApplyView.timeOut)
            }
            fingerApplyView.timeOut = null
            dxui.loadMain(mainView.screenMain)
            return
        }
 
        if(!fingerEnterView.enterFlag || bufferId > fingerEnterView.count){
            std.clearInterval(fingerEnterView.fingerTimer)
            fingerEnterView.fingerTimer = null
            return
        }
 
        // if(count == 0 && bufferId == 1){
        //     count++
        //     screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerInput1.wav`)
        // }
 
        // 1,注册用获取图像
        let res = screen.driver.finger.getEnrollImage()
        if(res != 0) {
            log.info("第" + bufferId + "个特征生成失败、请继续录入")
            return
        }
 
        // 2,生成特征
        res = screen.driver.finger.genChar(bufferId)
        if(res != 0) {
            log.info("第" + bufferId + "个特征生成失败、请继续录入")
            return
        }
 
        log.info("第" + bufferId + "个特征成功生成")
        // 特征录入成功,更新进度展示图片
        log.info("ppp: ", "/fingerRe" + bufferId + ".png")
        fingerEnterView.fingerRec.source(screen.resourcePath.imagePath + "/fingerRe" + bufferId + ".png")
 
        // 全部特征生成成功,开始合并特征生成模版
        if(bufferId == fingerEnterView.count){
 
            fingerEnterView.fingerCountLbl.hide()
 
            log.info("全部特征生成成功,开始合并特征生成模版")
            let res = screen.driver.finger.regModel()
            if(res != 0) {
                screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerF.wav`)
                log.info("合并特征失败、指纹录入流程失败!")
                fingerEnterView.enterFlag = false
                fingerEnterView.fingerStatusLbl.dataI18n = "fingerEnterView.fail"
                fingerEnterView.fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxF.png')
                fingerEnterView.fingerStatusLbl.textColor(0xFF0000)
                i18n.refreshObj(fingerEnterView.fingerStatusLbl)
                fingerEnterView.fingerStatusLbl.show()
                fingerEnterView.fingerResetBtn.show()
                fingerEnterView.fingerExitBtn.show()
                return
            }
 
            res = screen.driver.finger.search(bufferId, 0, 1024)
            if(res && res.code == 0){
                screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerR.wav`)
                log.info("搜索到指纹、指纹验证成功、指纹索引:" + res.pageIndex + ",指纹得分: " + res.score)
                fingerEnterView.enterFlag = false
                fingerEnterView.fingerStatusLbl.dataI18n = "fingerEnterView.repeat"
                fingerEnterView.fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxF.png')
                fingerEnterView.fingerStatusLbl.textColor(0xFF0000)
                i18n.refreshObj(fingerEnterView.fingerStatusLbl)
                fingerEnterView.fingerStatusLbl.show()
                fingerEnterView.fingerResetBtn.show()
                fingerEnterView.fingerExitBtn.show()
                return
            }
            
            log.info("模版生成成功、开始存储模版")
            res = screen.driver.finger.storeChar(index, 1)
            if(res != 0) {
                screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerF.wav`)
                log.info("存储模版失败、指纹录入流程失败!")
                fingerEnterView.enterFlag = false
                fingerEnterView.fingerStatusLbl.dataI18n = "fingerEnterView.fail"
                fingerEnterView.fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxF.png')
                fingerEnterView.fingerStatusLbl.textColor(0xFF0000)
                i18n.refreshObj(fingerEnterView.fingerStatusLbl)
                fingerEnterView.fingerStatusLbl.show()
                fingerEnterView.fingerResetBtn.show()
                fingerEnterView.fingerExitBtn.show()
                return
            }
 
            log.info("指纹录入成功")
            screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerS.wav`)
            fingerEnterView.enterFlag = false
            fingerEnterView.fingerStatusLbl.dataI18n = "fingerEnterView.success"
            fingerEnterView.fingerBox.source(screen.resourcePath.imagePath + '/fingerBoxS.png')
            fingerEnterView.fingerStatusLbl.textColor(0x05AA8D)
            fingerEnterView.fingerStatusLbl.show()
            i18n.refreshObj(fingerEnterView.fingerStatusLbl)
 
            std.clearInterval(fingerEnterView.fingerTimer)
            fingerEnterView.fingerTimer = null
            std.setTimeout(() => {
                if(!fingerEnterView.isRemote){
                    localUserAddView.nowUser.fingerId = index
                    localUserAddView.addFinger(localUserAddView.nowUser.fingerId)
                    dxui.loadMain(localUserAddView.screenMain)
                    fingerEnterView.backCb()
                }else{
                    // 主控读取指纹模版
                    // 从flash中获取指纹模版
                    screen.driver.finger.loadChar(index)
                    // 从传感器上获取bufferId默认为1,从flash中获取bufferId默认为2
                    let res = screen.driver.finger.upChar()
                    log.info("模版数据: ", common.arrayBufferToHexString(res))
                    screen.driver.finger.deleteChar(index, 1)
                    if(res == null) {
                        log.info("指纹模版上传失败!")
                        fingerEnterView.fingerReply(null, screen.MQTT_CODE.E_100)
                        if(fingerEnterView.userId){
                            screen.cacheFingerChar(fingerEnterView.userId, null)
                            fingerEnterView.userId = null
                            fingerEnterView.backCb()
                            dxui.loadMain(fingerApplyView.screenMain)
                        }else{
                            fingerEnterView.fingerReply(null, screen.MQTT_CODE.E_100)
                        }
                        return
                    }
                    log.info("指纹模版上传成功!")
                    if(fingerEnterView.userId){
                        screen.cacheFingerChar(fingerEnterView.userId, common.arrayBufferToHexString(res))
                        fingerEnterView.backCb()
                        dxui.loadMain(mainView.screenMain)
                    }else{
                        fingerEnterView.fingerReply(common.arrayBufferToHexString(res), screen.MQTT_CODE.S_000)
                    }
                }
            }, 1000);
            
            return
        }
        bufferId++
 
        // 写这里是因为,指纹录入后可以立马播报,而没有延迟,写到上面就会在2秒的下次循环后才会播报
        screen.driver.audio.play(`/app/code/resource/wav/${language}/fingerInput${bufferId}.wav`)
 
        // 特征录入成功,更新进度提示
        fingerEnterView.fingerCountLbl.text(bufferId + "/" + fingerEnterView.count)
    }, 2000)
}
 
fingerEnterView.enrollFinger = function(payload){
    fingerEnterView.isRemote = true
    fingerEnterView.payload = payload
}
 
fingerEnterView.fingerReply = function(fingerChar, code){
    if(!fingerEnterView.payload){
        return
    }
    let data = {
        serialNo: fingerEnterView.payload.serialNo,
        fingerChar: fingerChar,
        code: code
    }
    screen.fingerReply(data)
    fingerEnterView.payload = null
    fingerEnterView.isRemote = false
    // 隐藏该页面
    dxui.loadMain(mainView.screenMain)
}
 
fingerEnterView.fingerRegister = function() {
    // 重新录入指纹
    fingerEnterView.enterFlag = true
    uiReset()
 
    log.info("指纹重新录入")
    // 获取索引,获取第一个可用的索引ID
    let inx = screen.driver.finger.getIndex()
    log.info("搜索到的第一个未使用的索引ID: ", inx)
    // 传入索引ID,开始录入特征
    register(inx)
}
 
fingerEnterView.backCb = function () {
    log.info("remote: ", fingerEnterView.isRemote)
    if(!fingerEnterView.isRemote){
        if (!localUserAddView.nowUser) {
            return
        }
        if (localUserAddView.nowUser.id) {
        }
        localUserAddView.addID(localUserAddView.nowUser.id)
        if (localUserAddView.nowUser.name) {
            localUserAddView.addName(localUserAddView.nowUser.name)
        }
        if (localUserAddView.nowUser.idCard) {
            localUserAddView.addIDCard(localUserAddView.nowUser.idCard)
        }
        if (localUserAddView.nowUser.face) {
            localUserAddView.addFace(localUserAddView.nowUser.face, localUserAddView.nowUser.feature)
        }
        if (localUserAddView.nowUser.pwd) {
            localUserAddView.addPwd(localUserAddView.nowUser.pwd)
        }
        if (localUserAddView.nowUser.card) {
            localUserAddView.addCard(localUserAddView.nowUser.card)
        }
        localUserAddView.addType(localUserAddView.nowUser.type)
    }else{
        dxui.loadMain(fingerApplyView.screenMain)
    }
}
 
export default fingerEnterView