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

// Vdsl2LineInventoryAndStatusDataPart3ClassID is the 16-bit ID for the OMCI
// Managed entity VDSL2 line inventory and status data part 3
const Vdsl2LineInventoryAndStatusDataPart3ClassID = ClassID(170) // 0x00aa

var vdsl2lineinventoryandstatusdatapart3BME *ManagedEntityDefinition

// Vdsl2LineInventoryAndStatusDataPart3 (Class ID: #170 / 0x00aa)
//	This ME extends the other xDSL line inventory and status data MEs with attributes specific to
//	VDSL2. This ME contains per-band attributes for both directions. These same attributes are
//	defined in the xDSL line inventory and status data part 2 ME, but only for a single band. [ITUT
//	G.993.2] allows for VDSL2 to have as many as five bands upstream and as many as five bands
//	downstream.
//
//	Relationships
//		This is one of the status data MEs associated with an xDSL UNI. It is required only if VDSL2 is
//		supported by the PPTP. The ONU automatically creates or deletes an instance of this ME upon
//		creation or deletion of a PPTP xDSL UNI part 1 that supports these attributes.
//
//	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 PPTP xDSL UNI part 1 ME. (R) (mandatory) (2-bytes)
//
//		Upstream Bands Count
//			This attribute reports the number of upstream bands. It can be used to filter the upstream
//			attributes. All upstream attributes are arrays of per-band entries, of which the first upstream
//			bands count are populated. The contents of the arrays for unused frequency bands are
//			unspecified. The original attributes were allocated for as many as four upstream bands, US0, 1,
//			2, 3; optional extended attributes have been added to accommodate the possibility that five
//			upstream bands may be needed. (R) (mandatory) (1-byte)
//
//		Downstream Bands Count
//			This attribute reports the number of downstream bands. It can be used to filter the downstream
//			attributes. All downstream attributes are arrays of per-band entries, of which the first
//			downstream bands count are populated. The contents of the arrays for unused frequency bands are
//			unspecified. The original attributes were allocated for as many as three downstream bands, DS1,
//			2, 3; optional extended attributes have been added to accommodate the possibility that five
//			downstream bands may be needed. (R) (mandatory) (1-byte)
//
//		Downstream Line Attenuation Per Band
//			The LATNds attribute is defined per usable band. It is the squared magnitude of the channel
//			characteristics function, H(f), averaged over this band, and measured during loop diagnostic
//			mode and initialization. The exact definition is included in the relevant xDSL Recommendation.
//			The upstream line attenuation per band ranges from 0 (0.0-dB) to 1270 (+127.0-dB). The special
//			value 0xFFFF indicates that the line attenuation per band is out of the range to be represented.
//			(R) (mandatory) (3-bands * 2-bytes-=-6-bytes)
//
//		Upstream Line Attenuation Per Band
//			The LATNus attribute is defined per usable band. It is the squared magnitude of the channel
//			characteristics function H(f) averaged over this band, and measured during loop diagnostic mode
//			and initialization. The exact definition is included in the relevant xDSL Recommendation. The
//			upstream line attenuation per band ranges from 0 (0.0-dB) to 1270 (+127.0-dB). The special value
//			0xFFFF indicates that line attenuation per band is out of range to be represented. (R)
//			(mandatory) (4-bands * 2-bytes-=-8-bytes)
//
//		Downstream Signal Attenuation Per Band
//			The SATNds attribute is defined per usable band. It is the measured difference in the total
//			power transmitted in this band by the xTUC and the total power received by the xTUR during loop
//			diagnostic mode, initialization and showtime. The exact definition is included in the relevant
//			xDSL Recommendation. The downstream signal attenuation per band ranges from 0 (0.0-dB) to 1270
//			(+127.0-dB). The special value 0xFFFF indicates that the signal attenuation per band is out of
//			the range to be represented. (R) (mandatory) (3 bands * 2-bytes-=-6-bytes)
//
//			NOTE 1 - During showtime, only a subset of the subcarriers may be transmitted by the xTU-C, as
//			compared to loop diagnostic mode and initialization. Therefore, the downstream signal
//			attenuation value during showtime may be significantly lower than the downstream signal
//			attenuation value during loop diagnostic mode and initialization.
//
//		Upstream Signal Attenuation Per Band
//			The SATNus attribute is defined per usable band. It is the measured difference in decibels in
//			the total power transmitted in this band by the xTUR and the total power received in this band
//			by the xTUC during loop diagnostic mode, initialization and showtime. The exact definition is
//			included in the relevant xDSL Recommendation. The upstream signal attenuation per band ranges
//			from 0 (0.0-dB) to 1270 (+127.0-dB). The special value 0xFFFF indicates the signal attenuation
//			per band is out of range to be represented. (R) (mandatory) (4 bands * 2-bytes-= 8-bytes)
//
//			NOTE 2 - During showtime, only a subset of the subcarriers may be transmitted by the xTU-R, as
//			compared to loop diagnostic mode and initialization. Therefore, the upstream signal attenuation
//			value during showtime may be significantly lower than the upstream signal attenuation value
//			during loop diagnostic mode and initialization.
//
//		Downstream Snr Margin Per Band
//			The SNRMpbds attribute is defined per usable band. The downstream SNR margin per band is the
//			maximum increase of noise power received at the xTU-R, such that the BER requirements are met
//			for all downstream bearer channels. Each array value ranges from 0 (-64.0-dB) to 1270
//			(+63.0-dB). The special value 0xFFFF indicates that the attribute is out of range to be
//			represented. (R) (mandatory) (3 bands * 2-bytes-=-6-bytes)
//
//		Upstream Snr Margin Per Band
//			The SNRMpbus attribute is defined per usable band. The upstream SNR margin per band is the
//			maximum increase of noise power received at the xTU-C, such that the BER requirements are met
//			for all upstream bearer channels. Each array value ranges from 0 (-64.0-dB) to 1270 (+63.0-dB).
//			The special value 0xFFFF indicates that the attribute is out of range to be represented. (R)
//			(mandatory) (4 bands * 2-bytes-= 8-bytes)
//
//		Downstream Line Attenuation Extension
//			This attribute extends LATNds when more than three downstream bands are used. It is defined in
//			the same way as the downstream line attenuation per band attribute. (R) (optional) (2 bands *
//			2-bytes-= 4-bytes)
//
//		Upstream Line Attenuation Extension
//			This attribute extends LATNus when more than four upstream bands are used. It is defined in the
//			same way as the upstream line attenuation per band attribute. (R) (optional) (1 band *
//			2-bytes-=-2-bytes)
//
//		Downstream Signal Attenuation Extension
//			This attribute extends SATNds when more than three downstream bands are used. It is defined in
//			the same way as the downstream signal attenuation per band attribute. (R) (optional) (2 bands *
//			2-bytes-= 4-bytes)
//
//		Upstream Signal Attenuation Extension
//			This attribute extends SATNus when more than four upstream bands are used. It is defined in the
//			same way as the upstream signal attenuation per band attribute. (R) (optional) (1 band *
//			2-bytes-= 2-bytes)
//
//		Downstream Snr Margin Extension
//			This attribute extends SNRMpbds when more than three downstream bands are used. It is defined in
//			the same way as the downstream SNR margin per band attribute. (R) (optional) (2 bands *
//			2-bytes-= 4-bytes)
//
//		Upstream Snr Margin Extension
//			This attribute extends SNRMpbus when more than four upstream bands are used. It is defined in
//			the same way as the upstream SNR margin per band attribute. (R) (optional) (1-band * 2-bytes-=
//			2-bytes)
//
type Vdsl2LineInventoryAndStatusDataPart3 struct {
	ManagedEntityDefinition
	Attributes AttributeValueMap
}

// Attribute name constants

const Vdsl2LineInventoryAndStatusDataPart3_UpstreamBandsCount = "UpstreamBandsCount"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamBandsCount = "DownstreamBandsCount"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamLineAttenuationPerBand = "DownstreamLineAttenuationPerBand"
const Vdsl2LineInventoryAndStatusDataPart3_UpstreamLineAttenuationPerBand = "UpstreamLineAttenuationPerBand"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamSignalAttenuationPerBand = "DownstreamSignalAttenuationPerBand"
const Vdsl2LineInventoryAndStatusDataPart3_UpstreamSignalAttenuationPerBand = "UpstreamSignalAttenuationPerBand"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamSnrMarginPerBand = "DownstreamSnrMarginPerBand"
const Vdsl2LineInventoryAndStatusDataPart3_UpstreamSnrMarginPerBand = "UpstreamSnrMarginPerBand"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamLineAttenuationExtension = "DownstreamLineAttenuationExtension"
const Vdsl2LineInventoryAndStatusDataPart3_UpstreamLineAttenuationExtension = "UpstreamLineAttenuationExtension"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamSignalAttenuationExtension = "DownstreamSignalAttenuationExtension"
const Vdsl2LineInventoryAndStatusDataPart3_UpstreamSignalAttenuationExtension = "UpstreamSignalAttenuationExtension"
const Vdsl2LineInventoryAndStatusDataPart3_DownstreamSnrMarginExtension = "DownstreamSnrMarginExtension"
const Vdsl2LineInventoryAndStatusDataPart3_UpstreamSnrMarginExtension = "UpstreamSnrMarginExtension"

func init() {
	vdsl2lineinventoryandstatusdatapart3BME = &ManagedEntityDefinition{
		Name:    "Vdsl2LineInventoryAndStatusDataPart3",
		ClassID: Vdsl2LineInventoryAndStatusDataPart3ClassID,
		MessageTypes: mapset.NewSetWith(
			Get,
		),
		AllowedAttributeMask: 0xfffc,
		AttributeDefinitions: AttributeDefinitionMap{
			0:  Uint16Field(ManagedEntityID, PointerAttributeType, 0x0000, 0, mapset.NewSetWith(Read), false, false, false, 0),
			1:  ByteField(Vdsl2LineInventoryAndStatusDataPart3_UpstreamBandsCount, UnsignedIntegerAttributeType, 0x8000, 0, mapset.NewSetWith(Read), false, false, false, 1),
			2:  ByteField(Vdsl2LineInventoryAndStatusDataPart3_DownstreamBandsCount, UnsignedIntegerAttributeType, 0x4000, 0, mapset.NewSetWith(Read), false, false, false, 2),
			3:  MultiByteField(Vdsl2LineInventoryAndStatusDataPart3_DownstreamLineAttenuationPerBand, OctetsAttributeType, 0x2000, 3, toOctets("AAAA"), mapset.NewSetWith(Read), false, false, false, 3),
			4:  Uint32Field(Vdsl2LineInventoryAndStatusDataPart3_UpstreamLineAttenuationPerBand, UnsignedIntegerAttributeType, 0x1000, 0, mapset.NewSetWith(Read), false, false, false, 4),
			5:  MultiByteField(Vdsl2LineInventoryAndStatusDataPart3_DownstreamSignalAttenuationPerBand, OctetsAttributeType, 0x0800, 3, toOctets("AAAA"), mapset.NewSetWith(Read), false, false, false, 5),
			6:  Uint32Field(Vdsl2LineInventoryAndStatusDataPart3_UpstreamSignalAttenuationPerBand, UnsignedIntegerAttributeType, 0x0400, 0, mapset.NewSetWith(Read), false, false, false, 6),
			7:  MultiByteField(Vdsl2LineInventoryAndStatusDataPart3_DownstreamSnrMarginPerBand, OctetsAttributeType, 0x0200, 3, toOctets("AAAA"), mapset.NewSetWith(Read), false, false, false, 7),
			8:  Uint32Field(Vdsl2LineInventoryAndStatusDataPart3_UpstreamSnrMarginPerBand, UnsignedIntegerAttributeType, 0x0100, 0, mapset.NewSetWith(Read), false, false, false, 8),
			9:  Uint16Field(Vdsl2LineInventoryAndStatusDataPart3_DownstreamLineAttenuationExtension, UnsignedIntegerAttributeType, 0x0080, 0, mapset.NewSetWith(Read), false, true, false, 9),
			10: ByteField(Vdsl2LineInventoryAndStatusDataPart3_UpstreamLineAttenuationExtension, UnsignedIntegerAttributeType, 0x0040, 0, mapset.NewSetWith(Read), false, true, false, 10),
			11: Uint16Field(Vdsl2LineInventoryAndStatusDataPart3_DownstreamSignalAttenuationExtension, UnsignedIntegerAttributeType, 0x0020, 0, mapset.NewSetWith(Read), false, true, false, 11),
			12: ByteField(Vdsl2LineInventoryAndStatusDataPart3_UpstreamSignalAttenuationExtension, UnsignedIntegerAttributeType, 0x0010, 0, mapset.NewSetWith(Read), false, true, false, 12),
			13: Uint16Field(Vdsl2LineInventoryAndStatusDataPart3_DownstreamSnrMarginExtension, UnsignedIntegerAttributeType, 0x0008, 0, mapset.NewSetWith(Read), false, true, false, 13),
			14: ByteField(Vdsl2LineInventoryAndStatusDataPart3_UpstreamSnrMarginExtension, UnsignedIntegerAttributeType, 0x0004, 0, mapset.NewSetWith(Read), false, true, false, 14),
		},
		Access:  CreatedByOnu,
		Support: UnknownSupport,
	}
}

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