mirror of
https://github.com/ckaczor/WeatherService.git
synced 2026-01-14 01:25:43 -05:00
Initial commit
This commit is contained in:
161
Devices/WindDirectionDevice.cs
Normal file
161
Devices/WindDirectionDevice.cs
Normal file
@@ -0,0 +1,161 @@
|
||||
using System.Runtime.Serialization;
|
||||
using OneWireAPI;
|
||||
using WeatherService.Values;
|
||||
|
||||
namespace WeatherService.Devices
|
||||
{
|
||||
#region Enumerations
|
||||
|
||||
[DataContract]
|
||||
public enum WindDirection
|
||||
{
|
||||
[EnumMember]
|
||||
North,
|
||||
|
||||
[EnumMember]
|
||||
NorthNorthEast,
|
||||
|
||||
[EnumMember]
|
||||
NorthEast,
|
||||
|
||||
[EnumMember]
|
||||
EastNorthEast,
|
||||
|
||||
[EnumMember]
|
||||
East,
|
||||
|
||||
[EnumMember]
|
||||
EastSouthEast,
|
||||
|
||||
[EnumMember]
|
||||
SouthEast,
|
||||
|
||||
[EnumMember]
|
||||
SouthSouthEast,
|
||||
|
||||
[EnumMember]
|
||||
South,
|
||||
|
||||
[EnumMember]
|
||||
SouthSouthWest,
|
||||
|
||||
[EnumMember]
|
||||
SouthWest,
|
||||
|
||||
[EnumMember]
|
||||
WestSouthWest,
|
||||
|
||||
[EnumMember]
|
||||
West,
|
||||
|
||||
[EnumMember]
|
||||
WestNorthWest,
|
||||
|
||||
[EnumMember]
|
||||
NorthWest,
|
||||
|
||||
[EnumMember]
|
||||
NorthNorthWest,
|
||||
|
||||
[EnumMember]
|
||||
Unknown = -1
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
[DataContract]
|
||||
public class WindDirectionDevice : DeviceBase
|
||||
{
|
||||
#region Constants
|
||||
|
||||
private const double WindowOffset = 0.7;
|
||||
|
||||
private readonly double[,] _lookupTable = { {4.66, 4.66, 2.38, 4.66}, // 0
|
||||
{4.66, 3.18, 3.20, 4.64}, // 1
|
||||
{4.66, 2.38, 4.66, 4.66}, // 2
|
||||
{3.20, 3.20, 4.66, 4.64}, // 3
|
||||
{2.38, 4.66, 4.66, 4.66}, // 4
|
||||
{2.36, 4.62, 4.60, 0.06}, // 5
|
||||
{4.64, 4.64, 4.64, 0.06}, // 6
|
||||
{4.60, 4.60, 0.06, 0.06}, // 7
|
||||
{4.64, 4.64, 0.06, 4.64}, // 8
|
||||
{4.62, 0.06, 0.06, 4.60}, // 9
|
||||
{4.64, 0.06, 4.64, 4.64}, // 10
|
||||
{0.06, 0.06, 4.60, 4.60}, // 11
|
||||
{0.06, 4.64, 4.64, 4.64}, // 12
|
||||
{0.06, 4.62, 4.62, 2.34}, // 13
|
||||
{4.66, 4.66, 4.66, 2.38}, // 14
|
||||
{4.66, 4.66, 3.18, 3.18} }; // 15
|
||||
|
||||
#endregion
|
||||
|
||||
#region Member variables
|
||||
|
||||
private readonly Value _directionValue; // Cached direction value
|
||||
|
||||
private bool _initialized; // Has the device been initialized
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
|
||||
public WindDirectionDevice(Session session, owDevice device)
|
||||
: base(session, device, DeviceType.WindDirection)
|
||||
{
|
||||
// Create the value
|
||||
_directionValue = new Value(WeatherValueType.WindDirection, this);
|
||||
|
||||
_valueList.Add(WeatherValueType.WindDirection, _directionValue);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Internal methods
|
||||
|
||||
internal override void RefreshCache()
|
||||
{
|
||||
_directionValue.SetValue((double)ReadDirection());
|
||||
|
||||
base.RefreshCache();
|
||||
}
|
||||
|
||||
internal WindDirection ReadDirection()
|
||||
{
|
||||
int direction = -1; // Decoded direction
|
||||
|
||||
// Cast the device as the specific device
|
||||
owDeviceFamily20 voltage = (owDeviceFamily20)_device;
|
||||
|
||||
// If we haven't initialized the device we need to do it now
|
||||
if (!_initialized)
|
||||
{
|
||||
// Initialize the device
|
||||
voltage.Initialize();
|
||||
|
||||
// Remember that we've done this
|
||||
_initialized = true;
|
||||
}
|
||||
|
||||
// Get the array of voltages from the device
|
||||
double[] voltages = voltage.GetVoltages();
|
||||
|
||||
// Loop over the lookup table to find the direction that maps to the voltages
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
if (((voltages[0] <= _lookupTable[i, 0] + WindowOffset) && (voltages[0] >= _lookupTable[i, 0] - WindowOffset)) &&
|
||||
((voltages[1] <= _lookupTable[i, 1] + WindowOffset) && (voltages[1] >= _lookupTable[i, 1] - WindowOffset)) &&
|
||||
((voltages[2] <= _lookupTable[i, 2] + WindowOffset) && (voltages[2] >= _lookupTable[i, 2] - WindowOffset)) &&
|
||||
((voltages[3] <= _lookupTable[i, 3] + WindowOffset) && (voltages[3] >= _lookupTable[i, 3] - WindowOffset)))
|
||||
{
|
||||
direction = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Return the direction
|
||||
return (WindDirection)direction;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user