pm.lua 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. --- 模块功能:休眠管理
  2. -- @module pm
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.10.22
  7. module(..., package.seeall)
  8. --[[
  9. 关于休眠这一部分的说明:
  10. 目前的休眠处理有两种方式,
  11. 一种是底层core内部,自动处理,例如tcp发送或者接收数据时,会自动唤醒,发送接收结束后,会自动休眠;这部分不用lua脚本控制
  12. 另一种是lua脚本使用pm.sleep和pm.wake自行控制,例如,uart连接外围设备,uart接收数据前,要主动去pm.wake,这样才能保证前面接收的数据不出错,当不需要通信时,调用pm.sleep;如果有lcd的项目,也是同样道理
  13. 不休眠时功耗至少30mA左右
  14. 如果不是故意控制的不休眠,一定要保证pm.wake("A")了,有地方去调用pm.sleep("A")
  15. ]]
  16. --唤醒标记表
  17. local tags = {}
  18. --lua应用是否休眠,true休眠,其余没休眠
  19. local flag = true
  20. --- 某个Lua应用唤醒系统
  21. -- @param tag 一般string类型,某个Lua应用的唤醒标记,用户自定义
  22. -- @return 无
  23. -- @usage pm.wake(tag)
  24. function wake(tag)
  25. assert(tag and tag ~= nil, "pm.wake tag invalid")
  26. --唤醒表中此唤醒标记位置置1
  27. tags[tag] = 1
  28. --如果lua应用处于休眠状态
  29. if flag == true then
  30. --设置为唤醒状态
  31. flag = false
  32. --调用底层软件接口,真正唤醒系统
  33. pmd.sleep(0)
  34. end
  35. end
  36. --- 某个Lua应用休眠系统
  37. -- @param tag 一般string类型,某个Lua应用的唤醒标记,用户自定义,跟wake中的标记保持一致
  38. -- @return 无
  39. -- @usage pm.sleep(tag)
  40. function sleep(tag)
  41. assert(tag and tag ~= nil, "pm.sleep tag invalid")
  42. --唤醒表中此休眠标记位置置0
  43. tags[tag] = 0
  44. --只要存在任何一个标记唤醒,则不睡眠
  45. for k, v in pairs(tags) do
  46. if v > 0 then
  47. return
  48. end
  49. end
  50. flag = true
  51. --调用底层软件接口,真正休眠系统
  52. pmd.sleep(1)
  53. end
  54. --- pm.isSleep([tag]) 读取某个Lua应用或者全局的休眠状态
  55. -- @param tag 可选参数,如果查询某个tag的休眠状态,则跟wake中的tag保持一致;如果查询全局休眠状态,则不需要这个参数
  56. -- @return true休眠,其余没休眠
  57. -- @usage
  58. -- pm.isSleep() -- 查询全局休眠状态
  59. -- pm.isSleep('lcd') -- 查询lcd的休眠状态
  60. function isSleep(tag)
  61. return tag and tags[tag] ~= 1 or flag
  62. end