private NRF24Data CreateNRF24Data(NRF24Structure nrf24Structure) { if (nrf24Structure.NRF24Header == null || nrf24Structure.Data.Length < 5) { return(null); } // Set the NRF24 data part var nrf24Data = new NRF24Data { NodeAddress = $"{nrf24Structure.NRF24Header.Address}{nrf24Structure.Data.Substring(0, 2)}" }; var controlFieldString = nrf24Structure.Data.Substring(2, 4); var controlFieldBitArray = NRF24Helpers.GetBitArrayFromHexString(controlFieldString); nrf24Data.PayloadLength = NRF24Helpers.GetPartOfBitArray(controlFieldBitArray, 0, 6); nrf24Data.Pid = NRF24Helpers.GetPartOfBitArray(controlFieldBitArray, 6, 2); nrf24Data.NoAck = controlFieldBitArray[9]; nrf24Data.Payload = nrf24Structure.Data.Substring(4, nrf24Structure.Data.Length - 4); var payloadFieldBitArray = NRF24Helpers.GetBitArrayFromHexString(nrf24Data.Payload); // For last byte only the MSbit has value; rest will be cleared payloadFieldBitArray = NRF24Helpers.GetPartOfBitArray(payloadFieldBitArray, 0, payloadFieldBitArray.Length - 7); // Get the packet crc (the crc is located in last two bytes of the packet) var crcOffset = payloadFieldBitArray.Length - 16; nrf24Data.PacketCrc = NRF24Helpers.GetPartOfBitArray(payloadFieldBitArray, crcOffset, 16); // Remove the crc bits from the bitarray before it is processed further nrf24Data.PayloadBitArray = NRF24Helpers.GetPartOfBitArray(payloadFieldBitArray, 0, payloadFieldBitArray.Length - 16); //TODO what about the string payload?? // **** // Calculate the crc ourselfs // Get the payload in bits, as the bitArray is already stripped of all unneeded stuff, the length is the amount of bits //var payloadLengthBits = payloadFieldBitArray.Length; //var packetLengthBits = 40 + 9 + payloadLengthBits; // As the crc is calculated over the address, packet control field and payload, attach the two fields //var combinedString = $"{this.NRF24Header.Address}{this.Data}"; //var combinedString = $"{this.Data}"; // Create the NRF24Mysensor part nrf24Data.NRF24Mysensor = CreateNRF24Mysensor(nrf24Data); return(nrf24Data); }
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); }