Commit 6253ccbd by yiannis

Added support for variable size channels.

parent 44fe2a09
......@@ -2,7 +2,7 @@
///
// DAQ low level IO Library
//
// $Id: DaqFileIO.cxx,v 1.9 2005/03/14 23:05:04 yiannis Exp $
// $Id: DaqFileIO.cxx,v 1.10 2005/03/22 20:12:17 yiannis Exp $
// Date: March, 2005
// Author: Yiannis Papelis
//
......@@ -982,8 +982,24 @@ CDaqLowLevelIo::CheckIntegrity(
}
else {
CDaqChannelInfo& ch = m_Channels[chId];
int skip = ch.GetRecSize();
fseek(m_pFile, skip, SEEK_CUR);
int skip;
if ( ch.IsVarLen() ) {
int actCount;
if ( fread(&actCount, sizeof(int), 1, m_pFile) != 1 ) {
sprintf(buf, "Could not read var size channel length; chId=%d, ofs=%d, abort",
chId, ftell(m_pFile));
m_LastError = buf;
(*m_UserErrorFunc)(m_Filename.c_str(), buf);
return false;
}
skip = ch.GetItemSize() * actCount;
}
else {
skip = ch.GetRecSize();
}
if ( skip ) fseek(m_pFile, skip, SEEK_CUR); // save a system call if 0
}
ch++;
......@@ -1235,9 +1251,24 @@ CDaqLowLevelIo::LowLevelDataRead(
m_LastError = buf;
return false;
}
CDaqChannelInfo& ch = m_Channels[chId];
int size = ch.GetRecSize();
int size;
if ( ch.IsVarLen() ) {
int actCount;
if ( fread(&actCount, sizeof(int), 1, m_pFile) != 1 ) {
sprintf(buf, "Could not read var size channel length; chId=%d, ofs=%d, abort",
chId, ftell(m_pFile));
m_LastError = buf;
(*m_UserErrorFunc)(m_Filename.c_str(), buf);
return false;
}
size = ch.GetItemSize() * actCount;
}
else {
size = ch.GetRecSize();
}
if ( needChan[chId] != -1 ) { // it is -1 when we don't need it
CDaqBuffer& daqBuf = userStorage[needChan[chId]];
......@@ -1247,6 +1278,7 @@ CDaqLowLevelIo::LowLevelDataRead(
return false;
}
if ( size > 0 ) {
size_t n = fread(pTempSpace, size, 1, m_pFile);
if ( n != 1 ) {
sprintf(buf, "read data for channel %d near frame %d failed",
......@@ -1254,12 +1286,21 @@ CDaqLowLevelIo::LowLevelDataRead(
m_LastError = buf;
return false;
}
daqBuf.Append(pTempSpace, size, ch.GetItemCount());
}
// for variable size records, 'size' may be less than the full size for the channel
// The shorter storage used in the DAQ is transparent to the user so we fill
// the rest of the space (that didn't get read from the file with zeros.
int fullSize = ch.GetRecSize();
if ( fullSize != size ) {
memset(((char *)pTempSpace) + size, 0, fullSize - size);
}
daqBuf.Append(pTempSpace, fullSize, ch.GetItemCount());
if ( pFrameList ) (*pFrameList)[needChan[chId]].push_back(curFrame);
}
else {
// skip the data
fseek(m_pFile, size, SEEK_CUR);
if ( size ) fseek(m_pFile, size, SEEK_CUR);
}
}
}
......@@ -1785,7 +1826,23 @@ CDaqLowLevelIo::ReadDataForOneFrame(
}
CDaqChannelInfo& ch = m_Channels[chId];
int size = ch.GetRecSize();
int size;
if ( ch.IsVarLen() ) {
int actCount;
if ( fread(&actCount, sizeof(int), 1, m_pFile) != 1 ) {
sprintf(buf, "Could not read var size channel length; chId=%d, ofs=%d, abort",
chId, ftell(m_pFile));
m_LastError = buf;
(*m_UserErrorFunc)(m_Filename.c_str(), buf);
return eDAQ_READ_ERROR;
}
size = ch.GetItemSize() * actCount;
}
else {
size = ch.GetRecSize();
}
if ( needChannel[chId] != -1 ) { // it is -1 when we don't need it
CDaqBuffer& daqBuf = storage[needChannel[chId]];
......@@ -1795,13 +1852,20 @@ CDaqLowLevelIo::ReadDataForOneFrame(
return eDAQ_READ_INTERNAL_ERROR;
}
if ( size > 0 ) {
size_t n = fread(pTempSpace, size, 1, m_pFile);
if ( n != 1 ) {
sprintf(buf, "read data for channel %d failed", chId);
m_LastError = buf;
return eDAQ_READ_ERROR;
}
daqBuf.Replace(pTempSpace, size, ch.GetItemCount());
}
int fullSize = ch.GetRecSize();
if ( fullSize != size ) {
memset(((char *)pTempSpace) + size, 0, fullSize - size);
}
daqBuf.Replace(pTempSpace, fullSize, ch.GetItemCount());
gotData[chId] = true;
}
else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment