kmodule.go 3.9 KB

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