camera_raw.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. local libnet = require "libnet"
  2. local GC032A_InitReg =
  3. {
  4. zbar_scan = 0,--是否为扫码
  5. draw_lcd = 0,--是否向lcd输出
  6. i2c_id = 0,
  7. i2c_addr = 0x21,
  8. pwm_id = 5;
  9. pwm_period = 24*1000*1000,
  10. pwm_pulse = 0,
  11. sensor_width = 640,
  12. sensor_height = 480,
  13. color_bit = 16,
  14. init_cmd = "/luadb/GC032A_InitReg.txt"--此方法将初始化指令写在外部文件,支持使用 # 进行注释
  15. }
  16. local MSG_NEW = "DataNew" -- 新的一帧到来
  17. local camera_pwdn = gpio.setup(pin.PD06, 1, gpio.PULLUP) -- PD06 camera_pwdn引脚
  18. local camera_rst = gpio.setup(pin.PD07, 1, gpio.PULLUP) -- PD07 camera_rst引脚
  19. local taskName = "CAM_TASK"
  20. camera.on(0, "scanned", function(id, str)
  21. if type(str) == 'number' then --说明已经采集完成1fps,可以通知处理任务进行处理了
  22. sys_send(taskName, MSG_NEW, str)
  23. --camera.getRaw(0) --如果不想处理,纯粹看速度的,打开这行,上报速度为15fps
  24. elseif str == true then
  25. log.info("拍照完成")
  26. elseif str == false then
  27. log.error("摄像头没有数据")
  28. end
  29. end)
  30. local function netCB(msg)
  31. log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
  32. end
  33. --标注必要的是摄像头采集原始数据必须的操作
  34. local function camTask(ip, port)
  35. camera_rst(0) --必要的
  36. local camera_id = camera.init(GC032A_InitReg) --必要的
  37. local w,h = 320,240
  38. local cbuff = zbuff.create(w * h *2)--必要的
  39. local blen = w * 16 * 2
  40. local tx_buff = zbuff.create(blen + 16)
  41. local netc
  42. local result, param, is_err, rIP, rPort, vlen, start
  43. netc = socket.create(socket.ETH0, taskName)
  44. --socket.debug(netc, true)
  45. socket.config(netc, nil, true)
  46. result = libnet.waitLink(taskName, 0, netc)
  47. camera.startRaw(camera_id, w, h, cbuff)--必要的
  48. log.info("摄像头启动完成")
  49. while true do
  50. result = libnet.waitLink(taskName, 0, netc)
  51. result = libnet.connect(taskName, 5000, netc, ip, port)
  52. log.info(result, ip, port)
  53. while result do
  54. result = sys_wait(taskName, MSG_NEW, 200)--这个等采集完成的消息,当然不限于这个形式
  55. if type(result) == 'table' then --收到采集完成的消息后,就可以开始上传了,无论何种方法,只要把所有图像数据按照顺序上传即可
  56. vlen = 0
  57. start = 0
  58. while result and vlen < h do
  59. tx_buff:del()
  60. tx_buff:pack("<AHHIHH", "VCAM", w, h, vlen, blen, blen) --加入一个包头方便重新合成图片,当然也可以自己定义协议,无限制
  61. tx_buff:copy(nil, cbuff, start, blen)
  62. start = start + blen
  63. if (vlen + 16) >= h then
  64. camera.getRaw(0)
  65. end
  66. result = libnet.tx(taskName, 100, netc, tx_buff)
  67. vlen = vlen + 16
  68. end
  69. log.info("发送完成")
  70. else
  71. camera.getRaw(0)
  72. result = true
  73. end
  74. end
  75. libnet.close(taskName, 5000, netc)
  76. log.info(rtos.meminfo("sys"))
  77. sys.wait(1000)
  78. end
  79. end
  80. function camDemo(ip, port)
  81. sysplus.taskInitEx(camTask, taskName, netCB, ip, port)
  82. end