// 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() } } }