thanks for the info, ive managed to get the speed fan code up and running. so now all i need to do is change the shared memory address in the C# program, remove the speedfan structLayout, how would i interpret this data into simple integers? XMLReader?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace SpeedFanReader
{
class SpeedFan
{
static void printHeader(SpeedFan.Data d)
{
String header = "";
for (int i = 0; i < d.numFans; i++)
{
header += "Fan " + i + ",";
}
for (int i = 0; i < d.numTemps; i++)
{
header += "Temp " + i + ",";
}
for (int i = 0; i < d.numVolts; i++)
{
header += "Volt " + i + ",";
}
header += "Flags";
Console.WriteLine(header);
}
static void printData(SpeedFan.Data d)
{
if (d != null)
{
String output = "";
for (int i = 0; i < d.numFans; i++)
{
output += d.fans[i] + ",";
}
for (int i = 0; i < d.numTemps; i++)
{
output += d.temps[i] + ",";
}
for (int i = 0; i < d.numVolts; i++)
{
output += d.volts[i] + ",";
}
output += d.flags;
Console.WriteLine(output);
}
}
static void Main(string[] args)
{
SpeedFan sf = new SpeedFan();
sf.OpenView();
bool done = false;
StreamWriter writer = null;
if (args.Length > 0)
{
try
{
writer = new StreamWriter(args[0]);
writer.AutoFlush = true;
Console.SetOut(writer); // redirect stdout to the file
}
catch (IOException e)
{
Console.WriteLine("Failed to open file: " + args[0] + " : " + e.Message);
return;
}
}
try
{
bool first = true;
while (!done)
{
SpeedFan.Data d = sf.GetData();
if (first)
{
printHeader(d);
first = false;
}
printData(d);
if (writer != null)
writer.Flush();
// Sleep for a second
System.Threading.Thread.Sleep(1000);
}
}
finally
{
if (writer != null)
{
Console.SetOut(new StreamWriter(Console.OpenStandardOutput()));
writer.Flush();
writer.Close();
}
Console.WriteLine("Done!");
}
}
[structLayout(LayoutKind.Sequential, Pack = 1)]
public class Data
{
public ushort version;
public ushort flags;
public Int32 size;
public Int32 handle;
public ushort numTemps;
public ushort numFans;
public ushort numVolts;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public Int32[] temps;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public Int32[] fans;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public Int32[] volts;
public Data()
{
temps = new Int32[32];
fans = new Int32[32];
volts = new Int32[32];
}
}
#region Win32 API stuff
public const int FILE_MAP_READ = 0x0004;
[DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern IntPtr OpenFileMapping(int dwDesiredAccess,
bool bInheritHandle, StringBuilder lpName);
[DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern IntPtr MapViewOfFile(IntPtr hFileMapping,
int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow,
int dwNumberOfBytesToMap);
[DllImport("Kernel32.dll")]
internal static extern bool UnmapViewOfFile(IntPtr map);
[DllImport("kernel32.dll")]
internal static extern bool CloseHandle(IntPtr hObject);
#endregion
private bool fileOpen = false;
private IntPtr map;
private IntPtr handle;
~SpeedFan()
{
CloseView();
}
public bool OpenView()
{
if (!fileOpen)
{
StringBuilder sharedMemFile = new StringBuilder("SpeedFan64_SensorValues");
handle = OpenFileMapping(FILE_MAP_READ, false, sharedMemFile);
if (handle == IntPtr.Zero)
{
throw new Exception("Unable to open file mapping.");
}
map = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, Marshal.SizeOf((Type)typeof(Data)));
if (map == IntPtr.Zero)
{
throw new Exception("Unable to read shared memory.");
}
fileOpen = true;
}
return fileOpen;
}
public void CloseView()
{
if (fileOpen)
{
UnmapViewOfFile(map);
CloseHandle(handle);
}
}
public Data GetData()
{
if (fileOpen)
{
Data data = (Data)Marshal.PtrToStructure(map, typeof(Data));
return data;
}
else
return null;
}
}
}