ctrlxutils

package module
v0.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 30, 2025 License: MIT Imports: 12 Imported by: 0

README

Go ctrlX Data Layer Utilities

This Go library provides utilities to simplify interaction with the Bosch Rexroth ctrlX Data Layer. It offers a high-level manager to handle the lifecycle of data layer providers and includes a generic node provider for easily exposing values.

Core Components
  • DataLayerProviderManager: Manages the data layer connection and runs one or more providers in the background. It handles the creation and teardown of the datalayer.System and datalayer.Provider instances.
  • IDataLayerProvider: An interface that allows for the creation of modular, custom providers. Any struct that implements the Name() and Run() methods can be managed by the DataLayerProviderManager.
  • DataLayerProviderNode: A generic provider for exposing a single value of any type (T) as a node in the data layer. It automatically handles data layer events like read, write, create, and remove requests for the specified path.
Installation

To use this library, add it to your Go project.

go github.com/iotwin-at/ctrlxutils
Example Usage

The following example demonstrates how to create a custom DataLayerProviderNode and configure it using settings, that are stored to ctrlX appdata. Logs are written to jounald, such that they will be visible in CtrlX-UI's Logbook.

package main

import (
	"context"
	"os/signal"
	"syscall"
	"time"

	"github.com/boschrexroth/ctrlx-datalayer-golang/v2/pkg/datalayer"
	"github.com/iotwin-at/ctrlxutils"
	"github.com/uoul/go-common/log"
	"github.com/uoul/go-common/serialization"
)

// ---------------------------------------------------------------------------------
// Example AppConfig
// ---------------------------------------------------------------------------------
type AppConfig struct {
	UpdateRate int
}

// ---------------------------------------------------------------------------------
// Example Datalayer Provider implementation
// ---------------------------------------------------------------------------------

type CounterProvider struct {
	updateRate int
}

// Name implements ctrlxutils.IDataLayerProvider.
func (c *CounterProvider) Name() string {
	return "CounterProvider"
}

// Run implements ctrlxutils.IDataLayerProvider.
func (c *CounterProvider) Run(ctx context.Context, provider *datalayer.Provider, dlRootPath string) error {
	// Create nodes (here just one for demonstration purpose - in general a provider can host multiple nodes)
	counterNode := ctrlxutils.NewDataLayerProviderNode[int](ctx, provider, ctrlxutils.DataLayerProviderNodeConfig{
		Path:    "Counter", // Will be visible at Datalayer under <dlRootPath>/<ProviderName>/Counter
		Unit:    "inc.",
		Desc:    "Incrementing counter example",
		DescUrl: "",
	})
	// Init. value
	counterNode.SetValue(0)
	// Run Provider
	for {
		select {
		case <-time.Tick(time.Duration(c.updateRate) * time.Second):
			// Increment counter by 1
			counterNode.SetValue(counterNode.GetValue() + 1)
		case <-ctx.Done():
			return nil
		}
	}
}

// Use constructor to ensure provider implements interface
func NewCounterProvider(updateRate int) ctrlxutils.IDataLayerProvider {
	return &CounterProvider{
		updateRate: updateRate,
	}
}

// ---------------------------------------------------------------------------------
// Setup Application
// ---------------------------------------------------------------------------------

func main() {
	// Create Application Context
	ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGABRT)
	defer cancel()

	// Load AppConfig from file (you need to make sure, that the corresponding entries in snapcraft.yaml and manifest.json exists!)
	appConfig, _ := ctrlxutils.UnmarshalAppdata[AppConfig]( // Ignore Errors - do not do this in your code!
		serialization.NewJSONSerializer(),
		"properties.json",
	)

	// Create Logger for Ctrlx Logbook
	logger, _ := ctrlxutils.NewJournaldLogger(ctx, "", log.INFO)

	// Create provider manager
	ctrlxutils.NewDataLayerProviderManager(
		ctx,
		logger,
		"ipc://",     // Datalayer interface (for local deployment as snap always ips://)
		"MyFancyApp", // Datalayer RootPath
		ctrlxutils.WithProvider(NewCounterProvider(appConfig.UpdateRate)), // Register our CounterProvider from above (you can register multiple providers here)
	)

	// Wait for termination
	<-ctx.Done()
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func MarshalAppdata

func MarshalAppdata[T any](serializer serialization.ISerializer, file string, permission os.FileMode, data T) error

func NewJournaldLogger

func NewJournaldLogger(ctx context.Context, tag string, logLevel log.LogLevel) (log.ILogger, error)

func UnmarshalAppdata

func UnmarshalAppdata[T any](serializer serialization.ISerializer, file string) (T, error)

func WithProvider

func WithProvider(p IDataLayerProvider) func(*DataLayerProviderManager)

Types

type DataLayerProviderManager

type DataLayerProviderManager struct {
	// contains filtered or unexported fields
}

func NewDataLayerProviderManager

func NewDataLayerProviderManager(ctx context.Context, logger log.ILogger, dlConnStr string, dlRootPath string, opts ...func(*DataLayerProviderManager)) *DataLayerProviderManager

type DataLayerProviderNode

type DataLayerProviderNode[T any] struct {
	// contains filtered or unexported fields
}

func NewDataLayerProviderNode

func NewDataLayerProviderNode[T any](ctx context.Context, provider *datalayer.Provider, config DataLayerProviderNodeConfig) *DataLayerProviderNode[T]

func (*DataLayerProviderNode[T]) GetValue

func (d *DataLayerProviderNode[T]) GetValue() T

func (*DataLayerProviderNode[T]) SetValue

func (d *DataLayerProviderNode[T]) SetValue(val T)

type DataLayerProviderNodeConfig

type DataLayerProviderNodeConfig struct {
	Path    string // Path where this value will be available at datalayer
	Unit    string // Unit (e.g. kg)
	Desc    string // Description
	DescUrl string // Description URL
}

type IDataLayerProvider

type IDataLayerProvider interface {
	Name() string
	Run(ctx context.Context, provider *datalayer.Provider, dlRootPath string) error
}

type JournaldLogger

type JournaldLogger struct {
	// contains filtered or unexported fields
}

func (*JournaldLogger) Debug

func (j *JournaldLogger) Debug(message string)

Debug implements log.ILogger.

func (*JournaldLogger) Debugf

func (j *JournaldLogger) Debugf(format string, a ...any)

Debugf implements log.ILogger.

func (*JournaldLogger) Error

func (j *JournaldLogger) Error(message string)

Error implements log.ILogger.

func (*JournaldLogger) Errorf

func (j *JournaldLogger) Errorf(format string, a ...any)

Errorf implements log.ILogger.

func (*JournaldLogger) Fatal

func (j *JournaldLogger) Fatal(message string)

Fatal implements log.ILogger.

func (*JournaldLogger) Fatalf

func (j *JournaldLogger) Fatalf(format string, a ...any)

Fatalf implements log.ILogger.

func (*JournaldLogger) Info

func (j *JournaldLogger) Info(message string)

Info implements log.ILogger.

func (*JournaldLogger) Infof

func (j *JournaldLogger) Infof(format string, a ...any)

Infof implements log.ILogger.

func (*JournaldLogger) Trace

func (j *JournaldLogger) Trace(message string)

Trace implements log.ILogger.

func (*JournaldLogger) Tracef

func (j *JournaldLogger) Tracef(format string, a ...any)

Tracef implements log.ILogger.

func (*JournaldLogger) Warning

func (j *JournaldLogger) Warning(message string)

Warning implements log.ILogger.

func (*JournaldLogger) Warningf

func (j *JournaldLogger) Warningf(format string, a ...any)

Warningf implements log.ILogger.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL