Bläddra i källkod

update script/libs/necir.lua.

Signed-off-by: lulipro <lulipro@qq.com>
lulipro 2 år sedan
förälder
incheckning
d29b35aa1f
1 ändrade filer med 45 tillägg och 26 borttagningar
  1. 45 26
      script/libs/necir.lua

+ 45 - 26
script/libs/necir.lua

@@ -34,6 +34,7 @@
 --                                 |
 --                                GND
 --用法实例:演示用同一个SPI接口驱动VS1838和W25QXX
+--用法实例:
 local necir = require("necir")
 
 --定义用户回调函数
@@ -43,12 +44,13 @@ end
 
 sys.taskInit(function()
     local CS = gpio.setup(pin.PA07,0)  --VS1838(NMOS控制其GND)与W25QXX共用的片选引脚
+    necir.init(spi.SPI_0,pin.PB03,my_ir_cb)
 
     while 1 do
         --===============================
         log.info('------necir start------')
         CS(1)     --使能VS1838
-        necir.init(spi.SPI_0,pin.PB03,my_ir_cb)
+        necir.start()  --开启necir数据接收过程
         sys.wait(10000)
         log.info('necir request to close')
         necir.close()   --请求关闭necir
@@ -94,8 +96,8 @@ local recvBuff              --SPI接收数据缓冲区
 local recvNECFrame={}       --依次存储:地址码,地址码取反,数据码,数据码取反
 
 local recvCallback          --NEC报文接收成功后的用户回调函数
-local isRecvTaskRun         --接收任务是否需要继续运行的标志
-local isClosed              --necir是否已经完全关闭
+local isNeedTaskFlag        --接收任务是否需要运行的标志
+local isClosedFlag          --necir是否已经完全关闭的标志
 --[[
 ==============实现原理================================================
 NEC协议中无论是引导信号,逻辑0还是逻辑1,都由若干个562.5us的周期组成。
@@ -203,7 +205,7 @@ local function parseRecvData()
     --对收到的红外数据进行校验并调用 用户回调函数
     --有的遥控的2个地址字节不是相互取反的关系,因此这里不对地址码校验
     if ((recvNECFrame[3]+recvNECFrame[4]) == 255) then
-        --log.info('DataValid,go CallBack')
+        --log.info('necir','DataValid,go CallBack')
         if recvCallback then recvCallback(recvNECFrame) end
     end
     --log.info('necir',recvNECFrame[1],recvNECFrame[2],recvNECFrame[3],recvNECFrame[4])
@@ -213,7 +215,7 @@ end
 --检测引导产生的上升沿的的中断函数
 local function irq_func()    
     gpio.close(NECIR_IRQ_PIN)  --关闭GPIO功能,防止中断反复触发
-    spi.setup(NECIR_SPI_ID,nil,0,0,8,NECIR_SPI_BAUDRATE,spi.MSB,spi.master,1)--重新打开SPI接口
+    spi.setup(NECIR_SPI_ID,nil,0,0,8,NECIR_SPI_BAUDRATE,spi.MSB,spi.master,spi.full)--重新打开SPI接口
     
     recvBuff =  spi.recv(NECIR_SPI_ID, NECIR_SPI_RECV_BUFF_LEN) --通过SPI接收红外接收头输出的解调数据
     sys.publish('NECIR_SPI_DONE')  --发布消息,让任务对收到的SPI数据分析处理
@@ -222,25 +224,30 @@ end
 
 local function recvTaskFunc()
 
-    while isRecvTaskRun do
-        spi.close(NECIR_SPI_ID)  --关闭SPI接口在,这样才能把MISO空出来做中断检测
-        gpio.setup(NECIR_IRQ_PIN,irq_func,gpio.PULLUP ,gpio.RISING)--打开GPIO中断检测功能
+    while true do
+        sys.waitUntil('NECIR_START',5000)
 
-        local result, _ = sys.waitUntil('NECIR_SPI_DONE',1000)
-        if result then  --SPI完成采集,开始解析数据
-            parseRecvData()
+        while isNeedTaskFlag do
+            spi.close(NECIR_SPI_ID)  --关闭SPI接口在,这样才能把MISO空出来做中断检测
+            gpio.setup(NECIR_IRQ_PIN,irq_func,gpio.PULLUP ,gpio.RISING)--打开GPIO中断检测功能
+    
+            local result, _ = sys.waitUntil('NECIR_SPI_DONE',1000)
+            if result then  --SPI完成采集,开始解析数据
+                parseRecvData()
+            end
         end
-    end
-
-    --任务结束时做清理工作
-    gpio.close(NECIR_IRQ_PIN)  --关闭GPIO功能
-    spi.close(NECIR_SPI_ID)   --关闭SPI接口
-    isClosed = true
-    --log.info('necir recv task close')
+        --关闭接收过程时做清理工作
+        if not isClosedFlag then
+            gpio.close(NECIR_IRQ_PIN)  --关闭GPIO功能
+            spi.close(NECIR_SPI_ID)   --关闭SPI接口
+            isClosedFlag = true
+            --log.info('necir','recv task closed')
+        end
+    end --task main loop
 end
 
 --[[
-necir初始化,开启数据接收任务
+necir初始化
 @api necir.init(spi_id,irq_pin,recv_cb)
 @number spi_id,使用的SPI接口的ID
 @number irq_pin,使用的中断引脚,在单IO模式下这个引脚必须是SPI的MISO引脚
@@ -257,12 +264,24 @@ function necir.init(spi_id,irq_pin,recv_cb)
     NECIR_IRQ_PIN    = irq_pin
     recvCallback     = recv_cb
 
+    isNeedTaskFlag = false      --接收任务是否需要运行的标志
+    isClosedFlag   = true       --necir是否已经完全关闭的标志
     --启动红外数据接收任务
-    isRecvTaskRun      = true
-    isClosed           = false
     sys.taskInit(recvTaskFunc)
 end
 
+--[[
+开启necir数据接收过程
+@api necir.start()
+@usage
+necir.start()
+]]
+function necir.start()
+    isNeedTaskFlag     = true
+    isClosedFlag       = false
+    sys.publish('NECIR_START')
+end
+
 --[[
 请求关闭necir数据接收过程。此函数执行后并不能保证立刻关闭,具体是否已经关闭需要使用necir.isClosed()来查询。
 @api necir.close()
@@ -270,18 +289,18 @@ end
 necir.close()
 ]]
 function necir.close()
-    isRecvTaskRun = false
+    isNeedTaskFlag = false
 end
 
 --[[
-判断necir是否已经完全关闭,关闭后所使用的SPI接口将释放,可以复用为其他功能。如需再次开启,则需要再次调用necir.init(spi_id,irq_pin,recv_cb)
-@api necir.close()
+判断necir是否已经完全关闭,关闭后所使用的SPI接口将释放,可以复用为其他功能。如需再次开启,则需要再次调用necir.start()
+@api necir.isClosed()
 @return bool   关闭成功返回true
 @usage
-necir.close()
+necir.isClosed()
 ]]
 function necir.isClosed()
-    return isClosed
+    return isClosedFlag
 end
 
 return necir