wallpaper.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. // pages/piano/wallpaper/wallpaper.js
  2. const { deviceWallPaper } = require('../../../request/deviceListRequest')
  3. // const sharp = require('sharp');
  4. // const fs = require('fs');
  5. const {
  6. BtHelper
  7. } = require('../../../devices/bt_helper');
  8. const { BtCmd } = require('../../../devices/bluetooth/bt_cmd');
  9. import EventManager from '../../../utils/event_bus'
  10. import { EnumCmdEvent, CmdEvent } from '../../../devices/cmd_key_event';
  11. // import EventManager from '../../utils/event_bus'
  12. Page({
  13. /**
  14. * 页面的初始数据
  15. */
  16. data: {
  17. topImg: {
  18. pic: "wxfile://tmp_d3e57489ead39c698676ff860df9cb8a37f66ee1a4777dbb.jpg",
  19. id: "",
  20. name: ""
  21. },
  22. imageList: [
  23. {
  24. pic: "https://inews.gtimg.com/om_bt/OAVMydtx9BsJxf5i_thi4Oll9sR1px-Esmtv6UHSxoisEAA/641",
  25. id: "",
  26. name: ""
  27. },
  28. {
  29. pic: "https://inews.gtimg.com/om_bt/OAVMydtx9BsJxf5i_thi4Oll9sR1px-Esmtv6UHSxoisEAA/641",
  30. id: "",
  31. name: ""
  32. },
  33. {
  34. pic: "https://inews.gtimg.com/om_bt/OAVMydtx9BsJxf5i_thi4Oll9sR1px-Esmtv6UHSxoisEAA/641",
  35. id: "",
  36. name: ""
  37. },
  38. {
  39. pic: "https://inews.gtimg.com/om_bt/OAVMydtx9BsJxf5i_thi4Oll9sR1px-Esmtv6UHSxoisEAA/641",
  40. id: "",
  41. name: ""
  42. },
  43. {
  44. pic: "https://inews.gtimg.com/om_bt/OAVMydtx9BsJxf5i_thi4Oll9sR1px-Esmtv6UHSxoisEAA/641",
  45. id: "",
  46. name: ""
  47. }
  48. ],
  49. selectIndex: 0,
  50. nvabarData: {
  51. showCapsule: 1, //是否显示左上角图标 1表示显示 0表示不显示
  52. title: '壁纸设置', //导航栏 中间的标题
  53. },
  54. src: '',
  55. width: 250,//宽度
  56. height: 250,//高度
  57. _imageBuffer: null,
  58. }, footerTap() {
  59. const that = this;
  60. wx.chooseImage({
  61. count: 1, // 最多可以选择的图片张数
  62. sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  63. sourceType: ['album'], // 从相册选择
  64. success: function (res) {
  65. const tempFilePaths = res.tempFilePaths;
  66. // console.log('获取图片信息成功', res);
  67. // wx.cropImage({
  68. // src: tempFilePaths[0], // 图片路径
  69. // cropScale: '1:1', // 裁剪比例
  70. // success: (res) => {
  71. // console.log('裁剪成功', res);
  72. // that.setData({
  73. // src: res.tempFilePath
  74. // })
  75. // }
  76. // })
  77. wx.getImageInfo({
  78. src: tempFilePaths[0],
  79. success: function (imageInfo) {
  80. console.log('获取图片信息成功', imageInfo);
  81. //获取到image-cropper实例
  82. //开始裁剪
  83. that.setData({
  84. src: imageInfo.path,//要裁剪的图片
  85. })
  86. },
  87. fail: function (err) {
  88. console.error('获取图片信息失败', err);
  89. }
  90. });
  91. },
  92. fail: function (err) {
  93. console.error('选择图片失败', err);
  94. }
  95. });
  96. },
  97. async convertToRGB565(inputPath, outputPath) {
  98. try {
  99. // todo
  100. let sharp = null
  101. const metadata = await sharp(inputPath).metadata();
  102. const { width, height } = metadata;
  103. const buffer = await sharp(inputPath)
  104. .raw()
  105. .toBuffer();
  106. const outputBuffer = Buffer.alloc(width * height * 2); // 2 bytes per pixel for RGB565
  107. for (let y = 0; y < height; y++) {
  108. for (let x = 0; x < width; x++) {
  109. const index = (y * width + x) * 4; // RGBA
  110. const r = buffer[index];
  111. const g = buffer[index + 1];
  112. const b = buffer[index + 2];
  113. const r5 = (r >> 3) & 0x1F; // 5 bits for red
  114. const g6 = (g >> 2) & 0x3F; // 6 bits for green
  115. const b5 = (b >> 3) & 0x1F; // 5 bits for blue
  116. const rgb565 = (r5 << 11) | (g6 << 5) | b5;
  117. const outputIndex = (y * width + x) * 2;
  118. outputBuffer[outputIndex] = (rgb565 >> 8) & 0xFF; // High byte
  119. outputBuffer[outputIndex + 1] = rgb565 & 0xFF; // Low byte
  120. }
  121. }
  122. _this.data._imageBuffer = outputBuffer;
  123. _this.startImage()
  124. // fs.writeFileSync(outputPath, outputBuffer);
  125. console.log(`Conversion successful: ${outputPath}`);
  126. } catch (error) {
  127. console.error('Error converting image:', error);
  128. }
  129. },
  130. imageTap(e) {
  131. // console.log(e)
  132. // wxfile://tmp_d3e57489ead39c698676ff860df9cb8a37f66ee1a4777dbb.jpg
  133. let image = e.currentTarget.dataset.image;
  134. _this.setData({
  135. topImg: image ?? {}
  136. })
  137. }, wallpaperList() {
  138. let _this = this;
  139. deviceWallPaper().then(res => {
  140. console.log("壁纸列表", res);
  141. let data = res.data ?? []
  142. if (data.length == 0) {
  143. _this.setData({
  144. imageList: [],
  145. topImg: {},
  146. })
  147. return;
  148. }
  149. topImg = data[0];
  150. _this.setData({
  151. imageList: data ?? [],
  152. topImg: data[0] ?? {}
  153. })
  154. })
  155. },
  156. startImage() {
  157. BtHelper.sendData(BtCmd.wallPaper(1));
  158. },
  159. sendImage(imageBuffer) {
  160. let chunkSize = 20;
  161. for (let i = 0; i < imageBuffer.length; i += chunkSize) {
  162. const chunk = imageBuffer.slice(i, i + chunkSize);
  163. // this.sendImage(chunk);
  164. BtHelper.wallPaperData(chunk)
  165. }
  166. },
  167. endImage() {
  168. BtHelper.sendData(BtCmd.wallPaper(0));
  169. },
  170. /**
  171. * 生命周期函数--监听页面加载
  172. */
  173. onLoad(options) {
  174. let param = JSON.parse(options.param)
  175. console.log(param)
  176. this.wallpaperList();
  177. let _this = this;
  178. EventManager.addNotification(CmdEvent.eventName, function (event) {
  179. let name = event.cmdEvent;
  180. console.log("壁纸页:", event)
  181. switch (name) {
  182. case EnumCmdEvent.wallPaper:
  183. let otaCmd = event.wallPaper;
  184. let kind = event.kind;
  185. if (otaCmd === 1 && kind == 1) {
  186. // 开始发送
  187. _this.sendOtaData()
  188. } else if (otaCmd === 0 && kind == 1) {
  189. // 发送结束
  190. _this.endEnd()
  191. }
  192. break;
  193. }
  194. }, this)
  195. },
  196. /**
  197. * 生命周期函数--监听页面初次渲染完成
  198. */
  199. onReady() {
  200. },
  201. /**
  202. * 生命周期函数--监听页面显示
  203. */
  204. onShow() {
  205. },
  206. /**
  207. * 生命周期函数--监听页面隐藏
  208. */
  209. onHide() {
  210. },
  211. /**
  212. * 生命周期函数--监听页面卸载
  213. */
  214. onUnload() {
  215. EventManager.removeNotification(CmdEvent.eventName, this);
  216. },
  217. /**
  218. * 页面相关事件处理函数--监听用户下拉动作
  219. */
  220. onPullDownRefresh() {
  221. },
  222. /**
  223. * 页面上拉触底事件的处理函数
  224. */
  225. onReachBottom() {
  226. },
  227. /**
  228. * 用户点击右上角分享
  229. */
  230. onShareAppMessage() {
  231. }
  232. })