Skip to content

Commit

Permalink
fix(plc4go/bacnet): several smaller bugfixes
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Aug 14, 2024
1 parent ae2815e commit 11166dd
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 53 deletions.
23 changes: 11 additions & 12 deletions plc4go/internal/bacnetip/CommunicationsModule.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions plc4go/internal/bacnetip/PDU.go
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,9 @@ func (a *Address) Equals(other any) bool {
}

func (a *Address) String() string {
if a == nil {
return "<nil>"
}
result := ""
if a.AddrType == NULL_ADDRESS {
result = "Null"
Expand Down
93 changes: 52 additions & 41 deletions plc4go/internal/bacnetip/Task.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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 {
Expand All @@ -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
}
Expand All @@ -138,17 +134,17 @@ 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
args Args
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)
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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")

Expand All @@ -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
Expand Down Expand Up @@ -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
}
Expand Down
4 changes: 4 additions & 0 deletions plc4go/internal/bacnetip/vlan.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 11166dd

Please sign in to comment.