/*
 * Copyright (c) 2018 - present.  Boling Consulting Solutions (bcsw.net)
 * Copyright 2020-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 * NOTE: This file was generated, manual edits will be overwritten!
 *
 * Generated by 'goCodeGenerator.py':
 *              https://github.com/cboling/OMCI-parser/README.md
 */

package generated

import "github.com/deckarep/golang-set"

// TwdmChannelTuningPerformanceMonitoringHistoryDataPart1ClassID is the 16-bit ID for the OMCI
// Managed entity TWDM channel tuning performance monitoring history data part 1
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1ClassID = ClassID(449) // 0x01c1

var twdmchanneltuningperformancemonitoringhistorydatapart1BME *ManagedEntityDefinition

// TwdmChannelTuningPerformanceMonitoringHistoryDataPart1 (Class ID: #449 / 0x01c1)
//	This ME collects certain tuning-control-related PM data associated with the slot/circuit pack,
//	hosting one or more ANI-G MEs, for a specific TWDM channel. Instances of this ME are created and
//	deleted by the OLT.
//
//	The relevant events this ME is concerned with are counted towards the PM statistics associated
//	with the source TWDM channel. The attribute descriptions refer to the ONU activation cycle
//	states and timers specified in clause 12 of [ITU-T- G.989.3]. This ME contains the counters
//	characterized as mandatory in clause 14 of [ITU-T- G.989.3].
//
//	For a complete discussion of generic PM architecture, refer to clause I.4.
//
//	Relationships
//		An instance of this ME is associated with an instance of TWDM channel ME.
//
//	Attributes
//		Managed Entity Id
//			This attribute uniquely identifies each instance of this ME. Through an identical ID, this ME is
//			implicitly linked to an instance of the TWDM channel ME. (R, setbycreate) (mandatory) (2-bytes)
//
//		Interval End Time
//			This attribute identifies the most recently finished 15-min interval. (R) (mandatory) (1-byte)
//
//		Threshold Data 1_2 Id
//			Threshold data 1/2 ID: This attribute points to an instance of the threshold data 1 and 2 MEs
//			that contains PM threshold values. (R,-W, setbycreate) (mandatory) (2-bytes)
//
//		Tuning Control Requests For Rx Only Or Rx And Tx
//			The counter of received Tuning_Control PLOAM messages with Request operation code that contain
//			tuning instructions either for receiver only or for both receiver and transmitter. (R)
//			(mandatory) (4-byte)
//
//		Tuning Control Requests For Tx Only
//			The counter of received Tuning_Control PLOAM messages with Request operation code that contain
//			tuning instructions for transmitter only. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Rejected_Int_Sfc
//			Tuning control requests rejected/INT_SFC: The counter of transmitted Tuning_Response PLOAM
//			messages with NACK operation code and INT_SFC response code, indicating inability to start
//			transceiver tuning by the specified time (SFC). (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Rejected_Ds_Xxx
//			Tuning control requests rejected/DS_xxx: The aggregate counter of transmitted Tuning_Response
//			PLOAM messages with NACK operation code and any DS_xxx response code, indicating target
//			downstream wavelength channel inconsistency. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Rejected_Us_Xxx
//			Tuning control requests rejected/US_xxx: The aggregate counter of transmitted Tuning_Response
//			PLOAM messages with NACK operation code and any US_xxx response code, indicating target upstream
//			wavelength channel inconsistency. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Fulfilled With Onu Reacquired At Target Channel
//			The counter of controlled tuning attempts for which an upstream tuning confirmation has been
//			obtained in the target channel. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Failed Due To Target Ds Wavelength Channel Not Found
//			The counter of controlled tuning attempts that failed due to timer TO4 expiration in the DS
//			Tuning state (O8) in the target channel. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Failed Due To No Feedback In Target Ds Wavelength Channel
//			The counter of controlled tuning attempts that failed due to timer TO5 expiration in the US
//			Tuning state (O9) in the target channel. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Resolved With Onu Reacquired At Discretionary Channel
//			The counter of controlled tuning attempts for which an upstream tuning confirmation has been
//			obtained in the discretionary channel. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Rollback_Com_Ds
//			Tuning control requests Rollback/COM_DS: The counter of controlled tuning attempts that failed
//			due to communication condition in the target channel, as indicated by the Tuning_Response PLOAM
//			message with Rollback operation code and COM_DS response code. (R) (mandatory) (4-byte)
//
//		Tuning Control Requests Rollback_Ds_Xxx
//			Tuning control requests Rollback/DS_xxx: The aggregate counter of controlled tuning attempts
//			that failed due to target downstream wavelength channel inconsistency, as indicated by the
//			Tuning_Response PLOAM message with Rollback operation code and any DS_xxx response code. (R)
//			(mandatory) (4-byte)
//
//		Tuning Control Requests Rollback_Us_Xxx
//			Tuning control requests Rollback/US_xxx: The aggregate counter of controlled tuning attempts
//			that failed due to target upstream wavelength channel parameter violation, as indicated by the
//			Tuning_Response PLOAM message with Rollback operation code and US_xxx response code. (R)
//			(mandatory) (4-byte)
//
//		Tuning Control Requests Failed With Onu Reactivation
//			The counter of controlled tuning attempts that failed on any reason, with expiration of timers
//			TO4 or TO5 causing the ONU transition into state O1. (R) (mandatory) (4-byte)
//
type TwdmChannelTuningPerformanceMonitoringHistoryDataPart1 struct {
	ManagedEntityDefinition
	Attributes AttributeValueMap
}

// Attribute name constants

const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_IntervalEndTime = "IntervalEndTime"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_ThresholdData12Id = "ThresholdData12Id"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsForRxOnlyOrRxAndTx = "TuningControlRequestsForRxOnlyOrRxAndTx"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsForTxOnly = "TuningControlRequestsForTxOnly"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRejectedIntSfc = "TuningControlRequestsRejectedIntSfc"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRejectedDsXxx = "TuningControlRequestsRejectedDsXxx"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRejectedUsXxx = "TuningControlRequestsRejectedUsXxx"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFulfilledWithOnuReacquiredAtTargetChannel = "TuningControlRequestsFulfilledWithOnuReacquiredAtTargetChannel"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFailedDueToTargetDsWavelengthChannelNotFound = "TuningControlRequestsFailedDueToTargetDsWavelengthChannelNotFound"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFailedDueToNoFeedbackInTargetDsWavelengthChannel = "TuningControlRequestsFailedDueToNoFeedbackInTargetDsWavelengthChannel"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsResolvedWithOnuReacquiredAtDiscretionaryChannel = "TuningControlRequestsResolvedWithOnuReacquiredAtDiscretionaryChannel"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRollbackComDs = "TuningControlRequestsRollbackComDs"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRollbackDsXxx = "TuningControlRequestsRollbackDsXxx"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRollbackUsXxx = "TuningControlRequestsRollbackUsXxx"
const TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFailedWithOnuReactivation = "TuningControlRequestsFailedWithOnuReactivation"

func init() {
	twdmchanneltuningperformancemonitoringhistorydatapart1BME = &ManagedEntityDefinition{
		Name:    "TwdmChannelTuningPerformanceMonitoringHistoryDataPart1",
		ClassID: TwdmChannelTuningPerformanceMonitoringHistoryDataPart1ClassID,
		MessageTypes: mapset.NewSetWith(
			Create,
			Delete,
			Get,
			Set,
		),
		AllowedAttributeMask: 0xfffe,
		AttributeDefinitions: AttributeDefinitionMap{
			0:  Uint16Field(ManagedEntityID, PointerAttributeType, 0x0000, 0, mapset.NewSetWith(Read, SetByCreate), false, false, false, 0),
			1:  ByteField(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_IntervalEndTime, UnsignedIntegerAttributeType, 0x8000, 0, mapset.NewSetWith(Read), false, false, false, 1),
			2:  Uint16Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_ThresholdData12Id, UnsignedIntegerAttributeType, 0x4000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 2),
			3:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsForRxOnlyOrRxAndTx, CounterAttributeType, 0x2000, 0, mapset.NewSetWith(Read), false, false, false, 3),
			4:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsForTxOnly, CounterAttributeType, 0x1000, 0, mapset.NewSetWith(Read), false, false, false, 4),
			5:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRejectedIntSfc, CounterAttributeType, 0x0800, 0, mapset.NewSetWith(Read), false, false, false, 5),
			6:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRejectedDsXxx, CounterAttributeType, 0x0400, 0, mapset.NewSetWith(Read), false, false, false, 6),
			7:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRejectedUsXxx, CounterAttributeType, 0x0200, 0, mapset.NewSetWith(Read), false, false, false, 7),
			8:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFulfilledWithOnuReacquiredAtTargetChannel, CounterAttributeType, 0x0100, 0, mapset.NewSetWith(Read), false, false, false, 8),
			9:  Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFailedDueToTargetDsWavelengthChannelNotFound, CounterAttributeType, 0x0080, 0, mapset.NewSetWith(Read), false, false, false, 9),
			10: Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFailedDueToNoFeedbackInTargetDsWavelengthChannel, CounterAttributeType, 0x0040, 0, mapset.NewSetWith(Read), false, false, false, 10),
			11: Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsResolvedWithOnuReacquiredAtDiscretionaryChannel, CounterAttributeType, 0x0020, 0, mapset.NewSetWith(Read), false, false, false, 11),
			12: Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRollbackComDs, CounterAttributeType, 0x0010, 0, mapset.NewSetWith(Read), false, false, false, 12),
			13: Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRollbackDsXxx, CounterAttributeType, 0x0008, 0, mapset.NewSetWith(Read), false, false, false, 13),
			14: Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsRollbackUsXxx, CounterAttributeType, 0x0004, 0, mapset.NewSetWith(Read), false, false, false, 14),
			15: Uint32Field(TwdmChannelTuningPerformanceMonitoringHistoryDataPart1_TuningControlRequestsFailedWithOnuReactivation, CounterAttributeType, 0x0002, 0, mapset.NewSetWith(Read), false, false, false, 15),
		},
		Access:  CreatedByOlt,
		Support: UnknownSupport,
	}
}

// NewTwdmChannelTuningPerformanceMonitoringHistoryDataPart1 (class ID 449) creates the basic
// Managed Entity definition that is used to validate an ME of this type that
// is received from or transmitted to the OMCC.
func NewTwdmChannelTuningPerformanceMonitoringHistoryDataPart1(params ...ParamData) (*ManagedEntity, OmciErrors) {
	return NewManagedEntity(*twdmchanneltuningperformancemonitoringhistorydatapart1BME, params...)
}
