public static string GetHexStringFromBitArray(BitArray bitArray) { if (bitArray.Length != 8) { return(string.Empty); } var b = NRF24Helpers.GetByteFromBitArray(bitArray, 0); return(b.ToString("X2")); }
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); }
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); }
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); }