mirror of
https://git.rwth-aachen.de/acs/public/villas/node/
synced 2025-03-23 00:00:01 +01:00
264 lines
4.2 KiB
Go
264 lines
4.2 KiB
Go
package node
|
|
|
|
import "C"
|
|
import (
|
|
"time"
|
|
"unsafe"
|
|
|
|
gopointer "github.com/mattn/go-pointer"
|
|
)
|
|
|
|
func registerNode(name string, ctor CreateNode) {
|
|
|
|
}
|
|
|
|
type Signal struct {
|
|
}
|
|
|
|
type Sample struct {
|
|
Timestamp struct {
|
|
Origin time.Time
|
|
Received time.Time
|
|
}
|
|
|
|
Data []interface{}
|
|
}
|
|
|
|
type Node interface {
|
|
Close() error
|
|
|
|
Prepare() error
|
|
|
|
Parse(cfg []byte) error
|
|
|
|
Check() error
|
|
|
|
Start() error
|
|
Stop() error
|
|
|
|
Pause() error
|
|
Resume() error
|
|
Restart() error
|
|
|
|
Read(smps []Sample) (int, error)
|
|
Write(smps []Sample) (int, error)
|
|
|
|
Reverse() error
|
|
|
|
GetPollFDs() ([]int, error)
|
|
GetNetemFDs() ([]int, error)
|
|
|
|
// GetMemoryType()
|
|
|
|
Details() string
|
|
}
|
|
|
|
type CreateNode func() Node
|
|
|
|
// Wrapper
|
|
|
|
func intSliceToCArray(s []int) unsafe.Pointer {
|
|
b := (*[1 << 16]byte)(unsafe.Pointer(&s[0]))[0 : len(s)*8 : len(s)*8]
|
|
return C.CBytes(unsafe.Pointer(&b[0]))
|
|
}
|
|
|
|
func errorToInt(err error) int {
|
|
if err == nil {
|
|
return -1
|
|
} else {
|
|
return -22
|
|
}
|
|
}
|
|
|
|
//export NodeClose
|
|
func NodeClose(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Close())
|
|
}
|
|
|
|
//export NodePrepare
|
|
func NodePrepare(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Prepare())
|
|
}
|
|
|
|
//export NodeParse
|
|
func NodeParse(p unsafe.Pointer, c unsafe.Pointer) int {
|
|
cfg := gopointer.Restore(c).([]byte)
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Parse(cfg))
|
|
}
|
|
|
|
//export NodeCheck
|
|
func NodeCheck(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Check())
|
|
}
|
|
|
|
//export NodeStart
|
|
func NodeStart(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Start())
|
|
}
|
|
|
|
//export NodeStop
|
|
func NodeStop(p unsafe.Pointer) error {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Stop())
|
|
}
|
|
|
|
//export NodePause
|
|
func NodePause(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Pause())
|
|
}
|
|
|
|
//export NodeResume
|
|
func NodeResume(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Resume())
|
|
}
|
|
|
|
//export NodeRestart
|
|
func NodeRestart(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Restart())
|
|
}
|
|
|
|
//export NodeRead
|
|
func NodeRead(p unsafe.Pointer, smps []Sample) (int, error) {
|
|
n := gopointer.Restore(p).(Node)
|
|
return n.Read(smps)
|
|
}
|
|
|
|
//export NodeWrite
|
|
func NodeWrite(p unsafe.Pointer, smps []Sample) (int, int) {
|
|
n := gopointer.Restore(p).(Node)
|
|
r, err := n.Write(smps)
|
|
return r, errorToInt(err)
|
|
}
|
|
|
|
//export NodeReverse
|
|
func NodeReverse(p unsafe.Pointer) int {
|
|
n := gopointer.Restore(p).(Node)
|
|
return errorToInt(n.Reverse())
|
|
}
|
|
|
|
//export NodeGetPollFDs
|
|
func NodeGetPollFDs(p unsafe.Pointer) (unsafe.Pointer, int) {
|
|
n := gopointer.Restore(p).(Node)
|
|
f, err := n.GetPollFDs()
|
|
if err == nil {
|
|
return intSliceToCArray(f), 0
|
|
} else {
|
|
return nil, errorToInt(err)
|
|
}
|
|
}
|
|
|
|
//export NodeGetNetemFDs
|
|
func NodeGetNetemFDs(p unsafe.Pointer) (unsafe.Pointer, int) {
|
|
n := gopointer.Restore(p).(Node)
|
|
f, err := n.GetNetemFDs()
|
|
if err == nil {
|
|
return intSliceToCArray(f), 0
|
|
} else {
|
|
return nil, errorToInt(err)
|
|
}
|
|
}
|
|
|
|
//export NodeDetails
|
|
func NodeDetails(p unsafe.Pointer) *C.char {
|
|
n := gopointer.Restore(p).(Node)
|
|
d := n.Details()
|
|
return C.CString(d)
|
|
}
|
|
|
|
// Example
|
|
|
|
type ExampleNode struct {
|
|
Node
|
|
}
|
|
|
|
func NewExampleNode() Node {
|
|
return &ExampleNode{}
|
|
}
|
|
|
|
func (n *ExampleNode) Close() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Prepare() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Parse(cfg []byte) error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Check() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Start() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Stop() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Pause() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Resume() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Restart() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) Read(smps []Sample) (int, error) {
|
|
|
|
return 0, nil
|
|
}
|
|
|
|
func (n *ExampleNode) Write(smps []Sample) (int, error) {
|
|
|
|
return 0, nil
|
|
}
|
|
|
|
func (n *ExampleNode) Reverse() error {
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *ExampleNode) GetPollFDs() ([]int, error) {
|
|
|
|
return []int{}, nil
|
|
}
|
|
|
|
func (n *ExampleNode) GetNetemFDs() ([]int, error) {
|
|
return []int{}, nil
|
|
}
|
|
|
|
func (n *ExampleNode) Details() string {
|
|
|
|
return ""
|
|
}
|
|
|
|
// init
|
|
|
|
func init() {
|
|
registerNode("example-go", NewExampleNode)
|
|
}
|