
    hF=                         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y)    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/var/www/html/python/myenv/lib/python3.12/site-packages/garminconnect/fit.py_calcCRCr   	   s{    E& c	
C!8v
C
)eD3J'
'C
c	
C!8v
C
)eTQY#-.
.CJ    c                   N   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y3)4FitBaseTypez;BaseType 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                 4    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   sF     
  x}%%r   valuec                 h    | d   dv rt        |      }t        j                  |       }t        ||      S )z$function to avoid DeprecationWarningr   )	r   r!   r#   r   r(   r+   r6   r8   r;   )intr   rL   r   )r?   rM   fmts      r   r   zFitBaseType.pack   s7     C=::JE$$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   '   s   *
 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y)	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      s    K Ir   rZ   c                      e Zd ZdZdZdZdZd*dZdefdZ		 	 	 	 	 d+d	e
d
e
de
de
deddfdZdeeef   defdZ	 	 	 	 	 d,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	 	 d-de
dz  de
dz  ddfdZ	 	 	 	 	 	 	 	 	 	 d.d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d/d!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y)0
FitEncoderr3   r   r   r!   r
   Nc                 P    t               | _        | j                          d| _        y NF)r   bufwrite_headerdevice_info_definedselfs    r   __init__zFitEncoder.__init__   s    9#( r   c           
         | j                   j                         }| j                   j                  d       g }	 | j                   j                  d      }|sn:|j	                  dj                  |D cg c]  }t        |      d c}             X| j                   j                  |       dj                  |      S c c}w )Nr       02x
)rj   tellseekreadappendjoinord)rn   orig_poslinesrB   rJ   s        r   __str__zFitEncoder.__str__   s    88==?ab!ALLA">qc!fS\?">?@	 
 	hyy #?s   1B=header_sizeprotocol_versionprofile_version	data_size	data_typec                     | j                   j                  d       t        d|||||      }| j                   j                  |       y )Nr   BBHI4s)rj   rv   r   write)rn   r~   r   r   r   r   rG   s          r   rk   zFitEncoder.write_header   sB     	a
 	qr   contentc                    g }g }|D ]`  \  }}}}t        d||d   |d         }|j                  |       ||d   }n|||z  }|j                  t        j                  ||             b dj                  |      dj                  |      fS )NBBBr   r   r   r   )r   rx   r   ry   )	rn   r   
field_defsvaluesnumr?   rM   scalerG   s	            r   _build_content_blockzFitEncoder._build_content_block   s    
+2 	='C5%UC&!18G3DEAa } +"MM+**8U;<	= $chhv&677r   serial_numbertime_createdmanufacturerproductnumberc           
         |t        j                         }dt        j                  |d fdt        j                  | 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                  |      \  }}| j                  d   }	t        ddd|	t        |            }
| j                  j                  d	j                  | j!                  d
| j"                        |
|| j!                  | j"                        |g             y )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   ry   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   s;    #<<>L ##]D9""DNN<$@$G""L$7""GT2""FD1  $..$7
 227; ^^I.
Aq*c'l
 	HH &&#'43K3K '  "&&1I1I&J
	
r   software_versionhardware_versionc           
         dt         j                  |d fdt         j                  |d fg}| j                  |      \  }}| j                  d   }t        ddd|t        |            }| j                  j                  dj                  | j                  d| j                        ||| j                  | j                        |g             y )	Nr   r   rb   r   r   Tr   r   )r   r'   r"   r   re   r   r   rj   r   ry   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'l
 	HH &&#'43N3N '  "&&1L1L&M
	
r   r   cum_operationg_timebattery_voltagedevice_indexdevice_typebattery_statusc                 z   dt         j                  | 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                  |      \  }}| j                  sl| j                  d| j                        }| j                  d   }t        ddd|t        |            }| j                  j                  ||z   |z          d| _        | j                  | j                        }| j                  j                  ||z          y )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+E ( F 6J 1j#g,M HHNN6M1F:;'+D$##d.H.H#Iv'r   r   r   c                 ,    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                 0   | j                   j                         }| j                   j                  d       d}	 | j                   j                  d      }|snt	        |t        d|      d         }8| j                   j                  |       t        d|      S )Nr   r   rB   rD   )rj   ru   rv   rw   r   r   r   )rn   r{   r   rB   s       r   r   zFitEncoder.crc{  s{    88==?aa A3sAq 12C	 
 	hC~r   c                     | j                         | j                  z
  }| j                  |       | j                         }| j                  j                  dd       | j                  j                  |       y)z4re-weite file-header, then append crc to end of file)r   r   r!   N)get_sizerd   rk   r   rj   rv   r   )rn   r   r   s      r   finishzFitEncoder.finish  sV    MMOd&6&66	I.hhjasr   c                     | j                   j                         }| j                   j                  dd       | j                   j                         }| j                   j                  |       |S )Nr   r!   )rj   ru   rv   )rn   r{   r   s      r   r   zFitEncoder.get_size  sG    88==?axx}}hr   c                 6    | j                   j                         S )N)rj   getvaluerm   s    r   r   zFitEncoder.getvalue  s    xx  ""r   tc                 r    t        |t              r#t        j                  |j	                               }|dz
  S )zXthe 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  s,     a"AKKM*A9}r   r
   N)r;   rq   l   r   s   .FIT)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      sK   I)

  
   """  	
   
&8DcN 8u 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                 0    t         |           d| _        y 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                  | 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                  |	      \  }
}| j                  sl| j                  d	| j                  
      }| j                  d   }t        ddd|t        |	            }| j                  j                  ||z   |
z          d	| _        | j                  | j                        }| j                  j                  ||z          y )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  sd    +$$dnnY&?C""$;Q?""$<a@""$:A>""$5q9""$6:""$6:!!:q1	
 227;22''4+H+H ( F (89J 1j#g,M HHNN6M1F:;26D/##d.K.K#Lv'r   r   )NNNNNNN)
rQ   rR   rS   r   ro   r   rO   r   r   __classcell__r   s   @r   r   r     s    !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                 0    t         |           d| _        y 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t         j                  | 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                  |      \  }}| j                  sl| j                  d| j                        }| j                  d   }t        ddd|t        |            }| j                  j                  ||z   |z          d| _        | j                  | j                        }| j                  j                  ||z          y )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 ( F 7J 1j#g,M HHNN6M1F:;(,D%##d.I.I#Jv'r   r   )NNNNNNNNNNN)
rQ   rR   rS   r   ro   r   rO   r   r   r   r   s   @r   r   r     s0   * +/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      sm        # S S <P  P f
 
X Xv,(j ,(^4(z 4(r   