AirCAMERA_1020.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. local AirCAMERA_1020 =
  2. {
  3. id = camera.DVP,
  4. -- capture_photo_buff:拍照使用的zbuff缓冲区
  5. -- opend:是否已经成功打开
  6. }
  7. -- 摄像头事件回调函数
  8. local function camera_scan_cbfunc(id, str)
  9. log.info("camera_scan_cbfunc", id, str)
  10. --str为string类型时,表示扫码模式下扫码结果的回调
  11. --str为扫码识别后的解码字符串
  12. if type(str) == 'string' then
  13. log.info("scan code result", str)
  14. --str为false时,表示摄像头没有正常工作
  15. elseif str == false then
  16. log.error("no data")
  17. --str为number类型时,表示拍摄到的照片字节大小
  18. else
  19. log.info("capture photo data", str)
  20. sys.publish("AirCAMERA_1020_CAPTURE_IND", true)
  21. end
  22. end
  23. --打开AirCAMERA_1020摄像头;
  24. --width:number类型;
  25. -- 表示摄像头拍照时的宽度,单位为像素;
  26. -- 取值范围:大于0,并且和height的乘积不能超过1280*720;
  27. -- 如果没有传入此参数,则默认为1280;
  28. --height:number类型;
  29. -- 表示摄像头拍照时的宽度,单位为像素;
  30. -- 取值范围:大于0,并且和width的乘积不能超过1280*720;
  31. -- 如果没有传入此参数,则默认为720;
  32. --返回值:成功返回true,失败返回false
  33. function AirCAMERA_1020.open(width, height)
  34. --如果没有传入参数,width和height都使用默认值
  35. width = width or 1280
  36. height = height or 720
  37. --判断width和height参数的合法性
  38. if width<0 or height<0 or width*height>1280*720 then
  39. log.error("AirCAMERA_1020.open error", "invalid width or height", width, height)
  40. return false
  41. end
  42. --如果没有分配过存储照片的内存数据,此处申请200KB的zbuff内存空间
  43. --如果拍照过程中,发现200KB的空间不够使用,会自动扩充空间
  44. if AirCAMERA_1020.capture_photo_buff==nil then
  45. AirCAMERA_1020.capture_photo_buff = zbuff.create(200 * 1024, 0, zbuff.HEAP_PSRAM)
  46. if AirCAMERA_1020.capture_photo_buff == nil then
  47. log.error("AirCAMERA_1020.open error", "malloc mem fail")
  48. return false
  49. end
  50. end
  51. --初始化摄像头
  52. if not camera.init({id = AirCAMERA_1020.id, sensor_width = width, sensor_height = height}) then
  53. log.error("AirCAMERA_1020.open error", "camera.init fail")
  54. AirCAMERA_1020.capture_photo_buff:free()
  55. AirCAMERA_1020.capture_photo_buff = nil
  56. return false
  57. end
  58. --注册摄像头事件回调函数camera_scan_cbfunc
  59. --摄像头的异步事件都会通过回调函数通知结果
  60. camera.on(AirCAMERA_1020.id, "scanned", camera_scan_cbfunc)
  61. --设置摄像头已经成功打开的标志
  62. AirCAMERA_1020.opend = true
  63. return true
  64. end
  65. --使用AirCAMERA_1020摄像头拍照;必须在task中使用
  66. --返回值:成功返回照片的zbuff内存数据,失败返回false
  67. function AirCAMERA_1020.capture()
  68. --检查是否运行在task中
  69. local co, is_main = coroutine.running()
  70. -- Lua 5.1: 直接返回协程(主协程返回 nil)
  71. -- Lua 5.2+: 返回协程和是否是主协程
  72. if type(co) == "thread" and is_main then
  73. log.error("AirCAMERA_1020.capture error", "must in task", type(co) == "thread", is_main)
  74. return false
  75. end
  76. if co == nil then
  77. log.error("AirCAMERA_1020.capture error", "must in task", co)
  78. return false
  79. end
  80. --如果摄像头没有打开
  81. if not AirCAMERA_1020.opend then
  82. log.error("AirCAMERA_1020.capture error", "camera isn't opend")
  83. return false
  84. end
  85. if not camera.start(AirCAMERA_1020.id) then
  86. log.error("AirCAMERA_1020.capture error", "camera.start fail")
  87. return false
  88. end
  89. --启动拍照动作,拍照质量90%,如果拍照成功,照片数据存储到AirCAMERA_1020.capture_photo_buff的zbuff内存中
  90. if not camera.capture(AirCAMERA_1020.id, AirCAMERA_1020.capture_photo_buff, 1) then
  91. log.error("AirCAMERA_1020.capture error", "camera.capture sync fail")
  92. return false
  93. end
  94. --阻塞等待拍照结果,如果5秒钟没有等到结果,超时失败退出阻塞等待状态
  95. result = sys.waitUntil("AirCAMERA_1020_CAPTURE_IND", 5000)
  96. --打印拍摄的照片字节大小
  97. log.info("AirCAMERA_1020.capture", "photo size", AirCAMERA_1020.capture_photo_buff:used())
  98. if not result then
  99. log.error("AirCAMERA_1020.capture error", "camera.capture async fail")
  100. return false
  101. end
  102. --停止拍照
  103. camera.stop(AirCAMERA_1020.id)
  104. --返回存储照片数据的zbuff内存
  105. return AirCAMERA_1020.capture_photo_buff
  106. end
  107. --关闭AirCAMERA_1020摄像头
  108. --返回值:成功返回true,失败返回false
  109. function AirCAMERA_1020.close()
  110. --如果摄像头还没有打开,直接返回成功
  111. if not AirCAMERA_1020.opend then
  112. log.info("AirCAMERA_1020.close ok", "no open, needn't close")
  113. return true
  114. end
  115. --关闭摄像头
  116. camera.close(AirCAMERA_1020.id)
  117. --释放存储照片数据的zbuff内存
  118. if AirCAMERA_1020.capture_photo_buff ~= nil then
  119. AirCAMERA_1020.capture_photo_buff:free()
  120. AirCAMERA_1020.capture_photo_buff = nil
  121. end
  122. --复位摄像头已经成功打开的标志
  123. AirCAMERA_1020.opend = false
  124. return true
  125. end
  126. return AirCAMERA_1020