Skip to content

Commit

Permalink
BugFix: Opraveno pořadí hodnot ve SpinelDeviceSN. Bylo prohozené typo…
Browse files Browse the repository at this point in the history
…vé a sériové číslo.

Add: Funkce pro adresování sériových zařízení, včetně funkce adresování pomocí sériového čísla.
Add: Přidána podpora pro RS485 teploměry TQS3 a TQS4. Instrukce pro měření teploty.
  • Loading branch information
Papouchcom committed Jun 13, 2018
1 parent 33fc16f commit 8ae6d9b
Show file tree
Hide file tree
Showing 8 changed files with 188 additions and 8 deletions.
Binary file modified Latest/Papouch.Quido.dll
Binary file not shown.
Binary file modified Latest/Papouch.Quido.pdb
Binary file not shown.
1 change: 1 addition & 0 deletions Papouch.Spinel/Papouch.Spinel.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
<Compile Include="Spinel.cs" />
<Compile Include="Spinel97.Device.cs" />
<Compile Include="Spinel97.Device.Quido.cs" />
<Compile Include="Spinel97.Device.Tqs.cs" />
<Compile Include="Spinel97.Utils.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Spinel97.PacketSpinel97.cs" />
Expand Down
4 changes: 2 additions & 2 deletions Papouch.Spinel/Spinel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public SpinelDeviceSN(byte[] sdata)
this.Valid = false;
if ((sdata!=null) && (sdata.Length == 8))
{
this.SerialNumber = (uint)(sdata[0] * 0x100 + sdata[1]);
this.DeviceType = (uint)(sdata[2] * 0x100 + sdata[3]);
this.DeviceType = (uint)(sdata[0] * 0x100 + sdata[1]);
this.SerialNumber = (uint)(sdata[2] * 0x100 + sdata[3]);
for (int i = 4; i <= 7; i++)
{
this.FactoryData = (this.FactoryData * 0x100) + sdata[i];
Expand Down
41 changes: 41 additions & 0 deletions Papouch.Spinel/Spinel97.Device.Tqs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System;
using Papouch.Communication;

namespace Papouch.Spinel.Spinel97.Device.Tqs
{
public class Tqs : Device
{
public byte S97_INST_TQS_GetTemperature = 0x51; // Čtení teploty

public Tqs(ICommunicationInterface ci, byte spinelADR) : base(ci, spinelADR)
{

}

/// <summary>
/// Čtení teploty z teplotního senzoru
/// </summary>
/// <param name="temp">Aktuálně naměřená teplota. Pokud z nějakého důvodu není dostupná, je zde konstanta float.NaN.</param>
/// <returns>Teplota ve stupních Celsia.</returns>
public Boolean CmdGetTemperature(out float temp)
{
byte[] data = {};

PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TQS_GetTemperature, data);
txPacket.ADR = this.ADR;
PacketSpinel97 rxPacket;

if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
{
if ((rxPacket.SDATA != null) && (rxPacket.SDATA.Length == 2))
{
temp = (float)(rxPacket.SDATA[0] * 256 + rxPacket.SDATA[1]) / 32;
return true;
}
}
temp = float.NaN;
return false;
}

}
}
143 changes: 139 additions & 4 deletions Papouch.Spinel/Spinel97.Device.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,14 @@ namespace Papouch.Spinel.Spinel97.Device
{
public class Device : CsPropertyObject
{
public byte S97_INST_ReadInfo = 0xF3; // Čtení informací o výrobku (typové)
public byte S97_INST_ReadSN = 0xFA; // Čtení výrobních údajů
public byte S97_INST_ReadStatus = 0xF1; // Čtení statusu
public byte S97_INST_SetStatus = 0xE1; // Nastavení statusu
public byte S97_INST_ReadInfo = 0xF3; // Čtení informací o výrobku (typové)
public byte S97_INST_ReadSN = 0xFA; // Čtení výrobních údajů
public byte S97_INST_ReadStatus = 0xF1; // Čtení statusu
public byte S97_INST_SetStatus = 0xE1; // Nastavení statusu
public byte S97_INST_AllowConfig = 0xE4; // Povolení konfigurace
public byte S97_INST_GetCommParams = 0xF0; // Čtení komunikačních parametrů
public byte S97_INST_SetCommParams = 0xE0; // Nastavení komunikačních parametrů
public byte S97_INST_SetAddrBySN = 0xEB; // Nastavení adresy sériovým číslem

internal ICommunicationInterface ci = null;
private byte fADR = 0xFE;
Expand Down Expand Up @@ -123,6 +127,137 @@ public Boolean CmdSetStatus(byte dev_status)
return false;
}

/// <summary>
/// Povoluje provedení konfigurace. Musí předcházet bezprostředně před některými instrukcemi pro nastavení
/// komunikačních parametrů. Po následující instrukci (i neplatné) je konfigurace automaticky zakázána.
/// (U této instrukce není možné použít univerzální adresu 0xFE.)
/// </summary>
/// <returns></returns>
public Boolean CmdAllowConfiguration()
{
if ((ci != null) && (ci.Active))
{
byte[] data = { };

PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_AllowConfig, data);
txPacket.ADR = this.ADR;

PacketSpinel97 rxPacket;

if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
return true;
}
return false;
}

/// <summary>
/// Seznam standardních komunikačních rychlostí protokolu Spinel
/// </summary>
readonly int[] Baudrates = {110, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400};

/// <summary>
/// Zjistí adresu a komunikační rychlost zařízení. (Má význam jen u zařízení komunikujících po sériovém rozhraní.)
/// </summary>
/// <param name="addr">Adresa.</param>
/// <param name="baudrate">Komunikační rychlost v Baudech. Pokud je číslo menší než 110, jde o neznámý kód komunikační rychlosti.</param>
/// <returns></returns>
public Boolean CmdGetCommParams(out byte addr, out int baudrate)
{
if ((ci != null) && (ci.Active))
{
byte[] data = { };

PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_GetCommParams, data);
txPacket.ADR = this.ADR;

PacketSpinel97 rxPacket;

if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
{
if ((rxPacket.SDATA != null) && (rxPacket.SDATA.Length == 2))
{
addr = rxPacket.SDATA[0];
byte speedcode = rxPacket.SDATA[1];
if (speedcode < Baudrates.Length)
baudrate = Baudrates[speedcode];
else
baudrate = speedcode;
return true;
}
}
}
addr = 0xFF;
baudrate = 0xFF;
return false;
}

/// <summary>
/// Nastavení adresy a rychlosti. Bezprostředně před nastavením rychlosti musí být povolena konfugurace pomocí funkce <see cref="CmdAllowConfiguration"/>
/// </summary>
/// <param name="newaddr">Nová adresa. Musí být z rozsahu 0 až 253.</param>
/// <param name="newbaudrate">Nová komunikační rychlost v Baudech. Musí být jednou ze standardních komunikačních rychlostí jak jsou uvedeny v <see cref="Baudrates"/>. Pokud jde o jinou nestandardní rychlost, uveďte přímo kód rychlosti.</param>
/// <returns>Vrací standardní kód odpovědi z výčtu <see cref="ResponseACK"/>.</returns>
public ResponseACK CmdSetCommParams(byte newaddr, int newbaudrate)
{
if ((ci != null) && (ci.Active))
{
if ((newaddr == 0xFF) || (newaddr == 0xFE))
return ResponseACK.InvalidData;

int speedcode = Array.IndexOf<int>(Baudrates, newbaudrate);
if ((speedcode == -1) && (newbaudrate > 0xFF))
return ResponseACK.InvalidData;

if (speedcode == -1) speedcode = newbaudrate;

byte[] data = { newaddr, (byte)speedcode };

PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_SetCommParams, data);
txPacket.ADR = this.ADR;

PacketSpinel97 rxPacket;

if (SendAndReceive(ref txPacket, out rxPacket))
return (ResponseACK)rxPacket.INST;
}
return ResponseACK.OtherCommError;
}

/// <summary>
/// Instrukce umožňuje nastavit adresu podle unikátního sériového čísla zařízení.
/// Tato instrukce je praktická v případě, že nadřazený systém nebo obsluha ztratí adresu zařízení,
/// které je na stejné komunikační lince s dalšími zařízeními.
/// </summary>
/// <param name="newaddr">Nová adresa. Musí být z rozsahu 0 až 253.</param>
/// <param name="devicenumber">Typ zařízení. Kompletní S/N zařízení má tvar 1234/4567. Typ zařízení je číslo před lomítkem.</param>
/// <param name="serialnumber">Sériové číslo. Kompletní S/N zařízení má tvar 1234/4567. Sériové číslo je číslo za lomítkem.</param>
/// <returns></returns>
public Boolean CmdSetAddressBySerialNumber(byte newaddr, UInt16 devicenumber, UInt16 serialnumber)
{
if ((ci != null) && (ci.Active))
{
if ((newaddr == 0xFF) || (newaddr == 0xFE))
return false;

byte[] data = new byte[5];
data[0] = newaddr;
data[1] = (byte)((devicenumber & 0xFF00) >> 8);
data[2] = (byte)(devicenumber & 0x00FF);
data[3] = (byte)((serialnumber & 0xFF00) >> 8);
data[4] = (byte)(serialnumber & 0x00FF);

PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_SetAddrBySN, data);
txPacket.ADR = 0xFE;

PacketSpinel97 rxPacket;

if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
return true;
}
return false;
}



[CsProperty("ADR", 0xFE)]
public byte ADR
Expand Down
3 changes: 2 additions & 1 deletion Papouch.Spinel/Spinel97.PacketSpinel97.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public enum ResponseACK
DeviceMalfunction = 0x05,
NoDataAvailable = 0x06,
AutoInfoInputChanged = 0x0D,
AutoInfoMeasured = 0x0E
AutoInfoMeasured = 0x0E,
OtherCommError = 0xFF
}

public class PacketSpinel97
Expand Down
4 changes: 3 additions & 1 deletion Quido.NET.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Communication Interface Dem
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{EAB20BA0-D586-4E16-BE91-443620F819C8}"
ProjectSection(SolutionItems) = preProject
Changelog.txt = Changelog.txt
Performance1.psess = Performance1.psess
EndProjectSection
EndProject
Expand All @@ -22,6 +21,9 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuidoDemo_CS", "QuidoDemo_CS.NET\QuidoDemo_CS.csproj", "{83C08910-C5F6-402C-8542-120738E09436}"
EndProject
Global
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Expand Down

0 comments on commit 8ae6d9b

Please sign in to comment.