misc.lua 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. --- 模块功能:配置管理-序列号、IMEI、底层软件版本号、时钟、是否校准、飞行模式、查询电池电量等功能
  2. -- @module misc
  3. -- @author 稀饭放姜
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.10.20
  7. local req = ril.request
  8. module(..., package.seeall)
  9. --sn:序列号
  10. --imei:IMEI
  11. -- calib 校准标志
  12. local sn, imei, calib
  13. --[[
  14. 函数名:rsp
  15. 功能 :本功能模块内“通过虚拟串口发送到底层core软件的AT命令”的应答处理
  16. 参数 :
  17. cmd:此应答对应的AT命令
  18. success:AT命令执行结果,true或者false
  19. response:AT命令的应答中的执行结果字符串
  20. intermediate:AT命令的应答中的中间信息
  21. 返回值:无
  22. ]]
  23. local function rsp(cmd, success, response, intermediate)
  24. local prefix = string.match(cmd, "AT(%+%u+)")
  25. --查询序列号
  26. if cmd == "AT+WISN?" then
  27. sn = intermediate
  28. --查询IMEI
  29. elseif cmd == "AT+CGSN" then
  30. imei = intermediate
  31. --查询是否校准
  32. elseif cmd == "AT+ATWMFT=99" then
  33. log.info('misc.ATWMFT', intermediate)
  34. if intermediate == "SUCC" then
  35. calib = true
  36. else
  37. calib = false
  38. end
  39. end
  40. end
  41. --- 设置系统时间
  42. -- @param t,系统时间,格式参考:{year=2017,month=2,day=14,hour=14,min=2,sec=58}
  43. -- @return 无
  44. -- @usage misc.setClock({year=2017,month=2,day=14,hour=14,min=2,sec=58})
  45. function setClock(t)
  46. if t == nil or type(t) ~= "table" then return end
  47. if t.year - 2000 > 38 then return end
  48. req(string.format("AT+CCLK=\"%02d/%02d/%02d,%02d:%02d:%02d+32\"", string.sub(t.year, 3, 4), t.month, t.day, t.hour, t.min, t.sec), nil, rsp)
  49. end
  50. --- 获取系统时间
  51. -- @return table,{year=2017,month=2,day=14,hour=14,min=19,sec=23}
  52. -- @usage date = getClock()
  53. function getClock()
  54. return os.date("*t")
  55. end
  56. --- 获取星期
  57. -- @number 星期,1-7分别对应周一到周日
  58. -- @usage week = misc.getWeek()
  59. function getWeek()
  60. local clk = os.date("*t")
  61. return ((clk.wday == 1) and 7 or (clk.wday - 1))
  62. end
  63. --- 获取校准标志
  64. -- @return boole,
  65. -- @usage calib = misc.getCalib()
  66. function getCalib()
  67. return calib
  68. end
  69. --- 设置SN
  70. -- @string s,新sn的字符串
  71. -- @string r,设置后是否重启,参数为nil时,自动重启
  72. -- @return 无
  73. -- @usage misc.setsn("1234567890")
  74. function setsn(s, r)
  75. if s ~= sn then
  76. req("AT+AMFAC=" .. (r and "0" or "1"))
  77. req("AT+WISN=\"" .. s .. "\"")
  78. end
  79. end
  80. --- 获取模块序列号
  81. -- @return string,未获取到,返回""
  82. -- @usage sn = misc.getsn()
  83. function getsn()
  84. return sn or ""
  85. end
  86. --- 设置IMEI
  87. -- @string s,新IMEI字符串
  88. -- @string r,设置后是否重启,参数为nil时,自动重启
  89. -- @return 无
  90. -- @usage misc.setimei(”359759002514931”)
  91. function setimei(s, r)
  92. if s ~= imei then
  93. req("AT+AMFAC=" .. (r and "0" or "1"))
  94. req("AT+WIMEI=\"" .. s .. "\"")
  95. end
  96. end
  97. --- 获取模块IMEI
  98. -- @return string,IMEI号,如果未获取到返回""--注意:开机lua脚本运行之后,会发送at命令去查询imei,所以需要一定时间才能获取到imei。开机后立即调用此接口,基本上返回""
  99. -- @usage imei = misc.getimei()
  100. function getimei()
  101. return imei or ""
  102. end
  103. --- 获取VBAT的电池电压
  104. -- @return number,电池电压,单位mv
  105. -- @usage vb = getVbatt()
  106. function getVbatt()
  107. local v1, v2, v3, v4, v5 = pmd.param_get()
  108. return v2
  109. end
  110. --- 打开并且配置PWM(支持2路PWM,仅支持输出)说明:当id为0时:period 取值在 80-1625 Hz范围内时,level 占空比取值范围为:1-100;period 取值在 1626-65535 Hz范围时,设x=162500/period, y=x * level / 100, x 和 y越是接近正的整数,则输出波形越准确
  111. -- @number id,number类型,PWM输出通道,仅支持0和1,0用的是uart2 tx,1用的是uart2 rx
  112. -- @number period,number类型:当id为0时,period表示频率,单位为Hz,取值范围为80-1625,仅支持整数,当id为1时,取值范围为0-7,仅支持整数,表示时钟周期,单位为毫秒,0-7分别对应125、250、500、1000、1500、2000、2500、3000毫秒
  113. -- @number level,number类型:当id为0时,level表示占空比,单位为level%,取值范围为1-100,仅支持整数,当id为1时,取值范围为1-15,仅支持整数,表示一个时钟周期内的高电平时间,单位为毫秒 1-15分别对应15.6、31.2、46.9、62.5、78.1、93.7、110、125、141、156、172、187、203、219、234毫秒
  114. -- @return 无
  115. function openpwm(id, period, level)
  116. assert(type(id) == "number" and type(period) == "number" and type(level) == "number", "openpwm type error")
  117. assert(id == 0 or id == 1, "openpwm id error: " .. id)
  118. local pmin, pmax, lmin, lmax = 80, 1625, 1, 100
  119. if id == 1 then pmin, pmax, lmin, lmax = 0, 7, 1, 15 end
  120. assert(period >= pmin and period <= pmax, "openpwm period error: " .. period)
  121. assert(level >= lmin and level <= lmax, "openpwm level error: " .. level)
  122. req("AT+SPWM=" .. id .. "," .. period .. "," .. level)
  123. end
  124. --- 关闭PWM
  125. -- @number id,number类型,PWM输出通道,仅支持0和1,0用的是uart2 tx,1用的是uart2 rx
  126. -- @return 无
  127. function closepwm(id)
  128. assert(id == 0 or id == 1, "closepwm id error: " .. id)
  129. req("AT+SPWM=" .. id .. ",0,0")
  130. end
  131. --注册以下AT命令的应答处理函数
  132. ril.regrsp("+ATWMFT", rsp)
  133. ril.regrsp("+WISN", rsp)
  134. ril.regrsp("+CGSN", rsp)
  135. ril.regrsp("+WIMEI", rsp)
  136. ril.regrsp("+AMFAC", rsp)
  137. ril.regrsp("+CFUN", rsp)
  138. --查询是否校准
  139. req("AT+ATWMFT=99")
  140. --查询序列号
  141. req("AT+WISN?")
  142. --查询IMEI
  143. req("AT+CGSN")