mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-22 05:30:44 +00:00
More Resmed import cleanups, and fixes glitch with empty sessions
This commit is contained in:
parent
66e7b48abd
commit
e8b07b4eac
@ -121,24 +121,32 @@ EDFParser::EDFParser(QString name)
|
|||||||
}
|
}
|
||||||
EDFParser::~EDFParser()
|
EDFParser::~EDFParser()
|
||||||
{
|
{
|
||||||
QVector<EDFSignal>::iterator s;
|
for (auto s = edfsignals.begin(); s != edfsignals.end(); s++) {
|
||||||
|
|
||||||
for (s = edfsignals.begin(); s != edfsignals.end(); s++) {
|
|
||||||
if ((*s).data) { delete [](*s).data; }
|
if ((*s).data) { delete [](*s).data; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer) { delete [] buffer; }
|
if (buffer) { delete [] buffer; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read a 16 bits integer
|
||||||
qint16 EDFParser::Read16()
|
qint16 EDFParser::Read16()
|
||||||
{
|
{
|
||||||
if ((pos + long(sizeof(qint16))) > filesize) {
|
if ((pos + 2) > filesize) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef LITTLE_ENDIAN
|
||||||
|
// Intel, etc...
|
||||||
qint16 res = *(qint16 *)&buffer[pos];
|
qint16 res = *(qint16 *)&buffer[pos];
|
||||||
pos += sizeof(qint16);
|
#else
|
||||||
|
// ARM, PPC, etc..
|
||||||
|
qint16 res = buffer[pos] | (buffer[pos+1] << 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pos += 2;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString EDFParser::Read(unsigned n)
|
QString EDFParser::Read(unsigned n)
|
||||||
{
|
{
|
||||||
if ((pos + n) > filesize) {
|
if ((pos + n) > filesize) {
|
||||||
@ -287,14 +295,18 @@ bool EDFParser::Parse()
|
|||||||
for (int x = 0; x < num_data_records; x++) {
|
for (int x = 0; x < num_data_records; x++) {
|
||||||
for (int i = 0; i < num_signals; i++) {
|
for (int i = 0; i < num_signals; i++) {
|
||||||
EDFSignal &sig = edfsignals[i];
|
EDFSignal &sig = edfsignals[i];
|
||||||
|
#if LITTLE_ENDIAN
|
||||||
|
// Intel x86, etc..
|
||||||
memcpy((char *)&sig.data[sig.pos], (char *)&buffer[pos], sig.nr * 2);
|
memcpy((char *)&sig.data[sig.pos], (char *)&buffer[pos], sig.nr * 2);
|
||||||
sig.pos += sig.nr;
|
sig.pos += sig.nr;
|
||||||
pos += sig.nr * 2;
|
pos += sig.nr * 2;
|
||||||
// big endian will probably screw up without this..
|
#else
|
||||||
/*for (int j=0;j<sig.nr;j++) {
|
// ARM, PPC, etc..
|
||||||
|
for (int j=0;j<sig.nr;j++) {
|
||||||
qint16 t=Read16();
|
qint16 t=Read16();
|
||||||
sig.data[sig.pos++]=t;
|
sig.data[sig.pos++]=t;
|
||||||
} */
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,49 +314,59 @@ bool EDFParser::Parse()
|
|||||||
}
|
}
|
||||||
bool EDFParser::Open(QString name)
|
bool EDFParser::Open(QString name)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(buffer == nullptr);
|
||||||
//Urk.. This needs fixing for VC++, as it doesn't have packed attribute type..
|
|
||||||
|
|
||||||
if (name.endsWith(STR_ext_gz)) {
|
if (name.endsWith(STR_ext_gz)) {
|
||||||
|
// Open and decempress file to buffer
|
||||||
|
|
||||||
filename = name.mid(0, -3);
|
filename = name.mid(0, -3);
|
||||||
|
|
||||||
|
// Get file length from inside gzip file
|
||||||
QFile fi(name);
|
QFile fi(name);
|
||||||
fi.open(QFile::ReadOnly);
|
|
||||||
fi.seek(fi.size() - 4);
|
if (!fi.open(QFile::ReadOnly) || !fi.seek(fi.size() - 4)) {
|
||||||
|
goto badfile;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char ch[4];
|
unsigned char ch[4];
|
||||||
fi.read((char *)ch, 4);
|
fi.read((char *)ch, 4);
|
||||||
filesize = ch[0] | (ch [1] << 8) | (ch[2] << 16) | (ch[3] << 24);
|
filesize = ch[0] | (ch [1] << 8) | (ch[2] << 16) | (ch[3] << 24);
|
||||||
|
|
||||||
datasize = filesize - EDFHeaderSize;
|
datasize = filesize - EDFHeaderSize;
|
||||||
|
if (datasize < 0) {
|
||||||
if (datasize < 0) { return false; }
|
goto badfile;
|
||||||
|
|
||||||
qDebug() << "Size of" << name << "uncompressed=" << filesize;
|
|
||||||
gzFile f = gzopen(name.toLatin1(), "rb");
|
|
||||||
|
|
||||||
if (!f) {
|
|
||||||
qDebug() << "EDFParser::Open() Couldn't open file" << name;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open gzip file for reading
|
||||||
|
gzFile f = gzopen(name.toLatin1(), "rb");
|
||||||
|
if (!f) {
|
||||||
|
goto badfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decompressed header and data block
|
||||||
gzread(f, (char *)&header, EDFHeaderSize);
|
gzread(f, (char *)&header, EDFHeaderSize);
|
||||||
buffer = new char [datasize];
|
buffer = new char [datasize];
|
||||||
//gzbuffer(f,65536*2);
|
|
||||||
gzread(f, buffer, datasize);
|
gzread(f, buffer, datasize);
|
||||||
gzclose(f);
|
gzclose(f);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
// Open and read uncompressed file
|
||||||
QFile f(name);
|
QFile f(name);
|
||||||
|
|
||||||
if (!f.open(QIODevice::ReadOnly)) {
|
if (!f.open(QIODevice::ReadOnly)) {
|
||||||
return false;
|
goto badfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = name;
|
filename = name;
|
||||||
filesize = f.size();
|
filesize = f.size();
|
||||||
datasize = filesize - EDFHeaderSize;
|
datasize = filesize - EDFHeaderSize;
|
||||||
|
|
||||||
if (datasize < 0) { return false; }
|
if (datasize < 0) {
|
||||||
|
goto badfile;
|
||||||
|
}
|
||||||
|
|
||||||
f.read((char *)&header, EDFHeaderSize);
|
f.read((char *)&header, EDFHeaderSize);
|
||||||
//qDebug() << "Opening " << name;
|
|
||||||
buffer = new char [datasize];
|
buffer = new char [datasize];
|
||||||
f.read(buffer, datasize);
|
f.read(buffer, datasize);
|
||||||
f.close();
|
f.close();
|
||||||
@ -352,6 +374,10 @@ bool EDFParser::Open(QString name)
|
|||||||
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
badfile:
|
||||||
|
qDebug() << "EDFParser::Open() Couldn't open file" << name;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResmedLoader::ResmedLoader()
|
ResmedLoader::ResmedLoader()
|
||||||
@ -1555,7 +1581,14 @@ int ResmedLoader::Open(QString &path, Profile *profile)
|
|||||||
|
|
||||||
// Add the session to the machine & profile objects
|
// Add the session to the machine & profile objects
|
||||||
//if (!dodgy)
|
//if (!dodgy)
|
||||||
|
|
||||||
|
if (sess->length() > 0) {
|
||||||
m->AddSession(sess, profile);
|
m->AddSession(sess, profile);
|
||||||
|
} else {
|
||||||
|
// Hmm.. this means a ton of these could slow down import.
|
||||||
|
// I could instead set these to disabled by default, or implement a dodgy session marker
|
||||||
|
delete sess;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,6 +103,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
#ifdef TEST_BUILD
|
#ifdef TEST_BUILD
|
||||||
version += QString(STR_TestBuild);
|
version += QString(STR_TestBuild);
|
||||||
|
#else
|
||||||
|
ui->warningLabel->hide();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
this->setWindowTitle(STR_TR_SleepyHead + QString(" v%1 (" + tr("Profile") + ": %2)").arg(version).arg(PREF[STR_GEN_Profile].toString()));
|
this->setWindowTitle(STR_TR_SleepyHead + QString(" v%1 (" + tr("Profile") + ": %2)").arg(version).arg(PREF[STR_GEN_Profile].toString()));
|
||||||
|
Loading…
Reference in New Issue
Block a user