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
|