private static void ReadElements(MemoryMappedFile mmf, _HWiNFO_SHARED_MEM hWiNFOMemory) { for (uint index = 0; index < hWiNFOMemory.NumReadingElements; ++index) { using (var viewStream = mmf.CreateViewStream(hWiNFOMemory.OffsetOfReadingSection + index * hWiNFOMemory.SizeOfReadingElement, hWiNFOMemory.SizeOfReadingElement, MemoryMappedFileAccess.Read)) { var buffer = new byte[(int)hWiNFOMemory.SizeOfReadingElement]; viewStream.Read(buffer, 0, (int)hWiNFOMemory.SizeOfReadingElement); var gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); var structure = (_HWiNFO_ELEMENT)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(_HWiNFO_ELEMENT)); gcHandle.Free(); var sensor = FullSensorData[(int) structure.SensorIndex]; var elementKey = sensor.SensorId + "-" + sensor.SensorInstance + "-" + structure.ElementId; var element = new ElementObj { ElementKey = elementKey, SensorType = structure.SensorType, ElementId = structure.ElementId, LabelOrig = structure.LabelOrig, LabelUser = structure.LabelUser, Unit = structure.Unit, NumericValue = (float)structure.Value, Value = NumberFormat(structure.SensorType, structure.Unit, structure.Value), ValueMin = NumberFormat(structure.SensorType, structure.Unit, structure.ValueMin), ValueMax = NumberFormat(structure.SensorType, structure.Unit, structure.ValueMax), ValueAvg = NumberFormat(structure.SensorType, structure.Unit,structure.ValueAvg) }; sensor.Elements[elementKey] = element; } } }
private static void ParseIncFile() { if (IncData != null && FullSensorData.Any()) { var serverName = Environment.MachineName; DefaultContractResolver contractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() }; int index = -1; foreach (var section in IncData.Sections.Where(x => x.SectionName != "Variables")) { index++; var sectionName = Regex.Replace(section.SectionName, "HWINFO-CONFIG-", "", RegexOptions.IgnoreCase); foreach (KeyData key in section.Keys) { var elementName = key.Value; var sensorIdStr = IncData["Variables"][key.KeyName + "-SensorId"]; var sensorInstanceStr = IncData["Variables"][key.KeyName + "-SensorInstance"]; var elementIdStr = IncData["Variables"][key.KeyName + "-EntryId"]; if (sensorIdStr?.StartsWith("0x") == true && sensorInstanceStr?.StartsWith("0x") == true && elementIdStr?.StartsWith("0x") == true) { var sensorId = Convert.ToUInt32(sensorIdStr.Replace("0x", ""), 16); var sensorInstance = Convert.ToUInt32(sensorInstanceStr.Replace("0x", ""), 16); var elementId = Convert.ToUInt32(elementIdStr.Replace("0x", ""), 16); var fullSensorDataSensor = FullSensorData.Values.FirstOrDefault(x => x.SensorId == sensorId && x.SensorInstance == sensorInstance); var elementKey = sensorId + "-" + sensorInstance + "-" + elementId; if (fullSensorDataSensor?.Elements.ContainsKey(elementKey) == true) { var fullSensorDataElement = fullSensorDataSensor.Elements[elementKey]; var element = new ElementObj { ElementKey = elementKey, SensorType = fullSensorDataElement.SensorType, ElementId = fullSensorDataElement.ElementId, LabelOrig = elementName, LabelUser = elementName, Unit = fullSensorDataElement.Unit, NumericValue = fullSensorDataElement.NumericValue, Value = fullSensorDataElement.Value, ValueMin = fullSensorDataElement.ValueMin, ValueMax = fullSensorDataElement.ValueMax, ValueAvg = fullSensorDataElement.ValueAvg }; if (!SensorData.ContainsKey(index)) { var sensor = new SensorObj { SensorId = 0, SensorInstance = 0, SensorNameOrig = sectionName, SensorNameUser = sectionName, Elements = new Dictionary<string, ElementObj>() }; SensorData.Add(index, sensor); } SensorData[index].Elements[elementKey] = element; var t1 = serverName.Replace(' ', '_'); var t2 = SensorData[index].SensorNameUser.Replace(' ', '_'); var t3 = element.LabelUser.Replace(' ', '_'); var task = Task.Run<bool>(async () => await MQTT.Publish($"HWINFO/{t1}/{t2}/{t3}", JsonConvert.SerializeObject(new MQTTObj { Value = element.NumericValue, Unit = element.Unit }, new JsonSerializerSettings { ContractResolver = contractResolver }))); if (!SensorTrends.ContainsKey(elementKey)) { SensorTrends.Add(elementKey, new ChartCircularBuffer(fullSensorDataElement.SensorType, fullSensorDataElement.Unit)); } SensorTrends[elementKey].Put(fullSensorDataElement.NumericValue); } } } } } }