terminal_manager.go
2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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)
}