From 87d3ddcd49c889233c912acd2ac94960d883b630 Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Fri, 14 Feb 2025 21:50:09 +0000 Subject: [PATCH] camera: Upload frame every 5 seconds --- scanner/pages/camera/camera.js | 62 +++++++++++++++++++++++++++++--- scanner/pages/camera/camera.wxml | 1 + 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/scanner/pages/camera/camera.js b/scanner/pages/camera/camera.js index 80bd04a..5cfa5dd 100644 --- a/scanner/pages/camera/camera.js +++ b/scanner/pages/camera/camera.js @@ -33,6 +33,7 @@ Page({ phone_model: "unknown", progress: 0, zoom: -1, + rule_zoom: -1, max_zoom: 1, use_worker: false, show_tip: false, @@ -42,6 +43,9 @@ Page({ should_check_auto_torch: true, done_checking_auto_torch: false, camera_sensitivity: 1, + frame_uploaded: 0, + last_frame_upload_time: 0, + frame_upload_seq_num: 0, }, make_hint_text(r) { @@ -53,6 +57,10 @@ Page({ } } if (qr_is_valid) { + if (this.on_qr_found) { + this.on_qr_found(); + this.on_qr_found = null; + } var err = r.err || ""; if (err.includes("margin too small")) { return "对齐定位点"; @@ -71,12 +79,18 @@ Page({ }, onLoad(options) { + var new_session_id = Date.now(); + getApp().globalData.session_id = new_session_id; + if (options.env == 'dev') { + console.log("Using dev env settings."); + getApp().globalData.server_url = 'https://dev.themblem.com'; + } this.log("camera page load (build240622.2120)"); get_camera_rule(null, () => {}); this.log("options", options); options = options || {}; if (options.debug || options.scene == 'debug') { - getApp().globalData.debug = true; + getApp().globalData.debug = true } var enable_debug = getApp().globalData.debug; const si = get_system_info(); @@ -309,12 +323,21 @@ Page({ } get_camera_rule(max_zoom, (rule) => { var zoom = rule.zoom; + var initial_zoom = 2; this.setData({ - zoom, + zoom: initial_zoom, + rule_zoom: zoom, }); const ctx = wx.createCameraContext(); - this.log("camera set zoom", zoom); - ctx.setZoom({ zoom }); + this.log(`camera set initial zoom to ${initial_zoom}x, will zoom in to ${rule.zoom}x when qr is found`); + ctx.setZoom({ zoom: initial_zoom }); + this.on_qr_found = () => { + this.log(`qr found, zoom to ${rule.zoom}x`); + ctx.setZoom({ zoom: rule.zoom }); + this.setData({ + zoom: rule.zoom, + }); + } if (!this.listener) { this.log("creating camera frame listener..."); const listener = ctx.onCameraFrame((res) => { this.handle_frame(res) }); @@ -336,6 +359,36 @@ Page({ this.failed = true; } }, + handle_image_data_url(data_url) { + const now = Date.now(); + const interval = 5000; // 5 seconds + if (now - this.data.last_frame_upload_time < interval) { + return; + } + this.setData({ + last_frame_upload_time: now, + frame_upload_seq_num: this.data.frame_upload_seq_num + 1, + }); + var fd = { + session_id: getApp().globalData.session_id, + phone_model: getApp().globalData.phone_model, + seq_num: this.data.frame_upload_seq_num, + image_data_url: data_url, + } + wx.request({ + url: getApp().globalData.server_url + '/api/v1/camera-frame/', + method: "POST", + data: fd, + success: (res) => { + this.setData({ + frame_uploaded: this.data.frame_uploaded + 1, + }); + }, + fail: (e) => { + this.log("frame upload failed", e); + }, + }); + }, do_handle_frame(res) { if (this.busy) return; this.busy = true; @@ -361,6 +414,7 @@ Page({ result: JSON.stringify(r.result), debug_image_data_url: r.data_url, }); + this.handle_image_data_url(data_url); if (this.data.done_checking_auto_torch && result.ok && result.angle >= 0 && result.qrcode.length && is_emblem_qr_pattern(result.qrcode)) { this.setData({ show_modal: "verifying", diff --git a/scanner/pages/camera/camera.wxml b/scanner/pages/camera/camera.wxml index baa9959..097dda4 100644 --- a/scanner/pages/camera/camera.wxml +++ b/scanner/pages/camera/camera.wxml @@ -33,6 +33,7 @@ model: {{ phone_model }} zoom: {{ zoom }} sensitivity: {{ camera_sensitivity }} + frame uploaded: {{ frame_uploaded }} max zoom: {{ max_zoom }} result: {{ result }}