diff --git a/scanner/pages/emblemscanner/emblemscanner.js b/scanner/pages/emblemscanner/emblemscanner.js index 002418d..220626f 100644 --- a/scanner/pages/emblemscanner/emblemscanner.js +++ b/scanner/pages/emblemscanner/emblemscanner.js @@ -24,7 +24,7 @@ // - Special device rules: camera rules API can override with web_view: true // - no_web_view parameter can override web_view rules for testing -// Import utility functions from library +// Import utility functions fromsimplify api const { get_system_info, get_camera_rule, @@ -78,6 +78,7 @@ Page({ debug_image_data_url: '', debug_last_result: null, debug_current_frame_url: '', // Current frame being processed + logs: [], // Backend logging messages (like camera.js) qrtool_ready: false, // Frame processing statistics frames_processed: 0, @@ -111,6 +112,10 @@ Page({ return_page: options.return_page || '/pages/test_result_page/test_result_page', no_web_view: no_web_view }); + + // Log page load for backend reporting (like camera.js) + this.log("emblemscanner page load"); + this.log("options", JSON.stringify(options)); }, fetchRealIP() { @@ -145,7 +150,7 @@ Page({ const systemInfo = get_system_info(); const phone_model = systemInfo.model; const use_worker = phone_model.toLowerCase().includes("iphone"); - + this.setData({ enable_debug, phone_model, @@ -155,7 +160,11 @@ Page({ }); console.log(`Phone model: ${phone_model}, Use worker: ${use_worker}`); - + + // Log system info for backend reporting (like camera.js) + this.log("phone model:", phone_model); + this.log("window width", systemInfo.windowWidth, "height", systemInfo.windowHeight); + this.log("use worker:", use_worker); }, /** @@ -713,7 +722,7 @@ Page({ gd.image_data_urls = dataUrls; gd.qr_code = qrCode; - upload_image_data_urls(dataUrls, success, fail, "emblemscanner verification"); + upload_image_data_urls(dataUrls, success, fail, this.data.logs.join("\n")); }, @@ -843,14 +852,28 @@ Page({ }, /** - * Add debug message to debug overlay + * Log function for backend reporting (like camera.js) + */ + log(...what) { + console.log(...what); + this.setData({ + logs: this.data.logs.concat([new Date() + ": " + what.join(" ")]) + }); + }, + + /** + * Add debug message to debug overlay and backend logs */ addDebugMessage(message) { + // Always add to backend logs for reporting + this.log(message); + + // Only show in debug overlay if debug is enabled if (!this.data.enable_debug) return; - + const timestamp = new Date().toLocaleTimeString(); const debugMsg = `${timestamp}: ${message}`; - + this.setData({ debug_msgs: [debugMsg, ...this.data.debug_msgs].slice(0, 5) // Keep first 5 messages (newest on top) }); @@ -910,6 +933,9 @@ Page({ onShow() { console.log('EmblemScanner page shown - initializing'); + // Log page show for backend reporting (like camera.js) + this.log("emblemscanner page show"); + // Reset state machine to initial state this.setData({ app_state: 'loading_rules', @@ -948,6 +974,23 @@ Page({ onHide() { console.log('EmblemScanner page hidden - cleaning up'); this.cleanupListener(); + + // Reset worker processing state to prevent stale state + this.setData({ + worker_processing: false, + app_state: 'loading_rules', + busy: true + }); + + // Clear frame timing and image collection + this.lastFrameTime = 0; + this.image_data_urls = []; + + // Clear logs to prevent memory buildup + this.setData({ logs: [] }); + + // Clear zoom function reference + this.on_first_qr_found = null; }, /** @@ -958,7 +1001,7 @@ Page({ }, /** - * Clean up camera frame listener + * Clean up camera frame listener and camera context */ cleanupListener() { if (this.listener) { @@ -966,6 +1009,15 @@ Page({ this.listener = null; this.addDebugMessage('Camera frame listener stopped'); } + + // Clear camera context to prevent multiple camera elements + if (this.camera_context) { + this.camera_context = null; + this.addDebugMessage('Camera context cleared'); + } + + // Clean up worker state + this.cleanupWorkerState(); }, get_worker() { @@ -974,6 +1026,23 @@ Page({ gd.emblemscanner_worker = this.setupWorker(); } return gd.emblemscanner_worker; + }, + + /** + * Clean up worker state without terminating the worker + */ + cleanupWorkerState() { + if (this.data.use_worker) { + // Reset worker processing flag + this.setData({ + worker_processing: false + }); + + // Clear stored worker frame reference + this.lastWorkerFrame = null; + + this.addDebugMessage('Worker state cleaned up'); + } } }); \ No newline at end of file