Enums and Masks – RegDIOMapping1 & RegDIOMapping2
The RFM69CW/RFM69HCW module (based on the Semtech SX1231/SX1231H) has configurable digital outputs (RegDIOMapping1 & RegDIOMapping2) . Which I use to trigger interrupts on my Windows 10 IoT Core or Arduino devices. Currently (Sep 2019) the library only supports the mapping of the digital outputs D0 & D1 when the RFM69 is in Packet Mode.

I added some additional constants and enumerations for the other settings configured in RegDioMapping1 & RegDioMapping2.
// RegDioMapping1 & RegDioMapping2 Packet Mode Table 22 pg48 // DIO 0 Bits 7&6 of RegDioMapping1 [Flags] public enum Dio0Mapping { // Sleep // Standby // Frequency Synthesis // Reserved 00-10 FrequencySynthesisPllLock = 0b11000000, ReceiveCrcOk = 0b00000000, ReceivePayloadReady = 0b01000000, ReceiveSyncAddress = 0b10000000, ReceiveRssi = 0b11000000, TransmitPacketSent = 0b00000000, TransmitTxReady = 0b01000000, // Reserved 10 PllLock = 0b11000000 } const Dio0Mapping Dio0MappingDefault = 0x00; // DIO 1 Bits 5&4 of RegDioMapping1 public enum Dio1Mapping { SleepFifoLevel = 0b00000000, SleepFifoFull = 0b00010000, SleepFifoNotEmpty = 0b00100000, // Reserved 11 StandByFifoLevel = 0b00000000, StandByFifoFull = 0b00010000, StandByFifoNotEmpty = 0b00100000, FrequencySynthesisFifoLevel = 0b00000000, FrequencySynthesisFifoFull = 0b00010000, FrequencySynthesisFifoNotEmpty = 0b00100000, FrequencySynthesisPllLock = 0b00110000, ReceiveFifoLevel = 0b00000000, ReceiveFifoFull = 0b00010000, ReceiveFifoNotEmpty = 0b00100000, ReceiveTimeout = 0b00110000, TransmitFifoLevel = 0b00000000, TransmitFifoFull = 0b00010000, TransmitFifoNotEmpty = 0b00100000, TransmitPllLock = 0b00110000, } const Dio1Mapping Dio1MappingDefault = 0x00; // DIO 2 Bits 3&2 of RegDioMapping1 public enum Dio2Mapping { } const Dio2Mapping Dio2MappingDefault = 0x00; // DIO 2 Bits 1&0 of RegDioMapping1 public enum Dio3Mapping { } const Dio3Mapping Dio3MappingDefault = 0x00; // DIO 2 Bits 7&6 of RegDioMapping2 public enum Dio4Mapping { } const Dio4Mapping Dio4MappingDefault = 0x00; // DIO 2 Bits 5&4 of RegDioMapping2 public enum Dio5Mapping { } const Dio5Mapping Dio5MappingDefault = 0x00; // RegDioMapping2 Bits 2-0 public enum ClockOutDioMapping : byte { FXOsc = 0b00000000, FXOscDiv2 = 0b00000001, FXOscDiv4 = 0b00000010, FXOscDiv8 = 0b00000011, FXOscDiv16 = 0b00000100, FXOscDiv32 = 0b00000101, RC = 0b00000110, Off = 0b00000111, } public const ClockOutDioMapping ClockOutDioMappingDefault = ClockOutDioMapping.Off;
I also added some code to the initialise method to set the RegDioMapping1 & RegDioMapping1 only if the values were not the defaults.
public void Initialise(RegOpModeMode modeAfterInitialise, bool sequencer = RegOpModeSequencerDefault, bool listen = RegOpModeListenDefault, BitRate bitRate = BitRateDefault, ushort frequencyDeviation = frequencyDeviationDefault, double frequency = FrequencyDefault, AfcLowBeta afcLowBeta = AfcLowBetaDefault, ListenModeIdleResolution listenModeIdleResolution = ListenModeIdleResolutionDefault, ListenModeRXTime listenModeRXTime = ListenModeRXTimeDefault, ListenModeCriteria listenModeCrieria = ListenModeCriteriaDefault, ListenModeEnd listenModeEnd = ListenModeEndDefault, byte listenCoefficientIdle = ListenCoefficientIdleDefault, byte listenCoefficientReceive = ListenCoefficientReceiveDefault, bool pa0On = pa0OnDefault, bool pa1On = pa1OnDefaut, bool pa2On = pa2OnDefault, byte outputpower = OutputpowerDefault, PaRamp paRamp = PaRampDefault, bool ocpOn = OcpOnDefault, byte ocpTrim = OcpTrimDefault, LnaZin lnaZin = LnaZinDefault, LnaCurrentGain lnaCurrentGain = LnaCurrentGainDefault, LnaGainSelect lnaGainSelect = LnaGainSelectDefault, byte dccFrequency = DccFrequencyDefault, RxBwMant rxBwMant = RxBwMantDefault, byte RxBwExp = RxBwExpDefault, byte dccFreqAfc = DccFreqAfcDefault, byte rxBwMantAfc = RxBwMantAfcDefault, byte bxBwExpAfc = RxBwExpAfcDefault, Dio0Mapping dio0Mapping = Dio0MappingDefault, Dio1Mapping dio1Mapping = Dio1MappingDefault, Dio2Mapping dio2Mapping = Dio2MappingDefault, Dio3Mapping dio3Mapping = Dio3MappingDefault, Dio4Mapping dio4Mapping = Dio4MappingDefault, Dio5Mapping dio5Mapping = Dio5MappingDefault, ClockOutDioMapping clockOutDioMapping = ClockOutDioMappingDefault, ushort preambleSize = PreambleSizeDefault, RegSyncConfigFifoFileCondition? syncFifoFileCondition = null, byte? syncTolerance = null, byte[] syncValues = null, RegPacketConfig1PacketFormat packetFormat = RegPacketConfig1PacketFormat.FixedLength, RegPacketConfig1DcFree packetDcFree = RegPacketConfig1DcFreeDefault, bool packetCrc = PacketCrcOnDefault, bool packetCrcAutoClear = PacketCrcAutoClearDefault, byte payloadLength = PayloadLengthDefault, byte? addressNode = null, byte? addressbroadcast = null, TxStartCondition txStartCondition = TxStartConditionDefault, byte fifoThreshold = FifoThresholdDefault, byte interPacketRxDelay = InterPacketRxDelayDefault, bool autoRestartRx = AutoRestartRxDefault, byte[] aesKey = null ) ... // RegDioMapping1 if ((dio0Mapping != Dio0MappingDefault) || (dio1Mapping != Dio1MappingDefault) || (dio2Mapping != Dio2MappingDefault) || (dio3Mapping != Dio3MappingDefault)) { byte regDioMapping1Value = (byte)dio0Mapping; regDioMapping1Value |= (byte)dio1Mapping; regDioMapping1Value |= (byte)dio2Mapping; regDioMapping1Value |= (byte)dio3Mapping; RegisterManager.WriteByte((byte)Registers.RegDioMapping1, regDioMapping1Value); } // RegDioMapping2 if ((dio4Mapping != Dio4MappingDefault) || (dio5Mapping != Dio5MappingDefault) || (clockOutDioMapping != ClockOutDioMappingDefault )) { byte regDioMapping2Value = (byte)dio4Mapping; regDioMapping2Value |= (byte)dio5Mapping; regDioMapping2Value |= (byte)clockOutDioMapping; RegisterManager.WriteByte((byte)Registers.RegDioMapping2, regDioMapping2Value); }
I had several failed attempts at defining suitable enumerations for configuring the RegDioMapping1 & RegDioMapping2 registers. I initially started with an enumeration for each Mode (Sleep, StandBy etc.) but the implementation was quite complex. The initial version only supports DIO0 & DIO1 as most of the shields I have, only DIO0 adn/or DIO1 are connected.