private static void ReadSensors(MemoryMappedFile mmf, _HWiNFO_SHARED_MEM hWiNFOMemory) { for (var index = 0; index < hWiNFOMemory.NumSensorElements; ++index) { using (var viewStream = mmf.CreateViewStream(hWiNFOMemory.OffsetOfSensorSection + index * hWiNFOMemory.SizeOfSensorElement, hWiNFOMemory.SizeOfSensorElement, MemoryMappedFileAccess.Read)) { var buffer = new byte[(int)hWiNFOMemory.SizeOfSensorElement]; viewStream.Read(buffer, 0, (int)hWiNFOMemory.SizeOfSensorElement); var gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); var structure = (_HWiNFO_SENSOR)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(_HWiNFO_SENSOR)); gcHandle.Free(); if (!FullSensorData.ContainsKey(index)) { var sensor = new SensorObj { SensorId = structure.SensorId, SensorInstance = structure.SensorInstance, SensorNameOrig = structure.SensorNameOrig, SensorNameUser = structure.SensorNameUser, Elements = new Dictionary<string, ElementObj>() }; FullSensorData.Add(index,sensor); } } } ReadElements(mmf, hWiNFOMemory); }
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); } } } } } }