diff --git a/plc4go/internal/bacnetip/CommunicationsModule.go b/plc4go/internal/bacnetip/CommunicationsModule.go index 12772814973..83532dde3b0 100644 --- a/plc4go/internal/bacnetip/CommunicationsModule.go +++ b/plc4go/internal/bacnetip/CommunicationsModule.go @@ -68,7 +68,7 @@ func (p *__PCI) deepCopy() *__PCI { } func (p *__PCI) String() string { - return fmt.Sprintf("__PCI{pduUserData:%s, pduSource: %s, pduDestination: %s}", p.pduUserData, p.pduSource, p.pduDestination) + return fmt.Sprintf("__PCI{pduUserData:\n%s\n, pduSource: %s, pduDestination: %s}", p.pduUserData, p.pduSource, p.pduDestination) } // _Client is an interface used for documentation @@ -295,7 +295,6 @@ func (s *ServiceAccessPoint) _setServiceElement(serviceElement _ApplicationServi // _ApplicationServiceElement is an interface used for documentation type _ApplicationServiceElement interface { - fmt.Stringer Request(args Args, kwargs KWArgs) error Indication(args Args, kwargs KWArgs) error Response(args Args, kwargs KWArgs) error @@ -443,18 +442,18 @@ func Bind(localLog zerolog.Logger, args ...any) error { // go through the argument pairs for i := 0; i < len(args)-1; i++ { - client := args[i] - clientStringer, _ := client.(fmt.Stringer) - localLog.Debug().Stringer("client", clientStringer).Msg("client pair element") - server := args[i+1] - serverStringer, _ := server.(fmt.Stringer) - localLog.Debug().Stringer("server", serverStringer).Msg("server pair element") + left := args[i] + leftStringer, _ := left.(fmt.Stringer) + localLog.Debug().Stringer("left", leftStringer).Msg("left pair element") + right := args[i+1] + rightStringer, _ := right.(fmt.Stringer) + localLog.Debug().Stringer("right", rightStringer).Msg("right pair element") // make sure we're binding clients and servers - clientCast, okClient := client.(_Client) - serverCast, okServer := server.(_Server) - elementServiceCast, okElementService := client.(_ApplicationServiceElement) - serviceAccessPointCast, okServiceAccessPoint := server.(_ServiceAccessPoint) + clientCast, okClient := left.(_Client) + serverCast, okServer := right.(_Server) + elementServiceCast, okElementService := left.(_ApplicationServiceElement) + serviceAccessPointCast, okServiceAccessPoint := right.(_ServiceAccessPoint) if okClient && okServer { localLog.Trace().Msg("linking client-server") clientCast._setClientPeer(serverCast) diff --git a/plc4go/internal/bacnetip/PDU.go b/plc4go/internal/bacnetip/PDU.go index 7eca537bae7..510a4813e48 100644 --- a/plc4go/internal/bacnetip/PDU.go +++ b/plc4go/internal/bacnetip/PDU.go @@ -452,6 +452,9 @@ func (a *Address) Equals(other any) bool { } func (a *Address) String() string { + if a == nil { + return "" + } result := "" if a.AddrType == NULL_ADDRESS { result = "Null" diff --git a/plc4go/internal/bacnetip/Task.go b/plc4go/internal/bacnetip/Task.go index 06c92beed08..ba9eec116c3 100644 --- a/plc4go/internal/bacnetip/Task.go +++ b/plc4go/internal/bacnetip/Task.go @@ -44,13 +44,13 @@ type TaskRequirements interface { } type Task struct { - taskRequirements TaskRequirements - taskTime *time.Time - isScheduled bool + TaskRequirements + taskTime *time.Time + isScheduled bool } func NewTask(taskRequirements TaskRequirements) *Task { - return &Task{taskRequirements: taskRequirements} + return &Task{TaskRequirements: taskRequirements} } func (t *Task) InstallTask(options InstallTaskOptions) { @@ -73,15 +73,15 @@ func (t *Task) InstallTask(options InstallTaskOptions) { t.taskTime = when // pass along to the task manager - _taskManager.InstallTask(t.taskRequirements) + _taskManager.InstallTask(t.TaskRequirements) } func (t *Task) SuspendTask() { - _taskManager.SuspendTask(t.taskRequirements) + _taskManager.SuspendTask(t.TaskRequirements) } func (t *Task) Resume() { - _taskManager.ResumeTask(t.taskRequirements) + _taskManager.ResumeTask(t.TaskRequirements) } func (t *Task) GetTaskTime() *time.Time { @@ -100,34 +100,30 @@ func (t *Task) String() string { return fmt.Sprintf("Task(taskTime: %v, isScheduled: %v)", t.taskTime, t.isScheduled) } -type OneShotTaskRequirements interface { - ProcessTask() error -} - type OneShotTask struct { *Task - OneShotTaskRequirements } -func NewOneShotTask(oneShotTaskRequirements OneShotTaskRequirements, when *time.Time) *OneShotTask { - o := &OneShotTask{ - OneShotTaskRequirements: oneShotTaskRequirements, - } - o.Task = NewTask(o) +func NewOneShotTask(taskRequirements TaskRequirements, when *time.Time) *OneShotTask { + o := &OneShotTask{} + o.Task = NewTask(taskRequirements) if when != nil { o.taskTime = when } return o } +func (t *OneShotTask) String() string { + return fmt.Sprintf("OneShotTask(%v)", t.Task) +} + type OneShotDeleteTask struct { *Task - OneShotTaskRequirements } -func NewOneShotDeleteTask(oneShotTaskRequirements OneShotTaskRequirements, when *time.Time) *OneShotDeleteTask { - o := &OneShotDeleteTask{OneShotTaskRequirements: oneShotTaskRequirements} - o.Task = NewTask(o) +func NewOneShotDeleteTask(taskRequirements TaskRequirements, when *time.Time) *OneShotDeleteTask { + o := &OneShotDeleteTask{} + o.Task = NewTask(taskRequirements) if when != nil { o.taskTime = when } @@ -138,6 +134,10 @@ func (r *OneShotDeleteTask) IsOneShotDeleteTask() bool { return true } +func (r *OneShotDeleteTask) String() string { + return fmt.Sprintf("OneShotDeleteTask(%v)", r.Task) +} + type OneShotFunctionTask struct { *OneShotDeleteTask fn func(args Args, kwargs KWArgs) error @@ -145,10 +145,6 @@ type OneShotFunctionTask struct { kwargs KWArgs } -func (m *OneShotFunctionTask) ProcessTask() error { - return m.fn(m.args, m.kwargs) -} - func OneShotFunction(fn func(args Args, kwargs KWArgs) error, args Args, kwargs KWArgs) *OneShotFunctionTask { task := &OneShotFunctionTask{fn: fn, args: args, kwargs: kwargs} task.OneShotDeleteTask = NewOneShotDeleteTask(task, nil) @@ -163,12 +159,15 @@ func FunctionTask(fn func(args Args, kwargs KWArgs) error, args Args, kwargs KWA return task } -type RecurringTaskRequirements interface { - ProcessTask() error +func (m *OneShotFunctionTask) ProcessTask() error { + return m.fn(m.args, m.kwargs) +} + +func (m *OneShotFunctionTask) String() string { + return fmt.Sprintf("OneShotFunctionTask(%v, fn: %t, args: %s, kwargs: %s)", m.OneShotDeleteTask, m.fn != nil, m.args, m.kwargs) } type RecurringTask struct { - RecurringTaskRequirements *Task taskInterval *time.Duration @@ -177,12 +176,11 @@ type RecurringTask struct { log zerolog.Logger } -func NewRecurringTask(localLog zerolog.Logger, recurringTaskRequirements RecurringTaskRequirements, interval *time.Duration, offset *time.Duration) *RecurringTask { +func NewRecurringTask(localLog zerolog.Logger, taskRequirements TaskRequirements, interval *time.Duration, offset *time.Duration) *RecurringTask { r := &RecurringTask{ - RecurringTaskRequirements: recurringTaskRequirements, - log: localLog, + log: localLog, } - r.Task = NewTask(r) + r.Task = NewTask(taskRequirements) // save the interval, but do not automatically install r.taskInterval = interval @@ -235,7 +233,7 @@ func (r *RecurringTask) InstallTask(options InstallTaskOptions) { Msg("Now, interval, offset:") // compute the time - _taskTime := now.Add(-offset).Add(interval).Add(-(time.Duration(now.Add(-offset).Nanosecond() % int(interval)))).Add(offset) + _taskTime := now.Add(-offset).Add(interval).Add(-(time.Duration((now.Add(-offset).UnixNano() - time.Time{}.UnixNano()) % int64(interval)))).Add(offset) r.taskTime = &_taskTime r.log.Debug().Time("taskTime", _taskTime).Msg("task time") @@ -248,23 +246,29 @@ func (r *RecurringTask) IsRecurringTask() bool { return true } -type recurringFunctionTask struct { +func (r *RecurringTask) String() string { + return fmt.Sprintf("RecurringTask(%v, taskInterval: %v, taskIntervalOffset: %v)", r.Task, r.taskInterval, r.taskIntervalOffset) +} + +type RecurringFunctionTask struct { *RecurringTask - fn func() error + fn func(args Args, kwargs KWArgs) error + args Args + kwargs KWArgs } -func newRecurringFunctionTask(localLog zerolog.Logger, interval *time.Duration, fn func() error) *recurringFunctionTask { - r := &recurringFunctionTask{fn: fn} +func NewRecurringFunctionTask(localLog zerolog.Logger, interval *time.Duration, fn func(args Args, kwargs KWArgs) error, args Args, kwargs KWArgs) *RecurringFunctionTask { + r := &RecurringFunctionTask{fn: fn, args: args, kwargs: kwargs} r.RecurringTask = NewRecurringTask(localLog, r, interval, nil) return r } -func (r recurringFunctionTask) ProcessTask() error { - return r.fn() +func (r *RecurringFunctionTask) ProcessTask() error { + return r.fn(r.args, r.kwargs) } -func RecurringFunctionTask(localLog zerolog.Logger, interval *time.Duration, fn func() error) *RecurringTask { - return newRecurringFunctionTask(localLog, interval, fn).RecurringTask +func (r *RecurringFunctionTask) String() string { + return fmt.Sprintf("RecurringFunctionTask(%v, fn: %t, args: %s, kwargs: %s)", r.RecurringTask, r.fn != nil, r.args, r.kwargs) } var _taskManager TaskManager @@ -319,6 +323,13 @@ func (m *taskManager) GetTime() time.Time { return time.Now() } +func GetTaskManagerTime() time.Time { + if _taskManager == nil { + return time.Now() + } + return _taskManager.GetTime() +} + func (m *taskManager) ClearTasks() { m.tasks = nil } diff --git a/plc4go/internal/bacnetip/vlan.go b/plc4go/internal/bacnetip/vlan.go index 1398a005c3e..5eb955a0ad5 100644 --- a/plc4go/internal/bacnetip/vlan.go +++ b/plc4go/internal/bacnetip/vlan.go @@ -303,6 +303,10 @@ func (n *IPNode) bind(lan NodeNetworkReference) { // This is used to preserve th lan.AddNode(n) } +func (n *IPNode) String() string { + return fmt.Sprintf("IPNode(%v): %s, %v", n.Node, n.addrTuple, n.addrBroadcastTuple) +} + type IPRouterNode struct { *Client