| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- // package kmodule -- модуль на основе ядра.
- package kmodule
- import (
- "time"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
- mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
- )
- // kModule -- модуль на основе ядра.
- type kModule struct {
- kCtx kspec.IKernelCtx
- ctx comp_spec.ILocalCtx
- name module_name.IModuleNameFix
- bus bus_spec.IKernelBus
- timePhase core_spec.ISafeInt
- strLive core_spec.ISafeString
- stat mod_spec.IModuleStat
- }
- // NewKernelModule -- возвращает новый модуль на основе ядра.
- func NewKernelModule(name module_name.IModuleNameFix) mod_spec.IKernelModule {
- helpers.If(name == nil).Hassert("NewKernelModule(): name==nil", []any{})
- kCtx := kctx.GetKernelCtx()
- sf := &kModule{
- kCtx: kCtx,
- ctx: mL1.NewLocalCtx(kCtx.Ctx()),
- name: name,
- bus: kbus_local.GetKernelBusLocal(),
- timePhase: mL1.NewSafeInt(1000), // 1000 msec
- strLive: mL1.NewSafeString(),
- stat: mod_stat.NewModStat(name),
- }
- go sf.sigLive()
- return sf
- }
- // Stat -- возвращает статистику модуля.
- func (sf *kModule) Stat() mod_spec.IModuleStat {
- return sf.stat
- }
- // Log -- возвращает буферный лог.
- func (sf *kModule) Log() comp_spec.ILogBuf {
- return sf.ctx.Log()
- }
- // Ctx -- возвращает контекст модуля.
- func (sf *kModule) Ctx() comp_spec.ILocalCtx {
- return sf.ctx
- }
- // Run -- запускает модуль в работу.
- func (sf *kModule) Run() {
- helpers.If(true).Hassert("kModule.Run(): module='%v', parent not realized this method", []any{sf.name})
- }
- // Name -- возвращает уникальное имя модуля.
- func (sf *kModule) Name() module_name.IModuleNameFix {
- return sf.name
- }
- // IsWork -- возвращает признак состояния работы.
- func (sf *kModule) IsWork() core_spec.EBool {
- helpers.If(true).Hassert("kModule.IsWork(): module='%v', parent not realized this method", []any{sf.name})
- return ebool.NewEBool(false)
- }
- // Live -- возвращает индикатор жизни модуля.
- func (sf *kModule) Live() defs.ITxtFix {
- return sf.strLive.Get()
- }
- var (
- f0 = defs.TxtFix("|")
- f1 = defs.TxtFix("/")
- f2 = defs.TxtFix("-")
- f3 = defs.TxtFix("\\")
- )
- // Сигнал жизни, каждые 5 сек публикует в шину метку.
- func (sf *kModule) sigLive() {
- var (
- topic = bus_ent.ITopicFix(topic.NewTopic(bus_ent.ATopic(sf.name.Get()) + "_live"))
- iPhase = 0
- res mL0.IResult[core_spec.EBool]
- )
- fnPhase := func() {
- time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))
- select {
- case <-sf.kCtx.Ctx().Done():
- return
- default:
- switch iPhase {
- case 0:
- sf.strLive.Set(f0)
- res = sf.bus.Publish(topic, sf.strLive.Byte())
- case 1:
- sf.strLive.Set(f1)
- res = sf.bus.Publish(topic, sf.strLive.Byte())
- case 2:
- sf.strLive.Set(f2)
- res = sf.bus.Publish(topic, sf.strLive.Byte())
- case 3:
- sf.strLive.Set(f3)
- res = sf.bus.Publish(topic, sf.strLive.Byte())
- iPhase = -1
- }
- res.Hassert("kModule.sigLive(): name=%v, in publish live", sf.Name())
- iPhase++
- sf.stat.Add(1)
- }
- }
- for {
- select {
- case <-sf.kCtx.Ctx().Done():
- return
- default:
- fnPhase()
- }
- }
- }
|