Exemple #1
0
        object m_Data;                                          // ユーザーデータ

        public StateMachine()
        {
            m_Timer       = TMO.TMO_FEVR;
            m_TimeOut     = TMO.TMO_FEVR;
            m_TimeOutData = 0;
            m_OnTimeOut   = null;
        }
Exemple #2
0
        public Nucleus(IKernel kernel, int sysTmrIntNo, TMO sysTmrIntv)
        {
            m_Kernel      = kernel;
            m_SysTmrIntNo = sysTmrIntNo;
            m_SysTmrIntv  = sysTmrIntv;

            m_rsys.sysstat = SYSSTAT.TTS_INDP;

            for (int i = 0; i < m_ReadyQueue.Length; i++)
            {
                m_ReadyQueue[i] = new LinkedList <Task>();
            }

            m_SysTime.Value = 0;
            m_CurrentTask   = null;
            m_lwIP          = new lwip(ip_output);
#if LWIP_STATS
            stats.stats_init();
#endif
            sys.sys_init(m_lwIP, this);

            m_lwIP.mem_init();
            lwip.memp_init();
            pbuf.pbuf_init(m_lwIP);

            udp.udp_init(m_lwIP);
            tcp.tcp_init(m_lwIP);
        }
Exemple #3
0
        public ER Connect(T_IPV4EP p_myaddr, T_IPV4EP p_dstaddr, TMO tmout)
        {
            err_t   err;
            ip_addr ma = new ip_addr(0);
            ip_addr sa = new ip_addr(0);

            ma.addr = lwip.lwip_htonl(p_myaddr.ipaddr);
            err     = m_lwIP.tcp.tcp_bind(m_Pcb, ma, lwip.lwip_htons(p_myaddr.portno));
            if (err != err_t.ERR_OK)
            {
                return(ER.E_OBJ);
            }

            sa.addr = lwip.lwip_htonl(p_dstaddr.ipaddr);
            err     = m_lwIP.tcp.tcp_connect(m_Pcb, sa, lwip.lwip_htons(p_dstaddr.portno), Connected);
            if (err != err_t.ERR_OK)
            {
                return(ER.E_OBJ);
            }

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            if (task == null)
            {
                return(ER.E_TMOUT);
            }

            if (tmout == 0)
            {
                return(ER.E_TMOUT);
            }

            SetState(true, new TMO(tcp.TCP_TMR_INTERVAL), task, Intarval);

            ER ret = task.Wait(m_SendTaskQueue, TSKWAIT.TTW_TCP, m_CepID, tmout);

            switch (ret)
            {
            case ER.E_OK:
                if ((m_TPcb == null) || (m_TPcb.state != tcp_state.ESTABLISHED))
                {
                    return(ER.E_RLWAI);
                }
                break;

            case ER.E_TMOUT:
                return(ER.E_TMOUT);

            default:
                return(ER.E_RLWAI);
            }

            return(ER.E_OK);
        }
Exemple #4
0
 protected void SetState(ST state)
 {
     m_State       = state;
     m_Timer       = TMO.TMO_FEVR;
     m_TimeOut     = TMO.TMO_FEVR;
     m_TimeOutData = 0;
     m_OnTimeOut   = null;
 }
Exemple #5
0
        public ER ReceiveMessage(out T_MSG ppk_msg, TMO tmout)
        {
            ER ret;

            ppk_msg = null;

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            //if (ppk_msg == null)
            //	return ER.E_PAR;

            if ((m_TskQueue.First == null) && (m_MsgQueue.First != null))
            {
                ppk_msg = m_MsgQueue.First.Value;
                m_MsgQueue.RemoveFirst();
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_MBX, m_MbxID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    if (m_MsgQueue.First == null)
                    {
                        return(ER.E_RLWAI);
                    }
                    ppk_msg = m_MsgQueue.First.Value;
                    m_MsgQueue.RemoveFirst();
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            //SetDebugInfo(ppk_msg, lpszFileName, nLine);

            return(ER.E_OK);
        }
Exemple #6
0
 protected void SetState(ST state, TMO timeOut, object timeOutData,
                         TTimeOutEvent onTimeOut)
 {
     m_State       = state;
     m_Timer       = timeOut;
     m_TimeOut     = timeOut;
     m_TimeOutData = timeOutData;
     m_OnTimeOut   = onTimeOut;
 }
Exemple #7
0
        public ER GetMemoryBlock(out pointer p_blk, int blksz, TMO tmout)
        {
            ER ret;

            p_blk = null;

            //if (p_blk == null)
            //	return ER.E_PAR;

            for (; ;)
            {
                TMemNode Node = Allocate(blksz);

                if (Node != null)
                {
                    p_blk = Node.GetData();
                    break;
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                Task task = m_Nucleus.GetTask(ID.TSK_SELF);

                if (task == null)
                {
                    return(ER.E_CTX);
                }

                task.MemoryBlockSize = blksz;
                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_MPL, m_MplID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    continue;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }
#if DEBUG
            string lpszFileName = "";
            int    nLine        = 0;
            _CrtMemBlockHeader.AddBlock(m_pFirstBlock, m_pLastBlock, p_blk, blksz, lpszFileName, nLine);
            m_nBlockCount++;
#endif
            return(ER.E_OK);
        }
Exemple #8
0
        public ER Wait(LinkedList <Task> WaitQueue, TSKWAIT tskwait, ID wid, TMO tmout)
        {
            ER Result;

            System.Diagnostics.Debug.Assert(m_CPUContext.IsCurrent());

            if (m_rtsk.tskstat == TSKSTAT.TTS_SUS)
            {
                m_rtsk.tskstat = TSKSTAT.TTS_WAS;
            }
            else if (m_rtsk.tskstat == TSKSTAT.TTS_RUN)
            {
                System.Diagnostics.Debug.Assert(m_Nucleus.m_CurrentTask == this);
                m_rtsk.tskstat          = TSKSTAT.TTS_WAI;
                m_Nucleus.m_CurrentTask = null;
            }
            else
            {
                m_rtsk.tskstat = TSKSTAT.TTS_WAI;
            }
            m_rtsk.tskwait = tskwait;
            m_rtsk.wid     = wid;

            m_Nucleus.m_ReadyQueue[m_rtsk.tskpri].Remove(this);

            // 待ちタスクキューへ追加
            WaitQueue.AddLast(this);

            // タイマー設定
            SetState(false, tmout, WaitQueue, OnTimeOut);

            // タスクスケジューリング
            if (m_CPUContext.Dispatch())
            {
                if (State)
                {
                    Result = ER.E_TMOUT;
                }
                else
                {
                    Result = ER.E_OK;
                }
            }
            else
            {
                m_rtsk.tskstat = TSKSTAT.TTS_RUN;
                m_ReleaseWait  = true;
                Result         = ER.E_RLWAI;
            }

            return(Result);
        }
Exemple #9
0
        public ER Close(TMO tmout)
        {
            err_t err = m_lwIP.tcp.tcp_close(m_Pcb);

            if (err == err_t.ERR_OK)
            {
                return(ER.E_OK);
            }
            else
            {
                return(ER.E_OBJ);
            }
        }
Exemple #10
0
 public void CallTimeOut()
 {
     if (m_Timer == 0)
     {
         // タイムアウト処理関数呼び出し
         if (m_OnTimeOut != null)
         {
             m_OnTimeOut(m_TimeOutData);
         }
         // 新タイムアウト値設定
         m_Timer = m_TimeOut;
     }
 }
Exemple #11
0
        public void Progress(TMO interval)
        {
            if (m_TimeOut == TMO.TMO_FEVR)
            {
                m_Timer = TMO.TMO_FEVR;
                return;
            }

            m_Timer.Value -= interval;
            if (m_Timer <= 0)
            {
                m_Timer.Value = 0;
            }
        }
Exemple #12
0
        public ER GetMemoryBlock(out pointer p_blk, int blksz, TMO tmout)
        {
            ER ret;

            p_blk = null;

            //if (p_blk == null)
            //	return ER.E_PAR;

            for (; ;)
            {
                LinkedListNode <pointer> Node = m_MpfQueue.First;

                if (Node != null)
                {
                    p_blk = Node.Value;
                    m_MpfQueue.RemoveFirst();
                    break;
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                Task task = m_Nucleus.GetTask(ID.TSK_SELF);

                if (task == null)
                {
                    return(ER.E_CTX);
                }

                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_MPF, m_MpfID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    continue;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            return(ER.E_OK);
        }
Exemple #13
0
        public Kernel(long frequency, int sysTmrIntNo, TMO sysTmrIntv)
        {
            m_Nucleus = new Nucleus(this, sysTmrIntNo, sysTmrIntv);

            m_Frequency            = frequency;
            m_OnSetEvent           = null;
            m_OnStart              = null;
            m_OnTerminate          = null;
            m_OnIdle               = null;
            m_OnOutput             = null;
            m_OnGetSystemTimeEvent = null;

            m_Thread      = null;
            m_Terminate   = false;
            m_IntEvent    = null;
            m_Locked      = 0;
            m_TaskMode    = false;
            m_TlsIndex    = new ThreadLocal <int>();
            m_SysSem      = new System.Threading.Semaphore(1, 1);
            m_CallbackSem = new System.Threading.Semaphore(1, 1);
            m_Lock        = 0;
        }
Exemple #14
0
        public ER Wait(TMO tmout)
        {
            ER ret;

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            m_Count--;

            if (m_Count < 0)
            {
                if (tmout == 0)
                {
                    m_Count++;
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_SEM, m_SemID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    return(ER.E_OK);

                case ER.E_TMOUT:
                    m_Count++;
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            return(ER.E_OK);
        }
Exemple #15
0
        public ER Sleep(TMO tmout)
        {
            ER ret;

            if (tmout == TMO.TMO_POL)
            {
                if (m_rtsk.wupcnt > 0)
                {
                    m_rtsk.wupcnt--;
                }

                return(ER.E_OK);
            }

            if (m_rtsk.wupcnt <= 0)
            {
                ret = Wait(m_Nucleus.m_SlpTskQ, TSKWAIT.TTW_SLP, new ID(0), tmout);

                switch (ret)
                {
                case ER.E_OK:
                    m_rtsk.wupcnt = 0;
                    return(ER.E_OK);

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }
            else
            {
                m_rtsk.wupcnt--;

                return(ER.E_OK);
            }
        }
Exemple #16
0
        public ER SendData(T_IPV6EP p_dstaddr, pointer p_dat, int len, TMO tmout)
        {
            pbuf     buf;
            ip6_addr addr = new ip6_addr(p_dstaddr.ipaddr);

            buf = m_lwIP.pbuf_alloc(pbuf_layer.PBUF_TRANSPORT, (ushort)len, pbuf_type.PBUF_POOL);
            if (buf == null)
            {
                return(ER.E_NOMEM);
            }

            int pos = 0;

            for (pbuf q = buf; q != null; q = q.next)
            {
                pointer.memcpy(q.payload, new pointer(p_dat, pos), q.len);
                pos += q.len;
            }

            //m_lwIP.udp.udp_sendto(m_Pcb, buf, addr, p_dstaddr.portno);

            return(ER.E_OK);
        }
Exemple #17
0
        public ER ReceiveData(T_IPV6EP p_dstaddr, pointer p_dat, int len, TMO tmout)
        {
            ER ret;

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            if ((p_dat == null) || (len < 0))
            {
                return(ER.E_PAR);
            }

            if ((m_TskQueue.First == null) && (m_DatQueue.First != null))
            {
                pointer data;
                lock (m_DatQueue) {
                    data = m_DatQueue.First.Value;
                    m_DatQueue.RemoveFirst();
                }

                int dlen = (ushort)data;
                pointer.memcpy(p_dstaddr, data + sizeof(ushort), T_IPV6EP.length);
                pointer.memcpy(p_dat, data + sizeof(ushort) + T_IPV6EP.length, dlen);

                return((ER)dlen);
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_UDP, m_CepID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    if (m_DatQueue.First == null)
                    {
                        return(ER.E_RLWAI);
                    }
                    lock (m_DatQueue) {
                        p_dat = new pointer(m_DatQueue.First.Value, 0);
                        m_DatQueue.RemoveFirst();
                    }
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            //SetDebugInfo(p_dat, lpszFileName, nLine);

            return(ER.E_OK);
        }
Exemple #18
0
        public ER GetBuffer(ref pointer p_data, TMO tmout)
        {
            int result;
            ER  ret;

            //if (p_data == null)
            //	return ER.E_PAR;

            if ((m_SendMode != BufferMode.None) && (m_SendMode != BufferMode.ReduceCopy))
            {
                return(ER.E_OBJ);
            }

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            // リングバッファが空っぽかループしている場合
            if (m_RCSendWrPos <= m_RCSendRdPos)
            {
                result = m_RCSendData.Length - 1 - m_RCSendWrPos;
            }
            // リングバッファのループしていない区間
            else
            {
                result = m_RCSendWrPos - m_RCSendRdPos;
            }

            if ((m_SendTaskQueue.First == null) && (result != 0))
            {
                p_data = new pointer(m_RCSendData, m_RCSendWrPos);
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_SendTaskQueue, TSKWAIT.TTW_TCP, m_CepID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    // リングバッファが空っぽかループしている場合
                    if (m_RCSendWrPos <= m_RCSendRdPos)
                    {
                        result = m_RCSendData.Length - 1 - m_RCSendWrPos;
                    }
                    // リングバッファのループしていない区間
                    else
                    {
                        result = m_RCSendWrPos - m_RCSendRdPos;
                    }
                    if (result == 0)
                    {
                        return(ER.E_RLWAI);
                    }
                    p_data = new pointer(m_RCSendData, m_RCSendWrPos);
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            m_SendMode = BufferMode.ReduceCopy;

            return((ER)result);
        }
Exemple #19
0
        public ER WaitEventFlag(ref FLGPTN p_flgptn, TMO tmout, FLGPTN waiptn, MODE wfmode)
        {
            ER ret;

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            //if (p_flgptn == null)
            //	return ER.E_PAR;

            if ((wfmode & ~(MODE.TWF_ANDW | MODE.TWF_ORW | MODE.TWF_CLR)) != 0)
            {
                return(ER.E_PAR);
            }

            if ((m_TskQueue.First == null) && CheckPattern(waiptn, wfmode))
            {
                p_flgptn = m_FlagPattern;
                if ((wfmode & MODE.TWF_CLR) != 0)
                {
                    m_FlagPattern = 0;
                }
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                task.WaitPattern = waiptn;
                task.WaitMode    = wfmode;
                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_FLG, m_FlgID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    p_flgptn = m_FlagPattern;
                    if (!CheckPattern(waiptn, wfmode))
                    {
                        return(ER.E_RLWAI);
                    }
                    if ((wfmode & MODE.TWF_CLR) != 0)
                    {
                        m_FlagPattern = 0;
                    }
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            return(ER.E_OK);
        }
Exemple #20
0
        public ER ReceiveBuffer(ref pointer p_data, TMO tmout)
        {
            int result = 0;
            ER  ret;

            if (p_data == null)
            {
                return(ER.E_PAR);
            }

            if ((m_RecvMode != BufferMode.None) && (m_RecvMode != BufferMode.ReduceCopy))
            {
                return(ER.E_OBJ);
            }

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            if ((m_RecvTaskQueue.First == null) && (m_RecvPBuf != null || m_RecvDataQueue.Count != 0))
            {
                p_data = new pointer(m_RecvPBufPos.payload, m_RecvPos);
                result = m_RecvPBufPos.len - m_RecvPos;
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_RecvTaskQueue, TSKWAIT.TTW_TCP, m_CepID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    if (m_RecvDataQueue.Count == 0)
                    {
                        return(ER.E_RLWAI);
                    }
                    p_data = new pointer(m_RecvPBufPos.payload, m_RecvPos);
                    result = m_RecvPBufPos.len - m_RecvPos;
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            m_RecvMode = BufferMode.ReduceCopy;

            return((ER)result);
        }
Exemple #21
0
 public ER SendUrgentData(pointer data, int len, TMO tmout)
 {
     throw new NotImplementedException();
 }
Exemple #22
0
        public ER Accept(TcpRep tcpRep, T_IPV4EP p_dstaddr, TMO tmout)
        {
            tcp_pcb_listen pcb = m_lwIP.tcp.tcp_listen(m_Pcb);

            return(tcpRep.Accept(pcb, this, p_dstaddr, tmout));
        }
Exemple #23
0
        internal ER Accept(tcp_pcb_listen pcb, TcpCep cep, T_IPV4EP p_dstaddr, TMO tmout)
        {
            ER ret;

            m_Pcb    = pcb;
            m_TcpCep = cep;

            tcp.tcp_accept(pcb, Accepting);

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            //if (p_dstaddr == null)
            //	return ER.E_PAR;

            if ((m_TskQueue.First == null) && (m_AcceptQueue.First != null))
            {
                m_NewPcb = m_AcceptQueue.First.Value;
                m_AcceptQueue.RemoveFirst();
                p_dstaddr.ipaddr = lwip.lwip_ntohl(m_NewPcb.remote_ip.addr);
                p_dstaddr.portno = lwip.lwip_ntohs(m_NewPcb.remote_port);
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_TskQueue, TSKWAIT.TTW_ACP, m_RepID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    if (m_AcceptQueue.First == null)
                    {
                        return(ER.E_RLWAI);
                    }
                    m_NewPcb = m_AcceptQueue.First.Value;
                    m_AcceptQueue.RemoveFirst();
                    p_dstaddr.ipaddr = lwip.lwip_ntohl(m_NewPcb.remote_ip.addr);
                    p_dstaddr.portno = lwip.lwip_ntohs(m_NewPcb.remote_port);
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            return(ER.E_OK);
        }
Exemple #24
0
        public ER SendData(pointer p_data, int len, TMO tmout)
        {
            int result = 0;
            ER  ret;

            if (p_data == null)
            {
                return(ER.E_PAR);
            }

            if ((m_SendMode != BufferMode.None) && (m_SendMode != BufferMode.NormalCopy))
            {
                return(ER.E_OBJ);
            }

            Task task = m_Nucleus.GetTask(ID.TSK_SELF);

            if ((tmout != 0) && (task == null))
            {
                return(ER.E_CTX);
            }

            int space = tcp.tcp_sndbuf(m_TPcb);

            if ((m_SendPBuf == null) && (space >= len))
            {
                m_SendPBuf = p_data;
                m_SendPos  = 0;
                m_SendLen  = len;
                SentData(this, m_TPcb, (ushort)space);
            }
            else
            {
                if (task == null)
                {
                    return(ER.E_TMOUT);
                }

                if (tmout == 0)
                {
                    return(ER.E_TMOUT);
                }

                ret = task.Wait(m_SendTaskQueue, TSKWAIT.TTW_TCP, m_CepID, tmout);

                switch (ret)
                {
                case ER.E_OK:
                    if (m_SendPBuf != null)
                    {
                        return(ER.E_RLWAI);
                    }

                    m_SendPBuf = p_data;
                    m_SendPos  = 0;
                    m_SendLen  = len;
                    SentData(this, m_TPcb, tcp.tcp_sndbuf(m_TPcb));
                    break;

                case ER.E_TMOUT:
                    return(ER.E_TMOUT);

                default:
                    return(ER.E_RLWAI);
                }
            }

            m_SendMode = BufferMode.NormalCopy;

            return((ER)result);
        }
Exemple #25
0
 public abstract void Progress(TMO interval);