2014-04-09 21:01:57 +00:00
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim : set ts = 8 sts = 4 et sw = 4 tw = 99 :
*
* SleepLib Day Class Implementation
*
* Copyright ( c ) 2011 - 2014 Mark Watkins < jedimark @ users . sourceforge . net >
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file COPYING in the main directory of the Linux
* distribution for more details . */
2011-06-26 08:30:44 +00:00
2012-01-24 15:51:11 +00:00
# include <QMultiMap>
2014-04-22 21:04:59 +00:00
2012-01-01 15:47:21 +00:00
# include <algorithm>
2014-04-22 21:04:59 +00:00
# include <cmath>
# include <limits>
# include "day.h"
# include "profiles.h"
2011-06-26 08:30:44 +00:00
Day : : Day ( Machine * m )
2014-04-17 05:58:57 +00:00
: machine ( m )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
d_firstsession = true ;
2011-06-26 08:30:44 +00:00
}
Day : : ~ Day ( )
{
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator s = sessions . begin ( ) ; s ! = sessions . end ( ) ; + + s ) {
2014-04-17 05:58:57 +00:00
delete ( * s ) ;
2011-06-26 08:30:44 +00:00
}
}
2014-04-11 22:22:23 +00:00
MachineType Day : : machine_type ( ) const
2011-06-26 08:30:44 +00:00
{
2014-07-28 13:56:29 +00:00
return machine - > type ( ) ;
2011-11-21 10:20:11 +00:00
}
2014-04-17 05:58:57 +00:00
Session * Day : : find ( SessionID sessid )
{
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator s = sessions . begin ( ) ; s ! = end ; + + s ) {
2014-04-23 06:00:09 +00:00
if ( ( * s ) - > session ( ) = = sessid ) {
return ( * s ) ;
2014-04-17 05:58:57 +00:00
}
2011-12-27 13:21:10 +00:00
}
2014-04-17 05:58:57 +00:00
2014-04-23 13:19:56 +00:00
return nullptr ;
2011-12-27 13:21:10 +00:00
}
2011-06-26 08:30:44 +00:00
void Day : : AddSession ( Session * s )
{
if ( ! s ) {
2014-04-23 13:19:56 +00:00
qWarning ( " Day::AddSession called with nullptr session object " ) ;
2011-06-26 08:30:44 +00:00
return ;
}
2014-04-17 05:58:57 +00:00
2011-06-26 08:30:44 +00:00
sessions . push_back ( s ) ;
}
2014-07-30 17:14:28 +00:00
EventDataType Day : : countInsideSpan ( ChannelID span , ChannelID code )
{
QList < Session * > : : iterator end = sessions . end ( ) ;
int count = 0 ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
count + = sess . countInsideSpan ( span , code ) ;
}
}
return count ;
}
2014-08-06 07:28:24 +00:00
EventDataType Day : : lookupValue ( ChannelID code , qint64 time , bool square )
2014-07-20 16:22:51 +00:00
{
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
if ( ( time > sess . first ( ) ) & & ( time < sess . last ( ) ) ) {
2014-08-06 07:28:24 +00:00
return sess . SearchValue ( code , time , square ) ;
2014-07-20 16:22:51 +00:00
}
}
}
return 0 ;
}
2014-05-15 20:48:05 +00:00
EventDataType Day : : timeAboveThreshold ( ChannelID code , EventDataType threshold )
{
EventDataType val = 0 ;
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
val + = sess . timeAboveThreshold ( code , threshold ) ;
}
}
return val ;
}
EventDataType Day : : timeBelowThreshold ( ChannelID code , EventDataType threshold )
{
EventDataType val = 0 ;
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
val + = sess . timeBelowThreshold ( code , threshold ) ;
}
}
return val ;
}
2011-07-31 20:24:43 +00:00
EventDataType Day : : settings_sum ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
EventDataType val = 0 ;
2011-12-28 12:03:48 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-23 06:00:09 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-23 06:00:09 +00:00
if ( sess . enabled ( ) ) {
2014-05-06 18:03:13 +00:00
QHash < ChannelID , QVariant > : : iterator set = sess . settings . find ( code ) ;
2014-04-17 05:58:57 +00:00
2014-04-23 06:00:09 +00:00
if ( set ! = sess . settings . end ( ) ) {
val + = set . value ( ) . toDouble ( ) ;
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-06-26 08:30:44 +00:00
return val ;
}
2011-07-31 20:24:43 +00:00
EventDataType Day : : settings_max ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-07-06 00:22:50 +00:00
EventDataType min = - std : : numeric_limits < EventDataType > : : max ( ) ;
2014-04-22 05:28:58 +00:00
EventDataType max = min ;
EventDataType value ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it < end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
2014-07-06 00:22:50 +00:00
value = sess . settings . value ( code , min ) . toFloat ( ) ;
2014-04-22 05:28:58 +00:00
if ( value > max ) {
max = value ;
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
return max ;
2011-06-26 08:30:44 +00:00
}
2014-04-22 05:28:58 +00:00
2011-07-31 20:24:43 +00:00
EventDataType Day : : settings_min ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-22 05:28:58 +00:00
EventDataType max = std : : numeric_limits < EventDataType > : : max ( ) ;
EventDataType min = max ;
EventDataType value ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it < end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
2014-07-06 00:22:50 +00:00
value = sess . settings . value ( code , max ) . toFloat ( ) ;
2014-04-22 05:28:58 +00:00
if ( value < min ) {
min = value ;
2011-06-26 08:30:44 +00:00
}
}
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
return min ;
2011-06-26 08:30:44 +00:00
}
2011-07-31 20:24:43 +00:00
EventDataType Day : : settings_avg ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
EventDataType val = 0 ;
int cnt = 0 ;
2011-12-28 12:03:48 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; it + + ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
2014-05-06 18:03:13 +00:00
QHash < ChannelID , QVariant > : : iterator set = sess . settings . find ( code ) ;
2014-04-22 05:28:58 +00:00
if ( set ! = sess . settings . end ( ) ) {
val + = set . value ( ) . toDouble ( ) ;
cnt + + ;
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
val = ( cnt > 0 ) ? val / = EventDataType ( cnt ) : val ;
2011-06-26 08:30:44 +00:00
return val ;
}
2014-04-22 05:28:58 +00:00
2011-07-31 20:24:43 +00:00
EventDataType Day : : settings_wavg ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
double s0 = 0 , s1 = 0 , s2 = 0 , tmp ;
2011-12-28 12:03:48 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; it + + ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
2014-05-06 18:03:13 +00:00
QHash < ChannelID , QVariant > : : iterator set = sess . settings . find ( code ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( set ! = sess . settings . end ( ) ) {
s0 = sess . hours ( ) ;
tmp = set . value ( ) . toDouble ( ) ;
s1 + = tmp * s0 ;
s2 + = s0 ;
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
if ( s2 = = 0 ) { return 0 ; }
tmp = ( s1 / s2 ) ;
2011-12-26 18:26:06 +00:00
return tmp ;
2011-06-26 08:30:44 +00:00
}
2012-01-01 15:47:21 +00:00
2014-04-17 05:58:57 +00:00
EventDataType Day : : percentile ( ChannelID code , EventDataType percentile )
2011-12-11 09:45:28 +00:00
{
2014-04-23 06:00:09 +00:00
// Cache this calculation?
2014-04-17 05:58:57 +00:00
// QHash<ChannelID, QHash<EventDataType, EventDataType> >::iterator pi;
// pi=perc_cache.find(code);
// if (pi!=perc_cache.end()) {
// QHash<EventDataType, EventDataType> & hsh=pi.value();
// QHash<EventDataType, EventDataType>::iterator hi=hsh.find(
// if (hi!=pi.value().end()) {
// return hi.value();
// }
// }
2011-12-11 09:45:28 +00:00
2014-04-22 05:28:58 +00:00
QHash < EventStoreType , qint64 > wmap ; // weight map
2012-01-05 04:37:22 +00:00
2014-05-17 05:04:40 +00:00
QHash < EventStoreType , qint64 > : : iterator wmapit ;
2014-04-17 05:58:57 +00:00
qint64 SN = 0 ;
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
EventDataType lastgain = 0 , gain = 0 ;
2012-01-05 04:37:22 +00:00
// First Calculate count of all events
2012-02-01 14:53:31 +00:00
bool timeweight ;
2012-02-02 03:48:44 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator sess_end = sessions . end ( ) ;
2014-05-17 05:04:40 +00:00
for ( QList < Session * > : : iterator sess_it = sessions . begin ( ) ; sess_it ! = sess_end ; + + sess_it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * sess_it ) ;
if ( ! sess . enabled ( ) ) { continue ; }
2011-12-28 12:03:48 +00:00
2014-05-06 18:03:13 +00:00
QHash < ChannelID , QHash < EventStoreType , EventStoreType > > : : iterator ei = sess . m_valuesummary . find ( code ) ;
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
if ( ei = = sess . m_valuesummary . end ( ) ) { continue ; }
2014-05-06 18:03:13 +00:00
QHash < ChannelID , QHash < EventStoreType , quint32 > > : : iterator tei = sess . m_timesummary . find ( code ) ;
2014-04-17 05:58:57 +00:00
timeweight = ( tei ! = sess . m_timesummary . end ( ) ) ;
gain = sess . m_gain [ code ] ;
2012-01-05 12:12:42 +00:00
// Here's assuming gains don't change accross a days sessions
// Can't assume this in any multi day calculations..
2014-04-17 05:58:57 +00:00
if ( lastgain > 0 ) {
if ( gain ! = lastgain ) {
2012-01-09 08:05:20 +00:00
qDebug ( ) < < " Gains differ across sessions: " < < gain < < lastgain ;
2012-01-05 12:12:42 +00:00
}
}
2014-04-17 05:58:57 +00:00
lastgain = gain ;
2012-01-05 12:12:42 +00:00
2012-02-01 14:53:31 +00:00
qint64 weight ;
2014-04-17 05:58:57 +00:00
2013-01-17 18:26:11 +00:00
//qint64 tval;
2012-02-01 14:53:31 +00:00
if ( timeweight ) {
2014-05-06 18:03:13 +00:00
QHash < EventStoreType , quint32 > : : iterator teival_end = tei . value ( ) . end ( ) ;
2014-05-17 05:04:40 +00:00
wmap . reserve ( wmap . size ( ) + tei . value ( ) . size ( ) ) ;
2014-05-06 18:03:13 +00:00
for ( QHash < EventStoreType , quint32 > : : iterator it = tei . value ( ) . begin ( ) ; it ! = teival_end ; + + it ) {
2014-04-23 06:00:09 +00:00
weight = it . value ( ) ;
2014-04-17 05:58:57 +00:00
SN + = weight ;
2014-05-17 05:04:40 +00:00
wmap [ it . key ( ) ] + = weight ;
2012-02-01 14:53:31 +00:00
}
} else {
2014-05-06 18:03:13 +00:00
QHash < EventStoreType , EventStoreType > : : iterator eival_end = ei . value ( ) . end ( ) ;
2012-02-01 14:53:31 +00:00
2014-05-17 05:04:40 +00:00
wmap . reserve ( wmap . size ( ) + ei . value ( ) . size ( ) ) ;
2014-05-06 18:03:13 +00:00
for ( QHash < EventStoreType , EventStoreType > : : iterator it = ei . value ( ) . begin ( ) ; it ! = eival_end ; + + it ) {
2014-04-23 06:00:09 +00:00
weight = it . value ( ) ;
2012-02-01 14:53:31 +00:00
2014-04-17 05:58:57 +00:00
SN + = weight ;
2012-02-01 14:53:31 +00:00
2014-05-17 05:04:40 +00:00
wmap [ it . key ( ) ] + = weight ;
2012-02-01 14:53:31 +00:00
}
2011-12-11 09:45:28 +00:00
}
}
2012-01-01 15:47:21 +00:00
2012-01-05 04:37:22 +00:00
QVector < ValueCount > valcnt ;
2014-05-17 05:04:40 +00:00
valcnt . resize ( wmap . size ( ) ) ;
2012-01-05 04:37:22 +00:00
// Build sorted list of value/counts
2014-04-22 05:28:58 +00:00
2014-05-06 18:03:13 +00:00
QHash < EventStoreType , qint64 > : : iterator wmap_end = wmap . end ( ) ;
2014-05-17 05:04:40 +00:00
int ii = 0 ;
for ( QHash < EventStoreType , qint64 > : : iterator it = wmap . begin ( ) ; it ! = wmap_end ; + + it ) {
valcnt [ ii + + ] = ValueCount ( EventDataType ( it . key ( ) ) * gain , it . value ( ) , 0 ) ;
2012-01-05 04:37:22 +00:00
}
2014-04-17 05:58:57 +00:00
2012-01-05 04:37:22 +00:00
// sort by weight, then value
qSort ( valcnt ) ;
//double SN=100.0/double(N); // 100% / overall sum
2014-04-17 05:58:57 +00:00
double p = 100.0 * percentile ;
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
double nth = double ( SN ) * percentile ; // index of the position in the unweighted set would be
double nthi = floor ( nth ) ;
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
qint64 sum1 = 0 , sum2 = 0 ;
qint64 w1 , w2 = 0 ;
double v1 = 0 , v2 ;
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
int N = valcnt . size ( ) ;
int k = 0 ;
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
for ( k = 0 ; k < N ; k + + ) {
2014-05-17 05:04:40 +00:00
v1 = valcnt . at ( k ) . value ;
w1 = valcnt . at ( k ) . count ;
2014-04-17 05:58:57 +00:00
sum1 + = w1 ;
2012-01-05 04:37:22 +00:00
if ( sum1 > nthi ) {
return v1 ;
}
2014-04-17 05:58:57 +00:00
if ( sum1 = = nthi ) {
2012-01-05 04:37:22 +00:00
break ; // boundary condition
}
}
2014-04-17 05:58:57 +00:00
if ( k > = N ) {
2012-01-05 04:37:22 +00:00
return v1 ;
2014-04-17 05:58:57 +00:00
}
2012-01-05 04:37:22 +00:00
2014-04-17 05:58:57 +00:00
v2 = valcnt [ k + 1 ] . value ;
w2 = valcnt [ k + 1 ] . count ;
sum2 = sum1 + w2 ;
2012-01-05 04:37:22 +00:00
// value lies between v1 and v2
2014-04-17 05:58:57 +00:00
double px = 100.0 / double ( SN ) ; // Percentile represented by one full value
2012-01-05 04:37:22 +00:00
// calculate percentile ranks
2014-04-17 05:58:57 +00:00
double p1 = px * ( double ( sum1 ) - ( double ( w1 ) / 2.0 ) ) ;
double p2 = px * ( double ( sum2 ) - ( double ( w2 ) / 2.0 ) ) ;
2012-01-05 04:37:22 +00:00
// calculate linear interpolation
2014-04-17 05:58:57 +00:00
double v = v1 + ( ( p - p1 ) / ( p2 - p1 ) ) * ( v2 - v1 ) ;
2012-01-05 04:37:22 +00:00
return v ;
2014-04-17 05:58:57 +00:00
// p1.....p.............p2
// 37 55 70
2011-12-11 09:45:28 +00:00
}
2011-12-24 01:22:41 +00:00
EventDataType Day : : p90 ( ChannelID code )
2011-07-31 20:24:43 +00:00
{
2014-05-08 04:46:23 +00:00
return percentile ( code , 0.90F ) ;
2011-07-31 20:24:43 +00:00
}
2011-06-26 08:30:44 +00:00
2011-07-31 20:24:43 +00:00
EventDataType Day : : avg ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
double val = 0 ;
2011-06-26 08:30:44 +00:00
// Cache this?
2014-04-17 05:58:57 +00:00
int cnt = 0 ;
2011-06-26 08:30:44 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2011-12-28 12:03:48 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_avg . contains ( code ) ) {
2014-04-17 05:58:57 +00:00
val + = sess . avg ( code ) ;
2014-04-22 05:28:58 +00:00
cnt + + ; // hmm.. averaging averages doesn't feel right..
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
if ( cnt = = 0 ) { return 0 ; }
return EventDataType ( val / float ( cnt ) ) ;
2011-06-26 08:30:44 +00:00
}
2011-07-31 20:24:43 +00:00
EventDataType Day : : sum ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
// Cache this?
2014-04-17 05:58:57 +00:00
EventDataType val = 0 ;
2011-06-26 08:30:44 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2011-12-28 12:03:48 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_sum . contains ( code ) ) {
2014-04-17 05:58:57 +00:00
val + = sess . sum ( code ) ;
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-06-26 08:30:44 +00:00
return val ;
}
2011-07-31 20:24:43 +00:00
EventDataType Day : : wavg ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
double s0 = 0 , s1 = 0 , s2 = 0 ;
2011-08-07 11:37:56 +00:00
qint64 d ;
2011-12-28 12:03:48 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2011-12-28 12:03:48 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_wavg . contains ( code ) ) {
2014-04-17 05:58:57 +00:00
d = sess . length ( ) ; //.last(code)-sess.first(code);
s0 = double ( d ) / 3600000.0 ;
if ( s0 > 0 ) {
s1 + = sess . wavg ( code ) * s0 ;
s2 + = s0 ;
2011-08-07 11:37:56 +00:00
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
if ( s2 = = 0 ) {
2011-08-07 11:37:56 +00:00
return 0 ;
2014-04-17 05:58:57 +00:00
}
2011-08-07 11:37:56 +00:00
2014-04-17 05:58:57 +00:00
return ( s1 / s2 ) ;
2011-06-26 08:30:44 +00:00
}
2014-04-22 05:28:58 +00:00
2011-07-03 02:43:50 +00:00
// Total session time in milliseconds
2011-07-02 14:35:50 +00:00
qint64 Day : : total_time ( )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
qint64 d_totaltime = 0 ;
QMultiMap < qint64 , bool > range ;
2012-01-24 15:51:11 +00:00
//range.reserve(size()*2);
2014-04-23 06:00:09 +00:00
// Remember sessions may overlap..
2011-12-28 12:03:48 +00:00
2014-05-07 00:10:13 +00:00
qint64 first , last ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
2014-05-07 00:10:13 +00:00
first = sess . first ( ) ;
last = sess . last ( ) ;
// This algorithm relies on non zero length, and correctly ordered sessions
if ( last > first ) {
range . insert ( first , 0 ) ;
range . insert ( last , 1 ) ;
d_totaltime + = sess . length ( ) ;
}
2014-04-22 05:28:58 +00:00
}
2011-06-26 08:30:44 +00:00
}
2012-01-24 15:51:11 +00:00
bool b ;
2014-04-17 05:58:57 +00:00
int nest = 0 ;
2014-05-07 00:10:13 +00:00
qint64 ti = 0 ;
2014-04-17 05:58:57 +00:00
qint64 total = 0 ;
2012-01-24 16:45:18 +00:00
// This is my implementation of a typical "brace counting" algorithm mentioned here:
// http://stackoverflow.com/questions/7468948/problem-calculating-overlapping-date-ranges
2014-04-22 05:28:58 +00:00
2014-05-06 18:03:13 +00:00
QMultiMap < qint64 , bool > : : iterator rend = range . end ( ) ;
for ( QMultiMap < qint64 , bool > : : iterator rit = range . begin ( ) ; rit ! = rend ; + + rit ) {
2014-04-22 05:28:58 +00:00
b = rit . value ( ) ;
2014-04-17 05:58:57 +00:00
2012-01-24 15:51:11 +00:00
if ( ! b ) {
2014-04-22 05:28:58 +00:00
if ( ! ti ) {
ti = rit . key ( ) ;
}
2014-04-17 05:58:57 +00:00
2012-01-24 15:51:11 +00:00
nest + + ;
} else {
if ( - - nest < = 0 ) {
2014-04-22 05:28:58 +00:00
total + = rit . key ( ) - ti ;
2014-04-17 05:58:57 +00:00
ti = 0 ;
2012-01-24 15:51:11 +00:00
}
}
}
2014-04-17 05:58:57 +00:00
if ( total ! = d_totaltime ) {
2014-05-04 18:23:38 +00:00
// They can overlap.. tough.
// qDebug() << "Sessions Times overlaps!" << total << d_totaltime;
2012-01-24 15:51:11 +00:00
}
2014-04-17 05:58:57 +00:00
2012-01-24 15:51:11 +00:00
return total ; //d_totaltime;
2011-06-26 08:30:44 +00:00
}
2014-04-22 05:28:58 +00:00
2011-12-28 14:03:09 +00:00
bool Day : : hasEnabledSessions ( )
{
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
if ( ( * it ) - > enabled ( ) ) {
return true ;
2011-12-28 14:03:09 +00:00
}
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
return false ;
2011-12-28 14:03:09 +00:00
}
2011-12-11 09:45:28 +00:00
/*EventDataType Day::percentile(ChannelID code,double percent)
2011-06-26 08:30:44 +00:00
{
double val = 0 ;
int cnt = 0 ;
2013-10-22 11:42:57 +00:00
for ( QList < Session * > : : iterator s = sessions . begin ( ) ; s ! = sessions . end ( ) ; s + + ) {
2011-06-26 08:30:44 +00:00
Session & sess = * ( * s ) ;
2011-07-27 09:21:53 +00:00
if ( sess . eventlist . find ( code ) ! = sess . eventlist . end ( ) ) {
val + = sess . percentile ( code , percent ) ;
2011-06-26 08:30:44 +00:00
cnt + + ;
}
}
if ( cnt = = 0 ) return 0 ;
return EventDataType ( val / cnt ) ;
2011-12-11 09:45:28 +00:00
} */
2011-06-26 08:30:44 +00:00
2011-07-31 20:24:43 +00:00
qint64 Day : : first ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
qint64 date = 0 ;
2011-07-02 14:35:50 +00:00
qint64 tmp ;
2011-06-26 08:30:44 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
tmp = sess . first ( code ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( ! tmp ) { continue ; }
if ( ! date ) {
date = tmp ;
} else {
if ( tmp < date ) { date = tmp ; }
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-06-26 08:30:44 +00:00
return date ;
}
2011-07-31 20:24:43 +00:00
qint64 Day : : last ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
qint64 date = 0 ;
2011-07-02 14:35:50 +00:00
qint64 tmp ;
2011-06-26 08:30:44 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; it + + ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
tmp = sess . last ( code ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( ! tmp ) { continue ; }
if ( ! date ) {
date = tmp ;
} else {
if ( tmp > date ) { date = tmp ; }
}
2011-06-26 08:30:44 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-06-26 08:30:44 +00:00
return date ;
}
2013-10-25 10:39:30 +00:00
2011-12-17 14:38:15 +00:00
EventDataType Day : : Min ( ChannelID code )
2011-06-26 08:30:44 +00:00
{
2014-04-17 05:58:57 +00:00
EventDataType min = 0 ;
2011-07-27 09:21:53 +00:00
EventDataType tmp ;
2014-04-17 05:58:57 +00:00
bool first = true ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; it + + ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_min . contains ( code ) ) {
tmp = sess . Min ( code ) ;
if ( first ) {
min = tmp ;
first = false ;
} else {
if ( tmp < min ) { min = tmp ; }
}
2011-07-27 09:21:53 +00:00
}
2011-06-26 08:30:44 +00:00
}
2014-04-17 05:58:57 +00:00
2011-07-27 09:21:53 +00:00
return min ;
}
2011-06-26 08:30:44 +00:00
2013-10-25 10:39:30 +00:00
EventDataType Day : : physMin ( ChannelID code )
{
2014-04-17 05:58:57 +00:00
EventDataType min = 0 ;
2013-10-25 10:39:30 +00:00
EventDataType tmp ;
2014-04-17 05:58:57 +00:00
bool first = true ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_min . contains ( code ) ) {
2013-10-25 10:39:30 +00:00
2014-04-22 05:28:58 +00:00
tmp = sess . physMin ( code ) ;
if ( first ) {
min = tmp ;
first = false ;
} else {
if ( tmp < min ) { min = tmp ; }
}
2013-10-25 10:39:30 +00:00
}
}
2014-04-17 05:58:57 +00:00
2013-10-25 10:39:30 +00:00
return min ;
}
2011-12-10 12:14:48 +00:00
bool Day : : hasData ( ChannelID code , SummaryType type )
{
2014-04-17 05:58:57 +00:00
bool has = false ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
switch ( type ) {
// case ST_90P:
// has=sess->m_90p.contains(code);
// break;
case ST_PERC :
has = sess . m_valuesummary . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_MIN :
has = sess . m_min . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_MAX :
has = sess . m_max . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_CNT :
has = sess . m_cnt . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_AVG :
has = sess . m_avg . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_WAVG :
has = sess . m_wavg . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_CPH :
has = sess . m_cph . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_SPH :
has = sess . m_sph . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_FIRST :
has = sess . m_firstchan . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_LAST :
has = sess . m_lastchan . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
case ST_SUM :
has = sess . m_sum . contains ( code ) ;
break ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
default :
break ;
}
2011-12-10 12:14:48 +00:00
2014-04-22 05:28:58 +00:00
if ( has ) { break ; }
}
2011-12-10 12:14:48 +00:00
}
2014-04-17 05:58:57 +00:00
2011-12-10 12:14:48 +00:00
return has ;
}
2011-12-17 14:38:15 +00:00
EventDataType Day : : Max ( ChannelID code )
2011-07-27 09:21:53 +00:00
{
2014-04-17 05:58:57 +00:00
EventDataType max = 0 ;
2011-07-27 09:21:53 +00:00
EventDataType tmp ;
2014-04-17 05:58:57 +00:00
bool first = true ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_max . contains ( code ) ) {
2011-12-28 12:03:48 +00:00
2014-04-22 05:28:58 +00:00
tmp = sess . Max ( code ) ;
if ( first ) {
max = tmp ;
first = false ;
} else {
if ( tmp > max ) { max = tmp ; }
}
2011-07-27 09:21:53 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-07-27 09:21:53 +00:00
return max ;
2011-06-26 08:30:44 +00:00
}
2013-10-25 10:39:30 +00:00
EventDataType Day : : physMax ( ChannelID code )
{
2014-04-17 05:58:57 +00:00
EventDataType max = 0 ;
2013-10-25 10:39:30 +00:00
EventDataType tmp ;
2014-04-17 05:58:57 +00:00
bool first = true ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_max . contains ( code ) ) {
tmp = sess . physMax ( code ) ;
2013-10-25 10:39:30 +00:00
2014-04-22 05:28:58 +00:00
if ( first ) {
max = tmp ;
first = false ;
} else {
if ( tmp > max ) { max = tmp ; }
}
2013-10-25 10:39:30 +00:00
}
}
2014-04-17 05:58:57 +00:00
2013-10-25 10:39:30 +00:00
return max ;
}
2011-09-10 15:43:40 +00:00
EventDataType Day : : cph ( ChannelID code )
{
2014-04-17 05:58:57 +00:00
double sum = 0 ;
2011-09-17 12:39:00 +00:00
//EventDataType h=0;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) & & sess . m_cnt . contains ( code ) ) {
sum + = sess . count ( code ) ;
}
2011-09-10 15:43:40 +00:00
}
2014-04-17 05:58:57 +00:00
sum / = hours ( ) ;
2011-09-10 15:43:40 +00:00
return sum ;
}
EventDataType Day : : sph ( ChannelID code )
{
2014-04-17 05:58:57 +00:00
EventDataType sum = 0 ;
EventDataType h = 0 ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . m_sum . contains ( code ) ) {
sum + = sess . sum ( code ) / 3600.0 ; //*sessions[i]->hours();
//h+=sessions[i]->hours();
}
2011-09-10 15:43:40 +00:00
}
2014-04-17 05:58:57 +00:00
h = hours ( ) ;
sum = ( 100.0 / h ) * sum ;
2011-09-10 15:43:40 +00:00
return sum ;
}
2014-06-20 02:06:57 +00:00
EventDataType Day : : count ( ChannelID code )
2011-07-27 09:21:53 +00:00
{
2014-06-20 02:06:57 +00:00
EventDataType total = 0 ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-06-20 02:06:57 +00:00
if ( sess . enabled ( ) & & sess . m_cnt . contains ( code ) ) {
total + = sess . count ( code ) ;
2014-04-22 05:28:58 +00:00
}
2011-07-27 09:21:53 +00:00
}
2014-04-17 05:58:57 +00:00
2014-06-20 02:06:57 +00:00
return total ;
2011-07-27 09:21:53 +00:00
}
2014-04-22 05:28:58 +00:00
2014-05-19 03:46:02 +00:00
bool Day : : summaryOnly ( )
{
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
Session & sess = * ( * it ) ;
2014-07-02 11:58:36 +00:00
if ( sess . summaryOnly ( ) )
return true ;
2014-05-19 03:46:02 +00:00
}
return false ;
}
2011-09-18 15:43:14 +00:00
bool Day : : settingExists ( ChannelID id )
{
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
if ( sess . enabled ( ) ) {
2014-05-06 18:03:13 +00:00
QHash < ChannelID , QVariant > : : iterator set = sess . settings . find ( id ) ;
2014-04-22 05:28:58 +00:00
if ( set ! = sess . settings . end ( ) ) {
return true ;
}
2011-09-18 15:43:14 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-09-18 15:43:14 +00:00
return false ;
}
2014-04-22 05:28:58 +00:00
2011-12-23 10:52:31 +00:00
bool Day : : eventsLoaded ( )
{
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . eventsLoaded ( ) ) {
return true ;
2011-12-23 10:52:31 +00:00
}
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
return false ;
2011-12-23 10:52:31 +00:00
}
2011-08-07 11:37:56 +00:00
bool Day : : channelExists ( ChannelID id )
{
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2011-12-28 12:03:48 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) & & sess . eventlist . contains ( id ) ) {
return true ;
2011-12-10 12:14:48 +00:00
}
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
return false ;
2011-09-17 12:39:00 +00:00
}
2014-04-22 05:28:58 +00:00
2011-09-17 12:39:00 +00:00
bool Day : : channelHasData ( ChannelID id )
{
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2011-12-28 12:03:48 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
if ( sess . channelExists ( id ) ) {
return true ;
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . m_valuesummary . contains ( id ) ) {
return true ;
}
2014-06-20 02:06:57 +00:00
if ( sess . m_cnt . contains ( id ) ) {
return true ;
}
2011-12-30 23:02:45 +00:00
}
2011-09-17 12:39:00 +00:00
}
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
return false ;
2011-08-07 11:37:56 +00:00
}
2011-07-27 09:21:53 +00:00
void Day : : OpenEvents ( )
2011-06-26 08:30:44 +00:00
{
2014-04-22 05:28:58 +00:00
Q_FOREACH ( Session * session , sessions ) {
session - > OpenEvents ( ) ;
2011-06-26 08:30:44 +00:00
}
2011-12-23 10:52:31 +00:00
}
2014-04-22 05:28:58 +00:00
2011-12-23 10:52:31 +00:00
void Day : : CloseEvents ( )
{
2014-04-22 05:28:58 +00:00
Q_FOREACH ( Session * session , sessions ) {
session - > TrashEvents ( ) ;
2011-12-23 10:52:31 +00:00
}
2011-06-26 08:30:44 +00:00
}
2011-12-28 12:36:40 +00:00
qint64 Day : : first ( )
{
2014-04-17 05:58:57 +00:00
qint64 date = 0 ;
2011-12-28 12:36:40 +00:00
qint64 tmp ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
tmp = sess . first ( ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( ! tmp ) { continue ; }
if ( ! date ) {
date = tmp ;
} else {
if ( tmp < date ) { date = tmp ; }
}
2011-12-28 12:36:40 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-12-28 12:36:40 +00:00
return date ;
}
//! \brief Returns the last session time of this day
qint64 Day : : last ( )
{
2014-04-17 05:58:57 +00:00
qint64 date = 0 ;
2011-12-28 12:36:40 +00:00
qint64 tmp ;
2014-05-06 18:03:13 +00:00
QList < Session * > : : iterator end = sessions . end ( ) ;
2014-04-17 05:58:57 +00:00
2014-05-06 18:03:13 +00:00
for ( QList < Session * > : : iterator it = sessions . begin ( ) ; it ! = end ; + + it ) {
2014-04-22 05:28:58 +00:00
Session & sess = * ( * it ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( sess . enabled ( ) ) {
tmp = sess . last ( ) ;
2014-04-17 05:58:57 +00:00
2014-04-22 05:28:58 +00:00
if ( ! tmp ) { continue ; }
if ( ! date ) {
date = tmp ;
} else {
if ( tmp > date ) { date = tmp ; }
}
2011-12-28 12:36:40 +00:00
}
}
2014-04-17 05:58:57 +00:00
2011-12-28 12:36:40 +00:00
return date ;
}
2013-10-22 11:42:57 +00:00
2014-07-25 07:53:48 +00:00
bool Day : : removeSession ( Session * sess )
2013-10-22 11:42:57 +00:00
{
2014-07-25 07:53:48 +00:00
return sessions . removeAll ( sess ) > 0 ;
}
QString Day : : getCPAPMode ( )
{
2014-08-03 13:00:13 +00:00
Q_ASSERT ( machine_type ( ) = = MT_CPAP ) ;
CPAPMode mode = ( CPAPMode ) ( int ) qRound ( settings_wavg ( CPAP_Mode ) ) ;
2014-07-25 07:53:48 +00:00
if ( mode = = MODE_CPAP ) {
return QObject : : tr ( " Fixed " ) ;
} else if ( mode = = MODE_APAP ) {
return QObject : : tr ( " Auto " ) ;
} else if ( mode = = MODE_BILEVEL_FIXED ) {
return QObject : : tr ( " Fixed Bi-Level " ) ;
} else if ( mode = = MODE_BILEVEL_AUTO_FIXED_PS ) {
return QObject : : tr ( " Auto Bi-Level (Fixed PS) " ) ;
2014-08-03 13:00:13 +00:00
} else if ( mode = = MODE_BILEVEL_AUTO_VARIABLE_PS ) {
return QObject : : tr ( " Auto Bi-Level (Variable PS) " ) ;
} else if ( mode = = MODE_ASV ) {
2014-07-25 07:53:48 +00:00
return QObject : : tr ( " ASV Fixed EPAP " ) ;
2014-08-03 13:00:13 +00:00
} else if ( mode = = MODE_ASV_VARIABLE_EPAP ) {
2014-07-25 07:53:48 +00:00
return QObject : : tr ( " ASV Variable EPAP " ) ;
2013-10-22 11:42:57 +00:00
}
2014-07-25 07:53:48 +00:00
return STR_TR_Unknown ;
}
2014-08-03 13:00:13 +00:00
QString Day : : getPressureRelief ( )
{
CPAPLoader * loader = qobject_cast < CPAPLoader * > ( machine - > loader ( ) ) ;
if ( ! loader ) return STR_MessageBox_Error ;
QString pr_str ;
ChannelID pr_level_chan = loader - > PresReliefLevel ( ) ;
ChannelID pr_mode_chan = loader - > PresReliefMode ( ) ;
2014-08-04 19:57:48 +00:00
if ( ( pr_mode_chan ! = NoChannel ) & & settingExists ( pr_mode_chan ) ) {
2014-08-03 13:00:13 +00:00
int pr_mode = qRound ( settings_wavg ( pr_mode_chan ) ) ;
2014-08-04 19:57:48 +00:00
pr_str = QObject : : tr ( " %1%2 " ) . arg ( loader - > PresReliefLabel ( ) ) . arg ( schema : : channel [ pr_mode_chan ] . option ( pr_mode ) ) ;
int pr_level = - 1 ;
if ( pr_level_chan ! = NoChannel & & settingExists ( pr_level_chan ) ) {
pr_level = qRound ( settings_wavg ( pr_level_chan ) ) ;
}
if ( pr_level > = 0 ) pr_str + = QString ( " %1 " ) . arg ( schema : : channel [ pr_level_chan ] . option ( pr_level ) ) ;
2014-08-03 13:00:13 +00:00
} else pr_str = STR_TR_None ;
return pr_str ;
}
2014-07-25 07:53:48 +00:00
QString Day : : getPressureSettings ( )
{
2014-08-03 13:00:13 +00:00
Q_ASSERT ( machine_type ( ) = = MT_CPAP ) ;
2014-07-25 07:53:48 +00:00
CPAPMode mode = ( CPAPMode ) ( int ) settings_max ( CPAP_Mode ) ;
QString units = schema : : channel [ CPAP_Pressure ] . units ( ) ;
if ( mode = = MODE_CPAP ) {
2014-08-03 13:00:13 +00:00
return QObject : : tr ( " Fixed %1 (%2) " ) . arg ( settings_min ( CPAP_Pressure ) ) . arg ( units ) ;
2014-07-25 07:53:48 +00:00
} else if ( mode = = MODE_APAP ) {
2014-08-03 13:00:13 +00:00
return QObject : : tr ( " Min %1 Max %2 (%3) " ) . arg ( settings_min ( CPAP_PressureMin ) ) . arg ( settings_max ( CPAP_PressureMax ) ) . arg ( units ) ;
2014-07-25 07:53:48 +00:00
} else if ( mode = = MODE_BILEVEL_FIXED ) {
2014-08-05 22:31:31 +00:00
return QObject : : tr ( " EPAP %1 IPAP %2 (%3) " ) . arg ( settings_min ( CPAP_EPAP ) , 0 , ' f ' , 1 ) . arg ( settings_max ( CPAP_IPAP ) , 0 , ' f ' , 1 ) . arg ( units ) ;
2014-07-25 07:53:48 +00:00
} else if ( mode = = MODE_BILEVEL_AUTO_FIXED_PS ) {
2014-08-05 22:31:31 +00:00
return QObject : : tr ( " PS %1 over %2-%3 (%4) " ) . arg ( settings_max ( CPAP_PS ) , 0 , ' f ' , 1 ) . arg ( settings_min ( CPAP_EPAPLo ) , 0 , ' f ' , 1 ) . arg ( settings_max ( CPAP_IPAPHi ) , 0 , ' f ' , 1 ) . arg ( units ) ;
2014-08-03 13:00:13 +00:00
} else if ( mode = = MODE_BILEVEL_AUTO_VARIABLE_PS ) {
2014-08-05 22:31:31 +00:00
return QObject : : tr ( " Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) " ) . arg ( settings_min ( CPAP_EPAPLo ) , 0 , ' f ' , 1 ) . arg ( settings_max ( CPAP_IPAPHi ) , 0 , ' f ' , 1 ) . arg ( settings_min ( CPAP_PSMin ) , 0 , ' f ' , 1 ) . arg ( settings_max ( CPAP_PSMax ) , 0 , ' f ' , 1 ) . arg ( units ) ;
2014-07-25 07:53:48 +00:00
} else if ( mode = = MODE_ASV ) {
2014-08-03 15:24:58 +00:00
return QObject : : tr ( " EPAP %1 PS %2-%3 (%6) " ) . arg ( settings_min ( CPAP_EPAP ) , 0 , ' f ' , 1 ) . arg ( settings_min ( CPAP_PSMin ) , 0 , ' f ' , 1 ) . arg ( settings_max ( CPAP_PSMax ) , 0 , ' f ' , 1 ) . arg ( units ) ;
2014-07-25 07:53:48 +00:00
} else if ( mode = = MODE_ASV_VARIABLE_EPAP ) {
2014-08-06 07:08:34 +00:00
return QObject : : tr ( " Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) " ) .
arg ( settings_min ( CPAP_EPAPLo ) , 0 , ' f ' , 1 ) .
arg ( settings_max ( CPAP_IPAPHi ) , 0 , ' f ' , 1 ) .
arg ( settings_max ( CPAP_PSMin ) , 0 , ' f ' , 1 ) .
arg ( settings_min ( CPAP_PSMax ) , 0 , ' f ' , 1 ) .
arg ( units ) ;
2014-07-25 07:53:48 +00:00
}
return STR_TR_Unknown ;
2013-10-22 11:42:57 +00:00
}