
    iJ=                         d dl Z d dlmZ d dlmZ d dlmZmZ d dlmZ de	de	de	fd	Z
 G d
 d          Z G d d          Z G d de          Z G d de          Z G d de          ZdS )    N)datetime)BytesIO)packunpack)Anycrcbytereturnc                     g d}|| dz           }| dz	  dz  } | |z  ||dz           z  } || dz           }| dz	  dz  } | |z  ||dz	  dz           z  S )N)r   i  i  i   i  i <  i (  i  i  i l  i x  i  i P  i  i  i D        i   )r   r	   tabletmps       L/root/projects/butler/venv/lib/python3.11/site-packages/garminconnect/fit.py_calcCRCr   	   s      E& c	
C!8v
C
)eD3J'
'C
c	
C!8v
C9udai3.///    c                   b   e Zd ZdZdddddddZdddddddZd	dd	d
dddZdddddd	dZdddddd	dZdddddddZ	dddddddZ
dddddddZdddddd	dZd dd!d"d#ddZd$dd$d%dddZd&dd'd(dd	dZd)dd*d+dddZd,dd,d-dddZed.ed/efd0            Zed.eeef         d1ed/efd2            Zd3S )4FitBaseTypezABaseType Definition.

    see FIT Protocol Document(Page.20)
    r   enum      )#endianfieldnameinvalidsizesint8      uint8      sint16i  r      uint16i        sint32i      uint32l       string      float32	      float64l    
   uint8z      uint16z      uint32z   r	   basetyper
   c                 @    dddddddddd	dddd
d}|| d                  S )NBbhHiIsfdc)r   r   r!   r#   r   r(   r+   r.   r0   r3   r6   r8   r;   r>   r   r   )r?   formatss     r   
get_formatzFitBaseType.get_format   sK     
 
  x}%%r   valuec                     | d         dv rt          |          }t                              |           }t          ||          S )z%Function to avoid DeprecationWarning.r   )	r   r!   r#   r   r(   r+   r6   r8   r;   )intr   rL   r   )r?   rM   fmts      r   r   zFitBaseType.pack   sB     C=:::JJE$$X..Cr   N)__name__
__module____qualname____doc__r   r   r"   r%   r'   r*   r-   r/   r2   r5   r7   r:   r=   r	   staticmethodrO   strrL   dictr   bytesr   r   r   r   r   r   &   sI          D  E  E  F  F  F  F  F  G % G  F  G  G  D &S &S & & & \&&  tCH~  c  e       \     r   r   c                   "    e Zd ZdZddddddZdS )	Fitr;   r         1   3   )file_iddevice_infoweight_scalefile_creatorblood_pressureN)rQ   rR   rS   HEADER_SIZE	GMSG_NUMSr   r   r   rZ   rZ      s0        K  IIIr   rZ   c                      e Zd ZdZdZdZdZd/dZdefdZ		 	 	 	 	 d0de
de
de
de
deddfdZdeeef         defdZ	 	 	 	 	 d1de
dz  dedz  de
dz  de
dz  de
dz  ddfdZ	 	 d2de
dz  de
dz  ddfdZ	 	 	 	 	 	 	 	 	 	 d3dede
dz  de
dz  de
dz  de
dz  de
dz  d e
dz  d!e
dz  d"e
dz  de
dz  d#e
dz  ddfd$Zd4d&ed'e
defd(Zde
fd)Zd/d*Zde
fd+Zdefd,Zd-eez  defd.ZdS )5
FitEncoderr3   r   r   r!   r
   Nc                 b    t                      | _        |                                  d| _        d S NF)r   bufwrite_headerdevice_info_definedselfs    r   __init__zFitEncoder.__init__   s-    99#(   r   c                 l   | j                                         }| j                             d           g }	 | j                             d          }|sn3|                    d                    d |D                                  P| j                             |           d                    |          S )Nr   T    c                 0    g | ]}t          |          d S )02x)ord).0rJ   s     r   
<listcomp>z&FitEncoder.__str__.<locals>.<listcomp>   s"    ">">">qc!ff??">">">r   
)rj   tellseekreadappendjoin)rn   orig_poslinesrB   s       r   __str__zFitEncoder.__str__   s    8==??a	Ab!!A LL">">A">">">??@@@		A
 	hyyr   r;   rq   l      .FITheader_sizeprotocol_versionprofile_version	data_size	data_typec                     | j                             d           t          d|||||          }| j                             |           d S )Nr   BBHI4s)rj   rz   r   write)rn   r   r   r   r   r   rG   s          r   rk   zFitEncoder.write_header   sU     	a
 
 	qr   contentc                 X   g }g }|D ]z\  }}}}t          d||d         |d                   }|                    |           |	|d         }n|||z  }|                    t                               ||                     {d                    |          d                    |          fS )NBBBr   r   r   r   )r   r|   r   r}   )	rn   r   
field_defsvaluesnumr?   rM   scalerG   s	            r   _build_content_blockzFitEncoder._build_content_block   s    
+2 	= 	='C5%UC&!18G3DEEAa   } +"MM+**8U;;<<<<$$chhv&6&677r   serial_numbertime_createdmanufacturerproductnumberc           
      l   |t          j                    }dt          j        |d fdt          j        |                     |          d fdt          j        |d fdt          j        |d fdt          j        |d fdt          j        | j        d fg}| 	                    |          \  }}| j
        d         }	t          ddd|	t          |                    }
| j                            d	                    |                     d
| j                  |
||                     | j                  |g                     d S )Nr#   r   r   r!   r(   r   r_   BBHBr   T
definition	lmsg_typer   )r   nowr   r=   r-   	timestampr'   r   	FILE_TYPEr   re   r   lenrj   r   r}   record_headerLMSG_TYPE_FILE_INFO)rn   r   r   r   r   r   r   fieldsr   
msg_numberfixed_contents              r   write_file_infozFitEncoder.write_file_info   sK    #<>>L #]D9"DNN<$@$@$G"L$7"GT2"FD1 $.$7
 227;; ^I.
Aq*c'll
 
 	HH &&#'43K '   "&&1I&JJ
 	
 	
 	
 	
 	
r   software_versionhardware_versionc           
         dt           j        |d fdt           j        |d fg}|                     |          \  }}| j        d         }t          ddd|t          |                    }| j                            d	                    | 
                    d| j                  ||| 
                    | j                  |g                     d S )	Nr   r   rb   r   r   Tr   r   )r   r'   r"   r   re   r   r   rj   r   r}   r   LMSG_TYPE_FILE_CREATOR)rn   r   r   r   r   r   r   r   s           r   write_file_creatorzFitEncoder.write_file_creator*  s     "$4d;!#3T:
 227;;^N3
Aq*c'll
 
 	HH &&#'43N '   "&&1L&MM
 	
 	
 	
 	
 	
r   r   cum_operationg_timebattery_voltagedevice_indexdevice_typebattery_statusc                 &   dt           j        |                     |          dfdt           j        |dfdt           j        |dfdt           j        d d fdt           j        |dfdt           j        |dfdt           j        |d	fd
t           j        |dfdt           j        |dfdt           j        |	dfdt           j        |
dfdt           j        |d fg}|                     |          \  }}| j        sp|                     d| j	                  }| j
        d         }t          ddd|t          |                    }| j                            ||z   |z              d| _        |                     | j	                  }| j                            ||z              d S )N   r   r#   r.   r0   r!   r   r(   d   r6      r   r+   r8   Tr   r`   r   r   )r   r-   r   r=   r'   r"   r   rl   r   LMSG_TYPE_DEVICE_INFOre   r   r   rj   r   )rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   headerr   r   s                     r   write_device_infozFitEncoder.write_device_infoI  s    +$dnnY&?&?C#]A6"$7;"D$/"L!4"GQ/"$4c:#_c:!<3!;2!#3Q7"ND9
 227;;' 		,''4+E (  F 6J 1j#g,, M HNN6M1F:;;;'+D$##d.H#IIv'''''r   Fr   r   c                 4    d}|rd}t          d||z             S )Nr   @   rA   )r   )rn   r   r   msgs       r   r   zFitEncoder.record_headeru  s(     	CCy)))r   c                 F   | j                                         }| j                             d           d}	 | j                             d          }|sn%t	          |t          d|          d                   }B| j                             |           t          d|          S )Nr   Tr   rB   rD   )rj   ry   rz   r{   r   r   r   )rn   r~   r   rB   s       r   r   zFitEncoder.crc{  s    8==??a	3a  A 3sAq 122C		3
 	hC~~r   c                     |                                  | j        z
  }|                     |           |                                 }| j                            dd           | j                            |           dS )z5re-weite file-header, then append crc to end of file.)r   r   r!   N)get_sizerd   rk   r   rj   rz   r   )rn   r   r   s      r   finishzFitEncoder.finish  sk    MMOOd&66	I...hhjjasr   c                     | j                                         }| j                             dd           | j                                         }| j                             |           |S )Nr   r!   )rj   ry   rz   )rn   r~   r   s      r   r   zFitEncoder.get_size  sO    8==??ax}}hr   c                 4    | j                                         S )N)rj   getvaluerm   s    r   r   zFitEncoder.getvalue  s    x  """r   tc                     t          |t                    r&t          j        |                                          }|dz
  S )zbThe timestamp in fit protocol is seconds since
        UTC 00:00 Dec 31 1989 (631065600).
        i L%)
isinstancer   timemktime	timetuple)rn   r   s     r   r   zFitEncoder.timestamp  s7     a"" 	+AKKMM**A9}r   r
   N)r;   rq   r   r   r   )NNNNN)NN)
NNNNNNNNNN)Fr   )rQ   rR   rS   r   r   r   r   ro   rV   r   rO   rX   rk   rW   r   r   r   r   r   r   boolr   r   r   r   r   floatr   r   r   r   rg   rg      s9       I) ) ) )

  
  
  
  
   """   	
   
   &8DcN 8u 8 8 8 8  %)(,#'"!)
 )
Tz)
 o)
 Dj	)

 t)
 d
)
 
)
 )
 )
 )
Z (,'+
 
*
 *
 
	
 
 
 
D %)*.#'"'+&*#'"&'+%)*( *(*( Tz*( !4Z	*(
 Dj*( t*( **( t*( Dj*( 4Z*( **( d
*( 
*( *( *( *(X* * * *U * * * *S       #    #% # # # #8e+       r   rg   c                        e Zd ZdZd fdZ	 	 	 	 	 	 	 ddeez  ez  dedz  dedz  dedz  d	edz  d
edz  dedz  dedz  ddfdZ xZ	S )FitEncoderBloodPressure   r
   Nc                 V    t                                                       d| _        d S ri   )superro   blood_pressure_monitor_definedrn   	__class__s    r   ro   z FitEncoderBloodPressure.__init__  s'    .3+++r   r   diastolic_blood_pressuresystolic_blood_pressuremean_arterial_pressuremap_3_sample_meanmap_morning_valuesmap_evening_values
heart_ratec	                    dt           j        |                     |          dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfg}	|                     |	          \  }
}| j        sp|                     d	| j        
          }| j	        d         }t          ddd|t          |	                    }| j                            ||z   |
z              d	| _        |                     | j                  }| j                            ||z              d S )Nr   r   r   r!   r#   r   r(   r+   Tr   rc   r   r   )r   r-   r   r'   r"   r   r   r   LMSG_TYPE_BLOOD_PRESSUREre   r   r   rj   r   )rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                  r   write_blood_pressurez,FitEncoderBloodPressure.write_blood_pressure  si    +$dnnY&?&?C"$;Q?"$<a@"$:A>"$5q9"$6:"$6:!:q1	
 227;;2 		7''4+H (  F (89J 1j#g,, M HNN6M1F:;;;26D/##d.K#LLv'''''r   r   )NNNNNNN)
rQ   rR   rS   r   ro   r   rO   r   r   __classcell__r   s   @r   r   r     s        !4 4 4 4 4 4 04.2-1(,)-)-!%$( $(c>E)$( #&*$( "%t	$(
 !$d
$( :$(  $J$(  $J$( $J$( 
$( $( $( $( $( $( $( $(r   r   c                       e Zd ZdZd fdZ	 	 	 	 	 	 	 	 	 	 	 ddeez  ez  deez  deez  dz  deez  dz  d	eez  dz  d
eez  dz  deez  dz  deez  dz  deez  dz  deez  dz  deez  dz  deez  dz  deez  dz  ddfdZ xZ	S )FitEncoderWeightr#   r
   Nc                 V    t                                                       d| _        d S ri   )r   ro   weight_scale_definedr   s    r   ro   zFitEncoderWeight.__init__  s'    $)!!!r   r   weightpercent_fatpercent_hydrationvisceral_fat_mass	bone_massmuscle_mass	basal_met
active_metphysique_ratingmetabolic_agevisceral_fat_ratingbmic                 D   dt           j        |                     |          dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfdt           j        |dfd	t           j        |dfd
t           j        |	dfdt           j        |
dfdt           j        |dfdt           j        |dfdt           j        |dfg}|                     |          \  }}| j        sp|                     d| j                  }| j	        d         }t          ddd|t          |                    }| j                            ||z   |z              d| _        |                     | j                  }| j                            ||z              d S )Nr   r   r   r   r!   r#   r   r(   r.   r3   r0   r6   r8   r>   Tr   ra   r   r   )r   r-   r   r'   r"   r   r   r   LMSG_TYPE_WEIGHT_SCALEre   r   r   rj   r   )rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                       r   write_weight_scalez#FitEncoderWeight.write_weight_scale  s   " +$dnnY&?&?C"FC0"K5"$5s;"$5s;"Is3"K5"Iq1"J2!?A6"M15"$7;#S"-
 227;;( 		-''4+F (  F 7J 1j#g,, M HNN6M1F:;;;(,D%##d.I#JJv'''''r   r   )NNNNNNNNNNN)
rQ   rR   rS   r   ro   r   rO   r   r   r   r   s   @r   r   r     sy       * * * * * * +/0404(,*.(,)-.2,026"&-( -(c>E)-( e-( 5[4'	-(
 ;--( ;--( ;%-( 5[4'-( ;%-( %K$&-( ut+-( U{T)-( !5[4/-( 5[4-( 
-( -( -( -( -( -( -( -(r   r   )r   r   ior   structr   r   typingr   rO   r   r   rZ   rg   r   r   r   r   r   <module>r      sp                             0# 0S 0S 0 0 0 0:Q  Q  Q  Q  Q  Q  Q  Q h
 
 
 
 
 
 
 
Y Y Y Y Y Y Y Yx,( ,( ,( ,( ,(j ,( ,( ,(^4( 4( 4( 4( 4(z 4( 4( 4( 4( 4(r   