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)).