Files
OneWireAPI/DeviceFamily26.cs
2015-01-16 18:06:47 -05:00

263 lines
7.7 KiB
C#

namespace OneWireAPI
{
public class DeviceFamily26 : Device
{
public DeviceFamily26(Session session, short[] id)
: base(session, id)
{
// Just call the base constructor
}
public enum VoltageType : short
{
Supply,
Output
}
private double GetVoltage(VoltageType type)
{
short busy;
// Select and access the ID of the device we want to talk to
Adapter.Select(DeviceId);
// Data buffer to send over the network
var data = new byte[30];
// How many bytes of data to send
short dataCount = 0;
// Set the command to recall the status/configuration page to the scratchpad
data[dataCount++] = 0xB8;
// Set the page number to recall
data[dataCount++] = 0x00;
// Send the data block
Adapter.SendBlock(data, dataCount);
// Clear the data count
dataCount = 0;
// Access the device we want to talk to
Adapter.Access();
// Set the command to read the scratchpad
data[dataCount++] = 0xBE;
// Set the page number to read
data[dataCount++] = 0x00;
// Add 9 bytes to be read - 8 for the data and 1 for the CRC
for (var index = 0; index < 9; index++)
data[dataCount++] = 0xFF;
// Send the data block
Adapter.SendBlock(data, dataCount);
// Calculate the CRC of the scratchpad data
var crc = Crc8.Calculate(data, 2, 9);
// If the CRC doesn't match then throw an exception
if (crc != data[10])
{
// Throw a CRC exception
throw new OneWireException(OneWireException.ExceptionFunction.Crc, DeviceId);
}
// TODO - Check if we really need to change the input selector
if (true)
{
// Access the device we want to talk to
Adapter.Access();
// Reset the data count
dataCount = 0;
// Set the command to write the scratchpad
data[dataCount++] = 0x4E;
// Set the page number to write
data[dataCount++] = 0x00;
// Set or clear the AD bit based on the type requested
if (type == VoltageType.Supply)
data[dataCount++] = (byte) (data[2] | 0x08);
else
data[dataCount++] = (byte) (data[2] & 0xF7);
// Move the existing data down in the array
for (var index = 0; index < 7; index++)
data[dataCount++] = data[index + 4];
// Send the data block
Adapter.SendBlock(data, dataCount);
// Reset the data count
dataCount = 0;
// Access the device we want to talk to
Adapter.Access();
// Set the command to copy the scratchpad
data[dataCount++] = 0x48;
// Set the page number to copy to
data[dataCount++] = 0x00;
// Send the data block
Adapter.SendBlock(data, dataCount);
// Loop until the data copy is complete
do
{
busy = Adapter.ReadByte();
}
while (busy == 0);
}
// Access the device we want to talk to
Adapter.Access();
// Send the voltage conversion command
Adapter.SendByte(0xB4);
// Loop until conversion is complete
do
{
busy = Adapter.ReadByte();
}
while (busy == 0);
// Clear the data count
dataCount = 0;
// Set the command to recall the status/configuration page to the scratchpad
data[dataCount++] = 0xB8;
// Set the page number to recall
data[dataCount++] = 0x00;
// Access the device we want to talk to
Adapter.Access();
// Send the data block
Adapter.SendBlock(data, dataCount);
// Clear the data count
dataCount = 0;
// Access the device we want to talk to
Adapter.Access();
// Set the command to read the scratchpad
data[dataCount++] = 0xBE;
// Set the page number to read
data[dataCount++] = 0x00;
// Add 9 bytes to be read - 8 for the data and 1 for the CRC
for (var index = 0; index < 9; index++)
data[dataCount++] = 0xFF;
// Send the data block
Adapter.SendBlock(data, dataCount);
// Calculate the CRC of the scratchpad data
crc = Crc8.Calculate(data, 2, 9);
// If the CRC doesn't match then throw an exception
if (crc != data[10])
{
// Throw a CRC exception
throw new OneWireException(OneWireException.ExceptionFunction.Crc, DeviceId);
}
// Assemble the voltage data
var dVoltage = (double) ((data[6] << 8) | data[5]);
return dVoltage / 100;
}
public double GetSupplyVoltage()
{
return GetVoltage(VoltageType.Supply);
}
public double GetOutputVoltage()
{
return GetVoltage(VoltageType.Output);
}
public double GetTemperature()
{
// Select and access the ID of the device we want to talk to
Adapter.Select(DeviceId);
// Send the conversion command byte
Adapter.SendByte(0x44);
// Sleep while the data is converted
System.Threading.Thread.Sleep(10);
// Access the device we want to talk to
Adapter.Access();
// Data buffer to send over the network
var data = new byte[30];
// How many bytes of data to send
short dataCount = 0;
// Set the command to recall the status/configuration page to the scratchpad
data[dataCount++] = 0xB8;
// Set the page number to recall
data[dataCount++] = 0x00;
// Send the data block
Adapter.SendBlock(data, dataCount);
// Clear the data count
dataCount = 0;
// Access the device we want to talk to
Adapter.Access();
// Set the command to read the scratchpad
data[dataCount++] = 0xBE;
// Set the page number to read
data[dataCount++] = 0x00;
// Add 9 bytes to be read - 8 for the data and 1 for the CRC
for (var iIndex = 0; iIndex < 9; iIndex++)
data[dataCount++] = 0xFF;
// Send the data block
Adapter.SendBlock(data, dataCount);
// Calculate the CRC of the scratchpad data
var crc = Crc8.Calculate(data, 2, 9);
// If the CRC doesn't match then throw an exception
if (crc != data[10])
{
// Throw a CRC exception
throw new OneWireException(OneWireException.ExceptionFunction.Crc, DeviceId);
}
// Get the two bytes of temperature data
int temperatureLsb = data[3];
int temperatureMsb = data[4];
// Shift the data into the right order
var iTemperature = ((temperatureMsb << 8) | temperatureLsb) >> 3;
// Return the temperature
return iTemperature * 0.03125F;
}
}
}