コード例 #1
0
ファイル: gpib.cpp プロジェクト: dinguluer/vscp_software
int wxGPIB::Write(char* buf,size_t len)
{
    m_state = ibwrt(m_hd,buf,len);
    m_error = ThreadIberr();
    m_count = ThreadIbcnt();
    return m_count;
};
コード例 #2
0
ファイル: gpib.cpp プロジェクト: dinguluer/vscp_software
int wxGPIB::Read(char* buf,size_t len)
{
    // if something is in the fifo, first read that
    if(m_fifo->items() > 0) {
	   return m_fifo->read(buf,len);
    }
    m_state = ibrd(m_hd,buf,len);
    m_error = ThreadIberr();
    m_count = ThreadIbcnt();
    return m_count;
};
コード例 #3
0
ファイル: gpib.cpp プロジェクト: dinguluer/vscp_software
int wxGPIB::OpenDevice(const char* devname, void* dcs)
{
    // if dcs isn't NULL, type cast
    if(dcs) m_dcs = *(wxGPIB_DCS*)dcs;
    
    if(strncmp(devname,"gpib1",5) == 0) m_board = 0;
    else if(strncmp(devname,"gpib2",5) == 0) m_board = 1;
    if(m_board < 0) {
	   return -1;
    }
    // check for a valid timeout
    if((unsigned int)m_dcs.m_timeout > wxGPIB_TO_1000s) {
	   m_dcs.m_timeout = wxGPIB_TO_10us;
    }

    m_hd = ibdev(m_board,
			  m_dcs.m_address1,
			  m_dcs.m_address2,
			  m_dcs.m_timeout,
			  m_dcs.m_eot,
#ifdef __GNUG__
			  // FIXME!
			  // linux-gpib-3.2.08 doesn't work with any EOS (blocks). 
			  // Because we always has to add an EOS on the message 
			  // (independent of the m_eosChar setting), we can ignore it! 
			  0
#else
			  (m_dcs.m_eosMode << 8) | m_dcs.m_eosChar
#endif
	   );
    if(m_hd < 0) {
	   // no gpib controller installed (not found)
	   return -2;
    }
    // test for a connected listener (device with given address)
    short int listen = 0;
    ibln(m_board,m_dcs.m_address1,NO_SAD,&listen);
    if(!listen) {
	   // no listener at the given address
 	   CloseDevice();
 	   return -3;
    }
    // reset device
    ibclr(m_hd);
    // save state, error and count
    m_state = ThreadIbsta();
    m_count = ThreadIbcnt();
    m_error = ThreadIberr();
    // no error
    return 0;
};
コード例 #4
0
ファイル: gpibx.cpp プロジェクト: JONA-GA/connector_pi
int wxGPIB_x::Read(char* buf,size_t len)
{
    static char* rdbuf;
    if(m_fifo->items() > 0) {
	   return m_fifo->read(buf,len);
    }
    if(!m_asyncio) {
	   char spr = 0;
	   // ask the device if it is ready (this call blocks with Linux,
	   // so we reduced the serial poll timeout in the OpenDevice
	   // member function (look there)
	   ibrsp(m_hd,&spr);
	   if(spr & 0x10) {
		  // MAV Bit is set (message available), allocate memory on 
		  // heap. (Because the data transfer is asynchrone, the allocated
		  // memory must exist until the transfer finished. The GPIB
		  // device driver copy the data in it's interrupt service
		  // routine!!!)
		  m_asyncio = ASYNCRD;
		  rdbuf = new char[len];
		  memset(rdbuf,0,len);
		  // start the asynchron data transfer
		  ibrda(m_hd,rdbuf,len);
 	   }
    }
    if(m_asyncio == ASYNCRD ) {
	   ibwait(m_hd,0);
	   int state = ThreadIbsta();
 	   if((state & CMPL+ERR) == 0) {
		  return 0;
	   }
	   // asynchrone I/O was finished
	   m_asyncio = 0;
	   // save state, error and count
	   m_state = m_count = m_error = 0;
	   m_state = ThreadIbsta();
	   m_count = ThreadIbcnt();
	   m_error = ThreadIberr();
	   memcpy(buf,rdbuf,len);
	   delete rdbuf;
	   return m_count;
    }
    return 0;
};
コード例 #5
0
int wxGPIB_x::Write(char* buf,size_t len)
{
    if(!m_asyncio) {
        m_asyncio |= ASYNCWR;
        // start the asynchron data transfer
        ibwrta(m_hd,buf,len);
    }
    if(m_asyncio & ASYNCWR) {
        ibwait(m_hd,0);
        int state = ThreadIbsta();
        if((state & CMPL+ERR) == 0) {
            return 0;
        }
        m_asyncio = 0;
        // save state, error and count
        m_state = ThreadIbsta();
        m_count = ThreadIbcnt();
        m_error = ThreadIberr();
        return m_count;
    }
    // at this time, return 0 Bytes
    return 0;
};