estudios de i+d+i - envejecimiento csicenvejecimiento.csic.es/documentos/documentos/imserso-e... ·...

40
Portal Mayores | http://www.imsersomayores.csic.es 1 ESTUDIOS DE I+D+I Número 37 Desarrollo de un dispensador de píldoras controlado por un dispositivo móvil Autor: Boquete Vázquez, Luciano Filiación: Universidad de Alcalá, Escuela Politécnica Contacto: Convocatoria: 2005 Para citar este documento: BOQUETE VÁZQUEZ, Luciano (2006). “Desarrollo de un dispensador de píldoras controlado por un dispositivo móvil”. Madrid, IMSERSO, Estudios I+D+I, nº 37. [Fecha de publicación: 01/08/2007]. <http://www.imsersomayores.csic.es/documentos/documentos/imserso-estudiosidi- 37.pdf >

Upload: others

Post on 27-Jan-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

Portal Mayores | http://www.imsersomayores.csic.es

1

ESTUDIOS DE I+D+I

Número 37

Desarrollo de un dispensador de píldoras controlado por un dispositivo móvil

Autor: Boquete Vázquez, Luciano Filiación: Universidad de Alcalá, Escuela Politécnica Contacto: Convocatoria: 2005 Para citar este documento: BOQUETE VÁZQUEZ, Luciano (2006). “Desarrollo de un dispensador de píldoras controlado por un dispositivo móvil”. Madrid, IMSERSO, Estudios I+D+I, nº 37. [Fecha de publicación: 01/08/2007]. <http://www.imsersomayores.csic.es/documentos/documentos/imserso-estudiosidi-37.pdf>

Page 2: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

Portal Mayores | http://www.imsersomayores.csic.es

2

Resumen El objetivo de este proyecto es disponer de un sistema dispensador de medicamentos (Dispensador), destinado a ser utilizado principalmente en el domicilio de sus usuarios, de tal modo que sea posible gobernar y supervisar su funcionamiento a través de telefonía móvil, desde una unidad central supervisora (Centro de Control), dirigida por el personal adecuado.

El proyecto se estructura en los siguientes apartados: definición de especificaciones funcionales; desarrollo pre-industrial del Dispensador con el diseño de planos, sistema de control mecánico-electrónico, etc.; desarrollo de los sistemas electrónicos de control de la parte mecánica y de las comunicaciones por telefonía móvil; implementación del Centro de Control con la interfaz de usuario, control de accesos, bases de datos, protección de la información, etc.; desarrollo de los protocolos de comunicaciones, soportado en mensajes cortos de telefonía (SMS); integración de los diferentes módulos; realización de pruebas con usuarios y depuración del funcionamiento; y por último, divulgación de los resultados del proyecto.

Page 3: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

1

Nº del proyecto: 28/05

IMSERSO

MINISTERIO DE TRABAJO Y ASUNTOS SOCIALES

RESULTADO DE LA INVESTIGACIÓN

Investigador Principal: LUCIANO BOQUETE VÁZQUEZ

Título del Proyecto: DESARROLLO DE UN DISPENSADOR DE PÍLDORAS CONTROLADO POR TELEFONÍA MÓVIL

Organismo: UNIVERSIDAD DE ALCALÁ

Centro: ESCUELA POLITÉCNICA SUPERIOR

Departamento: ELECTRÓNICA

Fecha de Inicio: 01/12/2005

Fecha de Finalización: 31/12/2006

Fecha: 25-Enero-2007

El Investigador Principal:

Fdo: Luciano Boquete Vázquez

Page 4: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

2

Page 5: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

3

RESUMEN Como resultados de la investigación realizada, se incluyen los siguientes elementos: 1.- Diagramas del diseño mecánico del Dispensador 2.- Esquemas de los circuitos electrónicos, incluyendo la lista de materiales y los circuitos impresos 3.- Código fuente del programa del microcontrolador1. 4.- Código fuente del programa del Centro de Control. 5.- Informe gráfico del proyecto 6.- Copias de las publicaciones realizadas.

1 Se incluye en el CD adjunto

Page 6: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

4

DIAGRAMAS DEL DISEÑO MECÁNICO DEL DISPENSADOR

Se incluye en este apartado algunas imágenes.

Page 7: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

5

DIAGRAMAS DE LOS CIRCUITOS ELECTRÓNICOS

micro_atmel.opj <Rev Code>

Página Principal

Custom

1 6Monday , July 17, 2006

Title

Size Document Number Rev

Date: Sheet of

VMAIN

H4 MOTOR

PIN

_LED

1PI

N_L

ED2

PIN

_LED

3

DIRECCION_MOTOR

BRAKE_MOTOR

ENABLE_MOTOR

ILF_MOTORVMAIN

GND

POWER_IN

H5 CODEC

GN

D

VMAI

N

PCM_SYN

PCM_OUT

PCM_CLK

PCM_INPOWER_DOWN_INPUT

H2 ALIMENTACION

GN

D

TPS65014_INT

MPU_RESET

RESPWRON

POWER_IN

SDA

SCLVBA

T

VMAI

N

TPS_LED2

SDA

LED

2

MPU_RST

GND

PCM_OUT

POWER_DOWN_INPUT

H1 MICRO

VBAT

VMAI

N

GN

DSCL

SDA

MPU_RESET

RESPWRON

TPS65014_INT

POWER_IN DIRECCION_MOTOR

ENABLE_MOTOR

BRAKE_MOTOR

ILF_MOTOR

PIN

_LE

D1

PIN

_LE

D2

PIN

_LE

D3

PCM_CLK

PCM_OUTPCM_IN

PCM_SYN

POW

ER_D

OW

N_I

NPU

T

TPS_LED2

LED

3

ILF_MOTOR

PCM_IN

LED

1

DIR

ECC

ION

_MO

TO

R

PWRON BRAKE_MOTOR

PCM_SYN

TPS_INT ENABLE_MOTOR

VBAT

PCM_CLK

SCL

TP4

1

<Doc> <Rev Code>

<Title>

B

2 6Monday , July 17, 2006

Title

Size Document Number Rev

Date: Sheet of

TP6T POINT S

1

R1347KSM/C_0603

C310uFSM/C_0805

USB

R19 100R ?SM/C_0603

VMAIN

SCL

R21 4,7K

NEGATIVO

RESPWRON

Y132K

GALGA VOLTIMETRICA

SDA

C422uF

SM/C_0805

R12 100K

R18

RESISTOR

TP5T POINT S

1

TPS_LED2

VLDO1

Mirar lo que se hace con estas lineas

R110RSM/C_0603

VBAT

GND

POSITIVO

C12.2uFSM/C_0805

TP7T POINT S

1

VBAT

R20 100R ?SM/C_0603

R24

RESISTOR

R9 0R

TPS_LED2

BAT_COV

J1

CONECTOR ALIMENTACION

123

VMA

IN

SCL

VMAIN

TP1T POINT S

1

R80

SM/C_0603

VMAIN

U14

DS2745

1234 5

678SCL

SDAPIOSNS VSS

CTGVIN

VDD

R40R

U2

DS1338_RELOJ-CALEN

1234 5

678X1

X2VBATGND SDA

SCLSQWVCC

RESPWRON

RESPWRON

POWER_IN

POWER_IN

VBAT

R23

1,7K

R41

RESISTOR¿?

RELOJ CALENDARIO

POWER_IN

R43

RESISTOR¿?

TPS65014_INT

R10 1MSM/C_0603

HOT_RESET

R14 1MSM/C_0603

MSS5131-682MX = L3 (6u8) MSS5131-103MX = L4 (10u)

L16u8SM/L_1210

R247KSM/C_0603

VMAIN

R156K8SM/C_0603

TPS65014_INT

VBAT

TPS65014_PG

R16 1MSM/C_0603

VMAIN

VIB

TPS_LED2

SDA

TPS65014_PERFAIL

R11 3k3

C222uF

SM/C_0805

R17 1MSM/C_0603

MPU_RESET

NEGATIVO

L2 10u

SM/L_1210SCL

SDA

VMAIN

SDA

TP2 TEST POINT1

SW3

PB_ONOFF

SDA

MPU_RESET

VLDO2

R6110K

TPS65014_INT

R3RESISTOR¿?

R42RESISTOR¿?

TP3T POINT S

1

SCL

J2

BATERIA

12

VBAT

U1A

SYM 1 OF 1

TPS65014

TPS65012PQFP_TPS65014

1615

12

3540

31

29

47

11

28

48

43

5

6

2024

2

1

46

3

1922

27

42

45

14

41

32

4421

17

36

34

33

182526

4

3830

87

109

13

37

39

23

49

PGN

D1_

BPG

ND

1_A

DEFMAIN

INT*AC

HOT_RESET*

SDAT

PB_ONOFF

PG*

IFLSB

VCORE

USB

VINCORE

VCC

VLDO2VLDO1

LED2

DEFCORE

PGN

D2

VIB

VINLDO2VINLDO1

TPOR

VBAT_B

AGN

D3

PS_SEQ

VBAT_A

MPU_RESET*

AGN

D2

AGN

D1

GPIO4

LOW_PWR

PWRFAIL*

RESPWRON*

GPIO3GPIO2GPIO1

L2

TSSCLK

VINMAIN_BVINMAIN_A

L1_BL1_A

VMAIN

ISET

BATT_COVER

VFB_LDO1

THER

MAL

_PAD

VMAIN=3.6V

LOW_POWER

SCL

SCL

C5150uFSM/C_0805

R49

RESISTOR

SCL

VBAT

TP43

1

VMAIN

R7511K

SDA

VBAT

SCL

MPU_RESET

POSITIVO

R25

RESISTOR

DISP_BCKLIGHT

R22

1,7K

PB_ONOFF

R5RESISTOR¿?

Page 8: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

6

+

-

U4LM386/SO3

25

6 14 8

7

<Doc> <Rev Code>

<Title>

A

3 6Tuesday , June 27, 2006

Title

Size Document Number Rev

Date: Sheet of

PCM_SYN

C120,05uF

PCM_IN

C8

0.1uF

+

C10

250uF

GND

PCM_IN

PCM_OUT

PCM_SYN

PCM_OUTPCM_OUT

R261,2K

VMAIN

J3

ALTAVOZ

12

U3

MC145483

123456789

10 11121314151617181920

VAG REFRO-PIPO-PO+VDDFSRDRBCLKRPDI MCLK

BCLKTDT

FSTVSS

HBTGTI-TI+

VAGC9

0.01uF

PCM_CLK

VMAI

N

VMAIN

PCM_CLK

R27

0

R2910

C710uF

VMAINPCM_SYN

C6

0.1uF

C11BYPASS

VIN

VIN

POWER_DOWN_INPUTPOWER_DOWN_INPUT

VMAIN

POWER_DOWN_INPUT

COMO SE CONECTAN TI+,TI- Y TG???

PCM_IN

PCM_CLK

R2810K

13

2

GN

D

PCM_SYN

VMAIN

+ C260.1uF

C2810uF

PIN_LED2

BOTON_OKGND

<Doc> <Rev Code>

<Title>

B

5 6Monday , September 18, 2006

Title

Size Document Number Rev

Date: Sheet of

TCK

VBAT

PCM_SYN

TDO

PCM_OUT

LCD_D[0:7]

LCD_D3

PIN_LIBRE2

SDA

RESET_BT

BOTON_ABAJO

J7

CON8

12345678

ANTENA DEL BLUETOOTH

SPI_CLK

VMAIN

BOTON_ABAJO

+ C250.1uF

<Doc> <Rev Code>

<Title>

B

5 6Monday , September 18, 2006

Title

Size Document Number Rev

Date: Sheet of

+ C290.1uF

PCM_SYN

LCD_D6

TPS65014_INT

LCD_D2

SACAR LOS PINES A TP

BOTON_ARRIBA

U12

LP2992

1

2

3

4

5

VIN

GND

ON/OFF

BYPASS

VOUTSPI_CSB

BOTON_ARRIBA

LCD_D0

SALIDA_HALL

U10

BRAKE_MOTOR

TMS

SCL

LCD_RS

PCM_OUT

LCD_D2

AREF

SDA

LCD_D7

VMAIN

PIN_LED1

SENSOR DE POSICION CON EFECTO HALL

GND

VMAIN

TPS_LED2

V

TEST POINT

1

LCD_D4

PIN_LED1

BRAKE_MOTOR

R450R

SPI_MISO

AREF

PCM_CLK

VMAIN

PIN_LED3

PIN_LIBRE5

J5

CON4

1234

GND

TPS_LED2

PIN_LED2

LCD_D1

RESPWRON

PIN_LIBRE2

VMAIN

VMAIN

BOTON_DERECHA

PIN_LED3

RESPWRON

+C2310uF

VBAT

PCM_IN

VMAIN

VMAIN

R48

RESISTOR

R51

1K

LCD_RST

PIN_LIBRE5

LCD_CS

U8

ICL3222

1

37

8

9 10

1112

1314

15

1617

18

24

56

EN

V+V-

T2OUT

R2IN R2OUT

T2INT1IN

R1OUTR1IN

T1OUT

GNDVCC

SHDN

C1+C1-

C2+C2-

MPU_RESET

PCM_SYN

BOTON_IZQUIERDA

C2410uF

R3247K

U6

REF2920

1

23IN

OUTGND

BRAKE_MOTOR

GNDDIRECCION_MOTOR

ENABLE3222

PIN_LED3

TX

ARRIBA_ABAJO

BOTON_OK

BOTON_ABAJOLCD_WR

JP2

CON_JTAG

1 23 45 67 89 10

PCM_CLK

ILF_MOTOR

LCD_D5

POWER_IN

PCM_IN

VMAI

N

MPU_RESET

PIN_LIBRE1

R50

0R

SDA

ENABLE3222

SPI_MOSIR47 0R

PCM_IN

LCD_D4

PIN_LIBRE3

SCL

PIN_LED2

CTS

GND

+ C270.1uF

J9

CON20

123456789

1011121314151617181920

SPI_CSBSPI_MISO

TPS_LED2

SHUTDOWN3222

RE

SPW

RO

N

LCD_RST

LCD_CS

CTS

VMAIN

MPU_RESET

PCM_OUT

GND

PIN_LIBRE4

R31 R

VMAIN

POWER_DOWN_INPUT

PIN_LIBRE3

VMAIN

BOTON_IZQUIERDA

TP9T POINT S

1

TPS65014_INT

TDI

GND

BOTON_DERECHA

C31

22pF

PINES CON LEDS

GN

D

LCD_D0

VMAIN

BOTON_ARRIBA

U9

NL27WZ32US

1

2

3

4

5

6

7

8

R440R

TPS65014_INT

DIRECCION_MOTOR

VMAIN

LCD_RS

PIN_LIBRE1

SCL

LCD_WR

VMAIN

POWER_DOWN_INPUT

OK_DERECHATCK

PCM_CLK

JP1

RST

12

Condensadores Desacoplo Micro

GN

D

VMAI

N

TP8T POINT S

1

LCD_D7

SPI_CLK

ILF_MOTOR

RX

C39CAPACITOR NON-POL

GND

ILF_MOTOR

TDO

POWER_IN

PIN_LIBRE4

VMAIN

BLUETOOTH

U11

BLUETOOTH

2423

2625

1 32

3031

292827

222120191817

23456

89

101112131415

7

16

RTSCTS

TXDRXD

+1.8V GND

GNDRF I/O

PIO 3PIO 2PIO 5

USB D-USB D+

PCM_CLKPCM_OUT

PCM_INPCM_SYN

AIO0AIO1GNDPIO 4RESET

SPI_CSBSPI_CLKSPI_MOSIPIO 0PIO 1PIO 7GNDVDD

SPI_MISO

PIO 6

PINES GENERICOS DE MASA Y ALIMENTACION

GN

D

LCD_D3

VMAIN

ENABLE_MOTOR

POWER_DOWN_INPUT

RTS

JP3

PROG_BLUET

123456

LCD_D6

RESET_BT

R46 0R

RX

Condensadores Desacoplo Masas y referencias

GN

D

U7

MEGA128-A

1

23456789

1011121314151617

1819

20

2122

2423

2526272829303132 33

34

3536373839404142

43

4445464748495051

5352

5455565758596061

626364

PEN

PE0 (RXD/PDI)PE1 (TXD/PDO)PE2 (XCK0/AIN0)PE3 (OC3A/AIN4)PE4 (OC3B/INT4)PE5 (OC3C/INT5)PE6 (T3/INT6)PE7 (IC3/INT7)

PB0 (SS)PB1 (SCK)PB2 (MOSI)PB3 (MISO)PB4 (OC0)PB5 (OC1A)PB6 (OC1B)PB7 (OC2/OC1C)

PG3 (TOSC2)PG4 (TOSC1)

RESET

VCCGND

XTAL1XTAL2

PD0 (SCL/INT0)PD1 (SDA/INT1)PD2 (RXD1/INT2)PD3 (TXD1/INT3)PD4 (IC1)PD5 (XCK1)PD6 (T1)PD7 (T2) PG0 (WR)

PG1 (RD)

PC0 (A8)PC1 (A9)

PC2 (A10)PC3 (A11)PC4 (A12)PC5 (A13)PC6 (A14)PC7 (A15)

PG2 (ALE)

PA7 (AD7)PA6 (AD6)PA5 (AD5)PA4 (AD4)PA3 (AD3)PA2 (AD2)PA1 (AD1)PA0 (AD0)

GNDVCC

PF7 (ADC7/TDI)PF6 (ADC6/TDO)PF5 (ADC5/TMS)PF4 (ADC4/TCK)

PF3 (ADC3)PF2 (ADC2)PF1 (ADC1)PF0 (ADC0)

AREFAGNDAVCC

DIRECCION_MOTORENABLE_MOTOR

VMAINGN

D

U15 SS411A SENSOR HALL

1 2 3

VDD

GN

D

OU

TPU

T

OK_DERECHAENABLE_MOTOR

LCD_D5

RTS

SPI_MOSI

VBAT

PINES CONECTADOS AL CARGADOR

PIN_LED1

GN

D

SHUTDOWN3222

LCD_D[0:7]

BOTON_OK

BOTON_ABAJO

LCD_D1

TX

BOTON_DERECHA

C32

CAPACITOR NON-POL

PINES CONECTADOS AL DRIVER DEL MOTOR

TMS

TDI

C30

22pF

POWER_IN

PINES CONECTADOS AL CODEC

Page 9: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

7

PIN_LED2

<Doc> <Rev Code>

<Title>

A

6 6Tuesday , July 04, 2006

Title

Size Document Number Rev

Date: Sheet of

ENABLE_MOTORBRAKE_MOTOR

R35

330

PIN_LED3

ENABLE_MOTOR

SEÑAL PARA AVISAR DE ALTA CORRIENTE ENABLE_MOTOR

<Doc> <Rev Code>

<Title>

A

6 6Tuesday , July 04, 2006

Title

Size Document Number Rev

Date: Sheet of

BRAKE_MOTOR

DIRECCION_MOTOR

ILF_MOTOR

DIRECCION_MOTORENABLE_MOTOR

D3

LN175

1 2

ALIMENTACION DE LA PLACA DEL MICRO

BRAKE_MOTOR

DIRECCION_MOTOR

PIN_LED2PIN_LED1

PINES CONECTADOS A LEDS DE INFORMACION

BRAKE_MOTOR

GND

BRAKE_MOTOR ILF_MOTOR

PIN_LED2

PIN_LED1

PINES DEL DRIVER DEL MOTOR QUE VAN AL MICRO

R34

330

ILF_MOTOR

VBA

T

PIN_LED3

DIRECCION_MOTOR

DIRECCION_MOTORVBAT

DIRECCION_MOTOR

ENABLE_MOTORENABLE_MOTOR

PIN_LED1

D1

LN175

1 2

U13

HIP4020

123456789

10 11121314151617181920NC

ILFB2ENBB1VSSENAA1A2NC NC

VDDNC

OUTAVSSAVSSBOUTB

NCVDD

NC

VBAT

BRAKE_MOTORENABLE_MOTORDIRECCION_MOTOR

BRAKE_MOTORENABLE_MOTOR

DIRECCION_MOTOR

R33

330

BRAKE_MOTOR

D2

LN175

1 2

CLEMA PARA LA COLOCACION DEL MOTOR

C33

10uF

J6

MOTOR

12

PIN_LED3

Page 10: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

8

LISTA DE MATERIALES Item Number Quantity Value Description

Part Number

Part Reference PCB Footprint

1 1 2.2uF C1 SM/C_0805 2 1 22uF C2 SM/C_0805 3 1 10uF C3 SM/C_0805 4 1 22uF C4 SM/C_0805 5 1 150uF C5 SM/C_0805 6 1 0.1uF C6 SM/C_0805 7 1 10uF C7 SM/C_0805 8 1 0.1uF C8 SM/C_0805 9 1 0.01uF C9 SM/C_0805

10 1 250uF C10 SM/C_0805 11 1 BYPASS C11 SM/C_0805 12 1 0,05uF C12 SM/C_0805 13 1 10uF C23 14 1 10uF C24 15 1 0.1uF C25 SM/C_0805 16 1 0.1uF C26 SM/C_0805 17 1 0.1uF C27 SM/C_0805 18 1 10uF C28 19 1 0.1uF C29 SM/C_0805 20 1 22pF C30 21 1 22pF C31 22 1 CAPACITOR NON-POL C32 SM/C_0805 23 1 10uF C33 SM/C_0805 24 1 CAPACITOR NON-POL C39 25 1 LN175 D1 SM/C_1206 26 1 LN175 D2 SM/C_1206 27 1 LN175 D3 SM/C_1206 28 1 CONECTOR ALIMENTACION J1 CONECTOR_ALIMENTACION 29 1 BATERIA J2 CLEMA_2 30 1 ALTAVOZ J3 CLEMA_2 31 1 CON4 J5 CONECTOR_RS232 32 1 MOTOR J6 CLEMA_2 33 1 CON8 J7 BLKCON.100/VH/TM1SQ/W.10034 1 CON20 J9 35 1 RST JP1 BLKCON.100/VH/TM1SQ/W.10036 1 CON_JTAG JP2 CONECTOR_JTAG 37 1 PROG_BLUET JP3 CONECTOR_JTAG 38 1 6u8 L1 SM/L_1210 39 1 10u L2 SM/L_1210 40 1 10R R1 SM/C_0603 41 1 47K R2 SM/C_0603 42 1 RESISTOR¿? R3 SM/C_0603 43 1 0R R4 SM/C_0603 44 1 RESISTOR¿? R5 SM/C_0603 45 1 110K R6 SM/C_0603 46 1 511K R7 SM/C_0603 47 1 0 R8 SM/C_0603 48 1 0R R9 SM/C_0603 49 1 1M R10 SM/C_0603 50 1 3k3 R11 SM/C_0603 51 1 100K R12 SM/C_0603 52 1 47K R13 SM/C_0603

Page 11: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

9

53 1 1M R14 SM/C_0603 54 1 6K8 R15 SM/C_0603 55 1 1M R16 SM/C_0603 56 1 1M R17 SM/C_0603 57 1 RESISTOR R18 SM/C_0603 58 1 100R ? R19 SM/C_0603 59 1 100R ? R20 SM/C_0603 60 1 4,7K R21 SM/C_0603 61 1 1,7K R22 SM/C_0603 62 1 1,7K R23 SM/C_0603 63 1 RESISTOR R24 SM/C_0603 64 1 RESISTOR R25 SM/C_0603 65 1 1,2K R26 SM/C_0603 66 1 0 R27 SM/C_0603 67 1 10K R28 VRES10 68 1 10 R29 SM/C_0603 69 1 R R31 SM/C_0603 70 1 47K R32 71 1 330 R33 SM/C_0603 72 1 330 R34 SM/C_0603 73 1 330 R35 SM/C_0603 74 1 RESISTOR¿? R41 RESISTOR 75 1 RESISTOR¿? R42 76 1 RESISTOR¿? R43 77 1 0R R44 78 1 0R R45 79 1 0R R46 80 1 0R R47 81 1 RESISTOR R48 82 1 RESISTOR R49 SM/C_0603 83 1 0R R50 84 1 1K R51 85 1 PB_ONOFF SW3 PULSADOR 86 1 T POINT S TP1 V 87 1 TEST POINT TP2 V 88 1 T POINT S TP3 V 89 1 TEST POINT TP4 V 90 1 T POINT S TP5 V 91 1 T POINT S TP6 V 92 1 T POINT S TP7 V 93 1 T POINT S TP8 94 1 T POINT S TP9 95 1 TEST POINT TP43 V 96 1 TPS65014 U1 PQFP_TPS65014 97 1 DS1338_RELOJ-CALEN U2 USOP8/SMD/DS1338 98 1 MC145483 U3 TSSOP20/6.40/6.60/0.65MM 99 1 LM386/SO U4 SOG.050/8/WG.244/L.200

100 1 REF2920 U6 SOT-23/REF2920

101 1 MEGA128-A U7 ATEMEGA128/64/0.80MM/16/14

102 1 ICL3222 U8 SOG.050/18/WG.350/L.550 103 1 NL27WZ32US U9 NL27WZ32US 104 1 CRISTAL U10 CRISTAL 105 1 BLUETOOTH U11 MODULO_BLUETOOTH 106 1 LP2992 U12 SOT23/LP2992 107 1 HIP4020 U13 SOIC20/1.27MM/10.65/13

Page 12: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

10

108 1 DS2745 U14 USOP8/SMD/DS2745 109 1 SS411A SENSOR HALL U15 SS411A 110 1 TEST POINT V 111 1 32K Y1 CRYSTAL-32KHZ

CIRCUITOS IMPRESOS

Page 13: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

11

CÓDIGO CENTRO DE CONTROL

#include <utility.h> #include <ansi_c.h> #include <rs232.h> #include <string.h> #include "sms.h" /* CUERPO DE LAS FUNCIONES PARA EL MANEJO DE SMS*/ char com[]="COM1"; //asignacion que hay que cambiar para modificar el puerto por el que nos queramos conectar con el movil. unsigned char port=1; //abre el puerto serie especificado: el 1 o el 2 //==0 error abriendo puerto unsigned char AbrirPuertoSMS(unsigned char puerto) { char flag1; //actualizando valores port=puerto; com[3]='0'+puerto; //abriendo puerto flag1 = OpenComConfig (port, com, 19200, 0, 8, 1, 512, 512); //=0 succesfull //resultado if (flag1==0) { SetComTime (port, 5); //eliminar timeout return 1; } else { return 0; } } //cerrar el puerto de comunicaciones void CerrarPuertoSMS(void) { FlushInQ(port); //el valor que toma "port" en esta línea es el que se le indico como CloseCom (port); //parametro en la funcion de abrir puerto } //Habilitar el aviso de recepción de mensajes //==0 OK //==-1 No se ha encontrado el movil //==OTRO NO OK #define MAX_REINTENTOS 1 int habilitar_mensaje(void) { short i; int respuesta=0; int intentos = 0; FlushInQ (port); FlushOutQ (port); //enviar comando para habilitar la recepcion del mensaje do { ComWrt (port, "AT+CNMI=1,1,0,0", 15); ComWrtByte (port, 13); ComWrtByte (port, 10); //recibir ecos for (i=0;i<18;i++) { respuesta=ComRdByte (port); if(respuesta<0) { //printf("CONECTE EL MOVIL POR FAVOR\n"); intentos++; break; } } if (intentos == MAX_REINTENTOS) { return -1; //devuelvo -1 si no he encontrado el movil... } }while (respuesta <0); //recibir respuesta (ok) if (ComRdByte (port)!='O') return 1; //K,13,10 ComRdByte (port); ComRdByte (port); ComRdByte (port); return 0; } //lectura de un nuevo mensaje en el móvil //1: leer trama de aviso //2: enviar comando de lectura //3: leer mensaje //4: borrar mensaje //almacena en mensaje el contenido útil del sms, en telefono el que lo envía //y retorna el número de caracteres del mensaje int leerMensaje(char *mensaje,char *telefono)

Page 14: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

12

{ unsigned char byte=0,dato1,dato2,tamanyo; char telefono2[13]; int i; int longitud,posicion; unsigned char byte_esperado; longitud = GetInQLen (port); posicion = 0; for (i=0;i<longitud;i++) { byte = ComRdByte(port); switch(posicion) { case 0: byte_esperado = '+'; break; case 1: byte_esperado = 'C'; break; case 2: byte_esperado = 'M'; break; case 3: byte_esperado = 'T'; break; case 4: byte_esperado = 'I'; break; case 5: byte_esperado = ':'; break; } if (byte == byte_esperado) posicion++; else posicion = 0; if (posicion == 6) break; } if (posicion != 6) return 0; // FlushInQ (port); // FlushOutQ (port); /*1: Leer trama de aviso*/ //avisa con +CMTI: "SM",XX donde XX es el número del mensaje while (byte!=',') byte=ComRdByte (port); //recoger el número de mensaje (puede ser '1'-'3''0' != '0''1'-'3''0') dato1=ComRdByte (port); //unidades o decenas dato2=ComRdByte (port); //unidades o 13 ComRdByte (port); //13 o 10 if (dato2!=13) ComRdByte (port); //10 /*2: Enviar comando de lectura*/ ComWrt (port, "AT+CMGR=", 8); ComWrtByte (port, dato1); //unidades o decenas ComWrtByte (port, dato2); //unidades o 13 if (dato2!=13) ComWrtByte (port, 13); ComWrtByte (port, 10); do //leer ecos { byte=ComRdByte (port); }while (byte!=10); /*3: Leer mensaje*/ //eliminar saltos de linea do{ ComRdByte(port); }while(byte!=10); //los primeros caracteres no sirven for (i=0;i<35;i++) ComRdByte(port); //los 12 siguientes son el número de teléfono que lo envía for (i=0;i<12;i++) telefono2[i]=ComRdByte(port); telefono2[12]='\0'; //trasponer los dígitos para obtener el teléfono en el formato adecuado for(i=0;i<6;i++) { telefono[i*2] =telefono2[i*2+1]; telefono[i*2+1]=telefono2[i*2]; } telefono[12]='\0'; //el resto son datos del mensaje i=0; do{ mensaje[i++]=ComRdByte(port); }while (mensaje[i-1]!=10);

Page 15: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

13

mensaje[i-1]='\0'; //por último el ok[13,10] do{ byte=ComRdByte(port); }while (byte!='K');ComRdByte(port);ComRdByte(port); //quito ahora el borrado del mensaje para ver si lo recibe correctamente /*4: Borrar el mensaje del teléfono*/ /* ComWrt (port, "AT+CMGD=", 8); ComWrtByte (port, dato1); //unidades o decenas ComWrtByte (port, dato2); //unidades o 13 if (dato2!=13) ComWrtByte (port, 13); ComWrtByte (port, 10); do //leer ecos { byte=ComRdByte (port); }while (byte!=10); FlushInQ (port); FlushOutQ (port); */ return procesarMensaje(mensaje); } //Discrimina la parte útil eliminando cabeceras y códigos de control //retorna el número de caracteres que contiene el mensaje int procesarMensaje(char *mensaje) { char sbyte[]="00"; short i; //otra forma de hacerlo: comprobar que funciona for (i=0;mensaje[20+2*i]!='\0';i++) //a partir de la 20 está el mensaje { sbyte[0]=mensaje[20+2*i]; sbyte[1]=mensaje[21+2*i]; mensaje[i]=(char)strtol (sbyte, NULL, 16); } mensaje[i]='\0'; puts(mensaje); return (i-1); } //Envia el mensaje al teléfono seleccionado //==0 OK //==1 telefono no conectado //==2 error de conexión //==3 mensaje demasiado largo int enviarMensaje(const char mensaje[],const char telefono[]) { char telefono2[13]; short i,longitud; if (strlen(mensaje)>160) return 3; ComWrtByte(port,'a'); ComWrtByte(port,'t'); ComWrtByte(port,13); ComWrtByte(port,10); Delay(1); if(GetInQLen(port)==0) { return 1; } //leer ecos for (i=0; i<5;i++) ComRdByte(port); //leer ok if(ComRdByte(port)!='O') { return 2; } FlushInQ(port); //trasponer los dígitos para obtener el teléfono en el formato adecuado telefono2[12]='\0'; for(i=0;i<6;i++) { telefono2[i*2] =telefono[i*2+1]; telefono2[i*2+1]=telefono[i*2]; } telefono2[10]='F'; ComWrt (port, "AT+CMGS=140", 11); ComWrtByte (port, 13); ComWrtByte (port, 10); Delay(1); ComWrt (port, "0011000B91", 10);

Page 16: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

14

ComWrt (port, telefono2, 12); ComWrt (port, "00F6AA", 6); longitud=strlen(mensaje); enviarLetraHex(longitud /16); //enviar el byte como 2caracteres en formato hexadecimal enviarLetraHex(longitud %16); for(i=0;i<longitud;i++) { enviarLetraHex(mensaje[i] /16); enviarLetraHex(mensaje[i] %16); } ComWrtByte (port, 26); Delay(4); // FlushInQ (port); // FlushOutQ (port); return 0; } //envia el byte(0-15) en formato ascii ('0'-'F') char enviarLetraHex(short digito) { if (digito<10) { ComWrtByte (port, digito+48); return (digito+'0');//caracter 48 = '0' } else { ComWrtByte (port, digito+'A'-10); return (digito+'A'-10);//caracter 65 = 'A' } } void pasar_ascii_a_hexadecimal(char *cadena_entrada,char *cadena_salida) // envia la trama en formato SMS { char entero; int i; i=0; do { entero = cadena_entrada[i] / 16; cadena_salida[2*i]=enviarLetraHex(entero); // primer campo del codigo hexadecimal. entero=cadena_entrada[i]%16; cadena_salida[(2*i)+1]=enviarLetraHex(entero); //segundo campo del codigo hexadecimal. i++; } while (cadena_entrada[i]!='\0'); cadena_salida[2*i]='\0'; } void interpreta_mensaje(char *longitud,char *mensaje) { unsigned int i,numero_caracteres; char telefono_uno[]="4376255789F1\0"; numero_caracteres=0; i=0; //en las posiciones 18 y 19 de la trama recibida esta la longitud del mensaje //numero_caracteres=(16* (unsigned int(trama_recibida[18])-48) + (unsigned int(trama_recibida[19])-48)); numero_caracteres= (unsigned int) 16*(longitud[0]-'0') + (longitud[1]-'0');//pasamos de cadena de caracteres a entero //los datos empiezan al principio de la cadena nueva y se leen en parejas for(i=0; i<numero_caracteres; i++) { mensaje[i]=pasadecimal(mensaje[0+(2*i)],mensaje[1+(2*i)]); } mensaje[i]='\0'; //manda_pdu(mensaje,telefono_uno); } char pasadecimal(int a,int b) { int decimal; decimal=16*(a-'0'); if(b=='A') decimal=decimal+10; if(b=='B') decimal=decimal+11; if(b=='C') decimal=decimal+12; if(b=='D') decimal=decimal+13; if(b=='E') decimal=decimal+14; if(b=='F') decimal=decimal+15; if(b<'A') decimal=decimal+(b-'0'); return(decimal); } //includes de las librerías necesarias// #include <ansi_c.h> #include "cvi_db.h"

Page 17: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

15

#include "easytab.h" #include <cvirte.h> #include <userint.h> #include <utility.h> #include <rs232.h> #include "pruebas_irene.h" #include "sms.h" #include "ventana.h" #include <stdio.h> #include <string.h> /* Base de datos: */ //"DSN=myodcb(controlador del ordenador de la uni)" //"DSN=Mysql(controlador del ordenador de casa)" #define BASE_DATOS "DSN=myodcb" //Se define el nombre de la base de datos a utilizar// #define PUERTOSMS 1 //variables de los diferentes paneles que se utilizan// static int panelHandle; static int panel_2Handle; static int panel_3Handle; static int panel_4Handle; static int panelbusquedaHandle; static int panel_coincidencia; static int paneltab0; static int paneltab1; static int paneltab2; static int paneltab3; static int paneltab4; static int panel_mensaje; static int panel_borrar; char movil_manda[20];//variable global que contiene el numero de movil al que habrá //que mandarle el mensaje //Diferentes variables que sirven para buscar al paciente por diferentes referencias int buscar_por_nombre, buscar_por_numero, buscar_por_apellido_1,buscar_por_apellido_2; int buscar_por_dni,buscar_por_seguridad; int escogido; //Declaracion de fuciones especificas de la aplicacion// unsigned char contar_numero_enfermedades(void); void metodo_burbuja(char *array,unsigned int cuantos,unsigned int longitud); void activa_casillas_cuando_busqueda(unsigned int numero_de_tomas, unsigned int numero_enfermedad); //Declaración de funciones referidas al uso del puerto serie para comunicacion con movil. int habilitar_mensaje(void); int leerMensaje(char *mensaje,char *telefono); unsigned char AbrirPuertoSMS(unsigned char puerto); int enviarMensaje(const char mensaje[],const char telefono[]); void CerrarPuertoSMS(void); int procesarMensaje(char*mensaje); //funcion que transforma el char numero_paciente a un int normal para operar aritmeti- con el. void Irene_ulong_to_cadena (unsigned long numero, char *puntero_cadena,int long_cadena) { int long_numero = 0; unsigned long aux; aux = numero; while (aux) { aux = aux/10; long_numero++; } for(aux = 0;aux < long_cadena;aux++) { puntero_cadena[aux]=0; } aux = numero; for(long_numero;long_numero > 0; long_numero--) { puntero_cadena[long_numero-1]=numero%10 + '0'; numero = numero / 10; } } //Función que se comunica con el movil a través del puerto serie para saber si esta conectado o no void comprobar_si_esta_el_movil() { int respuesta; AbrirPuertoSMS(PUERTOSMS); respuesta = habilitar_mensaje(); if (respuesta==0) { SetCtrlVal(panelHandle,PANEL_LED_SI,1); SetCtrlAttribute (panelHandle,PANEL_LED_SI , ATTR_ON_COLOR, 0x0000FF00); SetCtrlVal(panelHandle,PANEL_TEXT_MOVIL,"El movil está conectado"); } else { SetCtrlVal(panelHandle,PANEL_LED_SI,1); SetCtrlAttribute (panelHandle,PANEL_LED_SI , ATTR_ON_COLOR, 0x00FF0000);

Page 18: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

16

SetCtrlVal(panelHandle,PANEL_TEXT_MOVIL,"El movil no está conectado"); } Delay(1); FlushInQ (PUERTOSMS); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// FUNCION PRINCIPAL DE LA APLICACIÓN////////////////////////////////// ////////////////////////////////interactua con la base de datos ////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// int main (int argc, char *argv[]) { static int databaseHandle; int respuesta; if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ if ((panelHandle = LoadPanel (0, "pruebas_irene.uir", PANEL)) < 0) return -1; comprobar_si_esta_el_movil(); //hay que mirar lo primero si el movil esta conectado databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"CREATE DATABASE IF NOT EXISTS Hospital"); DBImmediateSQL(databaseHandle,"USE Hospital"); DBDisconnect(databaseHandle); DisplayPanel (panelHandle); RunUserInterface (); DiscardPanel (panelHandle); return 0; } //////////////////// //////////////// //////////////////// FUNCION PARA CREAR UNA NUEVA FICHA //////////////// //////////////////// /////////////// int CVICALLBACK Nueva_ficha (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static int databaseHandle; static int statementHandle; int estado; int numRecs, i; unsigned long numero_paciente_ul = 0, max = 0; char numero_paciente[16]; switch (event) { case EVENT_COMMIT: panel_2Handle = LoadPanel (0, "pruebas_irene.uir", PANEL_2); //funciones para crear las pestañas // EasyTab_ConvertFromCanvas (panel_2Handle, PANEL_2_EASYTAB); EasyTab_LoadPanels (panel_2Handle, PANEL_2_EASYTAB, 1, "pruebas_irene.uir", __CVIUserHInst, PANEL1TAB0, &paneltab0, //panel de los datos del paciente PANEL2TAB1, &paneltab1, //panel de los datos clinicos PANEL2TAB2, &paneltab2, //panel del historial del paciente PANEL2TAB3, &paneltab3, //panel de las enfermedades y los tratamientos PANEL2TAB4, &paneltab4, //panel de otros tratamientos 0); //hacemos esconder el panel principal y aparece el segundo panel con todas las pestañas HidePanel (panelHandle); //Nos conectamos a la base de datos preestablecida y creamos las tablas si no //existieran previamente databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"USE Hospital"); DBImmediateSQL(databaseHandle,"CREATE TABLE IF NOT EXISTS Datos_del_Paciente(Número NUMERIC,Nombre CHAR(128),Primer_Apellido CHAR(128),Segundo_Apellido CHAR(128),DNI CHAR(10),Direccion CHAR(128),Portal CHAR(3), Escalera CHAR(10),Piso CHAR(8),Letra CHAR(2),Codigo_Postal CHAR(8),Poblacion CHAR(128),Provincia CHAR(128),Telefono_uno CHAR(10), Telefono_dos CHAR(10), Movil CHAR(20),PRIMARY KEY (Número))"); DBImmediateSQL(databaseHandle,"CREATE TABLE IF NOT EXISTS Datos_Clinicos(Número NUMERIC,Número_Seguridad_Social CHAR(15),Sexo CHAR(10),Fecha_Nacimiento CHAR(20),Edad CHAR(3),Peso FLOAT(5,2),Altura FLOAT(5,2),Antecedentes TEXT,FOREIGN KEY (Número) REFERENCES Datos_del_Paciente (Número))"); DBImmediateSQL(databaseHandle,"CREATE TABLE IF NOT EXISTS Historial(Número NUMERIC,Historial TEXT, FOREIGN KEY (Número) REFERENCES Datos_del_Paciente (Número))"); DBImmediateSQL(databaseHandle,"CREATE TABLE IF NOT EXISTS Enfermedades_Tratamientos(Número NUMERIC, Enfermedad CHAR(30), Tratamiento CHAR(30), Número_tomas NUMERIC, TOMA_1 CHAR(5), TOMA_2 CHAR(5), TOMA_3 CHAR(5), TOMA_4 CHAR(5), TOMA_5 CHAR(5), TOMA_6 CHAR(5), TOMA_7 CHAR(5), PRIMARY KEY (Número,Enfermedad), FOREIGN KEY (Número) REFERENCES Datos_del_Paciente (Número))"); DBImmediateSQL(databaseHandle,"CREATE TABLE IF NOT EXISTS Otros_tratamientos(Número NUMERIC, Descripción TEXT, FOREIGN KEY (Número) REFERENCES Datos_del_Paciente (Número))"); statementHandle = DBActivateSQL(databaseHandle,"SELECT Número FROM Datos_del_Paciente"); DBBindColChar(statementHandle,1,11,numero_paciente,&estado,""); numRecs=DBNumberOfRecords(statementHandle); if (numRecs < 0) strcpy(numero_paciente,"1");//Si es la primero ficha que se guarda, se pone un 1 en el //numero del paciente. else { for (i = 0; i<numRecs;i++) { DBFetchNext(statementHandle);

Page 19: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

17

numero_paciente_ul = strtoul (numero_paciente,NULL,10); if (numero_paciente_ul > max) max = numero_paciente_ul; } numero_paciente_ul = max + 1; Irene_ulong_to_cadena(numero_paciente_ul,(char *)numero_paciente,sizeof(numero_paciente)); } //Actualizamos el numero del paciente en todas las pestañas// SetCtrlVal(paneltab0,PANEL1TAB0_NUMERO_PACIENTE,numero_paciente); SetCtrlVal(paneltab1,PANEL2TAB1_NUMERO_PACIENTE,numero_paciente); SetCtrlVal(paneltab2,PANEL2TAB2_NUMERO_PACIENTE,numero_paciente); SetCtrlVal(paneltab3,PANEL2TAB3_NUMERO_PACIENTE,numero_paciente); SetCtrlVal(paneltab4,PANEL2TAB4_NUMERO_PACIENTE,numero_paciente); DBDisconnect(databaseHandle); DisplayPanel (panel_2Handle); break; } return 0; } /////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////// //////////////// ///////////////////// FUNCION PARA CONTAR EL NUMERO DE ENFERMEDADES DEL PACIENTE//////////////// //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// unsigned char contar_numero_enfermedades(void) { unsigned char numero_enfermedades=0; int on_off=0; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_1,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_2,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_3,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_4,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_5,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_6,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_7,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_8,&on_off); if(on_off==1) numero_enfermedades++; GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_9,&on_off); if(on_off==1) numero_enfermedades++; //vamos recorriendo todos los check box de la ventana en uso para saber el numeor de enfermedades //del paciente return numero_enfermedades; } ////////////////////////////////////////////////////////////////////////////////////////////// /////////////////// ///////////////////////// ////////////////// FUNCION PARA GRABAR LOS DATOS DE UNA NUEVA FICHA //////////////////////// ////////////////// ///////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK Guardar_ficha (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { /*variables generales*/ static int databaseHandle; static int statementHandle; int estado; int numRecs; int i,j; int respuesta=0; /*variables correspondientes a los datos del paciente*/ char numero_paciente[16]; char nombre[128]; char primer_apellido[128]; char segundo_apellido[128]; char dni[10]; char direccion[256]; char portal[5]; char escalera[10]; char piso[8];

Page 20: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

18

char letra[2]; char codigo_postal[8]; char poblacion[256]; char provincia[256]; char telefono_uno[10]; char telefono_dos[10]; char movil[20]; char prefijo[20]; char buffer_gigante[65200]; /*variables correspondientes a los datos clínicos del paciente*/ char numero_ss_clinicos[20]; char sexo_clinicos[10]; int masculino; int femenino; char dia[20],mes[10],anyo[5]; char edad_clinicos[3]; double peso_clinicos; double altura_clinicos; char antecedentes[2048]; /*variables correspondientes al historial del paciente*/ char historial[128]; /*variables correspondientes al panel de enfermedades y tratamientos*/ char enfermedad[30]; char tratamiento[30]; unsigned int numero_tomas; unsigned char numero_de_enfermedades; char tomas[7][10];//arrays de cadenas de caracteres// char mensaje[100][20];//arrays de cadenas de caracteres// char bueno[70][20]; char cadena[150];//cadena de 620 caracteres// int on_off=0; int x; int k; int a,b,c,h,numero_total_tomas; int multiplica; int cero; //una vez declaradas las variables oportunas empezamos con la ejecucion de la funcion// switch (event) { case EVENT_COMMIT: //inicializamos todas las variables a cero /*inicializacion de las correspondientes a la tabla de datos del paciente */ memset (numero_paciente,0,sizeof(numero_paciente)); memset (nombre,0,sizeof(nombre)); memset (primer_apellido,0,sizeof(primer_apellido)); memset (segundo_apellido,0,sizeof(segundo_apellido)); memset (dni,0,sizeof(dni)); memset (direccion,0,sizeof(direccion)); memset (portal,0,sizeof(portal)); memset (escalera,0,sizeof(escalera)); memset (piso,0,sizeof(piso)); memset (letra,0,sizeof(letra)); memset (codigo_postal,0,sizeof(codigo_postal)); memset (poblacion,0,sizeof(poblacion)); memset (provincia,0,sizeof(provincia)); memset (telefono_uno,0,sizeof(telefono_uno)); memset (telefono_dos,0,sizeof(telefono_dos)); memset (movil,0,sizeof(movil)); memset (prefijo,0,sizeof(prefijo)); /*inicializacion de las correspondientes a la tabla de los datos clinicos*/ memset (numero_ss_clinicos,0,sizeof(numero_ss_clinicos)); memset (sexo_clinicos,0,sizeof(sexo_clinicos)); memset (dia,0,sizeof(dia)); memset (mes,0,sizeof(mes)); memset (anyo,0,sizeof(anyo)); memset (edad_clinicos,0,sizeof(edad_clinicos)); peso_clinicos=0; altura_clinicos=0; memset (antecedentes,0,sizeof(antecedentes)); /*inicializacion de las variables correspondientes a la tabla de historial*/ memset (historial,0,sizeof(historial)); /*inicializacion de las variables correspondientes a la tabla enfermedades y tratamiento*/ memset(enfermedad,0,sizeof(enfermedad)); memset(tratamiento,0,sizeof(tratamiento)); numero_tomas=0; memset(tomas[0],0,sizeof(tomas[0])); memset(tomas[1],0,sizeof(tomas[0])); memset(tomas[2],0,sizeof(tomas[0])); memset(tomas[3],0,sizeof(tomas[0])); memset(tomas[4],0,sizeof(tomas[0])); memset(tomas[5],0,sizeof(tomas[0])); memset(tomas[6],0,sizeof(tomas[0])); /*Cogemos los valores que nos interesan del panel de los datos del paciente*/ GetCtrlVal (paneltab0, PANEL1TAB0_NUMERO_PACIENTE, numero_paciente); GetCtrlVal (paneltab0, PANEL1TAB0_NOMBRE, nombre); GetCtrlVal (paneltab0, PANEL1TAB0_PRIMER_APELLIDO, primer_apellido); GetCtrlVal (paneltab0, PANEL1TAB0_SEGUNDO_APELLIDO, segundo_apellido); GetCtrlVal (paneltab0, PANEL1TAB0_DNI, dni); GetCtrlVal (paneltab0, PANEL1TAB0_DIRECCION, direccion); GetCtrlVal (paneltab0, PANEL1TAB0_PORTAL, portal); GetCtrlVal (paneltab0, PANEL1TAB0_ESCALERA, escalera); GetCtrlVal (paneltab0, PANEL1TAB0_PISO, piso);

Page 21: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

19

GetCtrlVal (paneltab0, PANEL1TAB0_LETRA, letra); GetCtrlVal (paneltab0, PANEL1TAB0_CODIGO_POSTAL, codigo_postal); GetCtrlVal (paneltab0, PANEL1TAB0_POBLACION, poblacion); GetCtrlVal (paneltab0, PANEL1TAB0_PROVINCIA, provincia); GetCtrlVal (paneltab0, PANEL1TAB0_TELEFONO_UNO, telefono_uno); GetCtrlVal (paneltab0, PANEL1TAB0_TELEFONO_DOS, telefono_dos); GetCtrlVal (paneltab0, PANEL1TAB0_MOVIL, movil); GetCtrlVal (paneltab0, PANEL1TAB0_PREFIJO,prefijo); //funcion para que se grabe el numero de movil con el prefijo// strcat (prefijo,movil); /*Cogemos los valores que nos interesan de los datos clínicos del paciente*/ GetCtrlVal (paneltab1, PANEL2TAB1_NUMERO_SS, numero_ss_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_DIA, dia); GetCtrlVal (paneltab1, PANEL2TAB1_MES, mes); GetCtrlVal (paneltab1, PANEL2TAB1_ANYO, anyo); //funcion para concatenar el dia,el mes y el año de la fecha de nacimiento// strcat(dia,mes); strcat(dia,anyo); GetCtrlVal (paneltab1, PANEL2TAB1_EDAD , edad_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_NUMERIC_PESO , &peso_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_NUMERIC_ALTURA , &altura_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_TEXTBOX_ANTECEDENTES , antecedentes); GetCtrlVal (paneltab1, PANEL2TAB1_CHECKBOX_MASCULINO,&masculino); GetCtrlVal (paneltab1, PANEL2TAB1_CHECKBOX_FEMENINO,&femenino); //traducimos el tick del check box a una cadena que podamos introducir en la base de datos if (masculino==0) { if (femenino==1) strcpy(sexo_clinicos,"FEMENINO"); else { MessagePopup("CUIDADO","Ha de introducir el sexo del paciente"); return 0; } } else strcpy(sexo_clinicos,"MASCULINO"); /*Cogemos los valores que nos interesan del panel historial*/ GetCtrlVal (paneltab2, PANEL2TAB2_TEXTBOX_HISTORIAL,historial); /*Nos conectamos a la base de datos y escribimos los datos del resto de la ficha del paciente*/ databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"USE Hospital"); //Datos personales del paciente memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"INSERT INTO Datos_del_Paciente VALUES (%s,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", numero_paciente,nombre,primer_apellido,segundo_apellido,dni,direccion,portal, escalera,piso,letra,codigo_postal,poblacion,provincia,telefono_uno, telefono_dos,prefijo); DBImmediateSQL(databaseHandle, buffer_gigante); //Datos Clínicos del Ppaciente// memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"INSERT INTO Datos_Clinicos VALUES (%s,'%s','%s','%s','%s',%lf,%lf,'%s')", numero_paciente, numero_ss_clinicos, sexo_clinicos, dia, edad_clinicos, peso_clinicos,altura_clinicos,antecedentes); DBImmediateSQL(databaseHandle, buffer_gigante); //Historial del paciente memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"INSERT INTO Historial VALUES (%s,'%s')",numero_paciente,historial); DBImmediateSQL(databaseHandle, buffer_gigante); /*Cogemos los valores que nos interesan del panel de enfermedades y tratamiento*/ //en este caso iremos guardando en la base da datos los datos a la vez que vamos //cogiendo los valores necesarios de la ventana de enfermedades y tratamiento. //Asi tendremos que utilizar muchas menos variables que si cogieramos todos los valores //a la vez x=0; multiplica=0; numero_total_tomas = 0; for(i=0;i<9;i++) //se presentan nueve posibles enfermedades por cada paciente { GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_1+i,&on_off); if(on_off==1) { multiplica++; GetCtrlVal (paneltab3,PANEL2TAB3_ENFERMEDAD_1+i,enfermedad); GetCtrlVal (paneltab3,PANEL2TAB3_TRATAMIENTO_1+i,tratamiento); GetCtrlVal (paneltab3,PANEL2TAB3_NUMERO_TOMAS_1+i,&numero_tomas); for(j=0;j<7;j++) { GetCtrlVal (paneltab3,PANEL2TAB3_TOMA1_1+i+j*9,tomas[j]); }; a=0; //colocamos las horas de las tomas de menos a mayor y las introducimos en la tabla //correspondiente de la base de datos// metodo_burbuja((char *)tomas,numero_tomas,sizeof(tomas[0])); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"INSERT INTO Enfermedades_Tratamientos VALUES(%s,'%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s')", numero_paciente,enfermedad,tratamiento,numero_tomas,tomas[0],tomas[1], tomas[2],tomas[3],tomas[4],tomas[5],tomas[6]);

Page 22: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

20

//las tomas que no se necesiten se meten en la base de datos valiendo 0// DBImmediateSQL(databaseHandle, buffer_gigante); } }; //PARA REINICIAR EL PUERTO HAY QUE CERRARLO Y VOLVERLO A ABRIR CerrarPuertoSMS(); AbrirPuertoSMS(PUERTOSMS); //nos desonectamos de la base de datos DBDisconnect(databaseHandle); HidePanel (panel_2Handle); DisplayPanel(panelHandle); break; case EVENT_RIGHT_CLICK: MessagePopup("Ayuda","Introduzca los datos y pulse GUARDAR\n para almacenarlos en la Base de Datos"); } return 0; } /////////////////////////////////////////////////////////////////// //FUNCION PARA ORDENAR LAS HORAS DE LAS TOMAS DE MENOR A MAYOR///// ////////////////////////METODO DE LA BURBUJA/////////////////////// /////////////////////////////////////////////////////////////////// void metodo_burbuja(char *array,unsigned int cuantos,unsigned int longitud) { char aux[20]; int i,j; for(j=cuantos;j>1;j--){ for(i=1; i<j;i++) { if(strncmp(array+longitud*(i-1),array+longitud*i,5)>0) { //si se cumple que tomas[i-1] es mayor que tomas[i], entonces habra que cambiarlos de sitio strncpy(aux,array+longitud*(i-1),longitud); strncpy(array+longitud*(i-1),array+longitud*i,longitud); strncpy(array+longitud*i,aux,longitud); } } } } //FUNCION QUE CIERRA LA VENTANA DE PESTAÑAS BUSCAR PACIENTE CUANDO SE PULSA EL BOTON CANCELAR DE ESTA// int CVICALLBACK Cancelar (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: HidePanel (panel_4Handle); DisplayPanel (panelHandle); break; } return 0; } /////////////////////////////////////////////////////////////////////////////////// ////////////////////// FUNCION PARA BUSCAR UNA FICHA YA GRABADA /////////////////// /////////////////////se ejecuta esta funcion cuando estando en la pantalla//////// /////////////////////principal damos al boton BUSCAR FICHA///////////////////////// ////////////////////En tal caso aparece la pantalla en la se permite/////////////// ////////////////////buscar al paciente basandose en ciertos parametros///////////// //////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK Buscar_Ficha (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: if ((panelbusquedaHandle = LoadPanel (0, "pruebas_irene.uir", PANELBUSCA)) < 0) return -1; HidePanel(panelHandle); DisplayPanel(panelbusquedaHandle); break; } return 0; } /////////////////////////////////////////////////////////////////////////////////// /////////////Se ejecutara esta funcion si pulsamos al boton SALIR APLICACION/////// ////////////////////de la pantalla principal/////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK Salir_aplicacion (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break;

Page 23: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

21

} return 0; } ////////////////////////////////////////////////////////////////////////////////////// ///////////Al pulsar el boton BUSCAR FICHA se ejecurtara esta función//////////////// //que se encarga de elegir la forma de buscar la ficha del paciente segun lo que////// ///////////////////////////////haya decidido el usuario/////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK ActivaNumero (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int nivel=0; int nivel_nombre=0; switch (event) { case EVENT_COMMIT: GetCtrlVal(panelbusquedaHandle,PANELBUSCA_CHECKNUMERO,&nivel); if (nivel==0) { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_NUMERO, ATTR_DIMMED, 1); buscar_por_numero=0; } else { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_NUMERO, ATTR_DIMMED, 0); buscar_por_numero=1; } GetCtrlVal(panelbusquedaHandle,PANELBUSCA_CHECKNOMBRE,&nivel_nombre); if (nivel_nombre==0) { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_NOMBRE, ATTR_DIMMED, 1); buscar_por_nombre=0; } else { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_NOMBRE, ATTR_DIMMED, 0); buscar_por_nombre=1; } GetCtrlVal(panelbusquedaHandle,PANELBUSCA_CHECKAPELLIDO_1,&nivel); if (nivel==0) { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_APELLIDO_1, ATTR_DIMMED, 1); buscar_por_apellido_1=0; } else { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_APELLIDO_1, ATTR_DIMMED, 0); buscar_por_apellido_1=1; } GetCtrlVal(panelbusquedaHandle,PANELBUSCA_CHECKAPELLIDO_2,&nivel); if (nivel==0) { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_APELLIDO_2, ATTR_DIMMED, 1); buscar_por_apellido_2=0; } else { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_APELLIDO_2, ATTR_DIMMED, 0); buscar_por_apellido_2=1; } GetCtrlVal(panelbusquedaHandle,PANELBUSCA_CHECKDNI,&nivel); if (nivel==0) { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_DNI, ATTR_DIMMED, 1); buscar_por_dni=0; } else { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_DNI, ATTR_DIMMED, 0); buscar_por_dni=1; } //BUSCAR LA FICHA DE PACIENTE POR EL NUMERO DE LA SEGURIDAD SOCIAL// GetCtrlVal(panelbusquedaHandle,PANELBUSCA_CHECKSEGURIDAD,&nivel); if (nivel==0) { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_SEGURIDAD, ATTR_DIMMED, 1); buscar_por_seguridad=0; } else { SetCtrlAttribute (panelbusquedaHandle, PANELBUSCA_SEGURIDAD, ATTR_DIMMED, 0); buscar_por_seguridad=1; } break; } return 0; } ///////////////////////////////////////////////////////////////////////////////////////// /////////////// ////////////////////// /////////////// FUNCION QUE BUSCA EN LA BASE DE DATOS LAS TABLAS /////////////////////// //////////////////////

Page 24: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

22

/////////////// /////////////////////// //////////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK RealizarBusqueda (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int datos_busqueda_ya_introducidos = 0; char buffer_aux[512]; int fila; Point point; /*Variables relacionadas con la tabla Datos_del_Paciente*/ char numero_a_buscar[16]; char nombre_a_buscar[128]; char buffer[128]; char numero_paciente2[16]; char nombre2[128]; char primer_apellido2[128]; char segundo_apellido2[128]; char dni2[10]; char direccion2[128]; char portal2[3]; char escalera2[10]; char piso2[8]; char letra2[2]; char codigo_postal2[8]; char poblacion2[128]; char provincia2[128]; char telefono_uno2[10]; char telefono_dos2[10]; char movil2[20]; char movil[20]; char prefijo[20]; /*Variables relacionadas con la tabla Datos_Clinicos*/ char numero_ss_clinicos[20]; char sexo_clinicos[10]; int masculino; int femenino; char dia2[20],dia[20],mes[10],anyo[10]; char edad_clinicos[3]; double peso_clinicos=0; double altura_clinicos=0; char antecedentes[2048]; /*variables correspondientes al historial del paciente*/ char historial[65400]; /*Variables correspondientes a la tabla de enfermedades y tratamiento del paciente*/ unsigned char numero_de_enfermedades; char enfermedad[30]; unsigned char tratamiento[30]; unsigned int numero_tomas; char tomas[7][10]; int Numero_grabaciones; /*Variables generales*/ static int databaseHandle; static int statementHandle; int estado,estado1,estado2,estado3,estado4,estado5,estado6,estado7,estado8,estado9; int estado10, estado11, estado12,estado13,estado14,estado15,estado16,estado17,estado18,estado19; int estado20,estado21,estado22,estado23,estado24,estado25,estado26; int estado27, estado28, estado29, estado30, estado31,estado32, estado33, estado34, estado35,estado36; int i,k,j; switch (event) { case EVENT_COMMIT: databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"USE Hospital"); if(buscar_por_numero==1) { memset (numero_a_buscar,0,sizeof(numero_a_buscar)); GetCtrlVal(panelbusquedaHandle,PANELBUSCA_NUMERO,numero_a_buscar); memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_del_Paciente WHERE Número=%s",numero_a_buscar); datos_busqueda_ya_introducidos = 1; } if(buscar_por_nombre==1) { memset (nombre_a_buscar,0,sizeof(nombre_a_buscar)); GetCtrlVal(panelbusquedaHandle,PANELBUSCA_NOMBRE,nombre_a_buscar); if (datos_busqueda_ya_introducidos == 0) { memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_del_Paciente WHERE Nombre='%s'",nombre_a_buscar); } else { memset(buffer_aux,0,sizeof(buffer_aux)); sprintf(buffer_aux," AND Nombre='%s'",nombre_a_buscar); strcat(buffer,buffer_aux); } datos_busqueda_ya_introducidos = 1; } if(buscar_por_apellido_1==1) { memset (nombre_a_buscar,0,sizeof(nombre_a_buscar)); GetCtrlVal(panelbusquedaHandle,PANELBUSCA_APELLIDO_1,nombre_a_buscar); if (datos_busqueda_ya_introducidos == 0)

Page 25: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

23

{ memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_del_Paciente WHERE Primer_Apellido='%s'",nombre_a_buscar); } else { memset(buffer_aux,0,sizeof(buffer_aux)); sprintf(buffer_aux," AND Primer_Apellido='%s'",nombre_a_buscar); strcat(buffer,buffer_aux); } datos_busqueda_ya_introducidos = 1; } if(buscar_por_apellido_2==1) { memset (nombre_a_buscar,0,sizeof(nombre_a_buscar)); GetCtrlVal(panelbusquedaHandle,PANELBUSCA_APELLIDO_2,nombre_a_buscar); if (datos_busqueda_ya_introducidos == 0) { memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_del_Paciente WHERE Segundo_Apellido='%s'",nombre_a_buscar); } else { memset(buffer_aux,0,sizeof(buffer_aux)); sprintf(buffer_aux," AND Segundo_Apellido='%s'",nombre_a_buscar); strcat(buffer,buffer_aux); } datos_busqueda_ya_introducidos = 1; } if(buscar_por_dni==1) { memset (nombre_a_buscar,0,sizeof(nombre_a_buscar)); GetCtrlVal(panelbusquedaHandle,PANELBUSCA_DNI,nombre_a_buscar); if (datos_busqueda_ya_introducidos == 0) { memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_del_Paciente WHERE DNI='%s'",nombre_a_buscar); } else { memset(buffer_aux,0,sizeof(buffer_aux)); sprintf(buffer_aux," AND DNI='%s'",nombre_a_buscar); strcat(buffer,buffer_aux); } datos_busqueda_ya_introducidos = 1; } if(buscar_por_seguridad==1) { memset (nombre_a_buscar,0,sizeof(nombre_a_buscar)); GetCtrlVal(panelbusquedaHandle,PANELBUSCA_SEGURIDAD,nombre_a_buscar); if (datos_busqueda_ya_introducidos == 0) { memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_del_Paciente WHERE Codigo_Postal='%s'",nombre_a_buscar); } else { memset(buffer_aux,0,sizeof(buffer_aux)); sprintf(buffer_aux," AND Codigo_Postal='%s'",nombre_a_buscar); strcat(buffer,buffer_aux); } datos_busqueda_ya_introducidos = 1; } statementHandle = DBActivateSQL(databaseHandle,buffer); //Por si acaso hubiese mas de una coincidencia... /*Busco los datos de la tabla Datos_del_Paciente*/ DBBindColChar(statementHandle,1,16,numero_paciente2,&estado,""); DBBindColChar(statementHandle,2,128,nombre2,&estado1,""); DBBindColChar(statementHandle,3,128,primer_apellido2,&estado2,""); DBBindColChar(statementHandle,4,128,segundo_apellido2,&estado3,""); DBBindColChar(statementHandle,5,10,dni2,&estado4,""); DBBindColChar(statementHandle,6,128,direccion2,&estado5,""); DBBindColChar(statementHandle,7,3,portal2,&estado6,""); DBBindColChar(statementHandle,8,10,escalera2,&estado7,""); DBBindColChar(statementHandle,9,8,piso2,&estado8,""); DBBindColChar(statementHandle,10,2,letra2,&estado9,""); DBBindColChar(statementHandle,11,8,codigo_postal2,&estado10,""); DBBindColChar(statementHandle,12,128,poblacion2,&estado11,""); DBBindColChar(statementHandle,13,128,provincia2,&estado12,""); DBBindColChar(statementHandle,14,10,telefono_uno2,&estado13,""); DBBindColChar(statementHandle,15,10,telefono_dos2,&estado14,""); DBBindColChar(statementHandle,16,20,movil2,&estado15,""); Numero_grabaciones = DBNumberOfRecords (statementHandle); if (Numero_grabaciones > 1) { ///SI HAY MAS DE UNA FICHA DE PACIENTE QUE CUMPLA CON LOS CAMPOS ESPECIFICADOS//// ///SE CARGARA UNA VENTANA CON UNA TABLA QUE MOSTRARA LAS COINCIDENCIAS/////////// ///SE SEÑALARA UNA DE LAS FILAS Y SE PULSARA AL BOTON OK///////////////////////// panel_coincidencia = LoadPanel(0,"pruebas_irene.uir", PANEL_COIN);

Page 26: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

24

InsertTableRows (panel_coincidencia, PANEL_COIN_TABLE, 1, Numero_grabaciones, VAL_CELL_STRING); fila = 0; //POR CADA UNO DE LAS FICHAS DE PACIENTES CUMPLAN CON LAS ESPECIFICACIONES SE MOSTRARAN LOS///// //SIGUIENTES DATOS DE CADA UNO DE ELLOS: NUMERO_PACIENTE, NOMBRE, 1ªAPELLIDO,2ºAPELLIDO,DNI///// //Y CODIGO POSTAL////////////////////////////////////////////////////////////////////////////// for (fila=1;fila<=Numero_grabaciones;fila++) { DBFetchNext(statementHandle); SetTableCellVal (panel_coincidencia, PANEL_COIN_TABLE, MakePoint(1,fila), numero_paciente2); SetTableCellVal (panel_coincidencia, PANEL_COIN_TABLE, MakePoint(2,fila), nombre2); SetTableCellVal (panel_coincidencia, PANEL_COIN_TABLE, MakePoint(3,fila), primer_apellido2); SetTableCellVal (panel_coincidencia, PANEL_COIN_TABLE, MakePoint(4,fila), segundo_apellido2); SetTableCellVal (panel_coincidencia, PANEL_COIN_TABLE, MakePoint(5,fila), dni2); SetTableCellVal (panel_coincidencia, PANEL_COIN_TABLE, MakePoint(6,fila), codigo_postal2); } SetTableSelection(panel_coincidencia,PANEL_COIN_TABLE,MakeRect(1,1,1,6)); escogido = 0; InstallPopup (panel_coincidencia); while(escogido == 0) ProcessSystemEvents (); GetActiveTableCell(panel_coincidencia,PANEL_COIN_TABLE,&point); DBFetchRandom(statementHandle,point.y); } else if (Numero_grabaciones < 0) { MessagePopup ("No se ha encontrado ninguna ficha con los parametros referidos", "Los datos de busqueda introducidos no se encuentran en la base de datos. Por favor, cambie los datos o cancele la búsqueda."); break; } else DBFetchNext(statementHandle); /*Busco los datos de la tabla Datos clinicos*/ memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Datos_Clinicos WHERE Número=%s",numero_paciente2); statementHandle = DBActivateSQL(databaseHandle,buffer); DBBindColChar(statementHandle,1,16,numero_paciente2,&estado16,""); DBBindColChar(statementHandle,2,20,numero_ss_clinicos,&estado17,""); DBBindColChar(statementHandle,3,10,sexo_clinicos,&estado18,""); DBBindColChar(statementHandle,4,20,dia2, &estado19,""); DBBindColChar(statementHandle,5,3,edad_clinicos,&estado20,""); DBBindColDouble(statementHandle, 6, &peso_clinicos, &estado21); DBBindColDouble(statementHandle,7,&altura_clinicos,&estado22); DBBindColChar(statementHandle,8,2048,antecedentes,&estado23,""); DBFetchNext(statementHandle); /*Busco los datos de la tabla Historial*/ memset(buffer,0,sizeof(buffer)); sprintf(buffer,"SELECT * FROM Historial WHERE Número=%s",numero_paciente2); statementHandle = DBActivateSQL(databaseHandle,buffer); DBBindColChar(statementHandle,1,16,numero_paciente2,&estado24,""); DBBindColChar(statementHandle,2,65400,historial,&estado25,""); DBFetchNext(statementHandle); /*Activo el panel principal para poder ir guardando las variables en los sitios indicados*/ panel_4Handle = LoadPanel (0, "pruebas_irene.uir", PANEL_4); EasyTab_ConvertFromCanvas (panel_4Handle, PANEL_4_EASYTAB); EasyTab_LoadPanels (panel_4Handle, PANEL_4_EASYTAB, 1, "pruebas_irene.uir", __CVIUserHInst, PANEL1TAB0, &paneltab0, PANEL2TAB1, &paneltab1, PANEL2TAB2, &paneltab2, PANEL2TAB3, &paneltab3, PANEL2TAB4, &paneltab4, 0); /*Busco los datos correspondientes a la tabla enfermedades y tratamiento*/ memset(buffer,0,sizeof(buffer)); /*Aqui habria que buscar los datos de la ficha del paciente con dos parametros para estar seguros de que los datos de las enfermedades y tratamientos son los correctos*/ /*ademas la funcion para mirar en tablas deberia devolver el numero de veces que se ha encontrado el mismo numero de paciente en la tabla de enfermedades_tratamientos*/ sprintf(buffer, "SELECT * FROM Enfermedades_Tratamientos WHERE Número=%s",numero_paciente2); statementHandle =DBActivateSQL (databaseHandle, buffer); //Despues de mandar que se busque en la base de datos en la tabla de Enfermedades_Tratamientos, //tenemos que saber cuantas veces ha encontrado coincidencias y asi saber cuantas veces ha de //hacerse el for. Esta funcion es DBNumberOfRecords(); Numero_grabaciones = DBNumberOfRecords (statementHandle); DBBindColChar(statementHandle,1,16,numero_paciente2,&estado26,"");//este dato solo lo queremos una vez DBBindColChar (statementHandle,2,30,enfermedad,&estado27,""); DBBindColChar (statementHandle,3,30,tratamiento,&estado28,""); DBBindColInt (statementHandle,4,&numero_tomas,&estado29); DBBindColChar (statementHandle,5,10,tomas[0],&estado30,""); DBBindColChar (statementHandle,6,10,tomas[1],&estado31,""); DBBindColChar (statementHandle,7,10,tomas[2],&estado32,""); DBBindColChar (statementHandle,8,10,tomas[3],&estado33,"");

Page 27: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

25

DBBindColChar (statementHandle,9,10,tomas[4],&estado34,""); DBBindColChar (statementHandle,10,10,tomas[5],&estado35,""); DBBindColChar (statementHandle,11,10,tomas[6],&estado36,""); SetCtrlVal (paneltab3,PANEL2TAB3_NUMERO_PACIENTE,numero_paciente2); for(k=0;k<Numero_grabaciones;k++) { memset(enfermedad,0,sizeof(enfermedad)); memset(tratamiento,0,sizeof(tratamiento)); numero_tomas=0; memset(tomas[0],0,sizeof(tomas[0])); memset(tomas[1],0,sizeof(tomas[0])); memset(tomas[2],0,sizeof(tomas[0])); memset(tomas[3],0,sizeof(tomas[0])); memset(tomas[4],0,sizeof(tomas[0])); memset(tomas[5],0,sizeof(tomas[0])); memset(tomas[6],0,sizeof(tomas[0])); DBFetchRandom(statementHandle,k+1); SetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_1+k,1); SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_1+k, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_1+k, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_1+k, ATTR_DIMMED, 0); activa_casillas_cuando_busqueda(numero_tomas,k); //ponemos dichos datos en el panel correspondiente y en los lugares correspondientes// SetCtrlVal (paneltab3,PANEL2TAB3_ENFERMEDAD_1+k,enfermedad); SetCtrlVal (paneltab3,PANEL2TAB3_TRATAMIENTO_1+k, tratamiento); SetCtrlVal (paneltab3,PANEL2TAB3_NUMERO_TOMAS_1+k, numero_tomas); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA1_1+k,tomas[0]); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA2_1+k,tomas[1]); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA3_1+k,tomas[2]); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA4_1+k,tomas[3]); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA5_1+k,tomas[4]); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA6_1+k,tomas[5]); SetCtrlVal (paneltab3,PANEL2TAB3_TOMA7_1+k,tomas[6]); };//fin del for que recorre las enfermedades de un mismo paciente /*Ponemos los datos correspondientes en la pestanya de datos_del_paciente */ SetCtrlVal (paneltab0,PANEL1TAB0_NUMERO_PACIENTE,numero_paciente2); SetCtrlVal (paneltab0,PANEL1TAB0_NOMBRE,nombre2); SetCtrlVal (paneltab0,PANEL1TAB0_PRIMER_APELLIDO,primer_apellido2); SetCtrlVal (paneltab0,PANEL1TAB0_SEGUNDO_APELLIDO,segundo_apellido2); SetCtrlVal (paneltab0,PANEL1TAB0_DNI,dni2); SetCtrlVal (paneltab0,PANEL1TAB0_DIRECCION,direccion2); SetCtrlVal (paneltab0,PANEL1TAB0_PORTAL,portal2); SetCtrlVal (paneltab0,PANEL1TAB0_ESCALERA,escalera2); SetCtrlVal (paneltab0,PANEL1TAB0_PISO,piso2); SetCtrlVal (paneltab0,PANEL1TAB0_LETRA,letra2); SetCtrlVal (paneltab0,PANEL1TAB0_CODIGO_POSTAL,codigo_postal2); SetCtrlVal (paneltab0,PANEL1TAB0_POBLACION,poblacion2); SetCtrlVal (paneltab0,PANEL1TAB0_PROVINCIA,provincia2); SetCtrlVal (paneltab0,PANEL1TAB0_TELEFONO_UNO,telefono_uno2); SetCtrlVal (paneltab0,PANEL1TAB0_TELEFONO_DOS,telefono_dos2); strcpy(movil_manda,movil2);//se copia el posible numero al que se le mandaria un mensaje memset(prefijo,0,sizeof(prefijo));//este va con el prefijo strncpy(prefijo,movil2,2);//copio en prefijo y el movil en una sola cadena SetCtrlVal (paneltab0,PANEL1TAB0_PREFIJO,prefijo); strcpy(movil,movil2+2); SetCtrlVal(paneltab0,PANEL1TAB0_MOVIL,movil); /*Ponemos los datos correspondientes en la pestanya de datos_clinicos*/ SetCtrlVal (paneltab1, PANEL2TAB1_NUMERO_PACIENTE,numero_paciente2); SetCtrlVal (paneltab1, PANEL2TAB1_NUMERO_SS, numero_ss_clinicos); ////separamos la cadena dia2 que sacamos de la base de datos en tres cadenas//// ////diferentes que se introduciran en los huecos oportunos de la pestaña de la ventana ////que se encuentre activa///// memset(dia,0,sizeof(dia)); memset(mes,0,sizeof(mes)); memset(anyo,0,sizeof(anyo)); strncpy(dia,dia2,2); strncpy(mes,dia2+2,2); strcpy(anyo,dia2+4); SetCtrlVal (paneltab1, PANEL2TAB1_DIA, dia); SetCtrlVal (paneltab1, PANEL2TAB1_MES, mes); SetCtrlVal (paneltab1, PANEL2TAB1_ANYO,anyo); SetCtrlVal (paneltab1, PANEL2TAB1_EDAD , edad_clinicos); SetCtrlVal (paneltab1, PANEL2TAB1_NUMERIC_PESO , peso_clinicos); SetCtrlVal (paneltab1, PANEL2TAB1_NUMERIC_ALTURA , altura_clinicos); SetCtrlVal (paneltab1, PANEL2TAB1_TEXTBOX_ANTECEDENTES , antecedentes); if (strcmp(sexo_clinicos,"FEMENINO") != 0) { masculino=1; femenino=0; } else { femenino=1; masculino=0; }

Page 28: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

26

SetCtrlVal (paneltab1, PANEL2TAB1_CHECKBOX_MASCULINO,masculino); SetCtrlVal (paneltab1, PANEL2TAB1_CHECKBOX_FEMENINO,femenino); /*Ponemos los datos correspondientes en la pestana de historial*/ SetCtrlVal (paneltab2, PANEL2TAB2_NUMERO_PACIENTE,numero_paciente2); SetCtrlVal (paneltab2, PANEL2TAB2_TEXTBOX_HISTORIAL, historial); HidePanel(panelbusquedaHandle); DisplayPanel(panel_4Handle); DBDisconnect(databaseHandle); break; } return 0; } ///////////////Funcion que se ejecuta al pulsar el boton CANCELAR de la ventana que////////////////// /////////////muestra las opciones de busqueda de la ficha del paciente////////////////////////////// int CVICALLBACK CancelarBusqueda (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: HidePanel(panelbusquedaHandle); DisplayPanel(panelHandle); break; } return 0; } int CVICALLBACK salir_sin_cambios (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: panel_3Handle = LoadPanel (0, "pruebas_irene.uir", PANEL1TAB0); DisplayPanel(panelHandle); HidePanel(panel_3Handle); break; } return 0; } int CVICALLBACK abrir_ventana_mensaje (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: panel_mensaje = LoadPanel (0, "pruebas_irene.uir", PANEL_3); DisplayPanel(panel_mensaje); break; } return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////funcion que manda el mensaje indicado al movil del paciente requerido//////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK mandar (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { char buffer[160]; //char telefono[20]; char mensaje[100][20]; char bueno[70][20]; int x, i, j ,a, k,c, multiplica, numero_total_tomas, on_off; char tomas[7][10];//para las siete horas diferentes que puede haber para un tratamiento//// char enfermedad[30]; char tratamiento[30]; char tratamientos[9][30];//nueve tipos de enfermdades disponibles para cada paciente/// int num_tratamientos,este_tratamiento; unsigned int numero_tomas; char movil[20]; char prefijo[20]; char numero_al_que_mandar[20]; char cadena[160]; int devuelve;//variable que tiene el valor devuelto por la funcion mandar mensaje switch (event) { case EVENT_COMMIT: SetCtrlAttribute(panelHandle, PANEL_TIMER2, ATTR_ENABLED, 0);//DESHABILITO EL TIMER habilitar_mensaje(); ///ESTO HARA QUE COJA TODAS LAS TOMAS, LAS COLOQUE Y LAS ENVIE AL NUMERO QUE SE LE INDIQUE /// x=0; multiplica=0;

Page 29: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

27

numero_total_tomas = 0; //inicilizamos a cero todas las posiciones del array de cadenas mensaje///// for(i=0;i<100;i++) { memset(mensaje[i],0,sizeof(mensaje[0])); }; ///inicilizamos a cero todas las posiciones del array de cadenas bueno/////// for(i=0;i<70;i++) { memset(bueno[i],0,sizeof(bueno[0])); }; ////inicializamos a cero todas las cadenas del array tratamientos/////// for(i=0;i<9;i++) { memset(tratamientos[i],0,sizeof(tratamientos[0])); }; num_tratamientos = 0; //vamos pasando a traves de todos los check box de enfermedades y cuando haya una que este//// //señalada cogemos el nombre del tratamientosy las horas a las que se debe tomar.//////////// //así hasta comprobar todas las enfermedades. CUANDO TENGAMOS TODOS LOS DATOS PODREMOS DAR// //FORMA AL MENSAJE QUE HABRA QUE MANDAR AL MOVIL DEL PACIENTE EN CUESTION////////////////// for(i=0;i<9;i++) { GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_1+i,&on_off); if(on_off==1) { multiplica++; GetCtrlVal (paneltab3,PANEL2TAB3_ENFERMEDAD_1+i,enfermedad); GetCtrlVal (paneltab3,PANEL2TAB3_TRATAMIENTO_1+i,tratamiento); GetCtrlVal (paneltab3,PANEL2TAB3_NUMERO_TOMAS_1+i,&numero_tomas); for(j=0;j<7;j++) { GetCtrlVal (paneltab3,PANEL2TAB3_TOMA1_1+i+j*9,tomas[j]); }; este_tratamiento = -1; for (j=0;j<num_tratamientos;j++) { if (strcmp(tratamiento,tratamientos[j])==0) { este_tratamiento = j; break; } } if (este_tratamiento == -1) { este_tratamiento = num_tratamientos; sprintf(tratamientos[este_tratamiento],"%s ",tratamiento); num_tratamientos++; } metodo_burbuja((char *)tomas,numero_tomas,sizeof(tomas[0])); for(k=0;k<numero_tomas;k++) { //este_tratamiento va de 0 a 6, y quiero que en el mensaje se muestren del 1 al 7 sprintf(mensaje[k+x],"%s%d",tomas[k],este_tratamiento+1); }; numero_total_tomas += numero_tomas; x=x+numero_tomas; } } metodo_burbuja((char *) mensaje,numero_total_tomas,sizeof(mensaje[0])); ///////AQUI ES CUANDO VAMOS A DAR FORMA AL MENSAJE//////// strcpy(cadena,"PAC"); for(c=0;c<num_tratamientos;c++) strcat(cadena,tratamientos[c]); for(c=0;c<numero_total_tomas;c++) strcat(cadena, mensaje[c]); GetCtrlVal (paneltab0, PANEL1TAB0_MOVIL, movil); GetCtrlVal (paneltab0, PANEL1TAB0_PREFIJO,prefijo); strcat (prefijo,movil);//funcion para que se grabe el numero de movil con el prefijo// strcpy(numero_al_que_mandar,prefijo); puts(cadena); //break; devuelve=enviarMensaje(cadena,numero_al_que_mandar); //"CADENA" es el texto a mandar y //"numero_al_que_mandar"el numero de destino en formato normal (con el 34), //es la funcion enviarMensaje el que cambia los numeros del telefono para codificarlos if(devuelve==0) { printf("Se ha mandado el mensaje"); MessagePopup("AVISO","El MENSAJE SE HA ENVIADO CORRECTAMENTE"); } else MessagePopup("AVISO","SE HA PRODUCIDO UN ERROR AL INTENTAR MANDAR EL MENSAJE"); CerrarPuertoSMS();//sino cierro el puerto, estando abierta ya la aplicacion y habiendo mandado //un mensaje, se queda colgado y el siguiente no lo manda AbrirPuertoSMS(PUERTOSMS); SetCtrlAttribute(panelHandle, PANEL_TIMER2, ATTR_ENABLED, 1);//HABILITO DE NUEVO EL TIMER break; } return 0; }

Page 30: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

28

//////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////// ///////////////////// ////////////// FUNCION PARA MODIFICAR LOS DATOS DE LAS FICHAS YA CREADAS ANTERIORMENTE //////////////////// /////////////// //////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK Modificar_datos (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static int databaseHandle; static int statementHandle; /*variables correspondientes a los datos del paciente*/ char numero_paciente[16]; char nombre[128]; char nombre_2[128]; char primer_apellido[128]; char segundo_apellido[128]; char dni[10]; char direccion[256]; char portal[5]; char escalera[10]; char piso[8]; char letra[2]; char codigo_postal[8]; char poblacion[256]; char provincia[256]; char telefono_uno[10]; char telefono_dos[10]; char movil[20]; char prefijo[25]; char buffer_gigante[65200]; /*variables correspondientes a los datos clínicos del paciente*/ char numero_ss_clinicos[20]; char sexo_clinicos[10]; int masculino; int femenino; char dia2[20],dia[20],mes[10],anyo[5]; char edad_clinicos[3]; double peso_clinicos; double altura_clinicos; char antecedentes[2048]; /*variables correspondientes al historial del paciente*/ char historial[2048]; /*variables correspondientes al panel de enfermedades y tratamientos*/ char enfermedad[30]; char tratamiento[30]; unsigned int numero_tomas; unsigned char numero_de_enfermedades; char tomas[7][10];//arrays de cadenas de caracteres// char mensaje[100][20];//arrays de cadenas de caracteres// char bueno[70][20]; char cadena[150];//cadena de 150 caracteres// int on_off=0; int x,j,i; int k; int a,b,c,h,numero_total_tomas; int multiplica; int cero; switch (event) { case EVENT_COMMIT: /*inicializo a cero todas las variables*/ memset (numero_paciente,0,sizeof(numero_paciente)); memset (nombre,0,sizeof(nombre)); memset (nombre_2,0,sizeof(nombre_2)); memset (primer_apellido,0,sizeof(primer_apellido)); memset (segundo_apellido,0,sizeof(segundo_apellido)); memset (dni,0,sizeof(dni)); memset (direccion,0,sizeof(direccion)); memset (portal,0,sizeof(portal)); memset (escalera,0,sizeof(escalera)); memset (piso,0,sizeof(piso)); memset (letra,0,sizeof(letra)); memset (codigo_postal,0,sizeof(codigo_postal)); memset (poblacion,0,sizeof(poblacion)); memset (provincia,0,sizeof(provincia)); memset (telefono_uno,0,sizeof(telefono_uno)); memset (telefono_dos,0,sizeof(telefono_dos)); memset (movil,0,sizeof(movil)); memset (prefijo,0,sizeof(prefijo)); /*Cogemos los valores que nos interesan del panel de los datos del paciente*/ GetCtrlVal (paneltab0, PANEL1TAB0_NUMERO_PACIENTE, numero_paciente); GetCtrlVal (paneltab0, PANEL1TAB0_NOMBRE, nombre); GetCtrlVal (paneltab0, PANEL1TAB0_PRIMER_APELLIDO, primer_apellido); GetCtrlVal (paneltab0, PANEL1TAB0_SEGUNDO_APELLIDO, segundo_apellido); GetCtrlVal (paneltab0, PANEL1TAB0_DNI, dni); GetCtrlVal (paneltab0, PANEL1TAB0_DIRECCION, direccion); GetCtrlVal (paneltab0, PANEL1TAB0_PORTAL, portal); GetCtrlVal (paneltab0, PANEL1TAB0_ESCALERA, escalera); GetCtrlVal (paneltab0, PANEL1TAB0_PISO, piso); GetCtrlVal (paneltab0, PANEL1TAB0_LETRA, letra); GetCtrlVal (paneltab0, PANEL1TAB0_CODIGO_POSTAL, codigo_postal);

Page 31: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

29

GetCtrlVal (paneltab0, PANEL1TAB0_POBLACION, poblacion); GetCtrlVal (paneltab0, PANEL1TAB0_PROVINCIA, provincia); GetCtrlVal (paneltab0, PANEL1TAB0_TELEFONO_UNO, telefono_uno); GetCtrlVal (paneltab0, PANEL1TAB0_TELEFONO_DOS, telefono_dos); GetCtrlVal (paneltab0, PANEL1TAB0_MOVIL, movil); GetCtrlVal (paneltab0, PANEL1TAB0_PREFIJO, prefijo); strcat(prefijo,movil); /*inicializacion de las variables correspondientes a la tabla de los datos clinicos*/ memset (numero_ss_clinicos,0,sizeof(numero_ss_clinicos)); memset (sexo_clinicos,0,sizeof(sexo_clinicos)); memset (dia2,0,sizeof(dia2)); memset (dia,0,sizeof(dia)); memset (mes,0,sizeof(mes)); memset (anyo,0,sizeof(anyo)); memset (edad_clinicos,0,sizeof(edad_clinicos)); peso_clinicos=0; altura_clinicos=0; memset (antecedentes,0,sizeof(antecedentes)); /*Cogemos los valores que nos interesan de los datos clínicos del paciente*/ GetCtrlVal (paneltab1, PANEL2TAB1_NUMERO_SS, numero_ss_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_DIA, dia); GetCtrlVal (paneltab1, PANEL2TAB1_MES, mes); GetCtrlVal (paneltab1, PANEL2TAB1_ANYO, anyo); GetCtrlVal (paneltab1, PANEL2TAB1_EDAD , edad_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_NUMERIC_PESO , &peso_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_NUMERIC_ALTURA , &altura_clinicos); GetCtrlVal (paneltab1, PANEL2TAB1_TEXTBOX_ANTECEDENTES , antecedentes); GetCtrlVal (paneltab1, PANEL2TAB1_CHECKBOX_MASCULINO,&masculino); GetCtrlVal (paneltab1, PANEL2TAB1_CHECKBOX_FEMENINO,&femenino); if (masculino==0) { if (femenino==1) strcpy(sexo_clinicos,"FEMENINO"); else { MessagePopup("CUIDADO","Ha de introducir el sexo del paciente"); return 0; } } else strcpy(sexo_clinicos,"MASCULINO"); //COPIAR LA FECHA COMPLETA EN UNA SOLA CADENA PARA INTRODUCIRLA DE NUEVO EN LA BASE DE DATOS strcat(dia,mes); strcat(dia,anyo); /*inicializacion de datos correspondientes a la tabla de historial*/ memset (historial,0,sizeof(historial)); /*Cogemos los valores que nos interesan del panel historial*/ GetCtrlVal (paneltab2, PANEL2TAB2_TEXTBOX_HISTORIAL,historial); /*inicializacion de las variables correspondientes a la tabla enfermedades y tratamiento*/ memset(enfermedad,0,sizeof(enfermedad)); memset(tratamiento,0,sizeof(tratamiento)); numero_tomas=0; memset(tomas[0],0,sizeof(tomas[0])); memset(tomas[1],0,sizeof(tomas[0])); memset(tomas[2],0,sizeof(tomas[0])); memset(tomas[3],0,sizeof(tomas[0])); memset(tomas[4],0,sizeof(tomas[0])); memset(tomas[5],0,sizeof(tomas[0])); memset(tomas[6],0,sizeof(tomas[0])); /*Nos conectamos a la base de datos y escribimos los datos*/ databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"USE Hospital"); /*Introducimos en nuestra tabla Datos_del_paciente los nuevo valores que se han modificado*/ memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"UPDATE Datos_del_Paciente SET Nombre='%s',Primer_Apellido='%s',Segundo_Apellido='%s',DNI='%s',Direccion='%s',Portal='%s',Escalera='%s',Piso='%s',Letra='%s',Codigo_Postal='%s',Poblacion='%s',Provincia='%s',Telefono_uno='%s',Telefono_dos='%s',Movil='%s' WHERE Número=%s", nombre,primer_apellido,segundo_apellido,dni,direccion,portal,escalera,piso,letra, codigo_postal,poblacion,provincia,telefono_uno,telefono_dos,prefijo,numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); /*Introducimos en la tabla Datos_Clinicos los nuevos valores que se hayan introducido*/ memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"UPDATE Datos_Clinicos SET Número_Seguridad_Social='%s',Sexo='%s',Fecha_Nacimiento='%s',Edad='%s',Peso=%lf,Altura=%lf,Antecedentes='%s' WHERE Número=%s", numero_ss_clinicos,sexo_clinicos,dia,edad_clinicos, peso_clinicos,altura_clinicos,antecedentes,numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); /*Introducimos en la tabla Historial los nuevos valores que se hayan introducido*/ memset(buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"UPDATE Historial SET Historial='%s' WHERE Número=%s", historial,numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); /*Cogemos los valores que nos interesan del panel de enfermedades y tratamientos en este caso iremos guardando en la base de datos los datos a la vez que vamos cogiendo los valores necesarios de la ventana de enfermedades y tratamientos. Asi tendremos que utilizar muchas menos variables que si cogieramos todos los valores a la vez*/

Page 32: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

30

x=0; multiplica=0; numero_total_tomas = 0; memset(buffer_gigante,0,sizeof(buffer_gigante)); /*Primero han de borrarse todos los datos de la base de datos pertenecientes al paciente en particular y de la tabla enfermedades y tratamientos*/ sprintf(buffer_gigante,"DELETE FROM Enfermedades_Tratamientos WHERE Número=%s ", numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); //volvemos a grabar todos los datos(incluidos los nuevos y los que no se han modificado) for(i=0;i<9;i++) { GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_1+i,&on_off); if(on_off==1) { multiplica++; GetCtrlVal (paneltab3,PANEL2TAB3_ENFERMEDAD_1+i,enfermedad); GetCtrlVal (paneltab3,PANEL2TAB3_TRATAMIENTO_1+i,tratamiento); GetCtrlVal (paneltab3,PANEL2TAB3_NUMERO_TOMAS_1+i,&numero_tomas); for(j=0;j<7;j++) { GetCtrlVal (paneltab3,PANEL2TAB3_TOMA1_1+i+j*9,tomas[j]); }; a=0; metodo_burbuja((char *)tomas,numero_tomas,sizeof(tomas[0])); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"INSERT INTO Enfermedades_Tratamientos VALUES(%s,'%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s')", numero_paciente,enfermedad,tratamiento,numero_tomas,tomas[0],tomas[1], tomas[2],tomas[3],tomas[4],tomas[5],tomas[6]); //las tomas que no se necesiten se meten en la base de datos valiendo 0 DBImmediateSQL(databaseHandle, buffer_gigante); } }; //nos desconectamos de la base de datos// DBDisconnect(databaseHandle); MessagePopup("INFORME","DATOS MODIFICADOS CON ÉXITO"); break; } return 0; } int CVICALLBACK Aceptar (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: HidePanel (panel_4Handle); DisplayPanel (panelHandle); break; } return 0; } //Esta funcion nos devolvera una variable entera: numero_de_enfermedades, que nos servira para saber //cuantas veces hay que grabar en la base de datos una fila con el tratamiento, numero de tomas y //horas de las tomas de un mismo paciente, reciclando las variables para cada enfermedad int CVICALLBACK Activa_casillas (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int on_off_1, on_off_2,on_off_3, on_off_4,on_off_5, on_off_6,on_off_7, on_off_8,on_off_9; switch (event) { case EVENT_VAL_CHANGED: GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_1,&on_off_1); if (on_off_1==0)//SI NO TIENE TICK EL RESTO DE CAJAS ESTAN DESHABILITADAS// { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_1, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_1, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_1, ATTR_DIMMED, 1); } else //SI TIENE EL TICK LA CAJA SE ACTIVAN LAS SIGUIENTES// { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_1, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_1, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_1, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_2,&on_off_2); if (on_off_2==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_2, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_2, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_2, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_2, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_2, ATTR_DIMMED, 0);

Page 33: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

31

SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_2, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_3,&on_off_3); if (on_off_3==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_3, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_3, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_3, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_3, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_3, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_3, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_4,&on_off_4); if (on_off_4==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_4, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_4, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_4, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_4, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_4, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_4, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_5,&on_off_5); if (on_off_5==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_5, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_5, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_5, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_5, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_5, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_5, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_6,&on_off_6); if (on_off_6==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_6, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_6, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_6, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_6, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_6, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_6, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_7,&on_off_7); if (on_off_7==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_7, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_7, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_7, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_7, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_7, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_7, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_8,&on_off_8); if (on_off_8==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_8, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_8, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_8, ATTR_DIMMED, 1); } else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_8, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_8, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_8, ATTR_DIMMED, 0); } GetCtrlVal(paneltab3,PANEL2TAB3_CHECKBOX_TOMA_9,&on_off_9); if (on_off_9==0) { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_9, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_9, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_9, ATTR_DIMMED, 1); }

Page 34: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

32

else { SetCtrlAttribute (paneltab3, PANEL2TAB3_ENFERMEDAD_9, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_TRATAMIENTO_9, ATTR_DIMMED, 0); SetCtrlAttribute (paneltab3, PANEL2TAB3_NUMERO_TOMAS_9, ATTR_DIMMED, 0); } break; } return 0; } ////Al pulsar el boton CANCELAR de la ventana CREAR UNA NUEVA FICHA DE PACIENTE se sale de esta pantalla/// int CVICALLBACK Cancelar_otro (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: HidePanel(panel_2Handle); DisplayPanel(panelHandle); break; } return 0; } int CVICALLBACK Activar_tomas (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { unsigned int valor,offset; switch (event) { case EVENT_VAL_CHANGED: GetCtrlVal(panel,control,&valor); switch(control) { case PANEL2TAB3_NUMERO_TOMAS_1: offset = 0; break; case PANEL2TAB3_NUMERO_TOMAS_2: offset = 1; break; case PANEL2TAB3_NUMERO_TOMAS_3: offset = 2; break; case PANEL2TAB3_NUMERO_TOMAS_4: offset = 3; break; case PANEL2TAB3_NUMERO_TOMAS_5: offset = 4; break; case PANEL2TAB3_NUMERO_TOMAS_6: offset = 5; break; case PANEL2TAB3_NUMERO_TOMAS_7: offset = 6; break; case PANEL2TAB3_NUMERO_TOMAS_8: offset = 7; break; case PANEL2TAB3_NUMERO_TOMAS_9: offset = 8; break; } //primero ponemos todas en gris SetCtrlAttribute (panel, PANEL2TAB3_TOMA1_1+offset, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL2TAB3_TOMA2_1+offset, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL2TAB3_TOMA3_1+offset, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL2TAB3_TOMA4_1+offset, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL2TAB3_TOMA5_1+offset, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL2TAB3_TOMA6_1+offset, ATTR_DIMMED, 1); SetCtrlAttribute (panel, PANEL2TAB3_TOMA7_1+offset, ATTR_DIMMED, 1); //y ahora activamos las que toquen switch ((int)valor) { case 7: SetCtrlAttribute (panel, PANEL2TAB3_TOMA7_1+offset, ATTR_DIMMED, 0); case 6: SetCtrlAttribute (panel, PANEL2TAB3_TOMA6_1+offset, ATTR_DIMMED, 0); case 5: SetCtrlAttribute (panel, PANEL2TAB3_TOMA5_1+offset, ATTR_DIMMED, 0); case 4: SetCtrlAttribute (panel, PANEL2TAB3_TOMA4_1+offset, ATTR_DIMMED, 0); case 3: SetCtrlAttribute (panel, PANEL2TAB3_TOMA3_1+offset, ATTR_DIMMED, 0); case 2: SetCtrlAttribute (panel, PANEL2TAB3_TOMA2_1+offset, ATTR_DIMMED, 0); case 1: SetCtrlAttribute (panel, PANEL2TAB3_TOMA1_1+offset, ATTR_DIMMED, 0); break; default: break; } break; } return 0; }

Page 35: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

33

void activa_casillas_cuando_busqueda(unsigned int numero_de_tomas, unsigned int numero_enfermedad) { //primero ponemos todas en gris SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA1_1+numero_enfermedad, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA2_1+numero_enfermedad, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA3_1+numero_enfermedad, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA4_1+numero_enfermedad, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA5_1+numero_enfermedad, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA6_1+numero_enfermedad, ATTR_DIMMED, 1); SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA7_1+numero_enfermedad, ATTR_DIMMED, 1); //y ahora activamos las que toquen switch (numero_de_tomas) { case 7: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA7_1+numero_enfermedad, ATTR_DIMMED, 0); case 6: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA6_1+numero_enfermedad, ATTR_DIMMED, 0); case 5: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA5_1+numero_enfermedad, ATTR_DIMMED, 0); case 4: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA4_1+numero_enfermedad, ATTR_DIMMED, 0); case 3: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA3_1+numero_enfermedad, ATTR_DIMMED, 0); case 2: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA2_1+numero_enfermedad, ATTR_DIMMED, 0); case 1: SetCtrlAttribute (paneltab3, PANEL2TAB3_TOMA1_1+numero_enfermedad, ATTR_DIMMED, 0); break; default: break; } } void mandar_mensaje_paciente (char *numero, char*numero_al_que_mandar)//el primer parámetro se refiere //al numero de pacientes dentro de la base de datos, y el segundo parámetro al numero referente a ese //paciente que se coge automaticamente desde el sistema { char buffer[160]; //char telefono[20]; char mensaje[100][20]; char bueno[70][20]; int x, i, j ,a, k,c, multiplica, numero_total_tomas, on_off; char tomas[7][10]; char enfermedad[30]; char tratamiento[30]; char tratamientos[9][30]; int num_tratamientos,este_tratamiento; unsigned int numero_tomas; char cadena[160]; int devuelve;//variable que tiene el valor devuelto por la funcion mandar mensaje long estado; int databaseHandle,statementHandle; int NumeroGrabaciones; SetCtrlAttribute(panelHandle, PANEL_TIMER2, ATTR_ENABLED, 0);//DESHABILITO EL TIMER habilitar_mensaje(); x=0; multiplica=0; numero_total_tomas = 0; for(i=0;i<100;i++) { memset(mensaje[i],0,sizeof(mensaje[0])); }; for(i=0;i<70;i++) { memset(bueno[i],0,sizeof(bueno[0])); }; for(i=0;i<7;i++) { memset(tratamientos[i],0,sizeof(tratamientos[0])); }; num_tratamientos = 0; databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"USE Hospital"); sprintf(buffer,"SELECT * FROM Enfermedades_Tratamientos WHERE Número='%s'",numero); statementHandle = DBActivateSQL(databaseHandle,buffer); NumeroGrabaciones = DBNumberOfRecords (statementHandle); DBBindColChar (statementHandle,3,30,tratamiento,&estado,""); DBBindColInt (statementHandle,4,&numero_tomas,&estado); DBBindColChar (statementHandle,5,10,tomas[0],&estado,""); DBBindColChar (statementHandle,6,10,tomas[1],&estado,""); DBBindColChar (statementHandle,7,10,tomas[2],&estado,""); DBBindColChar (statementHandle,8,10,tomas[3],&estado,""); DBBindColChar (statementHandle,9,10,tomas[4],&estado,""); DBBindColChar (statementHandle,10,10,tomas[5],&estado,""); DBBindColChar (statementHandle,11,10,tomas[6],&estado,""); if (NumeroGrabaciones <= 0) { MessagePopup("ATENCION","Al paciente no se le ha pronosticado ninguna enfermedad\n"); return; }

Page 36: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

34

for(i=0;i<NumeroGrabaciones;i++) { multiplica++; DBFetchNext(statementHandle); este_tratamiento = -1; for (j=0;j<num_tratamientos;j++) { if (strcmp(tratamiento,tratamientos[j])==0) { este_tratamiento = j; break; } } if (este_tratamiento == -1) { este_tratamiento = num_tratamientos; sprintf(tratamientos[este_tratamiento],"%s ",tratamiento); num_tratamientos++; } metodo_burbuja((char *)tomas,numero_tomas,sizeof(tomas[0])); for(k=0;k<numero_tomas;k++) { sprintf(mensaje[k+x],"%s%d",tomas[k],este_tratamiento+1);//este_tratamiento va de 0 a 6, y quiero que en el mensaje se muestren del 1 al 7 }; numero_total_tomas += numero_tomas; x=x+numero_tomas; } metodo_burbuja((char *) mensaje,numero_total_tomas,sizeof(mensaje[0])); //Aqui es cuando vamos a dar forma al mensaje strcpy(cadena,"PAC"); for(c=0;c<num_tratamientos;c++) strcat(cadena,tratamientos[c]); for(c=0;c<numero_total_tomas;c++) strcat(cadena, mensaje[c]); puts(cadena); //ESTO HARA QUE COJA TODAS LAS TOMAS, LAS COLOQUE Y LAS ENVIE AL NUMERO QUE SE LE INDIQUE devuelve=enviarMensaje(cadena,numero_al_que_mandar); //"buffer" es el texto a mandar y "numero_al_que_mandar" //el numero de destino en formato normal (con el 34), es la funcion enviarMensaje el que //cambia los numeros del telefono para codificarlos if(devuelve==0) printf("Se ha mandado el mensaje"); CerrarPuertoSMS();//sino cierro el puerto, estando abierta ya la aplicacion y habiendo mandado //un mensaje, se queda colgado y el siguiente no lo manda AbrirPuertoSMS(PUERTOSMS); //leerMensaje( buffer,movil_manda); //printf("%s, %s",buffer, movil_manda); SetCtrlAttribute(panelHandle, PANEL_TIMER2, ATTR_ENABLED, 1);//HABILITO DE NUEVO EL TIMER return; } //definición de los tres tipos de mensajes que espera el centro de control desde el dispensador. #define INICIACION '1' #define RECIBIDO_OK '2' #define PASTILLA_NO_TOMADA '3' int CVICALLBACK timer (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { static int nveces; int a,i,j; char mensaje[160]; char telefono[20]; char telefono_dos[20]; char cadena_entrada[300]; int respuesta; char aviso_recepcion[]="+CMTI:\0"; switch (event) { case EVENT_TIMER_TICK: if (GetInQLen (PUERTOSMS)!=0) { SetCtrlAttribute(panelHandle, PANEL_TIMER2, ATTR_ENABLED, 0);//DESHABILITO EL TIMER a=leerMensaje(mensaje,telefono); if (a > 0) { if (strncmp(mensaje,"PAC",3)==0) //si es un mensaje de los nuestros... { switch(mensaje[4]) { case INICIACION: mensaje[a]='\0'; mandar_mensaje_paciente(mensaje+6,telefono);//El telefono lo sabes porque //se saca de la funcion leerMensaje llamada arriba break; case RECIBIDO_OK: memset(cadena_entrada,0,sizeof(cadena_entrada)); //sprintf(cadena_entrada,"Recibido OK del paciente Nº %s\n",mensaje+7); sprintf(cadena_entrada,"Recibido el OK desde el dispensador del paciente NUMERO %s\n",mensaje+6);//esto es lo que creo yo MessagePopup("INFORME",cadena_entrada);

Page 37: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

35

//printf(cadena_entrada); break; case PASTILLA_NO_TOMADA: memset(cadena_entrada,0,sizeof(cadena_entrada)); sprintf(cadena_entrada,"El paciente Nº "); j = strlen(cadena_entrada); for (i = 6; mensaje[i] != ' ';i++,j++) cadena_entrada[j]=mensaje[i]; cadena_entrada[j]='\0'; strcat(cadena_entrada," no se ha tomado la pastilla "); j = strlen(cadena_entrada); for (i++; mensaje[i] != ' ';i++,j++) cadena_entrada[j]=mensaje[i]; cadena_entrada[j]='\0'; strcat(cadena_entrada," de las "); j = strlen(cadena_entrada); for (i++; i < strlen(mensaje) ;i++,j++) cadena_entrada[j]=mensaje[i]; strcat(cadena_entrada,"\nLlamenle al "); strncpy(telefono_dos,telefono,11); strcat(cadena_entrada,telefono_dos); mensaje[strlen(mensaje)-1]='\n'; printf(cadena_entrada); MessagePopup("AVISO MUY IMPORTANTE",cadena_entrada); break; } } printf("\n"); printf("LLegada de mensaje\n"); printf("Telefono: %s\n",telefono); printf("Mensaje: %s\n",mensaje); for (i=0;i<a;i++) printf("0x%x %c\n",mensaje[i],mensaje[i]); printf("\n"); FlushInQ (PUERTOSMS); } } SetCtrlAttribute(panelHandle, PANEL_TIMER2, ATTR_ENABLED, 1);//HABILITO OTRA VEZ EL TIMER nveces ++; if (nveces >= 1000)//cada 10 segundos y actuar en consecuencia { comprobar_si_esta_el_movil(); nveces = 0; } break; } return 0; } /*int CVICALLBACK Borrar_Ficha (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: /*SIRVE PARA COMUNICAR AL CENTRO DE CONTROL QUE ESTA ACTIVO Y QUE NECESITA LA INFORMACION DE LAS TOMAS*/ //enviarMensaje("PAC 1 60 ","34605616507"); /*SIRVE PARA COMUNICAR AL CENTRO DE CONTROL QUE SE HA RECIBIDO CORRECTAMENTE EL MENSAJE QUE SE HAYA ENVIADO DESDE EL CENTRO DE CONTROL*/ //enviarMensaje("PAC 2 60 ","34605616507"); /*SIRVE PARA COMUNICAR AL CENTRO DE CONTROL QUE EL PACIENTE NO SE HA TOMADO ALGUNA DE LAS PASTILLAS EN UNA TOMA ESPECIFICA PASADO UN TIEMPO PRUDENCIAL*/ /* enviarMensaje("PAC 3 60 ESPIDIFEN 10:30 ","34605616507"); break; } return 0; }*/ int CVICALLBACK Coincidencia_ok (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: escogido = 1; RemovePopup(0); break; } return 0; } int CVICALLBACK tabla_coincidencias (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { Point punto,celda; switch (event) { case EVENT_LEFT_CLICK: punto.y = eventData1; punto.x = eventData2;

Page 38: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

36

GetTableCellFromPoint (panel,control ,punto, &celda ); SetTableSelection(panel,control,MakeRect(celda.y,1,1,6)); break; } return 0; } int CVICALLBACK Borrar_la_ficha (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: panel_borrar = LoadPanel (0, "pruebas_irene.uir", PANEL_5); DisplayPanel(panel_borrar); break; } return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ///////////////////////////////////////////////////////////////////////// ////////////////////////// CON ESTA FUNCION BORRAMOS DE LA BASE DE DATOS TODOS LOS DATOS////////////// ///////////////////////////DEL PACIENTE ESPECIFICADO //////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////// int CVICALLBACK borrar_definitivo (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { char numero_paciente[16]; char buffer_gigante[200]; int i; static int databaseHandle; switch (event) { case EVENT_COMMIT: memset(numero_paciente, 0, sizeof(numero_paciente)); GetCtrlVal (paneltab0, PANEL1TAB0_NUMERO_PACIENTE, numero_paciente); //NOS CONECTAMOS A LA BASE DE DATOS for(i=0;i<2;i++) { databaseHandle = DBConnect(BASE_DATOS); DBImmediateSQL(databaseHandle,"USE Hospital"); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"DELETE FROM Datos_del_Paciente WHERE Número= %s", numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"DELETE FROM Datos_Clinicos WHERE Número= %s", numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"DELETE FROM Historial WHERE Número= %s", numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"DELETE FROM Enfermedades_Tratamientos WHERE Número= %s", numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); memset (buffer_gigante,0,sizeof(buffer_gigante)); sprintf(buffer_gigante,"DELETE FROM Otros_tratamientos WHERE Número= %s", numero_paciente); DBImmediateSQL(databaseHandle, buffer_gigante); HidePanel(panel_borrar); HidePanel(panel_4Handle); DBDisconnect(databaseHandle); }; //hay que conectarse a la base de datos y eliminar todo lo relacionado con el paciente en cuestion MessagePopup("INFORME","LOS DATOS DEL PACIENTE SELECCIONADO HAN SIDO ELIMINADOS"); DisplayPanel(panelHandle); break; } return 0; } int CVICALLBACK volver_atras (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: HidePanel(panel_borrar); break; } return 0; }

Page 39: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

37

INFORME GRÁFICO En este apartado se muestran varias imágenes, sobre diferentes aspectos del proyecto

Fig. 6. Interfaz de usuario del Centro de Control Fig. 7. Dispensador en su versión final

Fig. 1. Diagrama general del sistema

RS232

GSMDISPE NS A DO R -1

DISPE NSA DO R -N

BT

SER VIDO R

mySQ L

CE NT RO DE C ON TR OL

RS232

16 Mhz.

:C

COMUNICACIONES

RS232

BLUETOOTH

ALIMENTACIÓNLM12

LM628

DAC

ENCODER INCREMENTALDC

MOTOR

INTERFAZ DE USUARIO

Fig. 2. Diagrama de bloques del dispensador.

Fig. 3. Modelado del sistema mecánico Fig. 4. Diseño del circuito impreso

Page 40: ESTUDIOS DE I+D+I - Envejecimiento Csicenvejecimiento.csic.es/documentos/documentos/imserso-e... · 2007-08-13 · pg* iflsb vcore usb vincore vcc vldo2 vldo1 led2 defcore pgnd2 vib

38

DIVULGACIÓN DE RESULTADOS

Autores: L. Boquete y J. M. R. Ascariz

Título: Sistema Electrónico para la Dosificación de Píldoras con Comunicaciones

Móviles

Ref. revista/Libro: Revista Internacional Iberoamericana sobre Computación

Ubicua: http://riicu.cc.uah.es/

Clave: A Volumen: Nº Páginas, inicial: final: Fecha: Octubre 2006

Editorial (si libro): Lugar de publicación: Alcalá de Henares

Autores: L. Boquete Vázquez, J. M. Rodríguez Ascariz

Título: Sistema Dispensador de Píldoras Controlado por Telefonía Móvil

Congreso: 1ª Conferencia Ibérica de Sistemas y Tecnologías de la Información

Lugar de celebración: Esposende (PORTUGAL)

Fecha: 21-23 Junio 2006

Publicación: Sistemas e Tecnologias de Informação no Espaço Ibérico", Vol I e II,

ISBN 978-989-20-0271-2. Vol. I. Pp. 523-532

Autores (p.o. de firma): L. Boquete, J. M. Rodríguez Ascariz

Título: Sistema Electrónico para la Dosificación de Píldoras con Comunicaciones

Móviles

Publicación: II Congreso IberoAmericano sobre Computación Ubicua: CICU 06.

ISBN: 84-8138-703-7

Clave: CL Volumen: Páginas, inicial: 131, final: 138. Fecha: Junio 2006

Lugar de celebración: Alcalá de Henares

Autores: L. Boquete, J. M. R. Ascariz

Título: Dispensador de Píldoras con Control por Telefonía Móvil

Publicación: XVI Jornadas TELECOM I+D 2006.

Fecha: 29 Noviembre-1 Diciembre 2006

Lugar de celebración: Madrid.