/*
 * 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"

// Vdsl2LineConfigurationExtensions2ClassID is the 16-bit ID for the OMCI
// Managed entity VDSL2 line configuration extensions 2
const Vdsl2LineConfigurationExtensions2ClassID = ClassID(323) // 0x0143

var vdsl2lineconfigurationextensions2BME *ManagedEntityDefinition

// Vdsl2LineConfigurationExtensions2 (Class ID: #323 / 0x0143)
//	This ME extends the xDSL line configuration MEs. The ME name was chosen because its attributes
//	were initially unique to ITU-T G.993.2 VDSL2. Due to continuing standards development, two of
//	the attributes (FEXT and NEXT TXREFVNds) are also used in [ITUT-G.992.3] and [ITUT-G.992.5].
//	This ME therefore pertains to the latter Recommendations as well as to [ITU-T-G.993.2].
//
//	The attributes of this ME are further defined in [ITU-T G.997.1].
//
//	An instance of this ME is created and deleted by the OLT.
//
//	Relationships
//		An instance of this ME may be associated with zero or more instances of the PPTP xDSL UNI part
//		1.////		The overall xDSL line configuration profile is modelled in several parts, all of which are
//		associated together through a common ME ID. (The client PPTP xDSL UNI part 1 has a single
//		pointer, which refers to the entire set of line configuration parts.)
//
//	Attributes
//		Managed Entity Id
//			This attribute uniquely identifies each instance of this ME. All xDSL and VDSL2 line
//			configuration profiles and extensions that pertain to a given PPTP xDSL must share a common ME
//			ID. (R, setbycreate) (mandatory) (2-bytes)
//
//		Sos Time Downstream
//			The SOS-TIME-ds attribute is used in the specification of receiver initiated SOS (see clause
//			13.4.3 of [ITUT G.993.2]). If the attribute value is not zero, the standard SOS triggering
//			criteria are enabled, and the value specifies the duration of the window used in the standard
//			SOS triggering criteria in the downstream direction. The special value zero indicates that the
//			standard SOS triggering criteria are disabled, i.e., vendor-discretionary values may be used
//			instead of the values configured in the MIB for the following parameters: SOS-NTONES-ds, SOS-
//			CRC-ds, SOS-TIME-ds. The valid range of non-zero values is from 1..255, specifying 64-ms to
//			16320 ms in steps of 64-ms. (R,-W, setbycreate) (optional) (1-byte)
//
//		Sos Time Upstream
//			The SOS-TIME-us attribute is used in the specification of receiver initiated SOS (see clause
//			13.4.3 of [ITUT G.993.2]). If the attribute value is not zero, the standard SOS triggering
//			criteria are enabled, and the value specifies the duration of the window used in the standard
//			SOS triggering criteria in the upstream direction. The special value zero indicates that the
//			standard SOS triggering criteria are disabled, i.e., vendor-discretionary values may be used
//			instead of the values configured in the MIB for the following parameters: SOS-NTONES-us, SOS-
//			CRC-us, SOS-TIME-us. The valid range of non-zero values is from 1..255, specifying 64-ms to
//			16320-ms in steps of 64-ms. (R,-W, setbycreate) (optional) (1-byte)
//
//		Sos Degraded Tones Threshold Downstream
//			The SOS-NTONES-ds attribute is the minimum percentage of tones in the downstream medley set that
//			must be degraded in order to arm the first subcondition of the standard SOS triggering criteria
//			in the downstream direction. The valid range of values is from 1 to 100% in steps of 1. Use of
//			the special value 0 is described in clause 13.4.3.2 of [ITUT G.993.2]. (R,-W, setbycreate)
//			(optional) (1-byte)
//
//		Sos Degraded Tones Threshold Upstream
//			The SOS-NTONES-us attribute is the minimum percentage of tones in the upstream medley set that
//			must be degraded in order to arm the first subcondition of the standard SOS triggering criteria
//			in the upstream direction. The valid range of values is from 1 to 100% in steps of 1. Use of the
//			special value 0 is described in clause 13.4.3.2 of [ITUT-G.993.2]. (R,-W, setbycreate)
//			(optional) (1-byte)
//
//		Sos Crc Threshold Downstream
//			The SOS-CRC-ds attribute is the minimum number of normalized CRC anomalies received in SOS-TIME-
//			ds seconds in order to arm the second sub-condition of the standard SOS triggering criteria (see
//			clause 13.4.3.2 of [ITU T G.993.2]) in the downstream direction. The valid range of SOS-CRC
//			values is 0.02 to (216-1)*0.02, in steps of 0.02. The value-0 specifies that the ONU uses its
//			internal default. (R, W, set-by-create) (optional) (2 bytes)
//
//		Sos Crc Threshold Upstream
//			The SOS-CRC-us attribute is the minimum number of normalized CRC anomalies received in SOS-TIME-
//			us seconds in order to arm the second sub-condition of the standard SOS triggering criteria (see
//			clause 13.4.3.2 of [ITU T G.993.2]) in the upstream direction. The valid range of SOS-CRC values
//			is 0.02 to (216-1)*0.02, in steps of 0.02. The value-0 specifies that the ONU uses its internal
//			default. (R, W, set-by-create) (optional) (2 bytes)
//
//		Max Sos Downstream
//			The MAX-SOS-ds attribute is used in deactivation. If the number of successful SOS procedures in
//			the downstream direction performed within a 120-s interval exceeds MAX-SOS-ds, the modem goes to
//			state L3. See clause 12.1.4 of [ITUT G.993.2] for details. The valid range of values is 1 to 15,
//			with the special value 0 as described in clause 12.1 of [ITUT G.993.2]. (R,-W, setbycreate)
//			(optional) (1-byte)
//
//		Max Sos Upstream
//			The MAX-SOS-us attribute is used in deactivation. If the number of successful SOS procedures in
//			the upstream direction performed within a 120-s interval exceeds MAX-SOS-us, the modem goes to
//			state L3. See clause 12.1.4 of [ITUT G.993.2] for details. The valid range of values is 1 to 15,
//			with the special value 0 as described in clause 12.1 of [ITUT G.993.2]. (R,-W, setbycreate)
//			(optional) (1-byte)
//
//		Snr Max Offset Downstream
//			The SNRMOFFSET-ROC-ds attribute is the SNR margin offset for the ROC in the downstream
//			direction. The attribute is used in the specification of the channel initialization policy (see
//			clause 12.3.7.1 of [ITUT G.993.2]). The valid range of SNR margin offset values is from 0..31-dB
//			in 0.1-dB steps. (R,-W, setbycreate) (optional) (2-bytes)
//
//		Snr Max Offset Upstream
//			The SNRMOFFSET-ROC-us attribute is the SNR margin offset for the ROC in the upstream direction.
//			The attribute is used in the specification of the channel initialization policy (see
//			clause-12.3.7.1 of [ITUT G.993.2]). The valid range of SNR margin offset values is from 0..31-dB
//			in 0.1-dB steps. (R,-W, setbycreate) (optional) (2-bytes)
//
//		Roc Minimum Impulse Noise Protection Downstream
//			The INPMIN-ROC-ds attribute specifies the minimum INP to apply on the ROC in the downstream
//			direction expressed in multiples of equivalent 4k DMT, xDSL (DMT) symbol length. The minimum INP
//			is an integer ranging from 0 to 8. (R,-W, setbycreate) (optional) (1-byte)
//
//		Roc Minimum Impulse Noise Protection Upstream
//			The INPMIN-ROC-us attribute specifies the minimum impulse noise protection to apply on the ROC
//			in the upstream direction expressed in multiples of equivalent 4k DMT symbol length. The minimum
//			INP is an integer ranging from 0 to 8. (R,-W, setbycreate) (optional) (1-byte)
//
//		Fext Downstream Transmitter Referred Virtual Noise Table
//			The FEXT TXREFVNds attribute is the downstream transmitter referred virtual noise specified for
//			FEXTR duration in Annex C of [ITUT G.992.3] (ADSL2) and Annex C of [ITUT G.992.5] (ADSL2plus).
//			The syntax of this attribute is the same as that of the TXREFVNds table attribute of the VDSL2
//			line configuration extensions ME. (R,-W) (mandatory for Annex-C of [ITUT-G.992.3] and Annex-C of
//			[ITUT-G.992.5]) (3-*-N bytes, where N is the number of breakpoints)
//
//		Next Downstream Transmitter Referred Virtual Noise Table
//			The NEXT TXREFVNds attribute is the downstream transmitter referred virtual noise specified for
//			NEXTR duration in Annex C of [ITUT G.992.3] (ADSL2) and Annex C of [ITUT G.992.5] (ADSL2plus).
//			The syntax of this attribute is the same as that of the TXREFVNds table attribute of the VDSL2
//			line configuration extensions ME. (R,-W) (mandatory for Annex-C of [ITUT-G.992.3] and Annex-C of
//			[ITUT-G.992.5]) (3-*-N bytes, where N is the number of breakpoints)
//
type Vdsl2LineConfigurationExtensions2 struct {
	ManagedEntityDefinition
	Attributes AttributeValueMap
}

// Attribute name constants

const Vdsl2LineConfigurationExtensions2_SosTimeDownstream = "SosTimeDownstream"
const Vdsl2LineConfigurationExtensions2_SosTimeUpstream = "SosTimeUpstream"
const Vdsl2LineConfigurationExtensions2_SosDegradedTonesThresholdDownstream = "SosDegradedTonesThresholdDownstream"
const Vdsl2LineConfigurationExtensions2_SosDegradedTonesThresholdUpstream = "SosDegradedTonesThresholdUpstream"
const Vdsl2LineConfigurationExtensions2_SosCrcThresholdDownstream = "SosCrcThresholdDownstream"
const Vdsl2LineConfigurationExtensions2_SosCrcThresholdUpstream = "SosCrcThresholdUpstream"
const Vdsl2LineConfigurationExtensions2_MaxSosDownstream = "MaxSosDownstream"
const Vdsl2LineConfigurationExtensions2_MaxSosUpstream = "MaxSosUpstream"
const Vdsl2LineConfigurationExtensions2_SnrMaxOffsetDownstream = "SnrMaxOffsetDownstream"
const Vdsl2LineConfigurationExtensions2_SnrMaxOffsetUpstream = "SnrMaxOffsetUpstream"
const Vdsl2LineConfigurationExtensions2_RocMinimumImpulseNoiseProtectionDownstream = "RocMinimumImpulseNoiseProtectionDownstream"
const Vdsl2LineConfigurationExtensions2_RocMinimumImpulseNoiseProtectionUpstream = "RocMinimumImpulseNoiseProtectionUpstream"
const Vdsl2LineConfigurationExtensions2_FextDownstreamTransmitterReferredVirtualNoiseTable = "FextDownstreamTransmitterReferredVirtualNoiseTable"
const Vdsl2LineConfigurationExtensions2_NextDownstreamTransmitterReferredVirtualNoiseTable = "NextDownstreamTransmitterReferredVirtualNoiseTable"

func init() {
	vdsl2lineconfigurationextensions2BME = &ManagedEntityDefinition{
		Name:    "Vdsl2LineConfigurationExtensions2",
		ClassID: Vdsl2LineConfigurationExtensions2ClassID,
		MessageTypes: mapset.NewSetWith(
			Create,
			Delete,
			Get,
			GetNext,
			Set,
			SetTable,
		),
		AllowedAttributeMask: 0xfffc,
		AttributeDefinitions: AttributeDefinitionMap{
			0:  Uint16Field(ManagedEntityID, PointerAttributeType, 0x0000, 0, mapset.NewSetWith(Read, SetByCreate), false, false, false, 0),
			1:  ByteField(Vdsl2LineConfigurationExtensions2_SosTimeDownstream, UnsignedIntegerAttributeType, 0x8000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 1),
			2:  ByteField(Vdsl2LineConfigurationExtensions2_SosTimeUpstream, UnsignedIntegerAttributeType, 0x4000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 2),
			3:  ByteField(Vdsl2LineConfigurationExtensions2_SosDegradedTonesThresholdDownstream, UnsignedIntegerAttributeType, 0x2000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 3),
			4:  ByteField(Vdsl2LineConfigurationExtensions2_SosDegradedTonesThresholdUpstream, UnsignedIntegerAttributeType, 0x1000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 4),
			5:  Uint16Field(Vdsl2LineConfigurationExtensions2_SosCrcThresholdDownstream, UnsignedIntegerAttributeType, 0x0800, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 5),
			6:  Uint16Field(Vdsl2LineConfigurationExtensions2_SosCrcThresholdUpstream, UnsignedIntegerAttributeType, 0x0400, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 6),
			7:  ByteField(Vdsl2LineConfigurationExtensions2_MaxSosDownstream, UnsignedIntegerAttributeType, 0x0200, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 7),
			8:  ByteField(Vdsl2LineConfigurationExtensions2_MaxSosUpstream, UnsignedIntegerAttributeType, 0x0100, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 8),
			9:  Uint16Field(Vdsl2LineConfigurationExtensions2_SnrMaxOffsetDownstream, UnsignedIntegerAttributeType, 0x0080, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 9),
			10: Uint16Field(Vdsl2LineConfigurationExtensions2_SnrMaxOffsetUpstream, UnsignedIntegerAttributeType, 0x0040, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 10),
			11: ByteField(Vdsl2LineConfigurationExtensions2_RocMinimumImpulseNoiseProtectionDownstream, UnsignedIntegerAttributeType, 0x0020, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 11),
			12: ByteField(Vdsl2LineConfigurationExtensions2_RocMinimumImpulseNoiseProtectionUpstream, UnsignedIntegerAttributeType, 0x0010, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 12),
			13: TableField(Vdsl2LineConfigurationExtensions2_FextDownstreamTransmitterReferredVirtualNoiseTable, TableAttributeType, 0x0008, TableInfo{nil, 3}, mapset.NewSetWith(Read, Write), false, false, false, 13),
			14: TableField(Vdsl2LineConfigurationExtensions2_NextDownstreamTransmitterReferredVirtualNoiseTable, TableAttributeType, 0x0004, TableInfo{nil, 3}, mapset.NewSetWith(Read, Write), false, false, false, 14),
		},
		Access:  CreatedByOlt,
		Support: UnknownSupport,
	}
}

// NewVdsl2LineConfigurationExtensions2 (class ID 323) 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 NewVdsl2LineConfigurationExtensions2(params ...ParamData) (*ManagedEntity, OmciErrors) {
	return NewManagedEntity(*vdsl2lineconfigurationextensions2BME, params...)
}
