====== Atomic Parameters ====== This tutorial describes the current procedure for adding a parameter to an Atom. This is used when an Atom needs to use its bits for some kind of information. ===== Declare Compilation Constants ===== First, we need to describe in the Element how big of a field we want to use, and where to place it inside the atom. We need to use the bits on the right hand part of the atom first, since a number of ones on the left hand side are already used. For instance, let's declare a small field which can hold a byte: enum { BITS = P::BITS_PER_ATOM, BYTE_BITS_LENGTH = 8, BYTE_BITS_POSITION = BITS - BYTE_BITS_LENGTH - 1 }; These constants are then used to describe a BitField, like so: typedef BitField, BYTE_BITS_LENGTH, BYTE_BITS_POSITION> AFByteBits; make sure that BitField is included in the file by adding: #include "BitField.h" to the top of the file. ===== Make Getter and Setter ===== We now need methods which access these bits. In the public section of your elemenet, place: u32 GetByteBits(const T& us) const { return AFByteBits::Read(this->GetBits(us)); } void SetByteBits(T& us, u32 bits) const { AFByteBits::Write(this->GetBits(us), bits & 0xff); } Now we are able to Get and Set these bits. ===== Set Default Value ===== We should also set some sort of default value for these bits. This is done by overriding the **GetDefaultAtom()** method. Place in the public section of your element: static const u32 TYPE() { return THE_INSTANCE.GetType(); } virtual const T& GetDefaultAtom() const { static T defaultAtom(TYPE(), 0, 0, 0); this->SetByteBits(defaultAtom, 0 /* Or other default value */); return defaultAtom; } In this example, the default atom has its bitfield set to 0. We can use this call during the behavior method as well to read or write bits of other atoms.