static const String buildSetCommand(const String &command, const Types &...parameters) { String prefix(F("AT+")); prefix += command; prefix += F("="); return prefix + buildParameterList(parameters...); }
static const String buildParameterList(const String ¶m, const Types &...rest) { return param + F(",") + buildParameterList(rest...); }
int MainWindow::createOceanDataViewFile( QStringList &sl_MetadataList, QStringList &sl_ParameterList, const QString &s_FilenameOut, const int i_CodecInput, const int i_Env, const int i_DeviceTypeOceanDataView, const bool b_showShortName, const bool b_showMethod, const bool b_showComment, const bool b_usePANGAEAQualityFlags, const bool b_setGeocode, const bool b_addLineNo, const float f_GEOCODE_min, const float f_GEOCODE_max, const QString &s_GEOCODE_min, const QString &s_GEOCODE_max, const bool b_setGearID, const int i_GearID, const int i_NumOfFiles ) { QVector<int> vi_pos; QVector<int> vi_posQV; QVector<int> vi_SpecialPos; int i_NumOfRemovedLines = 0; int i_NumOfHeaderItems = 0; int i_GeocodePos = -1; int i_GearIDPos = -1; int i_File = 0; int i_stopFileProgress = 0; int stopProgress = 0; int err = _NOERROR_; int i = 0; int n = 0; bool b_containsDOI = false; QString s_FieldDelimiter = "\t"; QString s_Environment = ""; QString s_DeviceType = "*"; QString s_Output = ""; QString s_FilenameIn = sl_MetadataList.at( 1 ).section( "\t", _FILENAMEPOS, _FILENAMEPOS ); QStringList sld_ParameterList; QStringList sl_Input; QStringList sl_Output; QDateTime dt_GEOCODE_min( QDateTime::fromString( (QString) s_GEOCODE_min, Qt::ISODate ) ); QDateTime dt_GEOCODE_max( QDateTime::fromString( (QString) s_GEOCODE_max, Qt::ISODate ) ); //----------------------------------------------------------------------------------------------------------------------- if ( sl_ParameterList.count() == 0 ) return( -60 ); //----------------------------------------------------------------------------------------------------------------------- i_NumOfHeaderItems = buildODVHeader( sl_Output, sl_ParameterList, vi_posQV, i_Env, b_showShortName, b_showMethod, b_showComment, b_usePANGAEAQualityFlags ); if ( i_NumOfHeaderItems < 0 ) return( i_NumOfHeaderItems ); // return as error, -70 = Latitude/Longitude not given, -71 = Latitude not given, -72 = Longitude not given //----------------------------------------------------------------------------------------------------------------------- QFile ftext( s_FilenameOut ); if ( ftext.open( QIODevice::WriteOnly | QIODevice::Text) == false ) return( -20 ); QTextStream tout( &ftext ); //----------------------------------------------------------------------------------------------------------------------- initFileProgress( i_NumOfFiles, s_FilenameIn, tr( "Creating Ocean Data View file..." ) ); //----------------------------------------------------------------------------------------------------------------------- // write header tout << "//<Version>ODV Spreadsheet V4.0</Version>" << endl; tout << "//<Creator>" << "</Creator>" << endl; tout << "//<CreateTime>" << QDateTime::currentDateTime().toString( "yyyy-MM-ddThh:mm" ) << "</CreateTime>" << endl; tout << "//<Software>" << getApplicationName( true ) << " " << _VERSION_ << "</Software>" << endl; tout << "//<Source>" << QDir::toNativeSeparators( s_FilenameOut ) << "</Source>" << endl; tout << "//<SourceLastModified>" << QDateTime::currentDateTime().toString( "yyyy-MM-ddThh:mm" ) << "</SourceLastModified>" << endl; tout << "//<DataField>GeneralField</DataField>" << endl; tout << "//<DataType>GeneralType</DataType>" << endl; tout << "//" << endl; //----------------------------------------------------------------------------------------------------------------------- i_GeocodePos = getGeocodePosition( sl_ParameterList, i_Env ); i_GearIDPos = getGearIDPosition( sl_ParameterList ); b_containsDOI = sl_Output.contains( "DOI:METAVAR:TEXT:51" ); tout << sl_Output.join( s_FieldDelimiter ) << endl; //----------------------------------------------------------------------------------------------------------------------- // find position of date/time parameters getSpecialPos( sl_ParameterList, vi_SpecialPos ); //----------------------------------------------------------------------------------------------------------------------- s_DeviceType = setDeviceType( i_DeviceTypeOceanDataView ); //----------------------------------------------------------------------------------------------------------------------- i_File = 1; while ( ( i_File <= i_NumOfFiles ) && ( err == _NOERROR_ ) && ( i_stopFileProgress != _APPBREAK_ ) ) { if ( containsSelectedEnvironment( _SELECTPARAMETER, sl_MetadataList.at( i_File ).section( "\t", _ENVIRONMENTPOS, _ENVIRONMENTPOS ).toInt(), i_Env ) == true ) { s_FilenameIn = sl_MetadataList.at( i_File ).section( "\t", _FILENAMEPOS, _FILENAMEPOS ); if ( ( n = readFile( s_FilenameIn, sl_Input, i_CodecInput ) ) > 0 ) { i = 0; sld_ParameterList.clear(); vi_pos.clear(); initProgress( i_NumOfFiles, s_FilenameIn, tr( "Ocean Data View converter is working..." ), n ); setStatusBarFileInProgress( s_FilenameIn ); //----------------------------------------------------------------------------------------------------------------------- // read header and find position of parameter s_Environment = sl_MetadataList.at( i_File ).section( "\t", _ENVIRONMENTPOS, _ENVIRONMENTPOS ) + _PSEPARATOR_; stopProgress = incProgress( i_NumOfFiles, i ); if ( sl_Input.at( i ).startsWith( "/* DATA DESCRIPTION:" ) == true ) // file starts with PANGAEA header { while ( ( i < n ) && ( sl_Input.at( i ).startsWith( "*/" ) == false ) ) { if ( sl_Input.at( i ).startsWith( "Parameter(s):" ) == true ) { while ( ( i < n ) && ( ( sl_Input.at( i ).startsWith( "Parameter(s):" ) == true ) || ( sl_Input.at( i ).startsWith( "\t" ) == true ) ) ) { sld_ParameterList.append( s_Environment + buildParameter( sl_Input.at( i ).section( "\t", 1, 1 ) ) ); if ( ++i < n ) stopProgress = incProgress( i_NumOfFiles, i ); } } if ( ++i < n ) stopProgress = incProgress( i_NumOfFiles, i ); } for ( int j=0; j<sl_ParameterList.count(); ++j ) vi_pos.append( containsParameter( true, sld_ParameterList, sl_ParameterList.at( j ), b_showShortName, b_showMethod, b_showComment ) ); if ( ++i < n ) stopProgress = incProgress( i_NumOfFiles, i ); } else { sld_ParameterList = buildParameterList( s_Environment, sl_Input.at( i ) ); // not a PANGAEA dataset for ( int j=0; j<sl_ParameterList.count(); ++j ) vi_pos.append( containsParameter( false, sld_ParameterList, sl_ParameterList.at( j ), b_showShortName, b_showMethod, b_showComment ) ); } //----------------------------------------------------------------------------------------------------------------------- // write output string if ( ( b_setGeocode == true ) || ( b_setGearID == true ) ) { while ( ( ++i < n ) && ( stopProgress != _APPBREAK_ ) ) { sl_Output = buildODVOutputStr( i+1, b_addLineNo, sl_Input.at( i ), sl_MetadataList.at( i_File ), vi_pos, vi_posQV, vi_SpecialPos, b_usePANGAEAQualityFlags, b_containsDOI, s_DeviceType, s_FieldDelimiter ); if ( writeDataLine( b_setGeocode, b_setGearID, i_GeocodePos, i_GearIDPos, sl_Output, i_Env, dt_GEOCODE_min, dt_GEOCODE_max, f_GEOCODE_min, f_GEOCODE_max, i_GearID ) == true ) { s_Output = sl_Output.join( s_FieldDelimiter ); if ( s_Output.contains( "delete line" ) == false ) tout << s_Output << endl; else ++i_NumOfRemovedLines; } stopProgress = incProgress( i_NumOfFiles, i ); } } else { while ( ( ++i < n ) && ( stopProgress != _APPBREAK_ ) ) { sl_Output = buildODVOutputStr( i+1, b_addLineNo, sl_Input.at( i ), sl_MetadataList.at( i_File ), vi_pos, vi_posQV, vi_SpecialPos, b_usePANGAEAQualityFlags, b_containsDOI, s_DeviceType, s_FieldDelimiter ); s_Output = sl_Output.join( s_FieldDelimiter ); if ( s_Output.contains( "delete line" ) == false ) tout << s_Output << endl; else ++i_NumOfRemovedLines; stopProgress = incProgress( i_NumOfFiles, i ); } } resetProgress( i_NumOfFiles ); } } i_stopFileProgress = incFileProgress( i_NumOfFiles, i_File++ ); } //----------------------------------------------------------------------------------------------------------------------- resetFileProgress( i_NumOfFiles ); ftext.close(); return( i_NumOfRemovedLines ); }