diff --git a/go.mod b/go.mod index 9330105..5389922 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.22.1 replace github.com/lorenzodonini/ocpp-go v0.18.0 => github.com/ChargePi/ocpp-go v0.21.0 require ( - github.com/ChargePi/ocppManager-go v1.2.0 github.com/agrison/go-commons-lang v0.0.0-20240106075236-2e001e6401ef github.com/lorenzodonini/ocpp-go v0.18.0 github.com/samber/lo v1.47.0 diff --git a/ocpp_v16/manager.go b/ocpp_v16/manager.go index 1531243..caa6f9c 100644 --- a/ocpp_v16/manager.go +++ b/ocpp_v16/manager.go @@ -29,11 +29,13 @@ type ( } ManagerV16 struct { - ocppConfig *Config - mandatoryKeys []Key - keyValidator KeyValidator + ocppConfig Config + mu sync.RWMutex + + mandatoryKeys []Key + keyValidator KeyValidator + onUpdateHandlers map[Key]OnUpdateHandler - mu sync.Mutex } ) @@ -47,10 +49,9 @@ func NewV16ConfigurationManager(defaultConfiguration Config, profiles ...string) } return &ManagerV16{ - ocppConfig: &defaultConfiguration, + ocppConfig: defaultConfiguration, mandatoryKeys: mandatoryKeys, onUpdateHandlers: make(map[Key]OnUpdateHandler), - mu: sync.Mutex{}, }, nil } @@ -65,17 +66,23 @@ func (m *ManagerV16) SetConfiguration(configuration Config) error { return err } - m.ocppConfig = &configuration + m.ocppConfig = configuration return nil } // RegisterCustomKeyValidator registers a custom key validator func (m *ManagerV16) RegisterCustomKeyValidator(validator KeyValidator) { + m.mu.Lock() + defer m.mu.Unlock() + m.keyValidator = validator } // GetMandatoryKeys returns the mandatory keys for the configuration func (m *ManagerV16) GetMandatoryKeys() []Key { + m.mu.RLock() + defer m.mu.RUnlock() + return m.mandatoryKeys } @@ -132,16 +139,16 @@ func (m *ManagerV16) UpdateKey(key Key, value *string) error { // GetConfiguration returns the full current configuration func (m *ManagerV16) GetConfiguration() ([]core.ConfigurationKey, error) { - m.mu.Lock() - defer m.mu.Unlock() + m.mu.RLock() + defer m.mu.RUnlock() return m.ocppConfig.GetConfig(), nil } // GetConfigurationValue returns the value of a specific key func (m *ManagerV16) GetConfigurationValue(key Key) (*string, error) { - m.mu.Lock() - defer m.mu.Unlock() + m.mu.RLock() + defer m.mu.RUnlock() return m.ocppConfig.GetConfigurationValue(key.String()) } @@ -166,6 +173,9 @@ func (m *ManagerV16) OnUpdateKey(key Key, handler OnUpdateHandler) error { return ErrKeyCannotBeEmpty } + m.mu.Lock() + defer m.mu.Unlock() + // Validate that the key exists _, err := m.ocppConfig.GetConfigurationValue(key.String()) if err != nil {