diff --git a/charger/ocpp_test_handler.go b/charger/ocpp_test_handler.go index 1069dedb0..f3031c8b6 100644 --- a/charger/ocpp_test_handler.go +++ b/charger/ocpp_test_handler.go @@ -14,7 +14,10 @@ type ChargePointHandler struct { // core func (handler *ChargePointHandler) OnChangeAvailability(request *core.ChangeAvailabilityRequest) (confirmation *core.ChangeAvailabilityConfirmation, err error) { - defer func() { handler.triggerC <- core.ChangeAvailabilityFeatureName }() + // dispatch asynchronously: the trigger handler issues synchronous CP→CS + // requests whose responses are read by this same goroutine, so a blocking + // send would deadlock the WebSocket read loop + go func() { handler.triggerC <- core.ChangeAvailabilityFeatureName }() return core.NewChangeAvailabilityConfirmation(core.AvailabilityStatusAccepted), nil } @@ -61,7 +64,8 @@ func (handler *ChargePointHandler) OnUnlockConnector(request *core.UnlockConnect } func (handler *ChargePointHandler) OnTriggerMessage(request *remotetrigger.TriggerMessageRequest) (confirmation *remotetrigger.TriggerMessageConfirmation, err error) { - defer func() { handler.triggerC <- request.RequestedMessage }() + // see OnChangeAvailability for why this is async + go func() { handler.triggerC <- request.RequestedMessage }() return remotetrigger.NewTriggerMessageConfirmation(remotetrigger.TriggerMessageStatusAccepted), nil }