1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-16 00:00:02 +01:00
VILLASnode/lib/nodes/go/example.go

265 lines
4.2 KiB
Go
Raw Normal View History

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)
}