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

// OnuDynamicPowerManagementControlClassID is the 16-bit ID for the OMCI
// Managed entity ONU dynamic power management control
const OnuDynamicPowerManagementControlClassID = ClassID(336) // 0x0150

var onudynamicpowermanagementcontrolBME *ManagedEntityDefinition

// OnuDynamicPowerManagementControl (Class ID: #336 / 0x0150)
//	This ME models the ONU's ability to enter power conservation modes in cooperation with the OLT
//	in an ITU-T G.987 system. [ITUT G.987.3] originally specified two alternative modes, doze and
//	cyclic sleep. The subsequent revision of [ITUT G.987.3] simplified the specification providing a
//	single power conservation mode, watchful sleep.
//
//	An ONU that supports power conservation modes automatically creates an instance of this ME.
//
//	Relationships
//		One instance of this ME is associated with the ONU ME.
//
//	Attributes
//		Managed Entity Id
//			This attribute uniquely identifies each instance of this ME. There is only one instance, number
//			0. (R) (mandatory) (2-bytes)
//
//		Power Reduction Management Capability
//			This attribute declares the ONU's support for managed power conservation modes, as defined in
//			[ITUT G.987.3]. It is a bit map in which the bit value 0 indicates no support for the specified
//			mode, while the bit value 1 indicates that the ONU does support the specified mode. (R)
//			(mandatory) (1-byte)
//
//			Codepoints are assigned as follows:
//
//			Value	Meaning
//
//			0	No support for power reduction
//
//			1	Doze mode supported
//
//			2	Cyclic sleep mode supported
//
//			3	Both doze and cyclic sleep modes supported
//
//			4	Watchful sleep mode supported
//
//			5..255	Reserved
//
//		Power Reduction Management Mode
//			This attribute enables one or more of the ONU's managed power conservation modes. It is a bit
//			map in which the bit value 0 disables the mode, while the value 1 enables the mode. Bit
//			assignments are the same as those of the power reduction management capability attribute. The
//			default value of each bit is 0. (R,-W) (mandatory) (1-byte)
//
//		Itransinit
//			This attribute is the ONU vendor's statement of the complete transceiver initialization time:
//			the worst-case time required for the ONU to regain full functionality when leaving the asleep
//			state in cyclic sleep mode or low-power state in watchful sleep mode (i.e., turning on both the
//			receiver and the transmitter and acquiring synchronization to the downstream flow), measured in
//			units of 125-us frames. The value zero indicates that the sleeping ONU can respond to a
//			bandwidth grant without delay. (R) (mandatory) (2-bytes)
//
//		Itxinit
//			This attribute is the ONU vendor's statement of the transmitter initialization time: the time
//			required for the ONU to regain full functionality when leaving the listen state (i.e., turning
//			on the transmitter), measured in units of 125-us frames. The value zero indicates that the
//			dozing ONU can respond to a bandwidth grant without delay. If watchful sleep is enabled, the ONU
//			ignores this attribute. (R) (mandatory) (2 bytes)
//
//		Maximum Sleep Interval
//			The Isleep/Ilowpower attribute specifies the maximum time the ONU spends in its asleep, listen,
//			or low-power states, as a count of 125-us frames. Local or remote events may truncate the ONU's
//			sojourn in these states. The default value of this attribute is 0. (R,-W) (mandatory) (4-bytes)
//
//		Maximum Receiver_Off Interval
//			Maximum receiver-off interval: The Irxoff attribute specifies the maximum time the OLT can
//			afford to wait from the moment it decides to wake up an ONU in the low-power state of the
//			watchful sleep mode until the ONU is fully operational, specified as a count of 125-us frames.
//			(R,-W) (mandatory) (4-bytes)
//
//		Minimum Aware Interval
//			The Iaware attribute specifies the time the ONU spends in its aware state, as a count of 125-us
//			frames, before it re-enters asleep or listen states. Local or remote events may independently
//			cause the ONU to enter an active state rather than returning to a sleep state. The default value
//			of this attribute is 0. (R,-W) (mandatory) (4-bytes)
//
//		Minimum Active Held Interval
//			The Ihold attribute specifies the minimum time during which the ONU remains in the active held
//			state, as a count of 125-us frames. Its initial value is zero. (R, W) (mandatory) (2-bytes)
//
//		Maximum Sleep Interval Extension
//			Maximum sleep interval for doze mode specifies the maximum time the ONU spends in its listen
//			state, as a count of 125-us frames. Local or remote events may truncate the ONU's sojourn in
//			these states. The default value is 0.
//
//			Maximum sleep interval for cyclic sleep mode specifies the maximum time the ONU spends in its
//			asleep state, as a count of 125-us frames. Local or remote events may truncate the ONU's sojourn
//			in these states. The default value is 0. If watchful sleep is enabled, the ONU ignores this
//			attribute.
//
//			(R,-W) (optional) (8-bytes)
//
//			This attribute designates maximum sleep interval values for doze mode and cyclic sleep mode
//			separately. When it supports this attribute, the ONU ignores the value of the maximum sleep
//			interval attribute.
//
//			Maximum sleep interval for doze mode	4-bytes
//
//			Maximum sleep interval for cyclic sleep mode	4-bytes
//
//		Ethernet Passive Optical Network Epon Capability Extension
//			Ethernet passive optical network (EPON) capability extension: This attribute declares EPON-
//			specific capabilities for the dynamic power management control.
//
//			Bits are assigned as follows.
//
//		Epon Setup Extension
//			The bits are assigned as follows.
//
//			This attribute specifies EPON specific configurations for the dynamic power management control.
//
//		Missing Consecutive Bursts Threshold
//			The Clobi attribute specifies the maximum number of missing consecutive scheduled bursts from
//			the ONU that the OLT is willing to tolerate without raising an alarm. The value of this
//			attribute defaults to 4. (R,-W) (mandatory) (4-bytes)
//
type OnuDynamicPowerManagementControl struct {
	ManagedEntityDefinition
	Attributes AttributeValueMap
}

// Attribute name constants

const OnuDynamicPowerManagementControl_PowerReductionManagementCapability = "PowerReductionManagementCapability"
const OnuDynamicPowerManagementControl_PowerReductionManagementMode = "PowerReductionManagementMode"
const OnuDynamicPowerManagementControl_Itransinit = "Itransinit"
const OnuDynamicPowerManagementControl_Itxinit = "Itxinit"
const OnuDynamicPowerManagementControl_MaximumSleepInterval = "MaximumSleepInterval"
const OnuDynamicPowerManagementControl_MaximumReceiverOffInterval = "MaximumReceiverOffInterval"
const OnuDynamicPowerManagementControl_MinimumAwareInterval = "MinimumAwareInterval"
const OnuDynamicPowerManagementControl_MinimumActiveHeldInterval = "MinimumActiveHeldInterval"
const OnuDynamicPowerManagementControl_MaximumSleepIntervalExtension = "MaximumSleepIntervalExtension"
const OnuDynamicPowerManagementControl_EthernetPassiveOpticalNetworkEponCapabilityExtension = "EthernetPassiveOpticalNetworkEponCapabilityExtension"
const OnuDynamicPowerManagementControl_EponSetupExtension = "EponSetupExtension"
const OnuDynamicPowerManagementControl_MissingConsecutiveBurstsThreshold = "MissingConsecutiveBurstsThreshold"

func init() {
	onudynamicpowermanagementcontrolBME = &ManagedEntityDefinition{
		Name:    "OnuDynamicPowerManagementControl",
		ClassID: OnuDynamicPowerManagementControlClassID,
		MessageTypes: mapset.NewSetWith(
			Get,
			Set,
		),
		AllowedAttributeMask: 0xfff0,
		AttributeDefinitions: AttributeDefinitionMap{
			0:  Uint16Field(ManagedEntityID, PointerAttributeType, 0x0000, 0, mapset.NewSetWith(Read), false, false, false, 0),
			1:  ByteField(OnuDynamicPowerManagementControl_PowerReductionManagementCapability, UnsignedIntegerAttributeType, 0x8000, 0, mapset.NewSetWith(Read), false, false, false, 1),
			2:  ByteField(OnuDynamicPowerManagementControl_PowerReductionManagementMode, UnsignedIntegerAttributeType, 0x4000, 0, mapset.NewSetWith(Read, Write), false, false, false, 2),
			3:  Uint16Field(OnuDynamicPowerManagementControl_Itransinit, UnsignedIntegerAttributeType, 0x2000, 0, mapset.NewSetWith(Read), false, false, false, 3),
			4:  Uint16Field(OnuDynamicPowerManagementControl_Itxinit, UnsignedIntegerAttributeType, 0x1000, 0, mapset.NewSetWith(Read), false, false, false, 4),
			5:  Uint32Field(OnuDynamicPowerManagementControl_MaximumSleepInterval, UnsignedIntegerAttributeType, 0x0800, 0, mapset.NewSetWith(Read, Write), false, false, false, 5),
			6:  Uint32Field(OnuDynamicPowerManagementControl_MaximumReceiverOffInterval, UnsignedIntegerAttributeType, 0x0400, 0, mapset.NewSetWith(Read, Write), false, false, false, 6),
			7:  Uint32Field(OnuDynamicPowerManagementControl_MinimumAwareInterval, UnsignedIntegerAttributeType, 0x0200, 0, mapset.NewSetWith(Read, Write), false, false, false, 7),
			8:  Uint16Field(OnuDynamicPowerManagementControl_MinimumActiveHeldInterval, UnsignedIntegerAttributeType, 0x0100, 0, mapset.NewSetWith(Read, Write), false, false, false, 8),
			9:  Uint64Field(OnuDynamicPowerManagementControl_MaximumSleepIntervalExtension, UnsignedIntegerAttributeType, 0x0080, 0, mapset.NewSetWith(Read, Write), false, true, false, 9),
			10: ByteField(OnuDynamicPowerManagementControl_EthernetPassiveOpticalNetworkEponCapabilityExtension, UnsignedIntegerAttributeType, 0x0040, 0, mapset.NewSetWith(Read), false, true, false, 10),
			11: ByteField(OnuDynamicPowerManagementControl_EponSetupExtension, UnsignedIntegerAttributeType, 0x0020, 0, mapset.NewSetWith(Read, Write), false, true, false, 11),
			12: Uint32Field(OnuDynamicPowerManagementControl_MissingConsecutiveBurstsThreshold, UnsignedIntegerAttributeType, 0x0010, 0, mapset.NewSetWith(Read, Write), false, false, false, 12),
		},
		Access:  CreatedByOnu,
		Support: UnknownSupport,
	}
}

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