Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <summary>
        ///     Čtení stavu vstupů
        /// </summary>
        /// <param name="inputs">pole logických stavů vstupů</param>
        /// <returns>vrací True pokud je přijata a zpracována korektní odpověď</returns>
        public Boolean CmdGetInputs(out Boolean[] inputs)
        {
            inputs = null;

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_QUIDO_GetInputs);

            txPacket.ADR = this.ADR;
            PacketSpinel97 rxPacket;

            if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
            {
                if (rxPacket.SDATA != null)
                {
                    inputs = new Boolean[(InputCount > -1) ? InputCount : rxPacket.SDATA.Length * 8];

                    byte index = 0;
                    while ((index < inputs.Length) && ((index / 8) < rxPacket.SDATA.Length))
                    {
                        inputs[index] = (((rxPacket.SDATA[rxPacket.SDATA.Length - (index / 8) - 1]) & (1 << (index % 8))) != 0);
                        index++;
                    }

                    return(true);
                }
            }
            return(false);
        }
Esempio n. 3
0
        /// <summary>
        ///     Nastavení samovolného vysílání
        /// </summary>
        /// <param name="enabled">je-li True, pak je samovolné vysílání aktivní</param>
        /// <returns>vrací True pokud je přijata a zpracována korektní odpověď</returns>
        public Boolean CmdGetAutoNotify(out byte format, out bool[] mask)
        {
            format = 0;
            mask   = null;

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_QUIDO_GetAutoNotify);

            txPacket.ADR = this.ADR;
            PacketSpinel97 rxPacket;

            if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
            {
                if ((rxPacket.SDATA != null) && (rxPacket.SDATA.Length > 1))
                {
                    format = (rxPacket.SDATA[0]);

                    mask = new bool[8 * (rxPacket.SDATA.Length - 1)];

                    for (int i = 0; i < mask.Length; i++)
                    {
                        mask[i] = ((rxPacket.SDATA[(i / 8) + 1] & (1 << (i % 8))) != 0);
                    }
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 4
0
        /// <summary>
        /// Přečte datum a čas z displeje.
        /// </summary>
        /// <param name="date">Datum a čas ze zařízení.</param>
        /// <returns></returns>
        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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <summary>
        ///    Čtení čítače
        /// </summary>
        /// <param name="index">pořadové číslo vstupu/čítače (indexováno od 1)</param>
        /// <param name="counter">vrací přečtenou hodnotu čítače</param>
        /// <param name="erase">je-li true, dojde při přečten k nulování tohoto čítače</param>
        /// <returns>vrací True pokud je přijata a zpracována korektní odpověď</returns>
        public Boolean CmdGetCounter(byte index, out int counter, bool erase = false)
        {
            counter = 0;

            byte[] data = new byte[1];
            data[0] = (byte)((index & 0x7F) | ((erase) ? 0x80 : 0x00));

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_QUIDO_GetCounter, 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 > 1))
                {
                    int len = rxPacket.SDATA[0];                                    // počet bitů counteru

                    int i = 1;
                    while ((i <= (len / 8)) && (i < rxPacket.SDATA.Length))
                    {
                        counter = ((counter * 0x100) + rxPacket.SDATA[i]);
                        i++;
                    }
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 7
0
        /// <summary>
        /// Zjistí počet segmentovek, vstupů a teplotních senzorů.
        /// </summary>
        /// <param name="SegCount">Počet znakovek.</param>
        /// <param name="InCount">Počet vstupů.</param>
        /// <param name="SnsCount">Počet teplotních senzorů.</param>
        /// <returns></returns>
        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);
        }
Esempio n. 8
0
        /// <summary>
        ///     Nastavení výstupu
        /// </summary>
        /// <param name="outid">výstup (indexováno od 1)</param>
        /// <param name="value">požadovaný stav</param>
        /// <param name="timer">čas po který bude výstup nastaven do požadovaného stavu, poté dojde ke změně na opačný stav. ( 1-255 * 0.5s )</param>
        /// <returns>vrací True v případě potvrzení příkazu modulem</returns>
        public Boolean CmdSetOutput(byte outid, Boolean value, byte timer = 0)
        {
            PacketSpinel97 txPacket = new PacketSpinel97();

            byte[] data;

            if (timer == 0)
            {
                txPacket.INST = S97_INST_QUIDO_SetOutput;

                data    = new byte[1];
                data[0] = (byte)(((value) ? 0x80 : 0x00) | (outid & 0x7F));
            }
            else
            {
                txPacket.INST = S97_INST_QUIDO_SetOutputTimered;

                data    = new byte[2];
                data[0] = timer;
                data[1] = (byte)(((value) ? 0x80 : 0x00) | (outid & 0x7F));
            }

            txPacket.ADR = this.ADR;

            txPacket.SDATA = data;

            PacketSpinel97 rxPacket;

            if (this.SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
            {
                return(true);
            }
            return(false);
        }
Esempio n. 9
0
        /// <summary>
        /// Vrací typ aktuálně nastaveného senzoru. (Nejedná se o autodetekci typu aktuálně připojeného senzoru. Typ senzoru se detekuje jen při zapnutí.)
        /// </summary>
        /// <param name="sensor">Typ senzoru detekovaného při zapnutí.</param>
        /// <returns>Výčet <see cref="ResponseACK"/>.</returns>
        public ResponseACK CmdGetSensorType(out SensorType sensor)
        {
            byte[] data = { };
            sensor = SensorType.Other;

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_Tht2Th2e_GetSensorType, 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 == 1))
                    {
                        if (rxPacket.SDATA[0] <= 4)
                        {
                            sensor = (SensorType)(rxPacket.SDATA[0]);
                        }
                        return(ResponseACK.AllIsOk);
                    }
                }
                else
                {
                    return((ResponseACK)rxPacket.INST);
                }
            }
            return(ResponseACK.OtherCommError);
        }
Esempio n. 10
0
        /// <summary>
        /// Ovládání automatického nastavování jasu displeje.
        /// </summary>
        /// <param name="enable">Automtika zapnuta = true.</param>
        /// <param name="min">Minimální jas na který může automatika jít (rozsah 6-36).</param>
        /// <param name="max">Maximální jas na který může automatika jít (rozsah 6-36).</param>
        /// <returns></returns>
        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);
            }
        }
Esempio n. 11
0
        /// <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);
        }
Esempio n. 12
0
        /// <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>Výčet <see cref="ResponseACK"/>.</returns>
        public ResponseACK 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))
            {
                if (rxPacket.INST == (byte)ResponseACK.AllIsOk)
                {
                    if ((rxPacket.SDATA != null) && (rxPacket.SDATA.Length == 2))
                    {
                        temp = (float)(rxPacket.SDATA[0] * 256 + rxPacket.SDATA[1]) / 32;
                        return(ResponseACK.AllIsOk);
                    }
                }
                else
                {
                    temp = float.NaN;
                    return((ResponseACK)rxPacket.INST);
                }
            }
            temp = float.NaN;
            return(ResponseACK.OtherCommError);
        }
Esempio n. 13
0
 public bool CheckReceivePacket(ref PacketSpinel97 rxPacket)
 {
     if ((rxPacket.INST < 0x10) && (rxPacket.SIG == this.tx_packet.SIG))
     {
         this.rx_packet = rxPacket;
         this.notify_rx_packet_receive.Set();
         return(true);
     }
     return(false);
 }
Esempio n. 14
0
        public override void PacketReceive(ref PacketSpinel97 packet)
        {
            base.PacketReceive(ref packet);

            if (packet.INST == 0x0D)
            {
                Debug.Print("Quido Autonotify Message");

                if ((OnInputsChange != null) || (OnInputChange != null))
                {
                    Boolean[] inputs = null;

                    if (packet.SDATA != null)
                    {
                        inputs = new Boolean[(InputCount > -1) ? InputCount : packet.SDATA.Length * 8];

                        byte index = 0;
                        while ((index < inputs.Length) && ((index / 8) < packet.SDATA.Length))
                        {
                            inputs[index] = (((packet.SDATA[packet.SDATA.Length - (index / 8) - 1]) & (1 << (index % 8))) != 0);
                            index++;
                        }
                        if (OnInputsChange != null)
                        {
                            OnInputsChange(this, inputs);
                        }
                        if (OnInputChange != null)
                        {
                            if (last_input_status == null)
                            {
                                last_input_status = new Boolean[inputs.Length];
                                for (int i = 0; (i < last_input_status.Length); i++)
                                {
                                    OnInputChange(this, i, inputs[i], inputs[i]);
                                    last_input_status[i] = inputs[i];
                                }
                            }
                            else
                            {
                                for (int i = 0; (i < last_input_status.Length); i++)
                                {
                                    if (last_input_status[i] != inputs[i])
                                    {
                                        OnInputChange(this, i, last_input_status[i], inputs[i]);
                                        last_input_status[i] = inputs[i];
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 15
0
        /// <summary>
        /// Měření aktuálních hodnot
        /// </summary>
        /// <param name="values">Třída se statusy a hodnotami jednotlivých veličin.</param>
        /// <returns>Výčet <see cref="ResponseACK"/>.</returns>
        public ResponseACK CmdGetMeasure(out MeasuredValues values)
        {
            values = new MeasuredValues();
            byte[] data = { 0x00 };

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_Tht2Th2e_GetMeasure, 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 > 0) && (rxPacket.SDATA.Length % 4 == 0))
                    {
                        int SectionIndex = FindSectionById(QuantityType.Temperature, ref rxPacket.SDATA);
                        if (SectionIndex > -1)
                        {
                            values.TemperatureStatus = (FlagsStatus)rxPacket.SDATA[SectionIndex + 1];
                            values.Temperature       = (float)(rxPacket.SDATA[SectionIndex + 2] * 256 + rxPacket.SDATA[SectionIndex + 3]) / 10;
                        }

                        SectionIndex = FindSectionById(QuantityType.DewPoint, ref rxPacket.SDATA);
                        if (SectionIndex > -1)
                        {
                            values.DewPointStatus = (FlagsStatus)rxPacket.SDATA[SectionIndex + 1];
                            values.DewPoint       = (float)(rxPacket.SDATA[SectionIndex + 2] * 256 + rxPacket.SDATA[SectionIndex + 3]) / 10;
                        }

                        SectionIndex = FindSectionById(QuantityType.Humidity, ref rxPacket.SDATA);
                        if (SectionIndex > -1)
                        {
                            values.HumidityStatus = (FlagsStatus)rxPacket.SDATA[SectionIndex + 1];
                            values.Humidity       = (float)(rxPacket.SDATA[SectionIndex + 2] * 256 + rxPacket.SDATA[SectionIndex + 3]) / 10;
                        }

                        if ((int)values.TemperatureStatus + (int)values.TemperatureStatus + (int)values.DewPointStatus > 0)
                        {
                            return(ResponseACK.AllIsOk);
                        }
                    }
                }
                else
                {
                    return((ResponseACK)rxPacket.INST);
                }
            }
            return(ResponseACK.OtherCommError);
        }
Esempio n. 16
0
        /// <summary>
        /// Zobrazení dat na displeji - vstupem je pole bytů. První byte jsou kontrolky.
        /// </summary>
        /// <param name="data">Binární data k zobrazení. První byte jsou kontrolky. Délka musí být počet segmentovek + 1.</param>
        /// <returns></returns>
        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);
            }
        }
Esempio n. 17
0
        /// <summary>
        ///     Čtení nastavení samovolného vysílání
        /// </summary>
        /// <param name="enabled">je li True, pak je samovolné vysílání zapnuto</param>
        /// <returns>vrací True pokud je přijata a zpracována korektní odpověď</returns>
        public Boolean CmdSetAutoNotify(bool enabled)
        {
            byte[] data = new byte[1];
            data[0] = (byte)((enabled) ? 0x01 : 0x00);

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_QUIDO_SetAutoNotify, data);

            txPacket.ADR = this.ADR;
            PacketSpinel97 rxPacket;

            if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
            {
                return(true);
            }
            return(false);
        }
Esempio n. 18
0
        /// <summary>
        ///    Nastavení čítače
        /// </summary>
        /// <param name="index">pořadové číslo vstupu/čítače (indexováno od 1)</param>
        /// <param name="rising">čítač reaguje na náběžnou hranu</param>
        /// <param name="falling">čítač reaguje na sestupnou hranu</param>
        /// <returns>vrací True pokud modul potvrdí zpracování příkazu</returns>
        public Boolean CmdSetCounterSettings(byte index, bool rising, bool falling)
        {
            byte[] data = new byte[1];
            data[0] = (byte)((index & 0x3F) | ((rising) ? 0x80 : 0x00) | ((falling) ? 0x40 : 0x00));

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_QUIDO_SetCounterSettings, data);

            txPacket.ADR = this.ADR;
            PacketSpinel97 rxPacket;

            if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
            {
                return(true);
            }
            return(false);
        }
Esempio n. 19
0
        public virtual void PacketReceive(ref PacketSpinel97 packet)
        {
            Debug.Print("Receive packet {0}", packet.INST);
            OnPacketReceive?.Invoke(packet);

            if (packet.INST < 0x10)
            {
                foreach (SpinelStackRec ssr in packets_to_receive)
                {
                    if (ssr.CheckReceivePacket(ref packet))
                    {
                        packets_to_receive.Remove(ssr);
                        return;
                    }
                }
            }
        }
Esempio n. 20
0
        /// <summary>
        /// Nastavení více výstupů najednou. Může obsahovat nastavení jednoho nebo až všech výstupů do požadovaného stavu. Stav může být pro každý výstup jiný.
        /// </summary>
        /// <param name="outs">List struktur <see cref="OutputState"/>. (Obsahují byte číslo výstupu a bool stav výstupu.)</param>
        /// <param name="timer">čas po který bude výstup nastaven do požadovaného stavu, poté dojde ke změně na opačný stav. ( 1-255 * 0.5s )</param>
        /// <returns>vrací True v případě potvrzení příkazu modulem</returns>
        public Boolean CmdSetOutputs(List <OutputState> outs, byte timer = 0)
        {
            PacketSpinel97 txPacket = new PacketSpinel97();

            byte[] data;

            if (outs.Count == 0)
            {
                return(false);
            }

            if (timer == 0)
            {
                txPacket.INST = S97_INST_QUIDO_SetOutput;

                data = new byte[outs.Count];
                for (int i = 0; i < outs.Count; i++)
                {
                    data[i] = (byte)(((outs[i].state) ? 0x80 : 0x00) | (outs[i].id & 0x7F));
                }
            }
            else
            {
                txPacket.INST = S97_INST_QUIDO_SetOutputTimered;

                data    = new byte[outs.Count + 1];
                data[0] = timer;
                for (int i = 0; i < outs.Count; i++)
                {
                    data[i + 1] = (byte)(((outs[i].state) ? 0x80 : 0x00) | (outs[i].id & 0x7F));
                }
            }

            txPacket.ADR = this.ADR;

            txPacket.SDATA = data;

            PacketSpinel97 rxPacket;

            if (this.SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
            {
                return(true);
            }
            return(false);
        }
Esempio n. 21
0
        /// <summary>
        /// Nastaví platnost dat na displeji.
        /// </summary>
        /// <param name="sec">Doba platnosti ve vteřinách (max. 65535).</param>
        /// <returns></returns>
        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);
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Zobrazení dat na displeji - vstupem je string.
        /// </summary>
        /// <param name="ascii"></param>
        /// <returns></returns>
        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);
            }
        }
Esempio n. 23
0
        /// <summary>
        /// Nastavení parametrů času a zobrazení.
        /// </summary>
        /// <param name="flags">Parametry složené ze <see cref="SetFlags"/>.</param>
        /// <param name="offset">Posun oproti UTC v minutách (jen pro TDS ETH).</param>
        /// <param name="zone">Identifikátor časové zóny (jen pro TDS ETH).</param>
        /// <returns></returns>
        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);
            }
        }
Esempio n. 24
0
        /// <summary>
        /// Nastaví uživatelsky definované číslo, které lze využít k zjištění stavu přístroje.
        /// </summary>
        /// <param name="dev_status">Po zapnutí přístroje, nebo po resetu (i softwarovém) je
        /// automaticky nastaven status 0x00. Pokud je touto funkcí status přestaven na jinou
        /// hodnotu, lze později snadno identifikovat, v jakém stavu se přístroj nachází.</param>
        /// <returns></returns>
        public Boolean CmdSetStatus(byte dev_status)
        {
            if ((ci != null) && (ci.Active))
            {
                byte[] data = { dev_status };

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

                PacketSpinel97 rxPacket;

                if (SendAndReceive(ref txPacket, out rxPacket) && (rxPacket.INST == (byte)ResponseACK.AllIsOk))
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 25
0
        /// <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);
        }
Esempio n. 26
0
        /// <summary>
        /// Nastavit datum a čas na zadaný čas.
        /// </summary>
        /// <param name="date">Datum a čas, které se má nastavit do displeje.</param>
        /// <returns></returns>
        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);
            }
        }
Esempio n. 27
0
        /// <summary>
        /// Přečte stavy binárních vstupů.
        /// </summary>
        /// <param name="inputs">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).</param>
        /// <returns></returns>
        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);
        }
Esempio n. 28
0
        /// <summary>
        /// Čtení teploty z připojeného 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>
        /// <param name="index">Číslo teploměru, číslováno od 1. Ve standardních Quidech je zde vždy 1.</param>
        /// <returns>Teplota v aktuálně nastavené teplotní jednotce.</returns>
        public Boolean CmdGetTemperature(out float temp, byte index = 0x01)
        {
            byte[] data = { index };

            PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_QUIDO_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 == 3))
                {
                    temp = (float)(rxPacket.SDATA[1] * 256 + rxPacket.SDATA[2]) / 10;
                    return(true);
                }
            }
            temp = float.NaN;
            return(false);
        }
Esempio n. 29
0
        public Boolean CmdGetInfo(out SpinelDeviceVersion version)
        {
            version = null;

            if ((ci != null) && (ci.Active))
            {
                PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_ReadInfo);
                txPacket.ADR = this.ADR;

                PacketSpinel97 rxPacket;

                if (this.SendAndReceive(ref txPacket, out rxPacket))
                {
                    version = new SpinelDeviceVersion(Encoding.ASCII.GetString(rxPacket.SDATA));
                    return(version.Valid);
                }
            }

            return(false);
        }
Esempio n. 30
0
        public Boolean CmdGetSN(out SpinelDeviceSN dev_sn)
        {
            dev_sn = null;

            if ((ci != null) && (ci.Active))
            {
                PacketSpinel97 txPacket = new PacketSpinel97(S97_INST_ReadSN);
                txPacket.ADR = this.ADR;

                PacketSpinel97 rxPacket;

                if (this.SendAndReceive(ref txPacket, out rxPacket))
                {
                    dev_sn = new SpinelDeviceSN(rxPacket.SDATA);
                    return(dev_sn.Valid);
                }
            }

            return(false);
        }