kmodule.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // package kmodule -- модуль на основе ядра.
  2. package kmodule
  3. import (
  4. "time"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kern_ctx"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
  15. )
  16. // kModule -- модуль на основе ядра.
  17. type kModule struct {
  18. kCtx *kern_ctx.KernCtx
  19. lCtx *lev1.LocalCtx
  20. name *module_name.LModuleName
  21. bus bus_spec.IKernelBus
  22. timePhase *lev0.MSafeNum
  23. txtLive *lev0.MTxt
  24. stat mod_spec.IModuleStat
  25. }
  26. // NewKernelModule -- возвращает новый модуль на основе ядра.
  27. func NewKernelModule(name *module_name.LModuleName) mod_spec.IKernelModule {
  28. lev0.If(name == nil).Hassert("NewKernelModule(): name==nil", []any{})
  29. kCtx := kern_ctx.GetKernCtx()
  30. sf := &kModule{
  31. kCtx: kCtx,
  32. lCtx: lev1.NewLocalCtx(kCtx.SelfCtx()),
  33. name: name,
  34. bus: kbus_local.GetKernelBusLocal(),
  35. timePhase: lev0.MutSafeNum(1000), // 1000 msec
  36. txtLive: lev0.MutTxt(""),
  37. stat: mod_stat.NewModStat(name),
  38. }
  39. go sf.sigLive()
  40. return sf
  41. }
  42. // Stat -- возвращает статистику модуля.
  43. func (sf *kModule) Stat() mod_spec.IModuleStat {
  44. return sf.stat
  45. }
  46. // Log -- возвращает буферный лог.
  47. func (sf *kModule) Log() *lev1.LogBuf {
  48. return sf.lCtx.Log()
  49. }
  50. // Ctx -- возвращает контекст модуля.
  51. func (sf *kModule) Ctx() *lev1.LocalCtx {
  52. return sf.lCtx
  53. }
  54. // Run -- запускает модуль в работу.
  55. func (sf *kModule) Run() {
  56. lev0.If(true).
  57. Hassert("kModule.Run(): module='%v', parent not realized this method",
  58. []any{sf.name})
  59. }
  60. // Name -- возвращает уникальное имя модуля.
  61. func (sf *kModule) Name() *module_name.LModuleName {
  62. return sf.name
  63. }
  64. // IsWork -- возвращает признак состояния работы.
  65. func (sf *kModule) IsWork() lev0.Bool {
  66. lev0.If(true).
  67. Hassert("kModule.IsWork(): module='%v', parent not realized this method",
  68. []any{sf.name})
  69. return false
  70. }
  71. // Live -- возвращает индикатор жизни модуля.
  72. func (sf *kModule) Live() *lev0.LTxt {
  73. return sf.txtLive.Let()
  74. }
  75. var (
  76. f0 = lev0.Txt("|")
  77. f1 = lev0.Txt("/")
  78. f2 = lev0.Txt("-")
  79. f3 = lev0.Txt("\\")
  80. )
  81. // Сигнал жизни, каждые 5 сек публикует в шину метку.
  82. func (sf *kModule) sigLive() {
  83. var (
  84. topic = topic.LetTopic(bus_ent.ATopic(sf.name.Get()) + "_live")
  85. iPhase = 0
  86. res *lev0.Result[lev0.Bool]
  87. )
  88. fnPhase := func() {
  89. time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))
  90. select {
  91. case <-sf.kCtx.Done():
  92. return
  93. default:
  94. switch iPhase {
  95. case 0:
  96. sf.txtLive.Set(f0)
  97. res = sf.bus.Publish(topic, sf.txtLive.Byte())
  98. case 1:
  99. sf.txtLive.Set(f1)
  100. res = sf.bus.Publish(topic, sf.txtLive.Byte())
  101. case 2:
  102. sf.txtLive.Set(f2)
  103. res = sf.bus.Publish(topic, sf.txtLive.Byte())
  104. case 3:
  105. sf.txtLive.Set(f3)
  106. res = sf.bus.Publish(topic, sf.txtLive.Byte())
  107. iPhase = -1
  108. }
  109. res.Hassert("kModule.sigLive(): name=%v, in publish live", sf.Name())
  110. iPhase++
  111. sf.stat.Add(1)
  112. }
  113. }
  114. for {
  115. select {
  116. case <-sf.kCtx.SelfCtx().Done():
  117. return
  118. default:
  119. fnPhase()
  120. }
  121. }
  122. }