Files
OneWireAPI/owDeviceFamily12.cs
2014-05-01 16:19:33 -04:00

200 lines
4.6 KiB
C#

using System;
namespace OneWireAPI
{
public class owDeviceFamily12 : owDevice
{
#region Constants
private const byte CHANNEL_ACCESS_COMMAND = 0xF5; // Command value to access a channel
private const byte WRITE_STATUS_COMMAND = 0x55; // Command value to write the status
private const byte READ_STATUS_COMMAND = 0xAA; // Command value to read the status
#endregion
#region Constructor
public owDeviceFamily12(owSession Session, short[] ID) : base(Session, ID)
{
// Just call the base constructor
}
#endregion
#region Methods
public bool IsPowered(byte[] State)
{
return ((State[0] & 0x80) == 0x80);
}
public bool GetLevel(int Channel, byte[] State)
{
if (Channel == 0)
return ((State[0] & 0x04) == 0x04);
else
return ((State[0] & 0x08) == 0x08);
}
public bool GetLatchState(int Channel, byte[] State)
{
if (Channel == 0)
{
return ((State[1] & 0x20) != 0x20);
}
else
{
return ((State[1] & 0x40) != 0x40);
}
}
public void SetLatchState(int Channel, bool LatchState, byte[] State)
{
if (Channel == 0)
{
State[1] &= 0xDF;
if (!LatchState) State[1] = (byte) (State[1] | 0x20);
}
else
{
State[1] &= 0xBF;
if (!LatchState) State[1] = (byte) (State[1] | 0x40);
}
}
public byte[] ReadDevice()
{
byte[] State = new byte[2];
byte[] aData = new byte[30]; // Data buffer to send over the network
short nDataCount = 0; // How many bytes of data to send
int iCRCResult; // Result of the CRC calculation
int iMatchCRC; // CRC retrieved from the device
// Select and access the ID of the device we want to talk to
owAdapter.Select(_deviceID);
// Set the commmand to execute
aData[nDataCount++] = CHANNEL_ACCESS_COMMAND;
// Set the data
aData[nDataCount++] = 0x55;
aData[nDataCount++] = 0xFF;
// Read the info, dummy data and CRC16
for (int i = 3; i < 7; i++)
aData[nDataCount++] = 0xFF;
// Send the data
owAdapter.SendBlock(aData, nDataCount);
// Calculate the CRC
iCRCResult = owCRC16.Calculate(aData, 0, 4);
// Assemble the CRC provided by the device
iMatchCRC = aData[6] << 8;
iMatchCRC |= aData[5];
iMatchCRC ^= 0xFFFF;
// Make sure the CRC values match
if (iCRCResult != iMatchCRC)
{
// Throw a CRC exception
throw new owException(owException.owExceptionFunction.CRC, _deviceID);
}
// Store the state data
State[0] = aData[3];
// Reset the data count
nDataCount = 0;
// Set the command
aData[nDataCount++] = READ_STATUS_COMMAND;
// Set the address to read
aData[nDataCount++] = 7;
aData[nDataCount++] = 0;
// Add data for the CRC
for (int i = 3; i < 6; i++)
aData[nDataCount++] = 0xFF;
// Select and access the ID of the device we want to talk to
owAdapter.Select(_deviceID);
// Send the data
owAdapter.SendBlock(aData, nDataCount);
// Calculate the CRC
iCRCResult = owCRC16.Calculate(aData, 0, 3);
// Assemble the CRC provided by the device
iMatchCRC = aData[5] << 8;
iMatchCRC |= aData[4];
iMatchCRC ^= 0xFFFF;
// Make sure the CRC values match
if (iCRCResult != iMatchCRC)
{
// Throw a CRC exception
throw new owException(owException.owExceptionFunction.CRC, _deviceID);
}
// Store the state data
State[1] = aData[3];
return State;
}
public void WriteDevice(byte[] State)
{
short nResult; // Result of method calls
byte[] aData = new byte[30]; // Data buffer to send over the network
short nDataCount = 0; // How many bytes of data to send
int iCRCResult; // Result of the CRC calculation
int iMatchCRC; // CRC retrieved from the device
// Select and access the ID of the device we want to talk to
owAdapter.Select(_deviceID);
// Set the commmand to execute
aData[nDataCount++] = WRITE_STATUS_COMMAND;
// Set the address
aData[nDataCount++] = 0x07;
aData[nDataCount++] = 0x00;
// Add the state
aData[nDataCount++] = State[1];
// Add bytes for the CRC result
aData[nDataCount++] = 0xFF;
aData[nDataCount++] = 0xFF;
// Send the data
nResult = owAdapter.SendBlock(aData, nDataCount);
// Calculate the CRC
iCRCResult = owCRC16.Calculate(aData, 0, 3);
// Assemble the CRC provided by the device
iMatchCRC = aData[5] << 8;
iMatchCRC |= aData[4];
iMatchCRC ^= 0xFFFF;
// Make sure the CRC values match
if (iCRCResult != iMatchCRC)
{
// Throw a CRC exception
throw new owException(owException.owExceptionFunction.CRC, _deviceID);
}
return;
}
#endregion
}
}