Пример #1
0
        //! \brief constructor with single phase telegraph
        public SinglePhaseTelegraphService(SinglePhaseTelegraph tTelegraph, System.Int32 tTimeOut, SingleDeviceAdapter tAdapter)
            : base(tTelegraph, tTimeOut)
        {
            m_Adapter = tAdapter;

            Initialize();
        }
Пример #2
0
        //! \brief constructor with single phase telegraph
        public SinglePhaseTelegraphService(SinglePhaseTelegraph tTelegraph, SingleDeviceAdapter tAdapter)
            : base(tTelegraph)
        {
            m_Adapter = tAdapter;

            Initialize();
        }
Пример #3
0
        private void TestingSinglePhaseTelegraphEvent(SinglePhaseTelegraph tTelegraph, BM_TELEGRAPH_STATE State, ESCommand ReceivedCommand)
        {
            tTelegraph.SinglePhaseTelegraphEvent -= new SinglePhaseTelegraphEventHandler(TestingSinglePhaseTelegraphEvent);

            if (State == BM_TELEGRAPH_STATE.BM_TELE_RT_SUCCESS)
            {
                //! raising event
                OnAdapterAvailableTelegraphAutoDetectionReport
                    (TELEGRAPH_AUTO_DETECT_RESULT.ONE_TELEGRAPH_MATCHED, new String[1] {
                    tTelegraph.Type
                });
            }
            else
            {
                //! raising event
                OnAdapterAvailableTelegraphAutoDetectionReport
                    (TELEGRAPH_AUTO_DETECT_RESULT.NO_TELEGRAPH_MATCHED, null);
            }
        }
Пример #4
0
        public override Boolean AutoDetectDeviceTelegraph()
        {
            List <SinglePhaseTelegraph> tTestingTelegraphsList = new List <SinglePhaseTelegraph>();

            if (!Open)
            {
                return(false);
            }
            if (this.IsBusy)
            {
                return(false);
            }

            foreach (Telegraph tTelegraph in m_SupportTelegraphList)
            {
                if (null == tTelegraph)
                {
                    continue;
                }
                SinglePhaseTelegraph tTelegraphItem = tTelegraph.GetTestTelegraph() as SinglePhaseTelegraph;
                if (null != tTelegraphItem)
                {
                    tTestingTelegraphsList.Add(tTelegraphItem);
                }
            }

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

            foreach (SinglePhaseTelegraph tTelegraph in tTestingTelegraphsList)
            {
                tTelegraph.SinglePhaseTelegraphEvent += new SinglePhaseTelegraphEventHandler(TestingSinglePhaseTelegraphEvent);
            }

            this.TryToSendTelegraphs(tTestingTelegraphsList.ToArray());

            return(true);
        }
        //! implement interface IBMTelegraph : TryToSendTelegraph
        public System.Boolean TryToSendTelegraph(SinglePhaseTelegraph telTarget)
        {
            if (null == telTarget)
            {
                return(false);
            }

            if (!m_Available)
            {
                return(false);
            }

            if (null != m_Adapter)
            {
                m_Adapter.WriteLogLine("Try to send telegraph.");
            }

            /*
             * SinglePhaseTelegraphService tService = new SinglePhaseTelegraphService(telTarget, m_PipelServiceTimeOut, this);
             *
             * if (m_Pipeline.AddService(tService))
             * {
             *  //tService.StartSignal.WaitOne();
             *  return true;
             * }
             */
            lock (((ICollection)m_TelegrapGroupQueue).SyncRoot)
            {
                m_TelegrapGroupQueue.Enqueue(new SinglePhaseTelegraph[1] {
                    telTarget
                });
                m_WaitTelegraphGroup.Set();
            }

            this.IsWorking = true;

            return(true);
        }
        public override System.Boolean TryToSendTelegraphs(Telegraph[] telTagets)
        {
            List <SinglePhaseTelegraph> tList = new List <SinglePhaseTelegraph>();

            if (null == telTagets)
            {
                return(false);
            }

            foreach (Telegraph tTelegraph in telTagets)
            {
                SinglePhaseTelegraph tTelegraphItem = tTelegraph as SinglePhaseTelegraph;
                if (null != tTelegraphItem)
                {
                    tList.Add(tTelegraphItem);
                }
                else
                {
                    tTelegraph.OnCancel();
                }
            }

            return(TryToSendTelegraphs(tList.ToArray()));
        }
        //! try to send single phase telegraph
        public Boolean TryToSendTelegraph(SinglePhaseTelegraph telTarget)
        {
            lock (((ICollection)m_qTransmit).SyncRoot)
            {
                try
                {
                    //! add BatteryManageTelegraph item to queue
                    m_qTransmit.Enqueue(telTarget);
                }
                catch (System.Exception e)
                {
                    System.Console.WriteLine(e.ToString());
                    return(false);
                }
            }

            if (!IsWorking)
            {
                //! re-start engine
                IsWorking = true;
            }

            return(true);
        }
Пример #8
0
        //private AutoResetEvent m_EngineCompleteSignal = null;

        public override System.Boolean DoService()
        {
            if (Cancelled)
            {
                //! recieve cancel request
                OnCancelAllPendingTelegraphs();
                return(false);
            }

            if (FSM_SEND_TELEGRAPHS)
            {
                if (null == m_TelegraphList)
                {
                    return(false);
                }
                if (0 == m_TelegraphList.Count)
                {
                    return(false);
                }

                foreach (Telegraph tTelegraph in m_TelegraphList)
                {
                    SinglePhaseTelegraph tTelegraphItem = tTelegraph as SinglePhaseTelegraph;
                    if (null == tTelegraphItem)
                    {
                        //! cancel this telegraph
                        m_TelegraphList.Remove(tTelegraph);
                        tTelegraph.OnCancel();
                        continue;
                    }
                }


                if (null == m_tEngine)
                {
                    m_tEngine = m_TelegraphList[0].CreateTelegraphEngine() as SinglePhaseTelegraphEngine;
                    m_tEngine.ParentAdapter           = m_Adapter;
                    m_tEngine.Priority                = ThreadPriority.AboveNormal;
                    m_tEngine.EngineStateReportEvent += new EngineStateReport(EngineStateReportEventHandler);
                    m_Adapter.WriteLogLine("New telegraph engine is created.");
                }
                if (null != m_tEngine.CompleteSignal)
                {
                    m_tEngine.CompleteSignal.Reset();
                }

                m_tEngine.TryToSendTelegraphs(m_TelegraphList.ToArray());

                if (null != m_tEngine.CompleteSignal)
                {
                    m_tEngine.CompleteSignal.WaitOne();
                }
                else
                {
                    Thread.Sleep(10);
                }

                FSM_SEND_TELEGRAPHS = false;
                FSM_WAIT_RESULT     = true;
            }

            if (FSM_WAIT_RESULT)
            {
                do
                {
                    lock (((ICollection)m_TelegraphList).SyncRoot)
                    {
                        if (0 == m_TelegraphList.Count)
                        {
                            if (null != m_tEngine)
                            {
                                try
                                {
                                    m_tEngine.Dispose();
                                    m_tEngine = null;
                                }
                                catch (Exception)
                                {
                                }
                            }

                            //m_tEngine = null;
                            FSM_WAIT_RESULT     = false;
                            FSM_SEND_TELEGRAPHS = true;
                            return(false);
                        }
                    }

                    if (Cancelled)
                    {
                        FSM_WAIT_RESULT     = false;
                        FSM_SEND_TELEGRAPHS = true;

                        //! recieve cancel request
                        OnCancelAllPendingTelegraphs();
                        return(false);
                    }

                    Thread.Sleep(1);
                } while (true);
            }

            return(true);
        }
Пример #9
0
 //! implement interface IBMTelegraph : TryToSendTelegraph
 public Boolean TryToSendTelegraph(SinglePhaseTelegraph telTarget)
 {
     return(m_TelegraphAdapter.TryToSendTelegraph(telTarget));
 }
        //! try to send telegraph(single phase)
        public override System.Boolean TryToSendTelegraph(Telegraph telTarget)
        {
            SinglePhaseTelegraph tempTelegraph = telTarget as SinglePhaseTelegraph;

            return(TryToSendTelegraph(tempTelegraph));
        }
        //! communication thread
        protected override void DoCommunication()
        {
            m_StartSignal.Set();

            while (null == m_Adapter)
            {
                m_StopRequest.WaitOne();

                m_CompleteingSignal.Set();
                return;
            }

            SinglePhaseTelegraph telTemp = null;

            Byte[] temBuffer = null;
            List <SinglePhaseTelegraph> WaitReplyList = new List <SinglePhaseTelegraph>();
            //List<SinglePhaseTelegraph>.Enumerator ListenerEnum = WaitReplyList.GetEnumerator();
            Int32        tWaitListIndex = 0;
            Queue <Byte> qReceiveBuffer = new Queue <byte>();

            Byte[] tempReceiveBuffer = new Byte[256];

            //! internal task send telegraph
            Boolean FSM_GET_QUEUE_ITEM = true;
            Boolean FSM_ENCODE         = false;
            Boolean FSM_TRANSMIT_DATA  = false;
            Boolean FSM_RECEIVE_DATA   = false;

            //! interanl task receive telegraph
            Boolean FSM_GET_LIST_ENUM = true;
            Boolean FSM_GET_LIST_ITEM = false;
            Boolean FSM_GET_NEXT_ITEM = false;
            Boolean FSM_DECODE        = false;

            Boolean m_StopMessageSent = false;

            SinglePhaseTelegraph teleReceive = null;

            Boolean IsNoPendingTranmitItem = false;
            Boolean IsNoPendingReceiveItem = true;
            Int32   ReadingFailedCounter   = 0;

            if (m_Adapter.Open)
            {
                //! clean receive buffer
                while (m_Adapter.ReadDevice(ref tempReceiveBuffer, "All Dropped for flushing buffer"))
                {
                    ;
                }
            }

            while (true)
            {
                if (m_StopRequest.WaitOne(0, true))
                {
                    m_CompleteingSignal.Set();
                    OnEngineStateReport(TELEGRAPH_ENGINE_STATE.ENGINE_STOPED);
                    return;
                }

                while (!IsNoPendingTranmitItem)
                {
                    //! get item from telegraph queue
                    if (FSM_GET_QUEUE_ITEM)
                    {
                        //! get telegraph from queue
                        lock (((ICollection)m_qTransmit).SyncRoot)
                        {
                            if (0 != m_qTransmit.Count)
                            {
                                //! do next loop

                                telTemp                = m_qTransmit.Dequeue();
                                FSM_GET_QUEUE_ITEM     = false;
                                FSM_ENCODE             = true;
                                IsNoPendingTranmitItem = false;
                                m_StopMessageSent      = false;
                            }
                            else
                            {
                                IsNoPendingTranmitItem = true;
                            }
                        }
                    }

                    //! after get queue item, try to decoding
                    if (FSM_ENCODE)
                    {
                        lock (telTemp)
                        {
                            //! try to encode
                            temBuffer = telTemp.Encode();

                            if (null == temBuffer)
                            {
                                /*! nothing to transmit, directly check if this
                                 *  telegraph was cancelled and receive data
                                 */
                                FSM_RECEIVE_DATA = true;
                            }
                            else
                            {
                                //! try to transmit
                                FSM_TRANSMIT_DATA = true;
                            }

                            FSM_ENCODE = false;
                        }
                    }

                    //! transmit data to device
                    if (FSM_TRANSMIT_DATA)
                    {
                        if (m_Adapter.Open)
                        {
                            if (m_Adapter.WriteDeviceNoDebug(temBuffer))
                            {
                                //! data transmitted
                                FSM_RECEIVE_DATA = true;
                                //! rasing on communication event
                                m_Adapter.OnCommunication(MSG_DIRECTION.OUTPUT_MSG, temBuffer, telTemp.Description);
                            }
                            else
                            {
                                /*! failed to transmit data, rasing event and this telegraph
                                 *  will be dropped directly.
                                 */
                                telTemp.OnError(BM_TELEGRAPH_STATE.BM_TELE_RT_ERROR_FAILD_TO_WRITE_DEVICE);
                                FSM_GET_QUEUE_ITEM = true;
                            }
                            FSM_TRANSMIT_DATA = false;  //!< reset state
                        }
                        else if (telTemp.isCancelled)
                        {
                            //! raising cancel event
                            telTemp.OnCancel();

                            FSM_TRANSMIT_DATA  = false;
                            FSM_GET_QUEUE_ITEM = true;
                        }
                    }

                    if (FSM_RECEIVE_DATA)
                    {
                        //! check whether this telegraph was already cancelled.
                        if (telTemp.isCancelled)
                        {
                            //! raising cancel event
                            telTemp.OnCancel();
                        }
                        else
                        {
                            //! add this telegraph to wait reply list
                            WaitReplyList.Add(telTemp);
                        }

                        FSM_RECEIVE_DATA   = false;
                        FSM_GET_QUEUE_ITEM = true;      //!< reset state
                    }
                }

                Boolean bDropFlag = true;


                //! get a enum from list
                if (FSM_GET_LIST_ENUM)
                {
                    if (WaitReplyList.Count > 0)
                    {
                        //! create a copy of list
#if false
                        ListenerEnum = WaitReplyList.GetEnumerator();

                        tWaitListIndex = 0;

                        if (ListenerEnum.MoveNext())
                        {
                            IsNoPendingReceiveItem = false;
                            m_StopMessageSent      = false;

                            FSM_GET_LIST_ENUM = false;
                            FSM_GET_LIST_ITEM = true;
                        }
                        else
                        {
                            ListenerEnum.Dispose();
                            IsNoPendingReceiveItem = true;
                        }
#else
                        tWaitListIndex = 0;

                        IsNoPendingReceiveItem = false;
                        m_StopMessageSent      = false;

                        FSM_GET_LIST_ENUM = false;
                        FSM_GET_LIST_ITEM = true;
#endif
                    }
                    else
                    {
                        IsNoPendingReceiveItem = true;
                    }
                }



                //! get a item from list
                if (FSM_GET_LIST_ITEM)
                {
#if false
                    if (ListenerEnum.Current.isCancelled)
                    {
                        //! illegal list item

                        //! raising cancel event
                        ListenerEnum.Current.OnCancel();

                        //! remove current item
                        WaitReplyList.Remove(ListenerEnum.Current);

                        FSM_GET_NEXT_ITEM = true;
                    }
                    else
                    {
                        //! get a item
                        teleReceive = ListenerEnum.Current;

                        //! try to decode
                        FSM_DECODE = true;
                    }
#else
                    if (WaitReplyList[tWaitListIndex].isCancelled)
                    {
                        //! illegal list item

                        //! raising cancel event
                        WaitReplyList[tWaitListIndex].OnCancel();

                        //! remove current item
                        WaitReplyList.RemoveAt(tWaitListIndex);
                        tWaitListIndex--;
                        FSM_GET_NEXT_ITEM = true;
                    }
                    else
                    {
                        //! get a item
                        teleReceive = WaitReplyList[tWaitListIndex];

                        //! try to decode
                        FSM_DECODE = true;
                    }
#endif
                    FSM_GET_LIST_ITEM = false;
                }

                //! check if there any input data
                if (!IsNoPendingReceiveItem)
                {
                    if (m_Adapter.Open)
                    {
                        if (m_Adapter.ReadDeviceNoDebug(ref tempReceiveBuffer))
                        {
                            ReadingFailedCounter = 0;
                            //! add data to input buffer
                            foreach (Byte tValue in tempReceiveBuffer)
                            {
                                qReceiveBuffer.Enqueue(tValue);
                            }
                            //Thread.Sleep(1);
                        }
                        else
                        {
                            ReadingFailedCounter++;
                            if (ReadingFailedCounter > 10)
                            {
                                Thread.Sleep(50);
                            }
                        }
                    }
                }

                //! decode
                if (FSM_DECODE)
                {
                    Byte[] DropData = new Byte[1];

                    //! drop all zeros
                    while (qReceiveBuffer.Count > 0)
                    {
                        if (0 != qReceiveBuffer.Peek())
                        {
                            break;
                        }

                        //! drop one data
                        DropData[0] = qReceiveBuffer.Dequeue();

                        //! raising debug event
                        m_Adapter.OnCommunication(MSG_DIRECTION.INPUT_MSG, DropData, "Dropping Zero");
                    }
                    Boolean      tRequestDrop = false;
                    System.Int32 nDequeueSize = teleReceive.Decode(ref qReceiveBuffer, ref tRequestDrop);
                    if (0 < nDequeueSize)
                    {
                        //! decode success
                        System.Byte[] tempReceiveMessage = new System.Byte[nDequeueSize];
                        for (System.Int32 n = 0; n < nDequeueSize; n++)
                        {
                            tempReceiveMessage[n] = qReceiveBuffer.Dequeue();
                        }

                        //! raising debug event
                        m_Adapter.OnCommunication(MSG_DIRECTION.INPUT_MSG, tempReceiveMessage, teleReceive.Description);

                        WaitReplyList.Remove(teleReceive);      //!< remove telegraph from listener list

                        tRequestDrop      = false;
                        FSM_GET_LIST_ENUM = true;               //!< reset state machine
                    }
                    else
                    {
                        //! mismatch
                        if (!tRequestDrop)
                        {
                            bDropFlag = false;
                        }

                        FSM_GET_NEXT_ITEM = true;
                    }
                    FSM_DECODE = false;
                }


                //! get next available item
                if (FSM_GET_NEXT_ITEM)
                {
                    /*
                     * Boolean result = false;
                     *
                     * do
                     * {
                     *  try
                     *  {
                     *      result = ListenerEnum.MoveNext();
                     *      break;
                     *  }
                     *  catch (InvalidOperationException )
                     *  {
                     *      try
                     *      {
                     *          ListenerEnum.Dispose();
                     *      }
                     *      catch (Exception e2)
                     *      {
                     *          e2.ToString();
                     *      }
                     *
                     *      ListenerEnum = WaitReplyList.GetEnumerator();
                     *  }
                     * }
                     * while (true);
                     */
                    tWaitListIndex++;

                    if (tWaitListIndex < WaitReplyList.Count)
                    {
                        //! get next item
                        FSM_GET_LIST_ITEM = true;
                    }
                    else
                    {
                        List <Byte> tDropDataList = new List <Byte>();

                        if (bDropFlag)
                        {
                            if (qReceiveBuffer.Count > 0)
                            {
                                tDropDataList.Add(qReceiveBuffer.Dequeue());
                            }
                        }
                        bDropFlag = true;

                        while (qReceiveBuffer.Count > 0)
                        {
                            if (0 != qReceiveBuffer.Peek())
                            {
                                break;
                            }
                            //! drop one data
                            tDropDataList.Add(qReceiveBuffer.Dequeue());
                        }

                        if (tDropDataList.Count > 0)
                        {
                            //! raising debug event
                            m_Adapter.OnCommunication(MSG_DIRECTION.INPUT_MSG, tDropDataList.ToArray(), "Dropping byte(s)");
                        }

                        /*
                         * try
                         * {
                         *  ListenerEnum.Dispose();
                         * }
                         * catch (Exception e)
                         * {
                         *  e.ToString();
                         * }
                         */
                        FSM_GET_LIST_ENUM = true;
                    }
                    FSM_GET_NEXT_ITEM = false;
                }

                if (IsNoPendingTranmitItem && IsNoPendingReceiveItem)
                {
                    //m_StartSignal.Reset();
                    IsNoPendingTranmitItem = false;
                    if (!m_StopMessageSent)
                    {
                        m_CompleteingSignal.Set();
                        m_StopMessageSent = true;
                        OnEngineStateReport(TELEGRAPH_ENGINE_STATE.ENGINE_STOPED);
                    }

                    if (qReceiveBuffer.Count > 0)
                    {
                        qReceiveBuffer.Clear();
                    }
                }
            }
        }