diff --git a/src/FileStream/FileStream.cpp b/src/FileStream/FileStream.cpp new file mode 100644 index 0000000..239f5ce --- /dev/null +++ b/src/FileStream/FileStream.cpp @@ -0,0 +1,103 @@ +#include "FileStream.h" +#include +#include + +#ifdef WIN32 +#else +#include +#include +#endif + +namespace +{ + const unsigned long long SKIP_UNIT_SIZE = 2147483647;//maxValue of int +} + +FileStream::FileStream() +#ifdef WIN32 + : mStream() +#else + : mPosition(0) + , mData(nullptr) + , mFd() + , mStSize() +#endif +{ + +} + +FileStream::~FileStream() +{ + +} + +bool FileStream::open(const std::string& aFileName) +{ +#ifdef WIN32 + mStream.open(aFileName.c_str(), std::ios_base::binary | std::ios::in); + return true; +#else + if ((mFd = ::open(aFileName.c_str(), O_RDONLY)) < 0) + { + return false; + } + struct stat sb; + if (fstat(mFd, &sb) == -1) + { + return false; + } + mStSize = sb.st_size; + mData = (int16_t*)mmap(NULL, mStSize, PROT_READ, MAP_SHARED, mFd, 0); + return true; +#endif +} + +void FileStream::seekg(unsigned long long aSkipSize, StreamPosition aFlag) +{ +#ifdef WIN32 + if(aFlag == StreamPosition::cur) + { + unsigned long long skipData = aSkipSize % SKIP_UNIT_SIZE; + int skipLoop = static_cast((aSkipSize - skipData) / SKIP_UNIT_SIZE); + for(int i = 0;i < skipLoop ; ++i) + { + mStream.seekg(SKIP_UNIT_SIZE,std::ios::cur); + } + mStream.seekg(static_cast(skipData),std::ios::cur); + } + else if(aFlag == StreamPosition::begin) + { + mStream.seekg(static_cast(aSkipSize),std::ios::beg); + } +#else + if(aFlag == StreamPosition::cur) + { + mPosition += aSkipSize; + } + else if(aFlag == StreamPosition::begin) + { + mPosition = aSkipSize; + } +#endif +} + +void FileStream::read(int16_t& aValue) +{ +#ifdef WIN32 + mStream.read((char*)&aValue,sizeof(int16_t)); +#else + aValue = mData[mPosition/2]; + mPosition += 2; +#endif +} + +void FileStream::close() +{ +#ifdef WIN32 + mStream.close(); +#else + munmap(mData, mStSize); + ::close(mFd); +#endif +} + diff --git a/src/FileStream/FileStream.h b/src/FileStream/FileStream.h new file mode 100644 index 0000000..76ce7c7 --- /dev/null +++ b/src/FileStream/FileStream.h @@ -0,0 +1,38 @@ +#ifndef FILESTREAM_H +#define FILESTREAM_H + +#include +#include +#include + +class FileStream +{ + +public: + enum StreamPosition + { + cur = 0, + begin + }; + +public: + FileStream(); + ~FileStream(); + bool open(const std::string& aFileName); + void seekg(unsigned long long aSkipSize, StreamPosition aFlag); + void read(int16_t& aValue); + void close(); + + private: +#ifdef WIN32 + std::ifstream mStream; +#else + unsigned long long mPosition; + int16_t* mData; + int mFd; + __off_t mStSize; +#endif + +}; + +#endif // FILESTREAM_H diff --git a/src/Parser.pro b/src/Parser.pro index f11cf57..0807da7 100644 --- a/src/Parser.pro +++ b/src/Parser.pro @@ -56,7 +56,8 @@ SOURCES += \ DataReader/PatientDataReader.cpp \ Helper/MatlabHelper.cpp \ Data/ConfigHeader.cpp \ - DataReader/ConfigHeaderReader.cpp + DataReader/ConfigHeaderReader.cpp \ + FileStream/FileStream.cpp HEADERS += \ Parser.h \ @@ -97,7 +98,8 @@ HEADERS += \ Data/ConfigHeader.h \ DataReader/ConfigHeaderReader.h \ Json/json.hpp \ - DataReader/TemperatureDataReader.h + DataReader/TemperatureDataReader.h \ + FileStream/FileStream.h INCLUDEPATH += $$PWD/../thirdParty/include diff --git a/src/ParserPrivate.cpp b/src/ParserPrivate.cpp index 5fc5642..9899727 100644 --- a/src/ParserPrivate.cpp +++ b/src/ParserPrivate.cpp @@ -14,8 +14,8 @@ #include "DataReader/PatientDataReader.h" #include "DataReader/TemperatureDataReader.h" #include "DataReader/ConfigHeaderReader.h" +#include "FileStream/FileStream.h" -#include #include #include @@ -67,15 +67,16 @@ namespace return 0; } - void skipStreamDataSize(std::ifstream& aStream,unsigned long long aSkipSize) + void skipStreamDataSize(FileStream& aStream,unsigned long long aSkipSize) { - unsigned long long skipData = aSkipSize % SKIP_UNIT_SIZE; - int skipLoop = static_cast((aSkipSize - skipData) / SKIP_UNIT_SIZE); - for(int i = 0;i < skipLoop ; ++i) - { - aStream.seekg(SKIP_UNIT_SIZE,std::ios::cur); - } - aStream.seekg(static_cast(skipData),std::ios::cur); + // unsigned long long skipData = aSkipSize % SKIP_UNIT_SIZE; + // int skipLoop = static_cast((aSkipSize - skipData) / SKIP_UNIT_SIZE); + // for(int i = 0;i < skipLoop ; ++i) + // { + // aStream.seekg(SKIP_UNIT_SIZE,std::ios::cur); + // } + // aStream.seekg(static_cast(skipData),std::ios::cur); + aStream.seekg(aSkipSize, FileStream::cur); } ParserMode initParserMode(const std::string& aPath) @@ -325,8 +326,8 @@ AScanData ParserPrivate::getAscanDataOfMotorPosition(const TasElementIndex& aSen aShotList->restAllCurrentLoopIndex(); unsigned long long skipSize = blockSizeIndex * mBlockSize + static_cast(AcmChannelNum - 1) * mDataSize; - std::ifstream stream; - stream.open(mFileList.at(static_cast(AcmNum - 1)).c_str(), std::ios_base::binary | std::ios::in); + FileStream stream; + stream.open(mFileList.at(static_cast(AcmNum - 1)).c_str()); if (aMotorPosition == MotorPosition::MotorPosition2 && aShotList->hasMotorPosition(2)) { unsigned long long motorPositionSize = mBlockSize * aShotList->getElementSize() * aShotList->getTasSize() * aShotList->getMuxSize(); @@ -382,8 +383,8 @@ void ParserPrivate::getAscanDataOfMotorPositionInThread(std::shared_ptrgetCurrentTasValue() != aSenderTasNum) { - stream.seekg(static_cast(mBlockSize), std::ios::cur); + stream.seekg(static_cast(mBlockSize), FileStream::cur); continue; } jumpElement = RECEIVE_ELEMENT_COUNT * (ElementMapper::mapping(ElectricIndex(aShotList->getCurrentElementValue())).getIndex() - 1); @@ -442,8 +443,8 @@ AScanData ParserPrivate::getAscanDataOfCEMeasured(unsigned short aTasNum,const T { return AScanData(); } - std::ifstream stream; - stream.open(mFileList.at(static_cast(AcmNum - 1)).c_str(), std::ios_base::binary | std::ios::in); + FileStream stream; + stream.open(mFileList.at(static_cast(AcmNum - 1)).c_str()); unsigned long long motorPositionSize = mBlockSize * aShotList->getElementSize() * aShotList->getTasSize() * aShotList->getMuxSize(); skipStreamDataSize(stream,motorPositionSize * aShotList->getMotorPositionSize()); int muxIndex = getMuxIndex(aReceiverIndex) + 1; @@ -522,8 +523,8 @@ void ParserPrivate::getAscanDataOfCEMeasuredInThread(std::shared_ptr a unsigned short* mapperArray = mapperArrayPointer.get(); for(int i = 0; i < aLoopNum; ++i) { - std::ifstream stream; - stream.open(mFileList.at(aFileNum).c_str(), std::ios_base::binary | std::ios::in); + FileStream stream; + stream.open(mFileList.at(aFileNum).c_str()); unsigned long long motorPositionSize = mBlockSize * aShotList->getElementSize() * aShotList->getTasSize() * aShotList->getMuxSize(); skipStreamDataSize(stream,motorPositionSize * aShotList->getMotorPositionSize()); unsigned long long jumpIndex[32] = {0}; @@ -539,7 +540,7 @@ void ParserPrivate::getAscanDataOfCEMeasuredInThread(std::shared_ptr a } if(aShotList->getCurrentTasValue() != aSenderTasNum) { - stream.seekg(static_cast(mBlockSize), std::ios::cur); + stream.seekg(static_cast(mBlockSize), FileStream::cur); continue; } @@ -705,14 +706,14 @@ AScanData ParserPrivate::searchAscanDataFromOneTasAscanDataOfCE(OneTasAScanData return result; } -void ParserPrivate::readAscanData(std::ifstream* aStream, AScanData aAScanData) +void ParserPrivate::readAscanData(FileStream* aStream, AScanData aAScanData) { //Read Header Info for(unsigned short i=0; iread((char*)&data,sizeof(int16_t)); - aStream->seekg(static_cast((CHANNEL_SIZE-1)*mDataSize), std::ios::cur); + aStream->read(data); + aStream->seekg(static_cast((CHANNEL_SIZE-1)*mDataSize), FileStream::cur); aAScanData.getHeader()[i] = data; } @@ -723,8 +724,8 @@ void ParserPrivate::readAscanData(std::ifstream* aStream, AScanData aAScanData) for(unsigned int i=0;i < mDataLength;++i) { int16_t data; - aStream->read((char*)&data,sizeof(int16_t)); - aStream->seekg(static_cast((CHANNEL_SIZE-1)*mDataSize), std::ios::cur); + aStream->read(data); + aStream->seekg(static_cast((CHANNEL_SIZE-1)*mDataSize), FileStream::cur); aAScanData.get()[i] = data; } @@ -732,8 +733,8 @@ void ParserPrivate::readAscanData(std::ifstream* aStream, AScanData aAScanData) for(unsigned int i=0;i < CRC_SIZE;++i) { int16_t data; - aStream->read((char*)&data,sizeof(int16_t)); - aStream->seekg(static_cast((CHANNEL_SIZE-1)*mDataSize), std::ios::cur); + aStream->read(data); + aStream->seekg(static_cast((CHANNEL_SIZE-1)*mDataSize), FileStream::cur); aAScanData.getCrc()[i] = data; } @@ -744,7 +745,7 @@ void ParserPrivate::readAscanData(std::ifstream* aStream, AScanData aAScanData) } } -void ParserPrivate::readOneTasAscanData(std::ifstream* aStream, unsigned long long* aIndex, OneTasAScanData aOneTasAscan) +void ParserPrivate::readOneTasAscanData(FileStream* aStream, unsigned long long* aIndex, OneTasAScanData aOneTasAscan) { //Read Header Info for(unsigned long long header = 0; header < HEADER_SIZE; ++header) @@ -752,7 +753,7 @@ void ParserPrivate::readOneTasAscanData(std::ifstream* aStream, unsigned long lo for(unsigned int channel = 0; channel < CHANNEL_SIZE; ++channel) { int16_t data; - aStream->read((char*)&data,sizeof(int16_t)); + aStream->read(data); aOneTasAscan.getHeader()[aIndex[channel] * HEADER_SIZE + header] = data; } } @@ -765,7 +766,7 @@ void ParserPrivate::readOneTasAscanData(std::ifstream* aStream, unsigned long lo for(unsigned int channel = 0; channel < CHANNEL_SIZE; ++channel) { int16_t data; - aStream->read((char*)&data,sizeof(int16_t)); + aStream->read(data); aOneTasAscan.get()[aIndex[channel] * mDataLength + ascanIndex] = data; } } @@ -776,7 +777,7 @@ void ParserPrivate::readOneTasAscanData(std::ifstream* aStream, unsigned long lo for(unsigned int channel = 0; channel < CHANNEL_SIZE; ++channel) { int16_t data; - aStream->read((char*)&data,sizeof(int16_t)); + aStream->read(data); aOneTasAscan.getCrc()[aIndex[channel] * CRC_SIZE + crc] = data; } } diff --git a/src/ParserPrivate.h b/src/ParserPrivate.h index 55b4a86..7ff1745 100644 --- a/src/ParserPrivate.h +++ b/src/ParserPrivate.h @@ -24,6 +24,8 @@ enum class ParserMode : unsigned short KITMode = 1 }; +class FileStream; + class ParserPrivate { public: @@ -52,8 +54,8 @@ private: void getAscanDataOfMotorPositionInThread(std::shared_ptr aShotList, OneTasAScanData aOneTasAscanData, unsigned short aSenderTasNum, unsigned short aFileNum, unsigned short aLoopNum); void getAscanDataOfCEMeasuredInThread(std::shared_ptr aShotList, OneTasAScanData aOneTasAscanData, unsigned short aSenderTasNum, unsigned short aFileNum, unsigned short aLoopNum); void getAllCEMeasuredDataInThread(CEMeasuredData aCEMeasuredData, unsigned short aTasNum, unsigned short aLoopNum); - void readAscanData(std::ifstream* aStream, AScanData aAScanData); - void readOneTasAscanData(std::ifstream* aStream, unsigned long long* aIndex, OneTasAScanData aOneTasAscan); + void readAscanData(FileStream* aStream, AScanData aAScanData); + void readOneTasAscanData(FileStream* aStream, unsigned long long* aIndex, OneTasAScanData aOneTasAscan); double getAmplification(short aValue); void initParser(); void initShotList();