151 lines
5.3 KiB
C#
151 lines
5.3 KiB
C#
using System.IO;
|
|
using System.Linq;
|
|
|
|
namespace ScreenLogicConnect.Messages
|
|
{
|
|
public class GetPoolStatus : HLMessage
|
|
{
|
|
public CircuitUpdateDataStructure[] circuitArray { get; private set; }
|
|
public int m_AirTemp { get; private set; }
|
|
public int m_Alarms { get; private set; }
|
|
public int m_BodiesCount { get; private set; }
|
|
public int m_CircuitCount { get; private set; }
|
|
public byte m_CleanerDelay { get; private set; }
|
|
public int[] m_CoolSetPoint { get; private set; } = new int[2];
|
|
public int[] m_CurrentTemp { get; private set; } = new int[2];
|
|
public byte m_FreezeMode { get; private set; }
|
|
public int[] m_HeatMode { get; private set; } = new int[2];
|
|
public int[] m_HeatStatus { get; private set; } = new int[2];
|
|
public int m_ORP { get; private set; }
|
|
public int m_ORPTank { get; private set; }
|
|
public int m_Ok { get; private set; }
|
|
public int m_PH { get; private set; }
|
|
public int m_PHTank { get; private set; }
|
|
public byte m_PoolDelay { get; private set; }
|
|
public byte m_Remotes { get; private set; }
|
|
public int m_SaltPPM { get; private set; }
|
|
public int m_Saturation { get; private set; }
|
|
public int[] m_SetPoint { get; private set; } = new int[2];
|
|
public byte m_SpaDelay { get; private set; }
|
|
|
|
public const short HLM_POOL_GETSTATUSQ = 12526;
|
|
|
|
public static GetPoolStatus QUERY(short senderID)
|
|
{
|
|
return new GetPoolStatus(senderID, HLM_POOL_GETSTATUSQ);
|
|
}
|
|
|
|
private GetPoolStatus(short senderID, short msgID)
|
|
: base(senderID, msgID)
|
|
{
|
|
}
|
|
|
|
public GetPoolStatus(byte[] header, byte[] data)
|
|
: base(header, data)
|
|
{
|
|
}
|
|
|
|
public GetPoolStatus(HLMessage msg)
|
|
: base(msg)
|
|
{
|
|
}
|
|
|
|
public override byte[] AsByteArray()
|
|
{
|
|
using (var ms = new MemoryStream())
|
|
{
|
|
using (var bw = new BinaryWriter(ms))
|
|
{
|
|
bw.Write(0);
|
|
}
|
|
|
|
data = ms.ToArray();
|
|
}
|
|
|
|
return base.AsByteArray();
|
|
}
|
|
|
|
protected override void Decode()
|
|
{
|
|
using (var ms = new MemoryStream(data))
|
|
{
|
|
using (var br = new BinaryReader(ms))
|
|
{
|
|
m_Ok = br.ReadInt32();
|
|
m_FreezeMode = br.ReadByte();
|
|
m_Remotes = br.ReadByte();
|
|
m_PoolDelay = br.ReadByte();
|
|
m_SpaDelay = br.ReadByte();
|
|
m_CleanerDelay = br.ReadByte();
|
|
br.ReadBytes(3);
|
|
m_AirTemp = br.ReadInt32();
|
|
m_BodiesCount = br.ReadInt32();
|
|
if (m_BodiesCount > 2)
|
|
{
|
|
m_BodiesCount = 2; // todo: what? this is how the android app is handling this, but it seems weird.
|
|
}
|
|
for (int i = 0; i < m_BodiesCount; i++)
|
|
{
|
|
var bodyType = br.ReadInt32();
|
|
if (bodyType < 0 || bodyType >= 2)
|
|
{
|
|
bodyType = 0;
|
|
}
|
|
m_CurrentTemp[bodyType] = br.ReadInt32();
|
|
m_HeatStatus[bodyType] = br.ReadInt32();
|
|
m_SetPoint[bodyType] = br.ReadInt32();
|
|
m_CoolSetPoint[bodyType] = br.ReadInt32();
|
|
m_HeatMode[bodyType] = br.ReadInt32();
|
|
}
|
|
m_CircuitCount = br.ReadInt32();
|
|
circuitArray = new CircuitUpdateDataStructure[m_CircuitCount];
|
|
for (int i = 0; i < m_CircuitCount; i++)
|
|
{
|
|
circuitArray[i] = new CircuitUpdateDataStructure()
|
|
{
|
|
id = br.ReadInt32(),
|
|
state = br.ReadInt32(),
|
|
colorSet = br.ReadByte(),
|
|
colorPos = br.ReadByte(),
|
|
colorStagger = br.ReadByte(),
|
|
delay = br.ReadByte(),
|
|
};
|
|
}
|
|
m_PH = br.ReadInt32();
|
|
m_ORP = br.ReadInt32();
|
|
m_Saturation = br.ReadInt32();
|
|
m_SaltPPM = br.ReadInt32();
|
|
m_PHTank = br.ReadInt32();
|
|
m_ORPTank = br.ReadInt32();
|
|
m_Alarms = br.ReadInt32();
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool isDeviceready()
|
|
{
|
|
return this.m_Ok == 1;
|
|
}
|
|
|
|
public bool isDeviceSync()
|
|
{
|
|
return this.m_Ok == 2;
|
|
}
|
|
|
|
public bool isDeviceServiceMode()
|
|
{
|
|
return this.m_Ok == 3;
|
|
}
|
|
|
|
public bool isSpaActive()
|
|
{
|
|
return this.circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.SPA_CIRCUIT_ID && x.state == 1) ?? false;
|
|
}
|
|
|
|
public bool isPoolActive()
|
|
{
|
|
return this.circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.POOL_CIRCUIT_ID && x.state == 1) ?? false;
|
|
}
|
|
}
|
|
}
|