/*

    File: file_sp3.h

    Copyright (C) 2008 Christophe GRENIER <grenier@cgsecurity.org>
  
    This software is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
  
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
  
    You should have received a copy of the GNU General Public License along
    with this program; if not, write the Free Software Foundation, Inc., 51
    Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

 */

/* Special thanks to Paulo Sousa for providing the information */

#ifndef file_SP3_H
#define file_SP3_H
#ifdef __cplusplus
extern "C" {
#endif

struct SP3FileInfo
{
  uint8_t	Versao;
  uint8_t	Revisao;
  char		zzReserved001[6];
  uint16_t	DataExameAno;			/* 2 bytes   (   9 -  10 ) */
  uint8_t    	DataExameMes;			/* 1 bytes   (    11     ) */
  uint8_t    	DataExameDia;			/* 1 bytes   (    12     ) */
  uint8_t    	DataExameHora;			/* 1 bytes   (    13     ) */
  uint8_t    	DataExameMinutos;		/* 1 bytes   (    14     ) */
  uint8_t    	DataExameSegundos;		/* 1 bytes   (    15     ) */
  uint8_t       zzReserved002;			/* 1 bytes   (    16     ) */
  uint32_t  	DuracaoExameMilisegundos;	/* 4 bytes   (  17 -  20 ) */
  char   	zzReserved003[6];		/* 6 bytes   (  21 -  26 ) */
  uint32_t    	TipoDeMonitorFetal;		/* 4 bytes   (  27 -  30 ) */
  char     	zzReserved004[2];		/* 2 bytes   (  31 -  32 ) */

  char     	LocalCod[6];			/* 6 bytes   (  33 -  38 ) */
    
  char         	zzReserved005[2];		/* 2 bytes   (  39 -  40 ) */
        
  char     	LocalNome[128];			/* 128 bytes (  41 - 168 ) */
  char     	LocalServicePlace[6];		/* 6 bytes   ( 169 - 174 ) */
    
  char         	zzReserved006[2];		/* 2 bytes   ( 175 - 176 ) */

  char     	FileName[64];			/* 64 bytes  ( 177 - 240 ) */
    
  char     	LocalBedOrDevice[4];		/* 4 bytes   ( 241 - 244 ) */
    
  char       	zzReserved007[12];		/* 12 bytes  ( 245 - 256 ) */

  char     	NumeroDoente[16];		/* 16 bytes  ( 257 - 272 ) */
  char         	zzReserved008[8];		/* 8 bytes   ( 273 - 280 ) */

  char     	NomeDoente[128];		/* 128 bytes ( 281 - 408 ) */
  uint16_t  	DataNascimentoAnoDoente;	/* 2 bytes   ( 409 - 410 ) */
  uint8_t    	DataNascimentoMesDoente;	/* 1 bytes   (    411    ) */
  uint8_t    	DataNascimentoDiaDoente;	/* 1 bytes   (    412    ) */
  uint8_t       zzReserved009;			/* 1 bytes   (    413    ) */
  uint8_t    	IdadeDoente;			/* 1 bytes   (    414    ) */
  char   	zzReserved010[3];		/* 3 bytes   ( 415 - 417 ) */
  uint8_t    	NumeroFetos;			/* 1 bytes   (    418    ) */
  uint8_t       zzReserved011;			/* 1 bytes   (    419    ) */
  uint8_t    	NumeroMeses;			/* 1 bytes   (    420    ) */
  char   	zzReserved012[5];		/* 5 bytes   ( 421 - 425 ) */
  uint8_t    	InvalidPointsA;			/* 1 bytes   (    426    ) */
  uint8_t       zzReserved013;			/* 1 bytes   (    427    ) */
  uint8_t    	GoodConfidencePointsA;		/* 1 bytes   (    428    ) */
  uint8_t       zzReserved014;			/* 1 bytes   (    429    ) */
  uint8_t    	ExcelentConfidencePointsA;	/* 1 bytes   (    430    ) */
  char   	zzReserved015[3];		/* 3 bytes   ( 431 - 433 ) */
  uint8_t    	InvalidPointsB;			/* 1 bytes   (    434    ) */
  uint8_t       zzReserved016;			/* 1 bytes   (    435    ) */
  uint8_t    	GoodConfidencePointsB;		/* 1 bytes   (    436    ) */
  uint8_t       zzReserved017;			/* 1 bytes   (    437    ) */
  uint8_t    	ExcelentConfidencePointsB;	/* 1 bytes   (    438    ) */

  char     	NumeroEpisodioUrgencia[16];	/* 16 bytes  ( 439 - 454 ) */
  char     	NumeroEpisodioInternamento[16];	/* 16 bytes  ( 455 - 470 ) */
  char     	NumeroEpisodioConsulta[16];	/* 16 bytes  ( 471 - 486 ) */
  char  	NumeroEpisodioAdicional[16];	/* 16 bytes  ( 487 - 502 ) */

  char		TipoDePesquisa_OLD;            	/* 1 bytes   (    503    ) */
    
  uint16_t	idTipoDePesquisa;		/* 2 bytes   ( 504 -  505) */

  char      	zzReserved018[11];            	/* 11 bytes  ( 506 - 516 ) */

  uint32_t    	ScaleFactorUc;			/* 4 bytes   ( 517 - 520 ) */

  uint32_t    	ProbeTypeFHR_A;			/* 4 bytes   ( 521 - 524 ) */
  uint32_t    	ProbeTypeFHR_B;			/* 4 bytes   ( 525 - 528 ) */

  uint32_t    	InternalDataBaseKey_OLD;	/* 4 bytes   ( 529 - 532) */
    
  char         	zzReserved019[4];		/* 4 bytes   ( 533 - 536) */

  /*------------------------------------------------------------------------*/
  /*Tamanho Antigo*/
  char     	ExternalDataBaseKey[38];	/* 38 bytes  ( 537 - 574) */
  /*------------------------------------------------------------------------*/
    
    
  /* UID PACIENTE INTERNO*/
  /* {480B57BB-CD71-4D48-A912-000000000000}*/
  /* 123456789 123456789 123456789 12345678   - Tamanho 38*/
  char     	InternalDataBaseKey__NEW[38];	/* 38 bytes  ( 575 - 612) */
    
  char         	zzReserved0201[2];		/* 2 bytes  ( 613 - 614) */
    
  /* UID EXAME CODE INTERNO	*/
  /* {480B57BB-CD71-4D48-A000-000000000000} */
  char     	ExameDataBase_UID[38];		/* 38 bytes  ( 612 - 652) */
        
  char         	zzReserved0202[2];		/* 2 bytes  ( 653 - 654) */
    
  char     	PartogramaDataBase_UID[38];	/* 38 bytes  ( 655 - 692) */
    
  char         	zzReserved0203[8];		/* 30 bytes  ( 693 - 700) */

  uint32_t    	TimeBaseDelta_POS;		/* 4 bytes   ( 701 - 704) */
  uint32_t    	TimeBaseDelta_LEN;		/* 4 bytes   ( 705 - 708) */
  uint32_t    	TimeBaseDelta_CRC32;		/* 4 bytes   ( 709 - 712) */
  char         	zzReserved021[8];		/* 8 bytes   ( 713 - 720) */


  uint32_t    	ExtraInfoFlag_POS;		/* 4 bytes   ( 721 - 724) */
  uint32_t    	ExtraInfoFlag_LEN;		/* 4 bytes   ( 725 - 728) */
  uint32_t    	ExtraInfoFlag_CRC32;		/* 4 bytes   ( 729 - 732) */
  char         	zzReserved022[8];		/* 8 bytes   ( 733 - 740) */

  uint32_t    	FHRa_POS; 
  uint32_t    	FHRa_LEN; 
  uint32_t    	FHRa_CRC32; 
  char         	zzReserved023[8];		/* 8 bytes   ( --- - 760) */

  uint32_t    	FHRb_POS; 
  uint32_t    	FHRb_LEN; 
  uint32_t    	FHRb_CRC32; 
  char         	zzReserved024[8];		/* 8 bytes   ( --- - 780) */

  uint32_t    	UC_POS; 
  uint32_t    	UC_LEN; 
  uint32_t    	UC_CRC32; 
  char         	zzReserved025[8];		/* 8 bytes   ( --- - 800) */


  uint32_t    	FM_POS; 
  uint32_t    	FM_LEN; 
  uint32_t    	FM_CRC32; 
  char         	zzReserved026[8];		/* 8 bytes   ( --- - 820) */

  uint32_t    	MHR_POS; 
  uint32_t    	MHR_LEN; 
  uint32_t    	MHR_CRC32; 
  char         	zzReserved027[8];		/* 8 bytes   ( --- - 840) */

    /*-----------------------------------------------------------------------------------*/

  uint32_t    	Fetal_SpO2_POS_POS; 
  uint32_t    	Fetal_SpO2_POS_LEN; 
  uint32_t    	Fetal_SpO2_POS_CRC32; 
  char         	zzReserved028[8];		/* 8 bytes   ( --- - 860) */

  uint32_t    	Fetal_SpO2_POS; 
  uint32_t    	Fetal_SpO2_LEN; 
  uint32_t    	Fetal_SpO2_CRC32; 
  char         	zzReserved029[8];		/* 8 bytes   ( --- - 880) */


    /*-----------------------------------------------------------------------------------*/
    

  uint32_t    	Pressure_POS_POS; 
  uint32_t    	Pressure_POS_LEN; 
  uint32_t    	Pressure_POS_CRC32; 
  char         	zzReserved030[8];		/* 8 bytes   ( --- - 900) */

  uint32_t    	Pressure_Systolic_BP_POS; 
  uint32_t    	Pressure_Systolic_BP_LEN; 
  uint32_t    	Pressure_Systolic_BP_CRC32; 
  char         	zzReserved031[8];		/* 8 bytes   ( --- - 920) */

  uint32_t    	Pressure_Diastolic_BP_POS; 
  uint32_t    	Pressure_Diastolic_BP_LEN; 
  uint32_t    	Pressure_Diastolic_BP_CRC32; 
  char         	zzReserved032[8];		/* 8 bytes   ( --- - 940) */


  uint32_t    	Pressure_Mean_BP_POS; 
  uint32_t    	Pressure_Mean_BP_LEN; 
  uint32_t    	Pressure_Mean_BP_CRC32; 
  char         	zzReserved033[8];		/* 8 bytes   ( --- - 960) */

  uint32_t    	Pressure_NIBP_MHR_POS; 
  uint32_t    	Pressure_NIBP_MHR_LEN; 
  uint32_t    	Pressure_NIBP_MHR_CRC32; 
  char         	zzReserved034[8];		/* 8 bytes   ( --- - 980) */

  /*-----------------------------------------------------------------------------------*/
    
  uint32_t    	Maternal_POS_POS; 
  uint32_t    	Maternal_POS_LEN; 
  uint32_t    	Maternal_POS_CRC32; 
  char         	zzReserved035[8];		/* 8 bytes   ( ---- - 1000) */

  uint32_t    	Maternal_SpO2_POS; 
  uint32_t    	Maternal_SpO2_LEN; 
  uint32_t    	Maternal_SpO2_CRC32; 
  char         	zzReserved036[8];		/* 8 bytes   ( ---- - 1020) */

  uint32_t    	Maternal_HR_POS; 
  uint32_t    	Maternal_HR_LEN; 
  uint32_t    	Maternal_HR_CRC32; 
  char         	zzReserved037[8];		/* 8 bytes   ( ---- - 1040) */

  /*-----------------------------------------------------------------------------*/

  uint32_t    	Event_POS_POS; 
  uint32_t    	Event_POS_LEN; 
  uint32_t    	Event_POS_CRC32; 
  char         	zzReserved038[8];		/* 8 bytes   ( ---- - 1060) */

  uint32_t    	Event_TYPE_POS; 
  uint32_t    	Event_TYPE_LEN; 
  uint32_t    	Event_TYPE_CRC32; 
  char         	zzReserved039[8];		/* 8 bytes   ( ---- - 1080) */

  uint32_t    	Event_DESC_POS; 
  uint32_t    	Event_DESC_LEN; 
  uint32_t    	Event_DESC_CRC32; 
  char         	zzReserved040[8];		/* 4 bytes   ( ---- - 1100) */

  /*-----------------------------------------------------------------------------*/
    
  uint32_t    	TQRS_POS_POS; 
  uint32_t    	TQRS_POS_LEN; 
  uint32_t    	TQRS_POS_CRC32; 
  char         	zzReserved041[8];		/* 8 bytes   ( ---- - 1120) */

  uint32_t    	TQRS_Status_POS; 
  uint32_t    	TQRS_Status_LEN; 
  uint32_t    	TQRS_Status_CRC32; 
  char         	zzReserved042[8];		/* 8 bytes   ( ---- - 1140) */

  uint32_t    	TQRS_Value_POS; 
  uint32_t    	TQRS_Value_LEN; 
  uint32_t    	TQRS_Value_CRC32; 
  char         	zzReserved043[8];		/* 8 bytes   ( ---- - 1160) */

  uint32_t    	TQRS_Biphasic_POS; 
  uint32_t    	TQRS_Biphasic_LEN; 
  uint32_t    	TQRS_Biphasic_CRC32; 
  char         	zzReserved044[8];		/* 8 bytes   ( ---- - 1180) */

  /*-----------------------------------------------------------------------------*/
   
  uint32_t    	Error_POS_POS; 
  uint32_t    	Error_POS_LEN; 
  uint32_t    	Error_POS_CRC32; 
  char         	zzReserved045[8];		/* 8 bytes   ( ---- - 1200) */

  uint32_t    	Error_TYPE_POS; 
  uint32_t    	Error_TYPE_LEN; 
  uint32_t    	Error_TYPE_CRC32; 
  char         	zzReserved046[8];		/* 8 bytes   ( ---- - 1220) */

  uint32_t    	Error_DESC_POS; 
  uint32_t    	Error_DESC_LEN; 
  uint32_t    	Error_DESC_CRC32; 
  char         	zzReserved047[8];		/* 8 bytes   ( ---- - 1240) */

  /*-----------------------------------------------------------------------------*/
  /*CommBUFFER*/
    
  uint32_t    	CommBUFFER_POS; 
  uint32_t    	CommBUFFER_LEN; 
  uint32_t    	CommBUFFER_CRC32; 
  char         	zzReserved048[8];		/* 8 bytes   ( ---- - 1260) */
        
  /*-----------------------------------------------------------------------------*/
    
    
  uint32_t    	Prove_FHRa_POS; 
  uint32_t    	Prove_FHRa_LEN; 
  uint32_t    	Prove_FHRa_CRC32; 
    
  char         	zzReserved049[8];		/* 8 bytes   ( ---- - 1280) */

  uint32_t    	Prove_FHRb_POS; 
  uint32_t    	Prove_FHRb_LEN; 
  uint32_t    	Prove_FHRb_CRC32; 
    
  char         	zzReserved050[8];		/* 8 bytes   ( ---- - 1300) */
         
  uint32_t    	Prove_UC_POS; 
  uint32_t    	Prove_UC_LEN; 
  uint32_t    	Prove_UC_CRC32; 
   
  char 		zzReserved999[1024*10-1312];
} __attribute__ ((gcc_struct, __packed__));

#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
#endif
