int wxGPIB::Write(char* buf,size_t len) { m_state = ibwrt(m_hd,buf,len); m_error = ThreadIberr(); m_count = ThreadIbcnt(); return m_count; };
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; };
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; };
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; };
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; };