emblemscanner: add log and fix camera state

This commit is contained in:
Fam Zheng 2025-09-16 21:24:40 +01:00
parent b87693a717
commit c8be7e4ce4

View File

@ -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');
}
}
});