// package kmodule -- модуль на основе ядра. package kmodule import ( "time" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" mKd "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/module_name" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec" mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat" ) // kModule -- модуль на основе ядра. type kModule struct { kCtx mKs.IKernelCtx ctx mKs.ILocalCtx name *module_name.AModuleName bus mKs.IKernelBus timePhase mKs.ISafeInt strLive mKs.ISafeString stat mKs.IModuleStat } // NewKernelModule -- возвращает новый модуль на основе ядра. func NewKernelModule(name *module_name.AModuleName) mKs.IKernelModule { mL0.Hassert(name != nil, "NewKernelModule(): name==nil") 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() mKs.IModuleStat { return sf.stat } // Log -- возвращает буферный лог. func (sf *kModule) Log() mKs.ILogBuf { return sf.ctx.Log() } // Ctx -- возвращает контекст модуля. func (sf *kModule) Ctx() mKs.ILocalCtx { return sf.ctx } // Run -- запускает модуль в работу. func (sf *kModule) Run() { mL0.Hassert(false, "kModule.Run(): module='%v', parent not realized this method", sf.name) } // Name -- возвращает уникальное имя модуля. func (sf *kModule) Name() *module_name.AModuleName { return sf.name } // IsWork -- возвращает признак состояния работы. func (sf *kModule) IsWork() bool { mL0.Hassert(false, "kModule.IsWork(): module='%v', parent not realized this method", sf.name) return false } // Live -- возвращает индикатор жизни модуля. func (sf *kModule) Live() string { return sf.strLive.Get() } // Сигнал жизни, каждые 5 сек публикует в шину метку. func (sf *kModule) sigLive() { var ( topic = mKd.NewTopic(sf.name.Get() + "_live") iPhase = 0 res mL0.IResult[bool] ) 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("|") res = sf.bus.Publish(topic, sf.strLive.Byte()) case 1: sf.strLive.Set("/") res = sf.bus.Publish(topic, sf.strLive.Byte()) case 2: sf.strLive.Set("-") res = sf.bus.Publish(topic, sf.strLive.Byte()) case 3: sf.strLive.Set("\\") 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() } } }