OpenCores
URL https://opencores.org/ocsvn/wbuart32/wbuart32/trunk

Subversion Repositories wbuart32

[/] [wbuart32/] [trunk/] [bench/] [cpp/] [uartsim.cpp] - Diff between revs 11 and 18

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 11 Rev 18
Line 55... Line 55...
 
 
        printf("Listening on port %d\n", port);
        printf("Listening on port %d\n", port);
 
 
        m_skt = socket(AF_INET, SOCK_STREAM, 0);
        m_skt = socket(AF_INET, SOCK_STREAM, 0);
        if (m_skt < 0) {
        if (m_skt < 0) {
                perror("Could not allocate socket: ");
                perror("ERR: Could not allocate socket: ");
                exit(-1);
                exit(EXIT_FAILURE);
        }
        }
 
 
        // Set the reuse address option
        // Set the reuse address option
        {
        {
                int optv = 1, er;
                int optv = 1, er;
                er = setsockopt(m_skt, SOL_SOCKET, SO_REUSEADDR, &optv, sizeof(optv));
                er = setsockopt(m_skt, SOL_SOCKET, SO_REUSEADDR, &optv, sizeof(optv));
                if (er != 0) {
                if (er != 0) {
                        perror("SockOpt Err:");
                        perror("ERR: SockOpt Err:");
                        exit(-1);
                        exit(EXIT_FAILURE);
                }
                }
        }
        }
 
 
        memset(&my_addr, 0, sizeof(struct sockaddr_in)); // clear structure
        memset(&my_addr, 0, sizeof(struct sockaddr_in)); // clear structure
        my_addr.sin_family = AF_INET;
        my_addr.sin_family = AF_INET;
Line 77... Line 77...
        // any/every one of them.
        // any/every one of them.
        my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        my_addr.sin_port = htons(port);
        my_addr.sin_port = htons(port);
 
 
        if (bind(m_skt, (struct sockaddr *)&my_addr, sizeof(my_addr))!=0) {
        if (bind(m_skt, (struct sockaddr *)&my_addr, sizeof(my_addr))!=0) {
                perror("BIND FAILED:");
                perror("ERR: BIND FAILED:");
                exit(-1);
                exit(EXIT_FAILURE);
        }
        }
 
 
        if (listen(m_skt, 1) != 0) {
        if (listen(m_skt, 1) != 0) {
                perror("Listen failed:");
                perror("ERR: Listen failed:");
                exit(-1);
                exit(EXIT_FAILURE);
        }
        }
}
}
 
 
UARTSIM::UARTSIM(const int port) {
UARTSIM::UARTSIM(const int port) {
        m_conrd = m_conwr = m_skt = -1;
        m_conrd = m_conwr = m_skt = -1;
Line 129... Line 129...
                m_fixdp   = (isetup >> 25)&1;
                m_fixdp   = (isetup >> 25)&1;
                m_evenp   = (isetup >> 24)&1;
                m_evenp   = (isetup >> 24)&1;
        }
        }
}
}
 
 
int     UARTSIM::nettick(int i_tx) {
void    UARTSIM::check_for_new_connections(void) {
        int     o_rx = 1;
 
 
 
        if ((m_conrd < 0)&&(m_conwr<0)&&(m_skt>=0)) {
        if ((m_conrd < 0)&&(m_conwr<0)&&(m_skt>=0)) {
                // Can we accept a connection?
                // Can we accept a connection?
                struct  pollfd  pb;
                struct  pollfd  pb;
 
 
                pb.fd = m_skt;
                pb.fd = m_skt;
Line 146... Line 144...
                        m_conrd = accept(m_skt, 0, 0);
                        m_conrd = accept(m_skt, 0, 0);
                        m_conwr = m_conrd;
                        m_conwr = m_conrd;
 
 
                        if (m_conrd < 0)
                        if (m_conrd < 0)
                                perror("Accept failed:");
                                perror("Accept failed:");
 
                        // else printf("New connection accepted!\n");
                }
                }
        }
        }
 
 
 
}
 
 
 
int     UARTSIM::nettick(int i_tx) {
 
        int     o_rx = 1, nr = 0;
 
 
 
        check_for_new_connections();
 
 
        if ((!i_tx)&&(m_last_tx))
        if ((!i_tx)&&(m_last_tx))
                m_rx_changectr = 0;
                m_rx_changectr = 0;
        else    m_rx_changectr++;
        else    m_rx_changectr++;
        m_last_tx = i_tx;
        m_last_tx = i_tx;
 
 
Line 171... Line 177...
                                char    buf[1];
                                char    buf[1];
                                buf[0] = (m_rx_data >> (32-m_nbits-m_nstop-m_nparity))&0x0ff;
                                buf[0] = (m_rx_data >> (32-m_nbits-m_nstop-m_nparity))&0x0ff;
                                if (1 != send(m_conwr, buf, 1, 0)) {
                                if (1 != send(m_conwr, buf, 1, 0)) {
                                        close(m_conwr);
                                        close(m_conwr);
                                        m_conrd = m_conwr = -1;
                                        m_conrd = m_conwr = -1;
 
                                        fprintf(stderr, "Failed write, connection closed\n");
                                }
                                }
                        }
                        }
                } else {
                } else {
                        m_rx_busy = (m_rx_busy << 1)|1;
                        m_rx_busy = (m_rx_busy << 1)|1;
                        // Low order bit is transmitted first, in this
                        // Low order bit is transmitted first, in this
Line 199... Line 206...
                pb.events = POLLIN;
                pb.events = POLLIN;
                if (poll(&pb, 1, 0) < 0)
                if (poll(&pb, 1, 0) < 0)
                        perror("Polling error:");
                        perror("Polling error:");
                if (pb.revents & POLLIN) {
                if (pb.revents & POLLIN) {
                        char    buf[1];
                        char    buf[1];
                        if (1 == recv(m_conrd, buf, 1, MSG_DONTWAIT)) {
                        if (1 == (nr = recv(m_conrd, buf, 1, MSG_DONTWAIT))) {
                                m_tx_data = (-1<<(m_nbits+m_nparity+1))
                                m_tx_data = (-1<<(m_nbits+m_nparity+1))
                                        // << nstart_bits
                                        // << nstart_bits
                                        |((buf[0]<<1)&0x01fe);
                                        |((buf[0]<<1)&0x01fe);
                                if (m_nparity) {
                                if (m_nparity) {
                                        int     p;
                                        int     p;
Line 224... Line 231...
                                }
                                }
                                m_tx_busy = (1<<(m_nbits+m_nparity+m_nstop+1))-1;
                                m_tx_busy = (1<<(m_nbits+m_nparity+m_nstop+1))-1;
                                m_tx_state = TXDATA;
                                m_tx_state = TXDATA;
                                o_rx = 0;
                                o_rx = 0;
                                m_tx_baudcounter = m_baud_counts-1;
                                m_tx_baudcounter = m_baud_counts-1;
 
                        } else if (nr == 0) {
 
                                close(m_conrd);
 
                                m_conrd = m_conwr = -1;
 
                                // printf("Closing network connection\n");
 
                        } else if (nr < 0) {
 
                                perror("O/S Read err:");
 
                                close(m_conrd);
 
                                m_conrd = m_conwr = -1;
                        }
                        }
                }
                }
        } else if (m_tx_baudcounter <= 0) {
        } else if (m_tx_baudcounter <= 0) {
                m_tx_data >>= 1;
                m_tx_data >>= 1;
                m_tx_busy >>= 1;
                m_tx_busy >>= 1;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.