2025-04-15 06:51:51 +01:00

153 lines
3.3 KiB
JavaScript

// pages/frame/frame.js
const { get_phone_model } = require("../../utils");
const { data_url_from_frame } = require("../../precheck");
Page({
/**
* Page initial data
*/
data: {
uploaded: 0,
failed: 0,
session_id: Date.now(),
frame_id: 0,
next_upload_time: 0,
uploading: false,
},
/**
* Lifecycle function--Called when page load
*/
onLoad(options) {
},
/**
* Lifecycle function--Called when page is initially rendered
*/
onReady() {
},
/**
* Lifecycle function--Called when page show
*/
onShow() {
},
/**
* Lifecycle function--Called when page hide
*/
onHide() {
},
/**
* Lifecycle function--Called when page unload
*/
onUnload() {
},
/**
* Page event handler function--Called when user drop down
*/
onPullDownRefresh() {
},
/**
* Called when page reach bottom
*/
onReachBottom() {
},
/**
* Called when user click on the top right corner to share
*/
onShareAppMessage() {
},
set_pos() {
this.setData({
label: "pos",
pos_class: "active",
neg_class: "",
stop_class: "",
})
},
set_neg() {
this.setData({
label: "neg",
pos_class: "",
neg_class: "active",
stop_class: "",
})
},
stop() {
this.setData({
"label": null,
pos_class: "",
neg_class: "",
stop_class: "active",
})
},
setup_camera() {
console.log("setup_camera");
const ctx = wx.createCameraContext();
ctx.setZoom({
zoom: 2
})
const listener = ctx.onCameraFrame((res) => { this.handle_frame(res) });
listener.start();
},
handle_frame(res) {
if (!this.data.label || this.data.uploading) {
return;
}
const now = Date.now();
if (now < this.data.next_upload_time) {
return;
}
console.log("uploading frame", this.data.frame_id);
const session_id = this.data.session_id;
const frame_id = this.data.frame_id;
this.setData({
frame_id: frame_id + 1,
uploading: true,
});
const url = `https://themblem.com/api/v5/frame/${session_id}/${frame_id}`;
var uca1 = new Uint8ClampedArray(res.data);
var uca = new Uint8ClampedArray(uca1);
const image_data_url = data_url_from_frame(res.width, res.height, uca);
wx.request({
url,
method: "POST",
data: {
label: this.data.label,
phone_model: get_phone_model(),
image: image_data_url,
},
success: (res) => {
this.setData({
uploaded: this.data.uploaded + 1,
next_upload_time: now + 500,
uploading: false,
});
},
fail: (res) => {
this.setData({
failed: this.data.failed + 1,
next_upload_time: now + 500,
uploading: false,
});
},
});
},
})