@ -5,7 +5,6 @@ 
			
		
	
		
		
			
				
					
					# include  <QDebug> # include  <QDebug>  
			
		
	
		
		
			
				
					
					# include  <QVBoxLayout> # include  <QVBoxLayout>  
			
		
	
		
		
			
				
					
					# include  <QLabel> # include  <QLabel>  
			
		
	
		
		
			
				
					
					# include  <QLineEdit>  
			
		
	
		
		
			
				
					
					# include  <QJsonDocument> # include  <QJsonDocument>  
			
		
	
		
		
			
				
					
					# include  <QJsonObject> # include  <QJsonObject>  
			
		
	
		
		
			
				
					
					# include  <QNetworkAccessManager> # include  <QNetworkAccessManager>  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -19,7 +18,9 @@ 
			
		
	
		
		
			
				
					
					# include  "drive_stats.hpp" # include  "drive_stats.hpp"  
			
		
	
		
		
			
				
					
					# include  "common/params.h" # include  "common/params.h"  
			
		
	
		
		
			
				
					
					# include  "common/utilpp.h" # include  "common/utilpp.h"  
			
		
	
		
		
			
				
					
					double  MILE_TO_KM  =  1.60934 ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					constexpr  double  MILE_TO_KM  =  1.60934 ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# if defined(QCOM) || defined(QCOM2) # if defined(QCOM) || defined(QCOM2)  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -28,6 +29,7 @@ const std::string private_key_path = "/persist/comma/id_rsa"; 
			
		
	
		
		
			
				
					
					const  std : : string  private_key_path  =  util : : getenv_default ( " HOME " ,  " /.comma/persist/comma/id_rsa " ,  " /persist/comma/id_rsa " ) ; const  std : : string  private_key_path  =  util : : getenv_default ( " HOME " ,  " /.comma/persist/comma/id_rsa " ,  " /persist/comma/id_rsa " ) ;  
			
		
	
		
		
			
				
					
					# endif # endif  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					QByteArray  rsa_sign ( QByteArray  data )  { QByteArray  rsa_sign ( QByteArray  data )  {  
			
		
	
		
		
			
				
					
					  auto  file  =  QFile ( private_key_path . c_str ( ) ) ;    auto  file  =  QFile ( private_key_path . c_str ( ) ) ;   
			
		
	
		
		
			
				
					
					  bool  r  =  file . open ( QIODevice : : ReadOnly ) ;    bool  r  =  file . open ( QIODevice : : ReadOnly ) ;   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -81,21 +83,24 @@ QString create_jwt(QString dongle_id, int expiry=3600){ 
			
		
	
		
		
			
				
					
					  return  jwt ;    return  jwt ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					QString  bold ( QString  s )  { QLayout  * build_stat ( QString  name ,  int  stat )  {  
			
				
				
			
		
	
		
		
			
				
					
					  return  " <b> "  +  s  +  " </b> " ;    QVBoxLayout  * layout  =  new  QVBoxLayout ;   
			
				
				
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					QWidget  * widget ( QLayout  * l ) {   QLabel  * metric  =  new  QLabel ( QString ( " %1 " ) . arg ( stat ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  QWidget  * q  =  new  QWidget ( ) ;    metric - > setStyleSheet ( R " (   
			
				
				
			
		
	
		
		
			
				
					
					  q - > setLayout ( l ) ;      font - size :  72 px ;   
			
				
				
			
		
	
		
		
			
				
					
					  return  q ;      font - weight :  700 ;   
			
				
				
			
		
	
		
		
			
				
					
					}   ) " );   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					  layout - > addWidget ( metric ,  0 ,  Qt : : AlignLeft ) ;   
			
		
	
		
		
			
				
					
					  
   
  
			
		
	
		
		
			
				
					
					QWidget  * build_stat ( QString  name ,  int  stat ) {   QLabel  * label  =  new  QLabel ( name ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  QVBoxLayout  * layout  =  new  QVBoxLayout ;    label - > setStyleSheet ( R " (   
			
				
				
			
		
	
		
		
			
				
					
					  layout - > addWidget ( new  QLabel ( bold ( QString ( " %1 " ) . arg ( stat ) ) ) ,  1 ,  Qt : : AlignCenter ) ;      font - size :  32 px ;   
			
				
				
			
		
	
		
		
			
				
					
					  layout - > addWidget ( new  QLabel ( name ) , 1 ,  Qt : : AlignCenter ) ;      font - weight :  600 ;   
			
				
				
			
		
	
		
		
			
				
					
					  return  widget ( layout ) ;    ) " );   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					  layout - > addWidget ( label ,  0 ,  Qt : : AlignLeft ) ;   
			
		
	
		
		
			
				
					
					  
  
			
		
	
		
		
			
				
					
					  return  layout ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  DriveStats : : replyFinished ( QNetworkReply  * l )  { void  DriveStats : : replyFinished ( QNetworkReply  * l )  {  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -116,47 +121,27 @@ void DriveStats::replyFinished(QNetworkReply *l){ 
			
		
	
		
		
			
				
					
					  QGridLayout  * gl  =  new  QGridLayout ( ) ;    QGridLayout  * gl  =  new  QGridLayout ( ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  int  all_distance  =  all [ " distance " ] . toDouble ( ) * ( metric  ?  MILE_TO_KM  :  1 ) ;    int  all_distance  =  all [ " distance " ] . toDouble ( ) * ( metric  ?  MILE_TO_KM  :  1 ) ;   
			
		
	
		
		
			
				
					
					  gl - > addWidget ( new  QLabel ( bold ( " ALL TIME " ) ) ,  0 ,  0 ,  1 ,  3 ) ;    gl - > addWidget ( new  QLabel ( " ALL TIME " ) ,  0 ,  0 ,  1 ,  3 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  gl - > addWidget ( build_stat ( " DRIVES " ,  all [ " routes " ] . toDouble ( ) ) ,  1 ,  0 ,  3 ,  1 ) ;    gl - > addLayout ( build_stat ( " DRIVES " ,  all [ " routes " ] . toDouble ( ) ) ,  1 ,  0 ,  3 ,  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  gl - > addWidget ( build_stat ( metric  ?  " KM "  :  " MILES " ,  all_distance ) ,  1 ,  1 ,  3 ,  1 ) ;    gl - > addLayout ( build_stat ( metric  ?  " KM "  :  " MILES " ,  all_distance ) ,  1 ,  1 ,  3 ,  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  gl - > addWidget ( build_stat ( " HOURS " ,  all [ " minutes " ] . toDouble ( )  /  60 ) ,  1 ,  2 ,  3 ,  1 ) ;    gl - > addLayout ( build_stat ( " HOURS " ,  all [ " minutes " ] . toDouble ( )  /  60 ) ,  1 ,  2 ,  3 ,  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  QFrame  * lineA  =  new  QFrame ;   
			
		
	
		
		
			
				
					
					  lineA - > setFrameShape ( QFrame : : HLine ) ;   
			
		
	
		
		
			
				
					
					  lineA - > setFrameShadow ( QFrame : : Sunken ) ;   
			
		
	
		
		
			
				
					
					  lineA - > setProperty ( " class " ,  " line " ) ;   
			
		
	
		
		
			
				
					
					  gl - > addWidget ( lineA ,  5 ,  0 ,  1 ,  3 ) ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  int  week_distance  =  week [ " distance " ] . toDouble ( ) * ( metric  ?  MILE_TO_KM  :  1 ) ;    int  week_distance  =  week [ " distance " ] . toDouble ( ) * ( metric  ?  MILE_TO_KM  :  1 ) ;   
			
		
	
		
		
			
				
					
					  gl - > addWidget ( new  QLabel ( bold ( " PAST WEEK " ) ) ,  6 ,  0 ,  1 ,  3 ) ;    gl - > addWidget ( new  QLabel ( " PAST WEEK " ) ,  6 ,  0 ,  1 ,  3 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  gl - > addWidget ( build_stat ( " DRIVES " ,  week [ " routes " ] . toDouble ( ) ) ,  7 ,  0 ,  3 ,  1 ) ;    gl - > addLayout ( build_stat ( " DRIVES " ,  week [ " routes " ] . toDouble ( ) ) ,  7 ,  0 ,  3 ,  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  gl - > addWidget ( build_stat ( metric  ?  " KM "  :  " MILES " ,  week_distance ) ,  7 ,  1 ,  3 ,  1 ) ;    gl - > addLayout ( build_stat ( metric  ?  " KM "  :  " MILES " ,  week_distance ) ,  7 ,  1 ,  3 ,  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  gl - > addWidget ( build_stat ( " HOURS " ,  week [ " minutes " ] . toDouble ( )  /  60 ) ,  7 ,  2 ,  3 ,  1 ) ;    gl - > addLayout ( build_stat ( " HOURS " ,  week [ " minutes " ] . toDouble ( )  /  60 ) ,  7 ,  2 ,  3 ,  1 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
				
				
			
		
	
		
		
			
				
					
					  f - > setLayout ( gl ) ;    setLayout ( gl ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  f - > setStyleSheet ( R " (    setStyleSheet ( R " (   
			
				
				
			
		
	
		
		
			
				
					
					    [ class = " line " ] {   
			
		
	
		
		
			
				
					
					      border :  2 px  solid  white ;   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
			
				
					
					    [ class = " outside " ] {   
			
		
	
		
		
			
				
					
					      border - radius :  20 px ;   
			
		
	
		
		
			
				
					
					      border :  2 px  solid  white ;   
			
		
	
		
		
			
				
					
					      padding :  10 px ;   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					    QLabel  {      QLabel  {   
			
		
	
		
		
			
				
					
					      font - size :  70 px ;        font - size :  48 px ;   
			
				
				
			
		
	
		
		
			
				
					
					      font - weight :  2 00;        font - weight :  600 ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  ) " );    ) " );   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					DriveStats : : DriveStats ( QWidget  * parent )  :  QWidget ( parent )  {  
			
		
	
		
		
			
				
					
					  f  =  new  QFrame ;   
			
		
	
		
		
			
				
					
					  f - > setProperty ( " class " ,  " outside " ) ;   
			
		
	
		
		
			
				
					
					  QVBoxLayout  * v  =  new  QVBoxLayout ;   
			
		
	
		
		
			
				
					
					  v - > addWidget ( f ) ;   
			
		
	
		
		
			
				
					
					  setLayout ( v ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					DriveStats : : DriveStats ( QWidget  * parent )  :  QWidget ( parent )  {  
			
		
	
		
		
			
				
					
					  QString  dongle_id  =  QString : : fromStdString ( Params ( ) . get ( " DongleId " ) ) ;    QString  dongle_id  =  QString : : fromStdString ( Params ( ) . get ( " DongleId " ) ) ;   
			
		
	
		
		
			
				
					
					  QString  token  =  create_jwt ( dongle_id ) ;    QString  token  =  create_jwt ( dongle_id ) ;