Projects
mass
turbina-core-mass
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 13
View file
turbina-core-mass.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Mon Oct 10 08:11:22 UTC 2016 - matwey@sai.msu.ru + +- Version 1.32 + +------------------------------------------------------------------- Sat Oct 8 16:10:10 UTC 2016 - matwey@sai.msu.ru - Version 1.31
View file
turbina-core-mass.spec
Changed
@@ -42,7 +42,7 @@ License: GPL-2.0 Group: Productivity/Scientific/Astronomy Name: turbina-core-mass -Version: 1.31 +Version: 1.32 Release: 0 Url: http://curl.sai.msu.ru/hg/turbina_core_m Source: %{tarname}-%{version}.tar.bz2
View file
_service
Changed
@@ -1,8 +1,8 @@ <services> <service name="tar_scm" mode="disabled"> <param name="url">http://curl.sai.msu.ru/hg/turbina_core_m</param> - <param name="versionformat">1.31</param> - <param name="revision">1.31</param> + <param name="versionformat">1.32</param> + <param name="revision">1.32</param> <param name="scm">hg</param> </service> <service name="recompress" mode="disabled">
View file
turbina_core_m-1.31.tar.bz2/Makefile -> turbina_core_m-1.32.tar.bz2/Makefile
Changed
@@ -10,7 +10,7 @@ MASS_SOURCES = main.o mass.o configs.o module.o auxiliary.o channel.o bicounter.o exchange.o rs485.o astrotime.o measmode.o errlog.o rserrno.o sci.o results.o receiver.o comms.o scenario.o instrument.o socket.o server.o PREPHOT = prephot PREPHOT_SOURCES = prephot.o parameter_set.o processing.o coordinates.o astrotime.o -VERSION = 1.31 +VERSION = 1.32 CXX = g++ INSTALL_PROGRAM = install RS485INCLUDE = $(shell for X in /usr/include/linux/rs485 /usr/src/rs485/include; do T=$$X; if -d $$X ; then break; fi done; echo $$T;)
View file
turbina_core_m-1.31.tar.bz2/deftypes.h -> turbina_core_m-1.32.tar.bz2/deftypes.h
Changed
@@ -7,246 +7,11 @@ #define MS2MKS (1000L) // msec to mksec #define MKS2MS (0.001) // mksec to msec #define MM2CM (0.1) // millimeter to cm conversion -#define S2MS (1000) // sec to msec template <class T> void checkMinMax(const T min_value, T &value, const T max_value) { value = (value > min_value) ? ((value < max_value) ? value : max_value ) : min_value; } -// template<class T> class win { -// typedef point<T> point_type; -// point_type _beg; -// point_type _end; -// public: // ������������� ��� end ������ > beg ����� ���� 0-��������� -// win( point_type b = point_type(), point_type e = point_type() ): _beg(b), _end(e) {} -// win( T bu, T bv, T eu, T ev ) : _beg( point_type( bu, bv ) ), _end( point_type( eu, ev )) {} -// point_type beg() const { return _beg; } -// point_type end() const { return _end; } -// win operator+=( point_type a ) { // ����� ���� �� ������ a: w+=a -// _beg += a; -// _end += a; -// return *this; -// } -// win operator-=( point_type a ) { // ����� ���� �� ������ a: w-=a -// _beg -= a; -// _end -= a; -// return *this; -// } -// win operator+( point_type a ) { // ����� ���� �� ������ a: wo=wi+a -// win t = *this; -// t += a; -// return t; -// } -// win operator-( point_type a ) { // ����� ���� �� ������ a: wo=wi-a -// win t = *this; -// t -= a; -// return t; -// } -// win operator&=( win a ) { // ����������� 2-� ���� W &= U -// _beg = point_type( max(_beg.x(), a._beg.x()), max(_beg.y(), a._beg.y()) ); -// _end = point_type( min(_end.x(), a._end.x()), min(_end.y(), a._end.y()) ); -// return *this; -// } -// win operator&( win a ) { // ����������� 2-� ���� u = w1&w2 -// win t = *this; -// t &= a; -// return t; -// } -// win operator|=( win a ) { // ����������� 2-� ���� W |= U (���� ���������� ���) -// _beg = point_type( min(_beg.x(), a._beg.x()), min(_beg.y(), a._beg.y()) ); -// _end = point_type( max(_end.x(), a._end.x()), max(_end.y(), a._end.y()) ); -// return *this; -// } -// win operator|( win a ) { // ����������� 2-� ���� u = w1&w2 -// win t = *this; -// t |= a; -// return t; -// } -// T xorg() { return _beg.x(); } -// T yorg() { return _beg.y(); } -// T xdim() { return _end.x() - _beg.x(); } -// T ydim() { return _end.y() - _beg.y(); } -// win expand( T ex ) { -// win t = *this; -// t._beg -= point_type( ex, ex ); -// t._end += point_type( ex, ex ); -// return t; -// } -// win squeeze( T ex ) { -// win t = *this; -// t._beg += point_type( ex, ex ); -// t._end -= point_type( ex, ex ); -// return t; -// } -// bool empty() { return _end.x()-_beg.x() <= 0 || _end.y()-_beg.y() <= 0; } -// bool operator==( win a ){ -// return _beg == a._beg && _end == a._end; -// } -// }; -// -// namespace std{ -// template<class T> std::ostream& operator<<(std::ostream& stm, const win<T>& win){ -// stm << "" << win.beg().x() << "," << win.beg().y() << ":" << win.end().x() << "," << win.end().y() << ""; -// return stm; -// } -// }; -// -// class Sframe { -// public: -// unsigned short* start; -// unsigned int x; -// unsigned int y; -// Sframe( unsigned short* s = 0, unsigned int xf = 0, unsigned int yf = 0 ) : start(s), x(xf), y(yf) {} -// }; -// -// template<class T> inline T swap(const T Value){ -// T ret; -// for(unsigned int i = 0; i < sizeof(T); i++ ) -// *((char*)(&ret)+i)=*((char*)(&Value)+sizeof(T)-i-1); -// return ret; -// }; -// -// class spot { -// public: -// point<double> pos; -// double sum; -// double max; -// spot::spot( point<double> a = point<double>(), double b = 0, double c = 0 ) -// : pos(a), sum(b), max(c) {} -// spot operator+=( spot a ) { -// pos += a.pos; -// sum += a.sum; -// max += a.max; -// return( *this ); -// } -// spot operator-=( spot a ){ -// pos -= a.pos; -// sum -= a.sum; -// max -= a.max; -// return( *this ); -// } -// /* spot operator*=( spot a ){ -// pos *= a.pos; -// sum *= a.sum; -// max *= a.max; -// return( *this ); -// }*/ -// spot operator/=( double a){ -// pos /= a; -// sum /= a; -// max /= a; -// return( *this ); -// } -// spot operator/( double a){ -// spot t = *this; -// t /= a; -// return t; -// } -// spot operator+( spot a ){ -// spot t = *this; -// t += a; -// return( t ); -// } -// spot operator-( spot a ){ -// spot t = *this; -// t -= a; -// return( t ); -// } -// /* spot operator*( spot a ){ -// spot t = *this; -// t *= a; -// return( t ); -// }*/ -// }; -// -// class star: public spot { -// public: -// point<double> rad; -// point<double> err; -// star::star( point<double> a = point<double>(), double s = 0, double m = 0, -// point<double> r = point<double>(), point<double> e = point<double>() ): -// spot( a, s, m ), rad(r), err(e) {} -// star::star( spot a ) : spot(a), rad(), err() {} -// star operator+=( star a ){ -// pos += a.pos; -// sum += a.sum; -// max += a.max; -// rad += a.rad; -// err += a.err; -// return( *this ); -// } -// star operator/=( double a) { -// pos /= a; -// sum /= a; -// max /= a; -// rad /= a; -// err /= a; -// return( *this ); -// } -// private: -// star operator*=( star a) { -// pos *= a.pos; -// sum *= a.sum; -// // max *= a.max; -// // rad *= a.rad; -// // err *= a.err; -// return( *this ); -// } -// public: -// star operator/( double a){ -// star t=*this; -// t /= a; -// return t; -// } -// star operator+( star a ){ -// star t = *this; -// t += a; -// return( t ); -// }
View file
turbina_core_m-1.31.tar.bz2/infras/exchange.cpp -> turbina_core_m-1.32.tar.bz2/infras/exchange.cpp
Changed
@@ -290,7 +290,7 @@ strcommnsent++ = (char)command; int ret = transaction(strcomm, nsent, strread, sizeof(strread)); if( ret != 3 ) throw ErrSignal( Signal::abbrev(ret) ); - strread3 = ((char)strread2 < 0 ? 0xff : 0 ); + strread3 = (strread2 > 0x7f ? 0xff : 0); memcpy( (char*)&avalue, strread, 4 ); return avalue; } @@ -305,6 +305,13 @@ return std::vector<unsigned char>(); } +std::vector<unsigned char> BaseRS485::askRaw(const std::vector<unsigned char>& raw) { + memcpy(strcomm, &raw0, raw.size()); + int ret = transaction(strcomm, raw.size(), strread, sizeof(strread)); + if( ret < MAX_PACKET_SIZE ) return std::vector<unsigned char>( strread, strread+ret ); + throw ErrSignal( Signal::abbrev(ret) ); +} + BaseRS485::com_stat BaseRS485::sendSimpleCommand( unsigned int module, const SComm command) { int nsent = 0; strcommnsent++ = (char)module; @@ -351,6 +358,7 @@ if(ret != ACW) throw ErrSignal( Signal::abbrev(ret) ); return BUSY; } + #ifndef NO_RS485_LEGACY int RS485LegacyImpl::transaction( const unsigned char *buffi, std::size_t nbyte, unsigned char *buffo, std::size_t) { int reply = 0; @@ -521,7 +529,7 @@ close(fd_); throw ErrFatal(strerror(errno)); }; - memset(&new_termios,0,sizeof(new_termios)); + new_termios = old_termios_; cfmakeraw(&new_termios); if(cfsetspeed(&new_termios, baudrate_flag(baudrate)) < 0) { close(fd_); @@ -529,6 +537,7 @@ } new_termios.c_ccVMIN = 0; new_termios.c_ccVTIME = 0; + new_termios.c_cflag |= CREAD|CLOCAL; if(tcsetattr(fd_, TCSANOW, &new_termios) < 0) { close(fd_); throw ErrFatal(strerror(errno)); @@ -570,7 +579,7 @@ // std::cerr << "cn= " << cycl_num << " cn-cp= " << cycl_prevs << " en= " << extranum << std::endl; cycl_prevs = cycl_num; numb = extranum; - memcpy(data, strread+2, (unsigned int)ret < buflen ? ret : buflen); + memcpy(data, strread+2, (std::size_t)ret < buflen ? (std::size_t)ret : buflen); ret = ret/2; break; }
View file
turbina_core_m-1.31.tar.bz2/infras/exchange.h -> turbina_core_m-1.32.tar.bz2/infras/exchange.h
Changed
@@ -2,6 +2,7 @@ #define _EXCHANGE_H #include <stdexcept> #include <sstream> +#include <vector> #include <sys/time.h> #include <termios.h> @@ -108,6 +109,7 @@ int askWord( unsigned int, const AWord); int askLong( unsigned int, const ALong); std::vector<unsigned char> askData( unsigned int, const AData); + std::vector<unsigned char> askRaw(const std::vector<unsigned char>& raw); com_stat sendSimpleCommand( unsigned int, const SComm); com_stat sendByteCommand( unsigned int, const SByte, char b); com_stat sendWordCommand( unsigned int, const SWord, short w);
View file
turbina_core_m-1.31.tar.bz2/infras/rs485.h -> turbina_core_m-1.32.tar.bz2/infras/rs485.h
Changed
@@ -86,6 +86,15 @@ error_handler( e ); return std::vector<unsigned char>(); } + std::vector<unsigned char> askRaw(const std::vector<unsigned char> &d) try { + Lock lock; + Protocol p( ptrs.get() ); + return ptrs->askRaw(d); + } + catch( ErrDriver& e) { + error_handler( e ); + return std::vector<unsigned char>(); + } BaseRS485::com_stat sendSimpleCommand(unsigned int m_address, SComm c) try { Lock lock; Protocol p( ptrs.get() );
View file
turbina_core_m-1.31.tar.bz2/instrument.cpp -> turbina_core_m-1.32.tar.bz2/instrument.cpp
Changed
@@ -2,6 +2,8 @@ #include "results.h" #include "defnames.h" +const double S2MS = 1000.0; + Instrument::Instrument(Config& config) : device( config.inp<std::string>( "General", "Common", "Device" ) ), bauderate( config.inp<int>( "General", "Common", "BaudeRate" ) ), @@ -15,42 +17,38 @@ Instrument::~Instrument() {} -void Instrument::prepareAccumTime(double exposition, int exposNumber, - double baseTime, int blockNumber) try { - bic1.setLevels(); - bic2.setLevels(); - // Master: -// bic1.setInduce(false); -// bic1.setMaster(true); -// bic1.setActive(true); - // Slave: -// bic2.setMaster(false); -// bic2.setActive(false); -// bic2.setInductor(&bic1); -// bic2.setInduce(true); - +int Instrument::prepareAccumTime(double exposition, double baseTime ) try { + + bic1.setLevels(); + bic2.setLevels(); // Master: - bic1.setInduce(false); - bic1.setMaster(false); - bic1.setActive(true); + bic1.setInduce( false ); + bic1.setMaster( false ); + bic1.setActive( true ); // Slave: - bic2.setMaster(true); - bic2.setActive(false); - bic2.setInductor(&bic1); - bic2.setInduce(true); - - bic1.setExpos(exposition); - bic2.setExpos(exposition); - bic1.setNumber(exposNumber); - bic2.setNumber(exposNumber); - + bic2.setMaster( true ); + bic2.setActive( false ); + bic2.setInductor( &bic1 ); + bic2.setInduce( true ); + + bic1.setExpos( exposition ); + bic2.setExpos( exposition ); + + blockNumber = (int)floor( S2MS*baseTime/exposition/getCountInBlock()); + int exposNumber = blockNumber*getCountInBlock(); + + bic1.setNumber( exposNumber ); + bic2.setNumber( exposNumber ); + receiver.init( baseTime, blockNumber, master_address, slave_address ); + return exposNumber; } catch (const std::exception &e) { bic1.reset(); bic2.reset(); ErrlogSingl::instance().write( ERR_STD_EXCP, e.what() ); ErrlogSingl::instance().wthrow( ERR_DEV_FUNC, "Problems in prepareAccumTime" ); + return 0; } void Instrument::startBaseTime( bool etest ) try {
View file
turbina_core_m-1.31.tar.bz2/instrument.h -> turbina_core_m-1.32.tar.bz2/instrument.h
Changed
@@ -22,12 +22,15 @@ struct timeval fixTemperTime; unsigned int master_address; unsigned int slave_address; + int blockNumber; public: Instrument(Config& config); ~Instrument(); static const int getCountInBlock() {return Bicounter::getCountInBlock();} - void prepareAccumTime(double exposition, int exposNumber, double baseTime, int blockNumber); + + int prepareAccumTime( double exposition, double baseTime ); + int get_blocks_number(){ return blockNumber; } void startBaseTime( bool etest=false ); unsigned int obtainData( std::valarray<COUNT_T>* count_data );
View file
turbina_core_m-1.31.tar.bz2/measmode.cpp -> turbina_core_m-1.32.tar.bz2/measmode.cpp
Changed
@@ -19,22 +19,17 @@ const std::string CountMeasModeName = "Counting measurement"; const bool nstring = true; // true for n string output +const double S2MS = 1000.0; MeasMode::MeasMode(const std::string& modename, Instrument& instr_) : mname(modename), instr(instr_), minDflux(0) { } -void MeasMode::calcValues() { - blockNumber = (int)floor( S2MS*baseTime/exposition/Instrument::getCountInBlock()); - exposNumber = blockNumber*Instrument::getCountInBlock(); - n_run = (int)floor( accumTime/baseTime ); -} - -void MeasMode::calcValues( double ex ) { - blockNumber = (int)floor( S2MS*baseTime/ex/Instrument::getCountInBlock()); - exposNumber = blockNumber*Instrument::getCountInBlock(); - n_run = (int)floor( accumTime/baseTime ); -} +//void MeasMode::calcValues() { +// double ex = (nstring)? 0.5*exposition : exposition; +// blockNumber = (int)floor( S2MS*baseTime/ex/Instrument::getCountInBlock()); +// exposNumber = blockNumber*Instrument::getCountInBlock(); +//} void MeasMode::outdata(RESULT_DATA& result_data, bool is_accum_time) { Result::instance().outdata(result_data, is_accum_time); @@ -51,9 +46,9 @@ Result::instance().outmode(mname); instr.checkStatus(); instr.waitHV(); - instr.prepareAccumTime( (nstring)? 0.5*exposition : exposition, exposNumber, baseTime, blockNumber ); + exposNumber = instr.prepareAccumTime( (nstring)? 0.5*exposition : exposition, baseTime ); - for( unsigned int i = 0; i < n_run && further_now(); i++ ) { + for( unsigned int i = 0; i < base_number && further_now(); i++ ) { instr.startBaseTime( false ); valarray<COUNT_T> count_data( exposNumber ); RESULT_DATA result_data; @@ -78,8 +73,8 @@ result_data_accum += result_data; particular_processing( count_data, result_data ); // for s strings } // end of base-time-cycle - if( n_loss == n_run ) throw ErrFat( ERR_EXCHANGE, mname ); - result_data_accum /= (double)(n_run - n_loss); + if( n_loss == base_number ) throw ErrFat( ERR_EXCHANGE, mname ); + result_data_accum /= (double)(base_number - n_loss); flux = result_data_accum.m/exposition; // store accumtime mean fluxes vars = result_data_accum.s0*exposition; // store accumtime vaiances outdata( result_data_accum, true ); // output AccumTime data to file @@ -87,32 +82,6 @@ return err; } -unsigned int MeasMode::testcnt( const std::valarray<COUNT_T>& counts, int exposNumber) { - COUNT_T testnumber(exposNumber, exposNumber, exposNumber, exposNumber); - unsigned int err = 0; - for(unsigned int i=0; i<counts.size(); i++) { - testnumber--; - int derr; - if((derr=countsi.a - testnumber.a) != 0) { - testnumber.a = countsi.a; - err += std::abs( (int)derr ); - } - if((derr=countsi.b - testnumber.b) != 0) { - testnumber.b = countsi.b; - err += std::abs( (int)derr ); - } - if((derr=countsi.c - testnumber.c) != 0) { - testnumber.c = countsi.c; - err += std::abs( (int)derr ); - } - if((derr=countsi.d - testnumber.d) != 0) { - testnumber.d = countsi.d; - err += std::abs( (int)derr ); - } - } - return err; -} - std::string MeasMode::getFlux() { char channame4 = { 'A', 'B', 'C', 'D' }; std::ostringstream s; @@ -139,7 +108,8 @@ baseTime = config.inp<int>("operations", NormalModeName, "basetime"); exposition = config.inp<double>("operations", NormalModeName, "exposition"); minDflux = config.inp<double>("operations", NormalModeName, "MinimalStarFlux"); - calcValues(( nstring)? 0.5*exposition : exposition ); + base_number = (int)floor( accumTime/baseTime ); +// calcValues(); } void Normal::pre_processing( valarray<COUNT_T>& count_data ) { @@ -174,7 +144,8 @@ accumTime = config.inp<int>("operations", mname, "accumtime"); baseTime = config.inp<int>("operations", NormalModeName, "basetime"); exposition = config.inp<double>("operations", NormalModeName, "exposition"); - calcValues(); + base_number = (int)floor( accumTime/baseTime ); +// calcValues(); } void Background::run() { @@ -185,7 +156,8 @@ accumTime = config.inp<int>("operations", "tests", "fluxestimationtime"); baseTime = config.inp<int>("operations", NormalModeName, "basetime"); exposition = config.inp<double>("operations", NormalModeName, "exposition"); - calcValues(); + base_number = (int)floor( accumTime/baseTime ); +// calcValues(); } void Flux::run() { @@ -200,7 +172,8 @@ testCounts = config.inpv<double>("operations", "tests", "testcounts"); if(testCounts.size() != N_CHAN) throw ErrFat(ERR_CFG_MISSED, "operations/tests/testcounts"); tolerance = config.inp<double>("operations", "tests", "fluxtolerance"); - calcValues(); + base_number = (int)floor( accumTime/baseTime ); +// calcValues(); } @@ -224,7 +197,8 @@ light = config.inp<double>("operations", "tests", "statisticlight"); modulation = config.inp<double>("operations", "tests", "modulation"); tolerance = config.inp<double>("operations", "tests", "fluxtolerance"); - calcValues(); + base_number = (int)floor( accumTime/baseTime ); +// calcValues(); } void StatTest::run() { @@ -240,26 +214,28 @@ accumTime = config.inp<int>("operations", "tests", "exchangetesttime"); baseTime = config.inp<int>("operations", NormalModeName, "basetime"); exposition = config.inp<double>("operations", NormalModeName, "exposition"); - calcValues(); + base_number = (int)floor( accumTime/baseTime ); +// calcValues(); } unsigned int ExchTest::runAccumTime() { instr.getTemperature(); Result::instance().outmode(mname); - instr.prepareAccumTime(exposition, exposNumber, baseTime, blockNumber); + exposNumber = instr.prepareAccumTime(exposition, baseTime ); + blockNumber = instr.get_blocks_number(); unsigned int n_loss = 0; unsigned int err = 0; unsigned int loss = 0; - for( unsigned int i = 0; i < n_run && further_now(); i++ ) { // base-time-cycle + for( unsigned int i = 0; i < base_number && further_now(); i++ ) { // base-time-cycle valarray<COUNT_T> count_data( exposNumber ); instr.startBaseTime( true ); if( ( loss = instr.obtainData( &count_data ) ) > 0 ) n_loss += loss; Result::instance().outcnt( count_data ); - err += testcnt(count_data, exposNumber); + err += testcnt( count_data ); instr.checkStatus(); } -// if(n_loss == n_run) throw ErrFat(ERR_EXCHANGE, mname); // Proverit' uspeshnost' - vdrug vse base-time proval'nye? +// if(n_loss == base_number) throw ErrFat(ERR_EXCHANGE, mname); // Proverit' uspeshnost' - vdrug vse base-time proval'nye? return n_loss; } @@ -269,7 +245,7 @@ Result::instance().outcomment("Exchange Test: It's OK"); } else { double percentage = 100*err; - if( blockNumber && n_run) percentage = percentage / ( 4*blockNumber*n_run ); + if( blockNumber && base_number) percentage = percentage / ( 4*blockNumber*base_number ); std::ostringstream s; s << "Exchange test failed. Fault = " << std::fixed << std::setprecision(1) << percentage << "%" << std::endl; Result::instance().outcomment(s.str()); @@ -277,11 +253,39 @@ } } +unsigned int ExchTest::testcnt( const std::valarray<COUNT_T>& counts ) { + unsigned int volume = counts.size(); + COUNT_T testnumber( volume, volume, volume, volume ); + unsigned int err = 0; + for( unsigned int i=0; i < volume; i++ ) { + testnumber--; + int derr; + if((derr=countsi.a - testnumber.a) != 0) { + testnumber.a = countsi.a; + err += std::abs( (int)derr ); + } + if((derr=countsi.b - testnumber.b) != 0) { + testnumber.b = countsi.b; + err += std::abs( (int)derr ); + } + if((derr=countsi.c - testnumber.c) != 0) { + testnumber.c = countsi.c; + err += std::abs( (int)derr );
View file
turbina_core_m-1.31.tar.bz2/measmode.h -> turbina_core_m-1.32.tar.bz2/measmode.h
Changed
@@ -13,19 +13,17 @@ double baseTime; double minDflux; // 0 for all modes except normal int accumTime; - unsigned int n_run; + unsigned int base_number; int exposNumber; int blockNumber; static std::valarray<double> flux; static std::valarray<double> vars; static bool _stop_now; - void calcValues( double ex ); - void calcValues(); +// void calcValues(); void monitorTemperature(); unsigned int runAccumTime(); static bool further_now() {return !_stop_now;} - unsigned int testcnt(const std::valarray<COUNT_T>&, int); virtual void particular_processing(std::valarray<COUNT_T>& count_data, const RESULT_DATA& result_data) {} virtual void outdata(RESULT_DATA& result_data, bool is_accum_time); virtual void pre_processing(std::valarray<COUNT_T>& count_data) { sci::binned( count_data ); } @@ -155,6 +153,7 @@ }; class ExchTest : public MeasMode { + unsigned int testcnt( const std::valarray<COUNT_T>& ); public: ExchTest(Config& config, Instrument& instr); ~ExchTest() {}
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.