| Line 50... | 
        Line 50... | 
      
      
         
  | 
         
  | 
      
      
        // From my own library
  | 
        // From my own library
  | 
      
      
        #include "llcomms.h"
  | 
        #include "llcomms.h"
  | 
      
      
        #include "deppi.h"
  | 
        #include "deppi.h"
  | 
      
      
         
  | 
         
  | 
      
      
        DEPPI::DEPPI(char *szSel) {
  | 
        FILE    *dbgfp = stderr;
  | 
      
      
                if (!DmgrOpen(&m_dev, szSel)) {
  | 
         
  | 
      
      
                        fprintf(stderr, "Open failed!\n");
  | 
        DEPPI::DEPPI(const char *szSel) {
  | 
      
      
           | 
                if ((!szSel)||(szSel[0] == '\0')) {
  | 
      
      
           | 
                        // Number of digilent devcies on a system
  | 
      
      
           | 
                        int     pcdvc;
  | 
      
      
           | 
         
  | 
      
      
           | 
                        // Go fish and try to find the device
  | 
      
      
           | 
                        DmgrEnumDevices(&pcdvc);
  | 
      
      
           | 
         
  | 
      
      
           | 
                        if (pcdvc < 0) {
  | 
      
      
           | 
                                depperr();
  | 
      
      
           | 
                                exit(EXIT_FAILURE);
  | 
      
      
           | 
                        }
  | 
      
      
           | 
         
  | 
      
      
           | 
                        //
  | 
      
      
           | 
                        int     found = 0; // Number of devices found mtg our criteria
  | 
      
      
           | 
                        DVC     dvcinfo; // A structure to receive device info
  | 
      
      
           | 
                        int     foundid=-1; // The id number of the device we found
  | 
      
      
           | 
         
  | 
      
      
           | 
                        //
  | 
      
      
           | 
                        for(int devid=0; devid < pcdvc; devid++) {
  | 
      
      
           | 
                                DmgrGetDvc(devid, &dvcinfo);
  | 
      
      
           | 
                                // fprintf(dbgfp, "DEVICE NAME: %s\n", dvcinfo.szName);
  | 
      
      
           | 
                                if (strcmp(dvcinfo.szName, "CmodS6")==0) {
  | 
      
      
           | 
                                        found++;
  | 
      
      
           | 
                                        // fprintf(dbgfp, "Found a CMOD!\n");
  | 
      
      
           | 
                                        foundid = devid;
  | 
      
      
           | 
                                }
  | 
      
      
           | 
                        }
  | 
      
      
           | 
         
  | 
      
      
           | 
                        if (found == 0) {
  | 
      
      
           | 
                                fprintf(stderr, "No CModS6 devices found\n");
  | 
      
      
           | 
                                exit(EXIT_FAILURE);
  | 
      
      
           | 
                        } else if (found > 1) {
  | 
      
      
           | 
                                fprintf(stderr, "More than one CModS6 device found.  Please consider opening your\n");
  | 
      
      
           | 
                                fprintf(stderr, "device with a valid serial number instead.\n");
  | 
      
      
           | 
                                exit(EXIT_FAILURE);
  | 
      
      
           | 
                        }
  | 
      
      
           | 
         
  | 
      
      
           | 
                        DmgrGetDvc(foundid, &dvcinfo);
  | 
      
      
           | 
                        if (!DmgrOpen(&m_dev, dvcinfo.szConn)) {
  | 
      
      
           | 
                                fprintf(stderr, "Could not open device!\n");
  | 
      
      
           | 
                                depperr();
  | 
      
      
           | 
                                exit(EXIT_FAILURE);
  | 
      
      
           | 
                        }
  | 
      
      
           | 
         
  | 
      
      
           | 
                        //
  | 
      
      
           | 
                        DmgrFreeDvcEnum();
  | 
      
      
           | 
                } else if (!DmgrOpen(&m_dev, (char *)szSel)) {
  | 
      
      
           | 
                        // We know the device serial number, so go open that particular
  | 
      
      
           | 
                        // device
  | 
      
      
           | 
                        fprintf(stderr, "Named device open (DmgrOpen) failed!\n");
  | 
      
      
           | 
                        depperr();
  | 
      
      
                        exit(EXIT_FAILURE);
  | 
                        exit(EXIT_FAILURE);
  | 
      
      
                }
  | 
                }
  | 
      
      
         
  | 
         
  | 
      
      
                if (!DeppEnable(m_dev)) {
  | 
                if (!DeppEnable(m_dev)) {
  | 
      
      
                        fprintf(stderr, "Could not enable DEPP interface\n");
  | 
                        fprintf(stderr, "Could not enable DEPP interface to (opened) device\n");
  | 
      
      
           | 
         
  | 
      
      
           | 
                        depperr();
  | 
      
      
                        exit(EXIT_FAILURE);
  | 
                        exit(EXIT_FAILURE);
  | 
      
      
                }
  | 
                }
  | 
      
      
         
  | 
         
  | 
      
      
                m_int = false, m_err = false;
  | 
                m_int = false, m_err = false;
  | 
      
      
         
  | 
         
  | 
      
      
        | Line 81... | 
        Line 134... | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        void    DEPPI::depperr(void) {
  | 
        void    DEPPI::depperr(void) {
  | 
      
      
                ERC     erc = DmgrGetLastError();
  | 
                ERC     erc = DmgrGetLastError();
  | 
      
      
                if(erc != ercNoErc) {
  | 
                if(erc != ercNoErc) {
  | 
      
      
                        char scode[cchErcMax], msg[cchErcMsgMax];
  | 
                        char scode[cchErcMax], smsg[cchErcMsgMax];
  | 
      
      
                        DmgrSzFromErc(erc, scode, msg);
  | 
                        DmgrSzFromErc(erc, scode, smsg);
  | 
      
      
                        fprintf(stderr, "ErrCode   : %s\n", scode);
  | 
                        fprintf(stderr, "ErrCode(%d): %s\n", erc, scode);
  | 
      
      
                        fprintf(stderr, "ErrMessage: %s\n", msg);
  | 
                        fprintf(stderr, "ErrMessage: %s\n", smsg);
  | 
      
      
           | 
         
  | 
      
      
           | 
                        if (erc == ercCapabilityConflict) {
  | 
      
      
           | 
                                fprintf(stderr, "Do you have the hardware manager in Vivado open?\n");
  | 
      
      
           | 
                                fprintf(stderr, "That could cause this conflict.\n");
  | 
      
      
           | 
                        }
  | 
      
      
                        close();
  | 
                        close();
  | 
      
      
                        exit(EXIT_FAILURE);
  | 
                        exit(EXIT_FAILURE);
  | 
      
      
                }
  | 
                }
  | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        void    DEPPI::write(char *buf, int len) {
  | 
        void    DEPPI::write(char *buf, int len) {
  | 
      
      
                bool    good = true;
  | 
                bool    good = true;
  | 
      
      
           | 
                const bool      dbg = false;
  | 
      
      
         
  | 
         
  | 
      
      
                if (false) {
  | 
                if (dbg) {
  | 
      
      
                        // Debug code--write one at a time
  | 
                        // Debug code--write one at a time
  | 
      
      
                        fputs("WR: ", stdout);
  | 
                        fputs("WR: ", stdout);
  | 
      
      
                        for(int i=0; i<len; i++) {
  | 
                        for(int i=0; i<len; i++) {
  | 
      
      
                                good = good && DeppPutReg(m_dev, 0, (unsigned char)buf[i], false);
  | 
                                good = good && DeppPutReg(m_dev, 0, (unsigned char)buf[i], false);
  | 
      
      
                                fputc(buf[i], stdout);
  | 
                                fputc(buf[i], stdout);
  | 
      
      
        | Line 113... | 
        Line 172... | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        int     DEPPI::read(char *buf, int len, int timeout_ms) {
  | 
        int     DEPPI::read(char *buf, int len, int timeout_ms) {
  | 
      
      
                int     left = len, nr=0;
  | 
                int     left = len, nr=0;
  | 
      
      
                struct  timespec        now, later;
  | 
                struct  timespec        now, later;
  | 
      
      
           | 
                const   bool    dbg = false;
  | 
      
      
         
  | 
         
  | 
      
      
                clock_gettime(CLOCK_MONOTONIC, &now);
  | 
                clock_gettime(CLOCK_MONOTONIC, &now);
  | 
      
      
         
  | 
         
  | 
      
      
                // printf("USBI::read(%d) (FIFO is %d-%d)\n", len, m_rend, m_rbeg);
  | 
                if (dbg) fprintf(dbgfp, "USBI::read(%d) (FIFO is %d-%d)\n", len, m_rend, m_rbeg);
  | 
      
      
                nr = pop_fifo(buf, left);
  | 
                nr = pop_fifo(buf, left);
  | 
      
      
                left -= nr;
  | 
                left -= nr;
  | 
      
      
         
  | 
         
  | 
      
      
                while(left > 0) {
  | 
                while(left > 0) {
  | 
      
      
                        raw_read(left, timeout_ms);
  | 
                        raw_read(left, timeout_ms);
  | 
      
      
                        nr = pop_fifo(&buf[len-left], left);
  | 
                        nr = pop_fifo(&buf[len-left], left);
  | 
      
      
                        left -= nr;
  | 
                        left -= nr;
  | 
      
      
         
  | 
         
  | 
      
      
                        // printf("\tWHILE (nr = %d, LEFT = %d, len=%d)\n", nr, left, len);
  | 
                        if (dbg) fprintf(dbgfp, "\tWHILE (nr = %d, LEFT = %d, len=%d)\n", nr, left, len);
  | 
      
      
                        if (nr == 0)
  | 
                        if (nr == 0)
  | 
      
      
                                break;
  | 
                                break;
  | 
      
      
        #define TIMEOUT
  | 
        #define TIMEOUT
  | 
      
      
        #ifdef  TIMEOUT
  | 
        #ifdef  TIMEOUT
  | 
      
      
                        if (timeout_ms == 0)
  | 
                        if (timeout_ms == 0)
  | 
      
      
        | Line 149... | 
        Line 209... | 
      
      
                                        break;
  | 
                                        break;
  | 
      
      
                        }
  | 
                        }
  | 
      
      
        #endif
  | 
        #endif
  | 
      
      
                }
  | 
                }
  | 
      
      
         
  | 
         
  | 
      
      
                // printf("READ %d characters (%d req, %d left)\n", len-left, len, left);
  | 
                if(dbg) fprintf(dbgfp, "READ %d characters (%d req, %d left)\n", len-left, len, left);
  | 
      
      
                return len-left;
  | 
                return len-left;
  | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        void    DEPPI::raw_read(const int clen, int timeout_ms) {
  | 
        void    DEPPI::raw_read(const int clen, int timeout_ms) {
  | 
      
      
                int     empty = RCV_BUFMASK - ((m_rbeg - m_rend)&(RCV_BUFMASK));
  | 
                int     empty = RCV_BUFMASK - ((m_rbeg - m_rend)&(RCV_BUFMASK));
  | 
      
      
                int     len = clen;
  | 
                int     len = clen;
  | 
      
      
                bool    good = true;
  | 
                bool    good = true;
  | 
      
      
           | 
                const   bool    dbg = false;
  | 
      
      
         
  | 
         
  | 
      
      
           | 
         
  | 
      
      
           | 
                if (dbg) fprintf(dbgfp, "DEPPI::raw_read(len=%d)\n", clen);
  | 
      
      
                if (len > empty)
  | 
                if (len > empty)
  | 
      
      
                        len = empty;
  | 
                        len = empty;
  | 
      
      
                if (len > 0) {
  | 
                if (len > 0) {
  | 
      
      
                        // Fill the tail of our buffer
  | 
                        // Fill the tail of our buffer
  | 
      
      
                        int ln = len;
  | 
                        int ln = len;
  | 
      
      
        | Line 175... | 
        Line 238... | 
      
      
                                        good = good && DeppGetReg(m_dev, 0, (unsigned char *)&m_rxbuf[i], false);
  | 
                                        good = good && DeppGetReg(m_dev, 0, (unsigned char *)&m_rxbuf[i], false);
  | 
      
      
                                        usleep(1);
  | 
                                        usleep(1);
  | 
      
      
                                }
  | 
                                }
  | 
      
      
                        } else
  | 
                        } else
  | 
      
      
                                good = good && DeppGetRegRepeat(m_dev, 0, (unsigned char *)m_rxbuf, ln, false);
  | 
                                good = good && DeppGetRegRepeat(m_dev, 0, (unsigned char *)m_rxbuf, ln, false);
  | 
      
      
                        // fprintf(stdout, "Pushing to FIFO\n");
  | 
                        if(dbg) fprintf(dbgfp, "DEPP: Pushing to FIFO\n");
  | 
      
      
                        push_fifo(m_rxbuf, ln);
  | 
                        push_fifo(m_rxbuf, ln);
  | 
      
      
                        len -= ln;
  | 
                        len -= ln;
  | 
      
      
                }
  | 
                }
  | 
      
      
         
  | 
         
  | 
      
      
                if (!good)
  | 
                if (!good)
  | 
      
      
                        depperr();
  | 
                        depperr();
  | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        void    DEPPI::flush_read(void) {
  | 
        void    DEPPI::flush_read(void) {
  | 
      
      
                while(poll(4)) {
  | 
                const   bool    dbg = false;
  | 
      
      
           | 
         
  | 
      
      
           | 
                if (dbg)        fprintf(dbgfp, "DEPPI::FLUSH-READ()\n");
  | 
      
      
           | 
         
  | 
      
      
           | 
                do {
  | 
      
      
                        m_rbeg = m_rend = 0;
  | 
                        m_rbeg = m_rend = 0;
  | 
      
      
                }
  | 
                } while(poll(4));
  | 
      
      
           | 
         
  | 
      
      
           | 
                if (dbg)        fprintf(dbgfp, "DEPPI::FLUSH-READ() -- COMPLETE\n");
  | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        void    DEPPI::push_fifo(char *buf, int len) {
  | 
        void    DEPPI::push_fifo(char *buf, int len) {
  | 
      
      
                char    last = 0;
  | 
                char    last = 0;
  | 
      
      
                char    *sptr = buf;
  | 
                char    *sptr = buf;
  | 
      
      
           | 
                const   bool    dbg = false;
  | 
      
      
         
  | 
         
  | 
      
      
                // fprintf(stdout, "PUSH(%d)\n", len);
  | 
                if (dbg)  fprintf(dbgfp, "DEPP::PUSH(%d)\n", len);
  | 
      
      
         
  | 
         
  | 
      
      
                if (m_rbeg != m_rend)
  | 
                if (m_rbeg != m_rend)
  | 
      
      
                        last = m_rbuf[(m_rbeg-1)&RCV_BUFMASK];
  | 
                        last = m_rbuf[(m_rbeg-1)&RCV_BUFMASK];
  | 
      
      
           | 
                if (dbg)        fprintf(dbgfp, "DEPPI::PUSH() last=%d, rbeg=%d, rend=%d\n", last, m_rbeg, m_rend);
  | 
      
      
                for(int i=0; i<len; i++) {
  | 
                for(int i=0; i<len; i++) {
  | 
      
      
                        char v = *sptr++;
  | 
                        char v = *sptr++;
  | 
      
      
                        if (((v & 0x80)||((unsigned char)v < 0x10))&&(v == last)) {
  | 
                        if (((v & 0x80)||((unsigned char)v < 0x10))&&(v == last)) {
  | 
      
      
                                // Skipp any stuff bytes
  | 
                                // Skipp any stuff bytes
  | 
      
      
                                // fprintf(stderr, "SKIPPING-1: %02x\n", v & 0x0ff);
  | 
                                if (dbg)  fprintf(dbgfp, "SKIPPING-1: %02x\n", v & 0x0ff);
  | 
      
      
                        } else if ((unsigned char)v == 0x0ff) {
  | 
                        } else if ((unsigned char)v == 0x0ff) {
  | 
      
      
                                // Skipp any not-yet-ready bytes
  | 
                                // Skipp any not-yet-ready bytes
  | 
      
      
                                // fprintf(stdout, "SKIPPING-2: %02x\n", 0x0ff);
  | 
                                if (dbg)  fprintf(dbgfp, "SKIPPING-2: %02x\n", 0x0ff);
  | 
      
      
                        } else {
  | 
                        } else {
  | 
      
      
                                m_rbuf[m_rbeg] = v;
  | 
                                m_rbuf[m_rbeg] = v;
  | 
      
      
                                // fprintf(stdout, "PUSHING: %02x %c\n", v&0x0ff,
  | 
                                if (dbg) fprintf(dbgfp, "PUSHING: 0x%02x \'%c\'\n",
  | 
      
      
                                //      isprint(v)?v:'.');
  | 
                                        v&0x0ff, isprint(v)?v:'.');
  | 
      
      
                                m_rbeg = (m_rbeg+1)&(RCV_BUFMASK);
  | 
                                m_rbeg = (m_rbeg+1)&(RCV_BUFMASK);
  | 
      
      
                        } last = v;
  | 
                        } last = v;
  | 
      
      
                }
  | 
                }
  | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        int     DEPPI::pop_fifo(char *buf, int len) {
  | 
        int     DEPPI::pop_fifo(char *buf, int len) {
  | 
      
      
                int     avail = (m_rbeg - m_rend)&(RCV_BUFMASK);
  | 
                int     avail = (m_rbeg - m_rend)&(RCV_BUFMASK);
  | 
      
      
                int     left = len;
  | 
                int     left = len;
  | 
      
      
                int     nr = 0;
  | 
                int     nr = 0;
  | 
      
      
           | 
                const   bool    dbg = false;
  | 
      
      
         
  | 
         
  | 
      
      
                // printf("Attempting to pop %d items from FIFO (%d - %d)\n",
  | 
                if (dbg) fprintf(dbgfp, "Attempting to pop %d items from FIFO (%d - %d)\n",
  | 
      
      
                //              len, m_rend, m_rbeg);
  | 
                                len, m_rend, m_rbeg);
  | 
      
      
                while((avail > 0)&&(left > 0)) {
  | 
                while((avail > 0)&&(left > 0)) {
  | 
      
      
                        int ln = RCV_BUFLEN-m_rend;
  | 
                        int ln = RCV_BUFLEN-m_rend;
  | 
      
      
                        if (ln > left)
  | 
                        if (ln > left)
  | 
      
      
                                ln = left;
  | 
                                ln = left;
  | 
      
      
                        if (ln > avail)
  | 
                        if (ln > avail)
  | 
      
      
        | Line 242... | 
        Line 314... | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
        bool    DEPPI::poll(unsigned ms) {
  | 
        bool    DEPPI::poll(unsigned ms) {
  | 
      
      
                int     avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
  | 
                int     avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
  | 
      
      
                bool    r = true;
  | 
                bool    r = true;
  | 
      
      
           | 
                const   bool    dbg = false;
  | 
      
      
         
  | 
         
  | 
      
      
                // printf("POLL\n");
  | 
                if (dbg) fprintf(dbgfp, "POLL\n");
  | 
      
      
                if ((avail < 2)&&((avail<1)||(m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10))) {
  | 
                if ((avail < 2)&&((avail<1)||(m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10))) {
  | 
      
      
                        // printf("POLL -- CALLS RAW READ\n");
  | 
                        if (dbg) fprintf(dbgfp, "POLL -- CALLS RAW READ\n");
  | 
      
      
                        raw_read(4,ms);
  | 
                        raw_read(4,ms);
  | 
      
      
                        avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
  | 
                        avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
  | 
      
      
         
  | 
         
  | 
      
      
                        if (avail != 0) {
  | 
                        if (avail != 0) {
  | 
      
      
                                // Read 'til there's nothing more to be read
  | 
                                // Read 'til there's nothing more to be read
  | 
      
      
        | Line 257... | 
        Line 330... | 
      
      
                                while(((v&0x80)==0)&&((unsigned)v>=0x10)&&(avail < RCV_BUFMASK-32)) {
  | 
                                while(((v&0x80)==0)&&((unsigned)v>=0x10)&&(avail < RCV_BUFMASK-32)) {
  | 
      
      
                                        raw_read(26,ms);
  | 
                                        raw_read(26,ms);
  | 
      
      
                                        if (avail == ((m_rbeg-m_rend)&(RCV_BUFMASK)))
  | 
                                        if (avail == ((m_rbeg-m_rend)&(RCV_BUFMASK)))
  | 
      
      
                                                break; // We didn't read anything more
  | 
                                                break; // We didn't read anything more
  | 
      
      
                                        avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
  | 
                                        avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
  | 
      
      
                                        // printf("POLL/LOOP -- %d available\n", avail);
  | 
                                        if (dbg) fprintf(dbgfp, "POLL/LOOP -- %d available\n", avail);
  | 
      
      
                                }
  | 
                                }
  | 
      
      
                                if (avail < 1)
  | 
                                if (avail < 1)
  | 
      
      
                                        r = false;
  | 
                                        r = false;
  | 
      
      
                                else if ((avail==1)&&((m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10)))
  | 
                                else if ((avail==1)&&((m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10)))
  | 
      
      
                                        r = false;
  | 
                                        r = false;
  | 
      
      
                        } else r = false;
  | 
                        } else r = false;
  | 
      
      
                }
  | 
                }
  | 
      
      
                // printf("POLL -- is %s\n", (r)?"true":"false");
  | 
                if (dbg) fprintf(dbgfp, "POLL -- is %s\n", (r)?"true":"false");
  | 
      
      
         
  | 
         
  | 
      
      
                return r;
  | 
                return r;
  | 
      
      
        }
  | 
        }
  | 
      
      
         
  | 
         
  | 
      
      
         No newline at end of file
  | 
         No newline at end of file
  |