github.com/enbility/spine-go@v0.7.0/spine/nodemanagement_usecase.go (about)

     1  package spine
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/enbility/spine-go/api"
     8  	"github.com/enbility/spine-go/model"
     9  	"github.com/enbility/spine-go/util"
    10  )
    11  
    12  func (r *NodeManagement) RequestUseCaseData(remoteDeviceSki string, remoteDeviceAddress *model.AddressDeviceType, sender api.SenderInterface) (*model.MsgCounterType, *model.ErrorType) {
    13  	rfAddress := featureAddressType(NodeManagementFeatureId, EntityAddressType(remoteDeviceAddress, DeviceInformationAddressEntity))
    14  	cmd := model.CmdType{
    15  		NodeManagementUseCaseData: &model.NodeManagementUseCaseDataType{},
    16  	}
    17  	return r.RequestRemoteDataBySenderAddress(cmd, sender, remoteDeviceSki, rfAddress, defaultMaxResponseDelay)
    18  }
    19  
    20  func (r *NodeManagement) processReadUseCaseData(featureRemote api.FeatureRemoteInterface, requestHeader *model.HeaderType) error {
    21  	fd := r.functionData(model.FunctionTypeNodeManagementUseCaseData)
    22  	if fd == nil {
    23  		return errors.New("function data not found")
    24  	}
    25  	cmd := fd.ReplyCmdType(false)
    26  
    27  	return featureRemote.Device().Sender().Reply(requestHeader, r.Address(), cmd)
    28  }
    29  
    30  func (r *NodeManagement) processReplyUseCaseData(message *api.Message, data *model.NodeManagementUseCaseDataType) error {
    31  	_, _ = message.FeatureRemote.UpdateData(true, model.FunctionTypeNodeManagementUseCaseData, data, nil, nil)
    32  
    33  	// the data was updated, so send an event, other event handlers may watch out for this as well
    34  	payload := api.EventPayload{
    35  		Ski:           message.FeatureRemote.Device().Ski(),
    36  		EventType:     api.EventTypeDataChange,
    37  		ChangeType:    api.ElementChangeUpdate,
    38  		Feature:       message.FeatureRemote,
    39  		Device:        message.FeatureRemote.Device(),
    40  		Entity:        message.FeatureRemote.Entity(),
    41  		CmdClassifier: util.Ptr(message.CmdClassifier),
    42  		Data:          data,
    43  	}
    44  	Events.Publish(payload)
    45  
    46  	return nil
    47  }
    48  
    49  func (r *NodeManagement) handleMsgUseCaseData(message *api.Message, data *model.NodeManagementUseCaseDataType) error {
    50  	switch message.CmdClassifier {
    51  	case model.CmdClassifierTypeRead:
    52  		return r.processReadUseCaseData(message.FeatureRemote, message.RequestHeader)
    53  
    54  	case model.CmdClassifierTypeReply:
    55  		return r.processReplyUseCaseData(message, data)
    56  
    57  	case model.CmdClassifierTypeNotify:
    58  		return r.processReplyUseCaseData(message, data)
    59  
    60  	default:
    61  		return fmt.Errorf("nodemanagement.handleUseCaseData: NodeManagementUseCaseData CmdClassifierType not implemented: %s", message.CmdClassifier)
    62  	}
    63  }