-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathserver.go
128 lines (107 loc) · 4 KB
/
server.go
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package iec61850
// #include <iec61850_server.h>
import "C"
import (
"unsafe"
)
type IedServer struct {
server C.IedServer
serverConfig ServerConfig
tlsConfig C.TLSConfiguration
clientAuthenticator ClientAuthenticator
}
func NewServerWithTlsSupport(serverConfig ServerConfig, tlsConfig *TLSConfig, iedModel *IedModel) (*IedServer, error) {
cTlsConfig, err := tlsConfig.createCTlsConfig()
if err != nil {
return nil, err
}
config := serverConfig.createIedServerConfig(serverConfig)
defer C.IedServerConfig_destroy(config)
return &IedServer{
server: C.IedServer_createWithConfig(iedModel.Model, cTlsConfig, config),
serverConfig: serverConfig,
tlsConfig: cTlsConfig,
}, nil
}
func NewServerWithConfig(serverConfig ServerConfig, iedModel *IedModel) *IedServer {
config := serverConfig.createIedServerConfig(serverConfig)
defer C.IedServerConfig_destroy(config)
return &IedServer{
server: C.IedServer_createWithConfig(iedModel.Model, nil, config),
serverConfig: serverConfig,
}
}
// NewServer creates a new instance of the IedServer using the provided _iedModel.
func NewServer(iedModel *IedModel) *IedServer {
return &IedServer{
server: C.IedServer_create(iedModel.Model),
}
}
// Start initiates the IedServer on the provided port.
func (is *IedServer) Start(port int) {
C.IedServer_start(is.server, C.int(port))
// If there's another way to detect the error, handle it here.
}
// IsRunning checks if the IedServer is currently running.
func (is *IedServer) IsRunning() bool {
return bool(C.IedServer_isRunning(is.server))
}
// Stop terminates the IedServer.
func (is *IedServer) Stop() {
C.IedServer_stop(is.server)
}
// Destroy frees all resources associated with the IedServer.
func (is *IedServer) Destroy() {
C.IedServer_destroy(is.server)
}
// LockDataModel locks the data _iedModel of the IedServer.
func (is *IedServer) LockDataModel() {
C.IedServer_lockDataModel(is.server)
}
// UnlockDataModel unlocks the data _iedModel of the IedServer.
func (is *IedServer) UnlockDataModel() {
C.IedServer_unlockDataModel(is.server)
}
// UpdateUTCTimeAttributeValue updates a DataAttribute with a UTC time value.
func (is *IedServer) UpdateUTCTimeAttributeValue(node *ModelNode, value int64) {
if node == nil || node._modelNode == nil {
return
}
C.IedServer_updateUTCTimeAttributeValue(is.server, (*C.DataAttribute)(node._modelNode), C.uint64_t(value))
}
// UpdateFloatAttributeValue updates a DataAttribute with a float value.
func (is *IedServer) UpdateFloatAttributeValue(node *ModelNode, value float32) {
if node == nil || node._modelNode == nil {
return
}
C.IedServer_updateFloatAttributeValue(is.server, (*C.DataAttribute)(node._modelNode), C.float(value))
}
// UpdateInt32AttributeValue updates a DataAttribute with an Int32 value.
func (is *IedServer) UpdateInt32AttributeValue(node *ModelNode, value int32) {
if node == nil || node._modelNode == nil {
return
}
C.IedServer_updateInt32AttributeValue(is.server, (*C.DataAttribute)(node._modelNode), C.int32_t(value))
}
// UpdateVisibleStringAttributeValue updates a DataAttribute with a visible string value.
func (is *IedServer) UpdateVisibleStringAttributeValue(attr *DataAttribute, value string) {
cValue := C.CString(value)
defer C.free(unsafe.Pointer(cValue))
C.IedServer_updateVisibleStringAttributeValue(is.server, attr.attribute, cValue)
}
// UpdateQuality updates the quality attribute with an UInt16 value
func (is *IedServer) UpdateQuality(node *ModelNode, quality uint16) {
C.IedServer_updateQuality(is.server, (*C.DataAttribute)(node._modelNode), C.ushort(quality))
}
// SetServerIdentity updates the server identity of the IedServer
func (is *IedServer) SetServerIdentity(vendor string, model string, version string) {
cVendor := C.CString(vendor)
cModel := C.CString(model)
cVersion := C.CString(version)
defer func() {
C.free(unsafe.Pointer(cVendor))
C.free(unsafe.Pointer(cModel))
C.free(unsafe.Pointer(cVersion))
}()
C.IedServer_setServerIdentity(is.server, cVendor, cModel, cVersion)
}