| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- --- 模块功能:GPIO功能测试.
- --- 如需切换外接GPS模块种类请执行重启
- -- @author openLuat
- -- @module gpio.testGpioSingle
- -- @license MIT
- -- @copyright openLuat
- -- @release 2018.03.27
- module(...,package.seeall)
- --记录gps型号和串口波特率
- local GPS_KIND_INFO_FILE = "/GPSKINDINFO.txt"
- --写实际接的串口号
- --Air820模块内部,gps芯片使用的是串口1
- local UART_ID = 1
- --串口接收数据缓冲区
- local rdBuf = ""
- --gps芯片型号
- local gpsKind=""
- --自适应的gps、agps功能库
- local gpsLib,agpsLib="",""
- --自适应串口波特率
- --默认从115200开始轮询
- local uartBaudrate=115200
- --其他串口参数
- local uartDatabits,uartParity,uartStopbits = 8,uart.PAR_NONE,uart.STOP_1
- function writeCmd(cmd,isFull)
- local tmp = cmd
- if not isFull then
- tmp = 0
- for i=2,cmd:len()-1 do
- tmp = bit.bxor(tmp,cmd:byte(i))
- end
- tmp = cmd..(string.format("%02X",tmp)):upper().."\r\n"
- end
- uart.write(UART_ID,tmp)
- log.info("autoGPS.writeCmd",tmp)
- end
- --解析GPS种类
- local function parse(data)
- if not data then return end
- local tInfo =
- {
- {keyWord="UC6228",kind="510U"},
- {keyWord="UC6226",kind="530H"},
- {keyWord="GOKE",kind="530"},
- {keyWord="URANUS5",kind="530Z"},
- {keyWord="ANTENNA",kind="530Z"},
- }
- for i=1,#tInfo do
- if data:match(tInfo[i].keyWord) then
- gpsKind=tInfo[i].kind
- log.info("autoGPS.parse",gpsKind)
- uart.close(UART_ID)
- sys.publish("GPS_KIND",gpsKind)
- return true,""
- end
- end
- return false,data
- end
- --缓冲拼接
- local function proc(data)
- if not data or string.len(data) == 0 then return end
- --追加到缓冲区
- rdBuf = rdBuf..data
- local result,unproc
- unproc = rdBuf
- --根据帧结构循环解析未处理过的数据
- while true do
- result,unproc = parse(unproc)
- if not unproc or unproc == "" or not result then
- break
- end
- end
- rdBuf = unproc or ""
- end
- --读出
- local function read()
- local data = ""
- while true do
- data = uart.read(UART_ID,"*l")
- if not data or string.len(data) == 0 then break end
- --打开下面的打印会耗时
- --log.info("testUart.read bin",data)
- proc(data)
- end
- end
- --串口发送成功回调
- local function writeOk()
- log.info("autoGPS.writeOk")
- end
- --写判断查询版本号命令
- local function writeKindCmd()
- if string.len(gpsKind)==0 then
- writeCmd("$PDTINFO\r\n",true) --510U
- writeCmd("$PDTINFO\r\n",true) --530H
- writeCmd("$PGKC462*") --530
- writeCmd("$PCAS06,0*") --530Z
- end
- end
- --波特率自动切换
- local function uartBaudrateTest()
- if string.len(gpsKind)==0 then
- uartBaudrate = uartBaudrate==115200 and 9600 or 115200
- uart.close(UART_ID)
- rdBuf = ""
- uart.setup(UART_ID,uartBaudrate,uartDatabits,uartParity,uartStopbits)
- log.info("autoGPS.uartBaudrateTest",uartBaudrate)
- end
- end
- local function init()
- --开始初始化
- if string.find(rtos.get_version(),"RDA8910") then
- pmd.ldoset(15,pmd.LDO_VIBR)
- else
- pmd.ldoset(7,pmd.LDO_VCAM)
- end
- rtos.sys32k_clk_out(1)
- --初始化完毕,开始注册回调打开串口
- uart.on(UART_ID,"sent",writeOk)
- uart.on(UART_ID,"receive",read)
- uart.setup(UART_ID,uartBaudrate,uartDatabits,uartParity,uartStopbits)
- end
- --解析关键字加载对应库
- local function loadLib(keyword)
- if keyword=="530" then
- gpsLib = require"gps"
- agpsLib = require"agps"
- elseif keyword=="530Z" then
- gpsLib = require"gpsZkw"
- agpsLib = require"agpsZkw"
- elseif keyword=="510U" then
- gpsLib = require"gpsHxxt"
- agpsLib = require"agpsHxxt"
- elseif keyword=="530H" then
- gpsLib = require"gpsHxxt"
- agpsLib = require"agpsHxxt"
- end
- if type(gpsLib)=="table" and type(gpsLib.init)=="fucntion" then
- gpsLib.init()
- end
- if type(agpsLib)=="table" and type(agpsLib.init)=="fucntion" then
- agpsLib.init()
- end
- end
- local function autoClose()
- uart.close(UART_ID)
- if string.find(rtos.get_version(),"RDA8910") then
- pmd.ldoset(0,pmd.LDO_VIBR)
- else
- pmd.ldoset(0,pmd.LDO_VCAM)
- end
- rtos.sys32k_clk_out(0)
- end
- local function selfAdapt()
- if io.exists(GPS_KIND_INFO_FILE) then
- local gpsKindInfo = io.readFile(GPS_KIND_INFO_FILE)
- log.info("autoGPS.task","gps kind info",gpsKindInfo)
- if string.find(gpsKindInfo,"530Z") then
- gpsKind="530Z"
- elseif string.find(gpsKindInfo,"510U") then
- gpsKind="510U"
- elseif string.find(gpsKindInfo,"530H") then
- gpsKind="530H"
- else
- gpsKind="530"
- end
- if string.find(gpsKindInfo,"9600") then
- uartBaudrate=9600
- elseif string.find(gpsKindInfo,"115200") then
- uartBaudrate=115200
- else
- log.warn("autoGPS.task","invalid uartBaudrate")
- end
- loadLib(gpsKind)
- sys.publish("AUTOGPS_READY",gpsLib,agpsLib,gpsKind,uartBaudrate)
- else
- rdBuf = ""
- init()
- while true do
- writeKindCmd()
- local result,data=sys.waitUntil("GPS_KIND",2000)
- if result then
- autoClose()
- loadLib(data)
- io.writeFile(GPS_KIND_INFO_FILE,gpsKind..tostring(uartBaudrate))
- sys.publish("AUTOGPS_READY",gpsLib,agpsLib,gpsKind,uartBaudrate)
- rdBuf=nil
- break
- else
- uartBaudrateTest()
- end
- sys.wait(100)
- end
- end
- end
- local coSelfAdapt = sys.taskInit(selfAdapt)
- --gps工作异常通知
- sys.subscribe("GPS_WORK_ABNORMAL_IND",function()
- log.info("autoGPS.GPS_WORK_ABNORMAL_IND",not coSelfAdapt or coroutine.status(coSelfAdapt)=="dead")
- if not coSelfAdapt or coroutine.status(coSelfAdapt)=="dead" then
- os.remove(GPS_KIND_INFO_FILE)
- if type(gpsLib)=="table" and type(gpsLib.unInit)=="function" then
- gpsLib.unInit()
- end
- if type(agpsLib)=="table" and type(agpsLib.unInit)=="function" then
- agpsLib.unInit()
- end
- gpsKind,gpsLib,agpsLib="","",""
- coSelfAdapt = sys.taskInit(selfAdapt)
- end
- end)
|