Exemple #1
0
        public static string GetHexStringFromBitArray(BitArray bitArray)
        {
            if (bitArray.Length != 8)
            {
                return(string.Empty);
            }

            var b = NRF24Helpers.GetByteFromBitArray(bitArray, 0);

            return(b.ToString("X2"));
        }
Exemple #2
0
        public static byte[] GetBytesFromBitArray(BitArray bitArray)
        {
            if (bitArray.Length % 8 != 0)
            {
                return(new byte[0]);
            }

            var count = bitArray.Length / 8;
            var bytes = new byte[count];

            for (var i = 0; i < count; i++)
            {
                bytes[i] = NRF24Helpers.GetByteFromBitArray(bitArray, i * 8);
            }

            return(bytes);
        }
Exemple #3
0
        public static ushort GetCrc16(BitArray bitArray)
        {
            ushort crc = 0xFFFF;

            ushort data;
            byte   workingByte;
            int    shift;
            ushort bitoffs = 0;

            workingByte = NRF24Helpers.GetByteFromBitArray(bitArray, bitoffs >> 3);
            while (bitoffs < bitArray.Length)
            {
                shift = bitoffs & 7;
                // Shift the active bit to the position of bit 15
                data = (ushort)(workingByte << (8 + shift));
                // Assure all other bits are 0
                data &= 0x8000;
                crc  ^= data;

                if ((crc & 0x8000) > 0)
                //if ((crc & 0x8000) != 0)
                //if ((crc & 0x8000) == 0)
                {
                    crc = (ushort)((crc << 1) ^ 0x8408);  // 0x1021 = (1) 0001 0000 0010 0001 = x^16+x^12+x^5+1
                }
                else
                {
                    crc = (ushort)(crc << 1);
                    //crc <<= 1;
                }
                ++bitoffs;
                if (0 == (bitoffs & 7))
                {
                    // Get a new byte for the next 8 bits.
                    workingByte = NRF24Helpers.GetByteFromBitArray(bitArray, bitoffs >> 3);
                }
            }

            return(crc);
        }
Exemple #4
0
        private NRF24Mysensor CreateNRF24Mysensor(NRF24Data nrf24Data)
        {
            // Check if the bitArray contains enough information to be processed
            if (nrf24Data.PayloadBitArray.Length < 57)
            {
                return(null);
            }

            // We should start at 1 as the string is not byte aligned
            var bitOffset = 1;

            // Set the MySensors data part
            var nrf24Mysensor = new NRF24Mysensor();

            nrf24Mysensor.Last = NRF24Helpers.GetByteFromBitArray(nrf24Data.PayloadBitArray, bitOffset);
            bitOffset         += 8;

            nrf24Mysensor.Sender = NRF24Helpers.GetByteFromBitArray(nrf24Data.PayloadBitArray, bitOffset);
            bitOffset           += 8;

            nrf24Mysensor.Destination = NRF24Helpers.GetByteFromBitArray(nrf24Data.PayloadBitArray,
                                                                         bitOffset);
            bitOffset += 8;

            nrf24Mysensor.Length = NRF24Helpers.GetPartOfBitArray(nrf24Data.PayloadBitArray, bitOffset, 5);
            bitOffset           += 5;

            nrf24Mysensor.Version = NRF24Helpers.GetPartOfBitArray(nrf24Data.PayloadBitArray, bitOffset, 3);
            bitOffset            += 3;

            nrf24Mysensor.DataType = NRF24Helpers.GetPartOfBitArray(nrf24Data.PayloadBitArray, bitOffset, 3);
            bitOffset += 3;

            nrf24Mysensor.IsAck = nrf24Data.PayloadBitArray[bitOffset];
            bitOffset++;

            nrf24Mysensor.ReqAck = nrf24Data.PayloadBitArray[bitOffset];
            bitOffset++;

            nrf24Mysensor.CommandType = NRF24Helpers.GetPartOfBitArray(nrf24Data.PayloadBitArray, bitOffset, 3);
            bitOffset += 3;

            nrf24Mysensor.Type = NRF24Helpers.GetByteFromBitArray(nrf24Data.PayloadBitArray, bitOffset);
            bitOffset         += 8;

            nrf24Mysensor.Sensor = NRF24Helpers.GetByteFromBitArray(nrf24Data.PayloadBitArray, bitOffset);
            bitOffset           += 8;

            nrf24Mysensor.PayloadBitArray = NRF24Helpers.GetPartOfBitArray(
                nrf24Data.PayloadBitArray,
                bitOffset,
                nrf24Data.PayloadBitArray.Length - bitOffset);

            // Find, is enabled, the VeraDevices corresponding to the package
            if (_generalSettings.LookupMysensorsNodeViaVera)
            {
                // Check if it is the gateway that sends the message
                if (nrf24Mysensor.Sender == 0)
                {
                    nrf24Mysensor.SenderVeraDevice = _veraSettings.VeraDevices
                                                     .SingleOrDefault(a_item => a_item.IsGateway);
                }
                else
                {
                    nrf24Mysensor.SenderVeraDevice = _veraSettings.VeraDevices
                                                     .SingleOrDefault(
                        a_item => a_item.VeraDeviceAltID != null &&
                        a_item.VeraDeviceAltID.NodeID == nrf24Mysensor.Sender &&
                        a_item.VeraDeviceAltID.ChildID == 255);
                }

                // Check if it is the gateway that receives the message
                if (nrf24Mysensor.Destination == 0)
                {
                    nrf24Mysensor.DestinationVeraDevice = _veraSettings.VeraDevices
                                                          .SingleOrDefault(a_item => a_item.IsGateway);
                }
                else
                {
                    nrf24Mysensor.DestinationVeraDevice = _veraSettings.VeraDevices
                                                          .Where(a_item => a_item.VeraDeviceAltID != null)
                                                          .SingleOrDefault(a_item =>
                                                                           a_item.VeraDeviceAltID.NodeID == nrf24Mysensor.Destination &&
                                                                           a_item.VeraDeviceAltID.ChildID == 255);
                }

                nrf24Mysensor.SensorVeraDevice = _veraSettings.VeraDevices
                                                 .Where(a_item => a_item.VeraDeviceAltID != null)
                                                 .SingleOrDefault(
                    a_item => a_item.VeraDeviceAltID.NodeID == nrf24Mysensor.Sender &&
                    a_item.VeraDeviceAltID.ChildID == nrf24Mysensor.Sensor);
            }

            return(nrf24Mysensor);
        }