Post on 27-Jan-2020
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>
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.
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
2
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
4
DIAGRAMAS DEL DISEÑO MECÁNICO DEL DISPENSADOR
Se incluye en este apartado algunas imágenes.
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¿?
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
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
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
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
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
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)
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);
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);
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"
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);
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);
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];
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);
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]);
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;
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 /////////////////////// //////////////////////
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)
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);
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,"");
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; }
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;
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; }
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);
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*/
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);
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); }
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; }
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; }
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);
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;
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; }
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
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.