public void Begin()
        {
            RegisterManager registers = Configuration.Registers;

            ChipEnable(false);

            // Set 1500uS (minimum for 32B payload in ESB@250KBPS) timeouts, to make testing a little easier
            // WARNING: If this is ever lowered, either 250KBS mode with AA is broken or maximum packet
            // sizes must never be used. See documentation for a more complete explanation.
            Configuration.AutoRetransmitDelay = AutoRetransmitDelays.Delay4000uS;
            Configuration.AutoRetransmitCount = 15;

            // Disable auto acknowledgement
            EnableAutoAcknowledgementRegister autoAckRegister = registers.EnableAutoAcknowledgementRegister;

            autoAckRegister.EN_AA = false;
            autoAckRegister.Save();

            // Attempt to set DataRate to 250Kbps to determine if this is a plus model
            Configuration.DataRate    = DataRates.DataRate250Kbps;
            Configuration.IsPlusModel = Configuration.DataRate == DataRates.DataRate250Kbps;

            // Restore our default PA level
            Configuration.PowerLevel = PowerLevels.Max;

            // Initialize CRC and request 2-byte (16bit) CRC
            Configuration.CrcEncodingScheme = CrcEncodingSchemes.DualBytes;
            Configuration.CrcEnabled        = true;

            // Disable dynamic payload lengths
            Configuration.DynamicPayloadLengthEnabled = false;

            // Set up default configuration.  Callers can always change it later.
            // This channel should be universally safe and not bleed over into adjacent spectrum.
            Configuration.Channel = 76;

            // Then set the data rate to the slowest (and most reliable) speed supported by all hardware.
            Configuration.DataRate = DataRates.DataRate1Mbps;

            // Reset current status
            // Notice reset and flush is the last thing we do
            StatusRegister statusRegister = registers.StatusRegister;

            statusRegister.RX_DR  = false;
            statusRegister.TX_DS  = false;
            statusRegister.MAX_RT = false;
            statusRegister.Save();

            TransmitPipe.FlushBuffer();
            ReceivePipes.FlushBuffer();
        }
 public RegisterManager(Radio radio)
 {
     ConfigurationRegister = new ConfigurationRegister(radio);
     EnableAutoAcknowledgementRegister = new EnableAutoAcknowledgementRegister(radio);
     EnableReceiveAddressRegister = new EnableReceiveAddressRegister(radio);
     AddressWidthRegister = new SetupAddressWidthRegister(radio);
     SetupRetransmissionRegister = new SetupRetransmissionRegister(radio);
     RfChannelRegister = new RfChannelRegister(radio);
     RfSetupRegister = new RfSetupRegister(radio);
     StatusRegister = new StatusRegister(radio);
     ObserveTransmitRegister = new ObserveTransmitRegister(radio);
     ReceivedPowerDetectorRegister = new ReceivedPowerDetectorRegister(radio);
     TransmitAddressRegister = new AddressPipeRegister(radio, Addresses.TX_ADDR, 0);
     FifoStatusRegister = new FifoStatusRegister(radio);
     DynamicPayloadLengthRegister = new DynamicPayloadLengthRegister(radio);
     FeatureRegister = new FeatureRegister(radio);
     ReceiveAddressPipeRegisters = new RegisterCollection<AddressPipeRegister>
     {
         {0, new AddressPipeRegister(radio, Addresses.RX_ADDR_P0, 0)},
         {1, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 1)},
         {2, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 2)},
         {3, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 3)},
         {4, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 4)},
         {5, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 5)},
     };
     ReceivePayloadWidthPipeRegisters = new RegisterCollection<ReceivePayloadWidthPipeRegister>
     {
         {0, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P0, 0)},
         {1, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P1, 1)},
         {2, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P2, 2)},
         {3, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P3, 3)},
         {4, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P4, 4)},
         {5, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P5, 5)}
     };
     AllRegisters = new RegisterCollection<RegisterBase>
     {
         {Addresses.CONFIG, ConfigurationRegister},
         {Addresses.EN_AA, EnableAutoAcknowledgementRegister},
         {Addresses.EN_RXADDR, EnableReceiveAddressRegister},
         {Addresses.SETUP_AW, AddressWidthRegister},
         {Addresses.SETUP_RETR, SetupRetransmissionRegister},
         {Addresses.RF_CH, RfChannelRegister},
         {Addresses.RF_SETUP, RfSetupRegister},
         {Addresses.STATUS, StatusRegister},
         {Addresses.OBSERVE_TX, ObserveTransmitRegister},
         {Addresses.RPD, ReceivedPowerDetectorRegister},
         {Addresses.RX_ADDR_P0, ReceiveAddressPipeRegisters[0]},
         {Addresses.RX_ADDR_P1, ReceiveAddressPipeRegisters[1]},
         {Addresses.RX_ADDR_P2, ReceiveAddressPipeRegisters[2]},
         {Addresses.RX_ADDR_P3, ReceiveAddressPipeRegisters[3]},
         {Addresses.RX_ADDR_P4, ReceiveAddressPipeRegisters[4]},
         {Addresses.RX_ADDR_P5, ReceiveAddressPipeRegisters[5]},
         {Addresses.TX_ADDR, TransmitAddressRegister},
         {Addresses.RX_PW_P0, ReceivePayloadWidthPipeRegisters[0]},
         {Addresses.RX_PW_P1, ReceivePayloadWidthPipeRegisters[1]},
         {Addresses.RX_PW_P2, ReceivePayloadWidthPipeRegisters[2]},
         {Addresses.RX_PW_P3, ReceivePayloadWidthPipeRegisters[3]},
         {Addresses.RX_PW_P4, ReceivePayloadWidthPipeRegisters[4]},
         {Addresses.RX_PW_P5, ReceivePayloadWidthPipeRegisters[5]},
         {Addresses.FIFO_STATUS, FifoStatusRegister},
         {Addresses.DYNPD, DynamicPayloadLengthRegister},
         {Addresses.FEATURE, FeatureRegister}
     };
 }
 public RegisterManager(Radio radio)
 {
     ConfigurationRegister             = new ConfigurationRegister(radio);
     EnableAutoAcknowledgementRegister = new EnableAutoAcknowledgementRegister(radio);
     EnableReceiveAddressRegister      = new EnableReceiveAddressRegister(radio);
     AddressWidthRegister        = new SetupAddressWidthRegister(radio);
     SetupRetransmissionRegister = new SetupRetransmissionRegister(radio);
     RfChannelRegister           = new RfChannelRegister(radio);
     RfSetupRegister             = new RfSetupRegister(radio);
     StatusRegister                = new StatusRegister(radio);
     ObserveTransmitRegister       = new ObserveTransmitRegister(radio);
     ReceivedPowerDetectorRegister = new ReceivedPowerDetectorRegister(radio);
     TransmitAddressRegister       = new AddressPipeRegister(radio, Addresses.TX_ADDR, 0);
     FifoStatusRegister            = new FifoStatusRegister(radio);
     DynamicPayloadLengthRegister  = new DynamicPayloadLengthRegister(radio);
     FeatureRegister               = new FeatureRegister(radio);
     ReceiveAddressPipeRegisters   = new RegisterCollection <AddressPipeRegister>
     {
         { 0, new AddressPipeRegister(radio, Addresses.RX_ADDR_P0, 0) },
         { 1, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 1) },
         { 2, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 2) },
         { 3, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 3) },
         { 4, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 4) },
         { 5, new AddressPipeRegister(radio, Addresses.RX_ADDR_P1, 5) },
     };
     ReceivePayloadWidthPipeRegisters = new RegisterCollection <ReceivePayloadWidthPipeRegister>
     {
         { 0, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P0, 0) },
         { 1, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P1, 1) },
         { 2, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P2, 2) },
         { 3, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P3, 3) },
         { 4, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P4, 4) },
         { 5, new ReceivePayloadWidthPipeRegister(radio, Addresses.RX_PW_P5, 5) }
     };
     AllRegisters = new RegisterCollection <RegisterBase>
     {
         { Addresses.CONFIG, ConfigurationRegister },
         { Addresses.EN_AA, EnableAutoAcknowledgementRegister },
         { Addresses.EN_RXADDR, EnableReceiveAddressRegister },
         { Addresses.SETUP_AW, AddressWidthRegister },
         { Addresses.SETUP_RETR, SetupRetransmissionRegister },
         { Addresses.RF_CH, RfChannelRegister },
         { Addresses.RF_SETUP, RfSetupRegister },
         { Addresses.STATUS, StatusRegister },
         { Addresses.OBSERVE_TX, ObserveTransmitRegister },
         { Addresses.RPD, ReceivedPowerDetectorRegister },
         { Addresses.RX_ADDR_P0, ReceiveAddressPipeRegisters[0] },
         { Addresses.RX_ADDR_P1, ReceiveAddressPipeRegisters[1] },
         { Addresses.RX_ADDR_P2, ReceiveAddressPipeRegisters[2] },
         { Addresses.RX_ADDR_P3, ReceiveAddressPipeRegisters[3] },
         { Addresses.RX_ADDR_P4, ReceiveAddressPipeRegisters[4] },
         { Addresses.RX_ADDR_P5, ReceiveAddressPipeRegisters[5] },
         { Addresses.TX_ADDR, TransmitAddressRegister },
         { Addresses.RX_PW_P0, ReceivePayloadWidthPipeRegisters[0] },
         { Addresses.RX_PW_P1, ReceivePayloadWidthPipeRegisters[1] },
         { Addresses.RX_PW_P2, ReceivePayloadWidthPipeRegisters[2] },
         { Addresses.RX_PW_P3, ReceivePayloadWidthPipeRegisters[3] },
         { Addresses.RX_PW_P4, ReceivePayloadWidthPipeRegisters[4] },
         { Addresses.RX_PW_P5, ReceivePayloadWidthPipeRegisters[5] },
         { Addresses.FIFO_STATUS, FifoStatusRegister },
         { Addresses.DYNPD, DynamicPayloadLengthRegister },
         { Addresses.FEATURE, FeatureRegister }
     };
 }