diff --git a/Latest/Papouch.Comunication.dll b/Latest/Papouch.Comunication.dll
index a313db3..532f225 100644
Binary files a/Latest/Papouch.Comunication.dll and b/Latest/Papouch.Comunication.dll differ
diff --git a/Latest/Papouch.Comunication.pdb b/Latest/Papouch.Comunication.pdb
index c107313..ed07ba1 100644
Binary files a/Latest/Papouch.Comunication.pdb and b/Latest/Papouch.Comunication.pdb differ
diff --git a/Latest/Papouch.Quido.dll b/Latest/Papouch.Quido.dll
index f418730..8d40c23 100644
Binary files a/Latest/Papouch.Quido.dll and b/Latest/Papouch.Quido.dll differ
diff --git a/Latest/Papouch.Quido.pdb b/Latest/Papouch.Quido.pdb
index ee44b45..e28d98d 100644
Binary files a/Latest/Papouch.Quido.pdb and b/Latest/Papouch.Quido.pdb differ
diff --git a/Latest/Papouch.Utils.dll b/Latest/Papouch.Utils.dll
index 652fe3d..7b202c9 100644
Binary files a/Latest/Papouch.Utils.dll and b/Latest/Papouch.Utils.dll differ
diff --git a/Latest/Papouch.Utils.pdb b/Latest/Papouch.Utils.pdb
index ceef8a5..ad72b7d 100644
Binary files a/Latest/Papouch.Utils.pdb and b/Latest/Papouch.Utils.pdb differ
diff --git a/Papouch.Spinel/Papouch.Spinel.csproj b/Papouch.Spinel/Papouch.Spinel.csproj
index 47d8acd..6363efd 100644
--- a/Papouch.Spinel/Papouch.Spinel.csproj
+++ b/Papouch.Spinel/Papouch.Spinel.csproj
@@ -40,6 +40,7 @@
+
diff --git a/Papouch.Spinel/Spinel97.Device.Tds.cs b/Papouch.Spinel/Spinel97.Device.Tds.cs
new file mode 100644
index 0000000..4527bd6
--- /dev/null
+++ b/Papouch.Spinel/Spinel97.Device.Tds.cs
@@ -0,0 +1,371 @@
+using System;
+using System.Text;
+using Papouch.Communication;
+
+namespace Papouch.Spinel.Spinel97.Device.Tds
+{
+ public class Tds : Device
+ {
+ public byte S97_INST_TDS_GetTemperature = 0x51; // Čtení teploty
+ public byte S97_INST_TDS_SetDateTime = 0x70; // Nastavení data a času
+ public byte S97_INST_TDS_GetDateTime = 0x71; // Čtení data a času
+ public byte S97_INST_TDS_SetBrightnessManual = 0x93; // Nastavení jasu manuálně
+ public byte S97_INST_TDS_SetBrightnessAuto = 0x95; // Nastavení jasu automaticky
+ public byte S97_INST_TDS_SetDataValidity = 0x94; // Nastavení délky zobrazení
+ public byte S97_INST_TDS_SetDataAscii = 0x90; // Zápis znaků na displej
+ public byte S97_INST_TDS_SetDataBin = 0x91; // Zápis binárních dat na displej
+ public byte S97_INST_TDS_SetFlags = 0x76; // Nastavení parametrů času a zobrazení
+ public byte S97_INST_TDS_SetAutoInfo = 0x78; // Vynutit zobrazení automatických informací
+ public byte S97_INST_TDS_GetInputs = 0x31; // Vynutit zobrazení automatických informací
+
+ public Tds(ICommunicationInterface ci, byte spinelADR) : base(ci, spinelADR)
+ {
+
+ }
+
+ ///
+ /// Zjistí počet segmentovek, vstupů a teplotních senzorů.
+ ///
+ /// Počet znakovek.
+ /// Počet vstupů.
+ /// Počet teplotních senzorů.
+ ///
+ public bool CmdGetHwInfo(out int SegCount, out int InCount, out int SnsCount)
+ {
+ SegCount = -1;
+ InCount = -1;
+ SnsCount = -1;
+
+ byte[] data = { 0x01 };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_ReadInfo, 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 == 5))
+ {
+ SegCount = rxPacket.SDATA[0];
+ InCount = rxPacket.SDATA[2];
+ SnsCount = rxPacket.SDATA[4];
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ ///
+ /// Čtení teploty z teplotního senzoru
+ ///
+ /// Aktuálně naměřená teplota. Pokud z nějakého důvodu není dostupná, je zde konstanta float.NaN.
+ /// Výčet .
+ public ResponseACK CmdGetTemperature(out float temp)
+ {
+ byte[] data = { 0x01 };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_GetTemperature, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if (SendAndReceive(ref txPacket, out rxPacket))
+ {
+ if (rxPacket.INST == (byte)ResponseACK.AllIsOk)
+ {
+ if ((rxPacket.SDATA != null) && (rxPacket.SDATA.Length == 2))
+ {
+ temp = (float)(rxPacket.SDATA[0] * 256 + rxPacket.SDATA[1]) / 10;
+ return ResponseACK.AllIsOk;
+ }
+ }
+ else
+ {
+ temp = float.NaN;
+ return (ResponseACK)rxPacket.INST;
+ }
+ }
+ temp = float.NaN;
+ return ResponseACK.OtherCommError;
+ }
+
+ ///
+ /// Nastavit datum a čas na aktuální čas ve Windows.
+ ///
+ ///
+ public bool CmdSetDateTime()
+ {
+ return CmdSetDateTime(DateTime.Now);
+ }
+
+ ///
+ /// Nastavit datum a čas na zadaný čas.
+ ///
+ /// Datum a čas, které se má nastavit do displeje.
+ ///
+ public bool CmdSetDateTime(DateTime date)
+ {
+ byte yy = (byte)(date.Year % 100);
+ byte[] data = { (byte)date.Hour, (byte)date.Minute, (byte)date.Second, (byte)date.Day, (byte)date.Month, yy };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetDateTime, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Přečte datum a čas z displeje.
+ ///
+ /// Datum a čas ze zařízení.
+ ///
+ public bool CmdGetDateTime(out DateTime date)
+ {
+ byte[] data = { };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_GetDateTime, 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 == 7))
+ {
+ date = new DateTime();
+ date = date.AddHours(rxPacket.SDATA[0]);
+ date = date.AddMinutes(rxPacket.SDATA[1]);
+ date = date.AddSeconds(rxPacket.SDATA[2]);
+ date = date.AddDays(rxPacket.SDATA[4] - 1);
+ date = date.AddMonths(rxPacket.SDATA[5] - 1);
+
+ int yy = DateTime.Now.Year - (DateTime.Now.Year % 100) + (rxPacket.SDATA[6] - 1);
+ date = date.AddYears(yy);
+
+ return true;
+ }
+ }
+
+ date = DateTime.MinValue;
+ return false;
+
+ }
+
+
+ ///
+ /// Manuální nastavení jasu displeje.
+ ///
+ /// Rozsah 0 až 36.
+ ///
+ public bool CmdSetBrightnessManual(byte brightness)
+ {
+ if ((brightness > 36) || (brightness < 0)) return false;
+
+ byte[] data = { brightness };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetBrightnessManual, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Ovládání automatického nastavování jasu displeje.
+ ///
+ /// Automtika zapnuta = true.
+ /// Minimální jas na který může automatika jít (rozsah 6-36).
+ /// Maximální jas na který může automatika jít (rozsah 6-36).
+ ///
+ public bool CmdSetBrightnessAuto(bool enable, byte min, byte max)
+ {
+ if ((min > 36) || (min < 6)) return false;
+ if ((max > 36) || (max < 6)) return false;
+
+ byte[] data = { Convert.ToByte(enable), min, max, 0 };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetBrightnessAuto, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Nastaví platnost dat na displeji.
+ ///
+ /// Doba platnosti ve vteřinách (max. 65535).
+ ///
+ public bool CmdSetDataValidity(UInt16 sec)
+ {
+ byte[] data = { (byte)(sec >> 8), (byte)sec };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetDataValidity, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Zobrazení dat na displeji - vstupem je string.
+ ///
+ ///
+ ///
+ public bool CmdSetDataAscii(string ascii)
+ {
+
+ byte[] data = Encoding.UTF8.GetBytes(ascii);
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetDataAscii, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Představuje jednotlivé segmenty znakovky.
+ ///
+ [Flags]
+ public enum SevenSeg : byte
+ {
+ a = 1,
+ b = 2,
+ c = 4,
+ d = 8,
+ e = 16,
+ f = 32,
+ g = 64,
+ dp = 128
+ }
+
+ ///
+ /// Zobrazení dat na displeji - vstupem je pole bytů. První byte jsou kontrolky.
+ ///
+ /// Binární data k zobrazení. První byte jsou kontrolky. Délka musí být počet segmentovek + 1.
+ ///
+ public bool CmdSetDataBin(byte[] data)
+ {
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetDataBin, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+
+ ///
+ /// Parametry instrukce Nastavení parametrů času a zobrazení.
+ ///
+ [Flags]
+ public enum SetFlags : UInt16
+ {
+ AutoSummerTime = 1,
+ ShowAutoOnPowerUp = 4,
+ ShowAutoAfterTimeout = 8,
+ HoursMode12 = 16,
+ ShowMonthFirst = 32,
+ ShowTimeInAutoItems = 256,
+ ShowDateInAutoItems = 512,
+ ShowTemperatureInAutoItems = 1024
+ }
+
+ ///
+ /// Nastavení parametrů času a zobrazení.
+ ///
+ /// Parametry složené ze .
+ /// Posun oproti UTC v minutách (jen pro TDS ETH).
+ /// Identifikátor časové zóny (jen pro TDS ETH).
+ ///
+ public bool CmdSetFlags(UInt16 flags, UInt16 offset, UInt16 zone = 0)
+ {
+
+ byte[] data = { (byte)(flags >> 8), (byte)flags, (byte)(offset >> 8), (byte)offset, (byte)(zone >> 8), (byte)zone };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetFlags, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Vynutit zobrazení automatických informací.
+ ///
+ ///
+ public bool CmdSetAutoInfo()
+ {
+
+ byte[] data = { };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_SetAutoInfo, data);
+ txPacket.ADR = this.ADR;
+ PacketSpinel97 rxPacket;
+
+ if ((SendAndReceive(ref txPacket, out rxPacket)) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
+ return true;
+ else
+ return false;
+
+ }
+
+ ///
+ /// Přečte stavy binárních vstupů.
+ ///
+ /// Pole 4 bytů se stavem vstupů. MSB je IN1. V každém bajtu je LSb (bit 0) aktuální stav vstupu. Bit 1 je v jedničce pokud byl od posledního čtení zaznamenána na vstupu úroveň 1 (stisk tlačítka).
+ ///
+ public bool CmdGetInputs(out byte[] inputs)
+ {
+
+ inputs = new byte[4];
+ byte[] data = { };
+
+ PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_TDS_GetInputs, 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 == 4))
+ {
+ inputs = rxPacket.SDATA;
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+
+ }
+}
diff --git a/README.md b/README.md
index 7c1f479..62e26e4 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,7 @@ Balíček knihoven a ukázkových aplikací pro práci se zařízeními komuniku
* **I/O moduly Quido**: [dokumentace a příklady použití](https://github.com/Papouchcom/spinel.net/wiki/Dokumentace:-Quido), [odkaz na web papouch.com](https://www.papouch.com/cz/website/mainmenu/clanky/vyberte-si/io-pro-ethernet-usb-rs485-rs232/)
* **Teploměry TQS3 a TQS4**: [dokumentace a příklady použití](https://github.com/Papouchcom/spinel.net/wiki/Dokumentace:-TQS), [odkaz na web papouch.com](https://www.papouch.com/cz/website/mainmenu/products/mereni/teplomery-vlhkomery/rs485-tqs/)
* **Senzory THT2 a TH2E**: [dokumentace a příklady použití](https://github.com/Papouchcom/spinel.net/wiki/Dokumentace:-THT2,-TH2E), [THT2 na papouch.com](https://www.papouch.com/cz/shop/product/tht2-vlhkomer-teplomer-rs485/), [TH2E na papouch.com](https://www.papouch.com/cz/shop/product/th2e-ethernetovy-teplomer-s-vlhkomerem/)
+* **Segmentové displeje TDS**
Knihovna umožňuje i komunikaci se zařízeními, které používají protokol Spinel, ale nejsou v knihovně implementovány (viz funkce [`SendAndReceive()`](https://github.com/Papouchcom/spinel.net/wiki/Spinel:-Ostatn%C3%AD-instrukce)).