X-Git-Url: https://git.giacomolli.uk/onehouse/blobdiff_plain/b9a4f3bdd2609a8b178dd42f313c383ccb59049b..c36e60046f72af3d0803943185526c27b10aa4ae:/driver/alamo/gateway.go?ds=inline diff --git a/driver/alamo/gateway.go b/driver/alamo/gateway.go index 1bf0074..2f3da3b 100644 --- a/driver/alamo/gateway.go +++ b/driver/alamo/gateway.go @@ -33,23 +33,6 @@ func (g *gateway) status(ctx context.Context) ([]State, error) { return states, nil } -func (g *gateway) action(ctx context.Context, mac string, action Action) (State, error) { - err := g.wait(ctx) - if err != nil { - return State{}, fmt.Errorf("wait for action slot: %w", err) - } - - ctx, cancel := context.WithTimeout(ctx, gatewayExchangeTimeout) - defer cancel() - - state, err := g.client.Action(ctx, mac, action) - if err != nil { - return State{}, fmt.Errorf("exchange gateway action: %w", err) - } - - return state, nil -} - func (g *gateway) wait(ctx context.Context) error { err := ctx.Err() if err != nil { @@ -73,7 +56,29 @@ func (g *gateway) wait(ctx context.Context) error { return err } + deadline, exists := ctx.Deadline() + if exists && !time.Now().Before(deadline) { + return context.DeadlineExceeded + } + g.nextStart = time.Now().Add(gatewayRequestInterval) return nil } + +func (g *gateway) action(ctx context.Context, mac string, action Action) (State, error) { + err := g.wait(ctx) + if err != nil { + return State{}, fmt.Errorf("wait for action slot: %w", err) + } + + ctx, cancel := context.WithTimeout(ctx, gatewayExchangeTimeout) + defer cancel() + + state, err := g.client.Action(ctx, mac, action) + if err != nil { + return State{}, fmt.Errorf("exchange gateway action: %w", err) + } + + return state, nil +}