| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- // package kmodule -- модуль на основе ядра.
- package kmodule
- import (
- "time"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- mKd "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
- 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 *mKd.ModuleName
- bus mKs.IKernelBus
- timePhase mKs.ISafeInt
- strLive mKs.ISafeString
- stat mKs.IModuleStat
- }
- // NewKernelModule -- возвращает новый модуль на основе ядра.
- func NewKernelModule(name *mKd.ModuleName) 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() *mKd.ModuleName {
- 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()
- }
- }
- }
|