terminal_manager.go 2.6 KB
package service

import (
	"container/list"
	"github.com/gookit/event"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/log"
	"sync"
)

var (
	DownEntityEvent = "down_entity"
)

type TerminalManager struct {
	TerminalDeviceList []*TerminalDevice
	TerminalDevices    sync.Map
}

func NewTerminalManager() *TerminalManager {
	return &TerminalManager{
		TerminalDeviceList: make([]*TerminalDevice, 0),
		TerminalDevices:    sync.Map{},
	}
}

func (term *TerminalManager) GetDevice(terminalId string) (*TerminalDevice, bool) {
	device, ok := term.TerminalDevices.Load(terminalId)
	if !ok {
		device := NewTerminalDevice(terminalId)
		term.TerminalDevices.Store(terminalId, device)
		log.Logger.Debug("【TerminalManager】 add new device:"+terminalId, map[string]interface{}{"device": device})
		term.TerminalDeviceList = append(term.TerminalDeviceList, device)
		return nil, false
	}
	if v, ok := device.(*TerminalDevice); ok {
		return v, ok
	}
	return nil, false
}

func (term *TerminalManager) PopDownEntityByDevice(sn string) (DownEntity, bool) {
	device, ok := term.GetDevice(sn)
	if !ok {
		return nil, false
	}
	return device.PopDownEntity()
}

func (term *TerminalManager) AddDownEntityByDevice(sn string, entity interface{}) bool {
	device, ok := term.GetDevice(sn)
	if !ok {
		return false
	}
	device.AddDownEntity(entity)
	return true
}

func (term *TerminalManager) BroadcastDownEntity(downEntity interface{}) {
	for i := range term.TerminalDeviceList {
		term.TerminalDeviceList[i].AddDownEntity(downEntity)
	}
}

// Listen Event

func (term *TerminalManager) DownEntityEvent(e event.Event) error {
	//fmt.Printf("handle down entity event: %s\n", e.Name())
	entity := e.Get("entity")
	if entity != nil {
		term.BroadcastDownEntity(entity)
	}
	return nil
}

type TerminalDevice struct {
	Id             string
	DownEntityList *list.List
}

func NewTerminalDevice(terminalId string) *TerminalDevice {
	return &TerminalDevice{
		Id:             terminalId,
		DownEntityList: list.New(),
	}
}

func (device *TerminalDevice) PopDownEntity() (DownEntity, bool) {
	element := device.DownEntityList.Front()
	if element == nil {
		return nil, false
	}
	device.DownEntityList.Remove(element)
	if v, ok := element.Value.(DownEntity); ok {
		log.Logger.Debug("【TerminalManager】 pop down entity to Sender", map[string]interface{}{"entity": v})
		return v, ok
	}
	return nil, false
}

func (device *TerminalDevice) AddDownEntity(downEntity interface{}) {
	log.Logger.Debug("【TerminalManager】 add down entity to Profile", map[string]interface{}{"entity": downEntity})
	device.DownEntityList.PushBack(downEntity)
}