Escolar Documentos
Profissional Documentos
Cultura Documentos
Osciloscopio basado en
Windows 95
utilizando el puerto serie
VARIABLES
A MEDIR PERIFRICO
PC
2.5
A/D
Lach
8x51
PC MAX232 Memoria
Interrupcin
Decodificar Toma de
recepcin decisin
Operacin
Establecer modo
de uso
Inicio
Cargar modo de
uso
No Guardar en
Modo
memoria la trama
Guardar en manual
final
memoria la trama
de inicio S
Leer un dato de
Guardar en No
memoria y
Existe
memoria el enviarlo
disparo
estado de los
canales
S
No
Realizar una Fin de
muestras y envo
guardarla en
memoria S
No
Fin
Otra datos
S muestra
No S
CView
CPersistentFrame CControlDlg
CDocument CConfigComDlg
OnDraw Monitor
Serialize
CArchive
OnPrint Impresora
CFile
Leyenda
Objeto
Funcin
Memoria no voltil
(*) Control avanzado
Ilustracin 1.4: relacin entre objetos
1.3 HARDWARE
El hardware est constituido por tres bloques:
Circuitera digital: sta gira entorno al microcontrolador 87C51. Gestiona
una memoria externa, tiene mapeado en memoria un lach de 8 bits que
controla la electrnica analgica, un conversor A/D est acoplado en el
puerto cuatro y un driver 232 en los pines de comunicacin
Circuitera analgica: se dedica a procesar la seal/es analgica/s de entrada
hasta llegar al conversor A/D. Est formada por cuatro etapas de entrada, las
cuales poseen cada una un divisor de tensin gobernados por rels. Las
seales de entrada pueden ser multiplexadas, posteriormente se aplica una
ganancia variable mediante un amplificador inversor, para finalmente ser
filtradas con un amplificador inversor sumador banda pasante o paso bajo.
Circuitera de alimentacin: suministra la energa necesaria para la
electrnica. Existen dos bloques, uno dedicado a los elementos analgicos y
otro a los digitales, de este modo se evita interferencias entre s.
1.3.1 CIRCUITERA DIGITAL
PR 24 = (640 A) 12 K 5mW 1 W
2
4
Entonces
400 6.6 + 6.4 10 4 390 10 3
643A PR18 = (643A) 1M 0.4W 1 W
2
I1 =
10 6 2
Se ha insertado un seguidor de tensin entre V2 y Vout para evitar efectos de
carga desde la seal de entrada al siguiente bloque, que est formado por un multiplexor
analgico seguido de un amplificador inversor. El multiplexor es el encargado de ir
seleccionando alternadamente entre los cuatro canales disponibles. Los canales se
seleccionan mediante los puertos CAN1 y CAN2 que son directamente los pines 14 (T0)
y 15 (T1) del 87C51.
2.1.2.2 Amplificador inversor de ganancia variable
Se ha utilizado la estructura bsica de un amplificador inversor cuya resistencia
de realimentacin puede ser escogida mediante un multiplexor analgico como se
muestra en la siguiente figura.
G6 = 20 R12 = G6 R15 = 200 K R12 = 150 K R12 = 150 K RV6 = 100 K RV6 = 200 K
G7 = 50 R13 = G7 R15 = 500 K R13 = 375 K R13 = 330 K RV7 = 250 K RV7 = 500 K
G8 = 100 R14 = G8 R15 = 1M R14 = 750 K R14 = 680 K RV8 = 500 K RV8 = 500 K
Donde
c1 = 1 R1 C1
H 1 ( j 0 ) = R1
R3
y la segunda
V (S ) R 1 R2 C 2 s
H 2 (S ) = 0 = 1
V1 (S ) {R2 1 + R1 C1 s 1 + R2 C 2 s
1424 43 4 142 4 43 4
Ganancia Paso _ bajo Paso _ alto
c3 = 1 R C
2 2
H 2 ( j 0 ) = R1
R2
Seguidamente se presenta el diagrama de Bode asinttico
|H1(S)|
R1/R3
W
W C1
|H2(S)|
R1/R2
W
W C3 W C2
1
C1 = 60 pF
2 26.5KHz 10 K
1
c 3 = 2 5Hz = 1 R C = 110 K C 2 = 3F
2 2 2 5Hz 10 K
La seal proveniente del V2 y que en consecuencia queda alterada por la funcin
de transferencia H 1 ( S ) , es una tensin continua constante, por lo tanto al ser una seal
de frecuencia cero no sufre modificacin alguna por el filtro paso bajo. La ganancia
deseada nuevamente es la unidad, entonces
R1 = R3 = 10 K
Finalmente se presenta el diseo global del filtro inversor sumador con filtro de banda
pasante en la siguiente figura
Vo
Vmx
Vpromedio
Vmn
t
T'
T
Vo
m1
Vmx
m2
Vmn
t
T/2 t2
1
t1 =
RL C V T 1 +
=
( Vmin
Vmax
)
T Vmax V T 2
= 1 +
( V
Vmax
)
=
Vmax 2 2 Vmax 2
Sustituyendo T = 1 , donde f p es el nmero de pulsos por segundo (el doble
fp
de la frecuencia original), se obtiene
V 1 V 1 V
RL C = 2 = 1
Vmax 2 f p Vmax f p 2 Vmax
2 Vmax V
2 f p RL C = 1
V 2 Vmax
pero como
V
<< 1
2 Vmax
se desprecia el segundo trmino para obtener
2 Vmax
2 f p RL C =
V
o
2 Vmax
C=
V 2 f p RL
Esta frmula representa una solucin conservativa del problema de diseo: si la
lnea recta nunca pasa por debajo de Vmin , la curva exponencial estar seguro por
encima de este valor. Una regla prctica que se utilizar en el diseo es elegir
5 Vmax
C= Ecuacin 2.4.
V 2 f p RL
2.1.3.1.2 Diseo de una fuente de tensin usando un circuito integrado
Los reguladores de tensin lineales se empaquetan como circuitos integrados
(CI); se enfocar la atencin sobre la serie L78XX. Las hojas de especificaciones
apropiadas aparecen en el apndice. Se puede obtener varias tensiones diferentes: 5, 5.2,
6, 8, 8.5, 9, 12, 15, 18 y 24 V. Todo lo que se requiere para disear un regulador
alrededor de uno de estos CI es seleccionar el transformador, los diodos y el filtro.
Las hojas de especificaciones para este CI indican que debe existir una tierra
comn entre la entrada y la salida, y que la tensin mnima en la entrada del CI debe
estar al menos 2 4 V por encima de la salida regulada. Para asegurar esta ltima
condicin, es necesario filtrar la salida del rectificador. En la ilustracin 2.12, C F
realiza este filtrado cuando se combina con la resistencia de entrada del CI.
6 0.6
R44 = R45 = = 450 valor comercial R23 = 470
12 10 3
2.2 SOFTWARE DE BAJO NIVEL
2.2.1 DIAGRAMAS DE FLUJO
En los siguientes apartados, se presentan los diagramas de flujo del cdigo en
ensamblador. En la memoria descriptiva se expone de forma narrada la explicacin de
stos.
Inicio preludio
Cargar modo de
uso
No
Modo
Guardar en manual
memoria la trama
de inicio S
Guardar en No
Existe
memoria el
disparo
estado de los
canales
S
Fin preludio
Inicio muestreo
T0 = T1 = 0
S Sin multiplexacin.
Sin mux. Slo Canal 1
No
S
Con mux 1 y 2
No
Guardar en memoria
externa el final de trama
Fin muestreo
No
1012 muestras
Fin Canal 1
S
T0 == 1 Cargar BCON con BCON2
No
Leer conversin.
Reset del A/D.
No
1012 muestras
Fin Canal 1
S
T0 == 1
No S
T1 == 1
S
T0 == 0
No
S S
T1 == 1 T1 == 0
No
T1 = 1. T1 = 0
Cargar BCON con BCON3 Cargar BCON con BCON1
T1 == 0
CA1 de T0
Leer conversin.
Reset del A/D.
No
1012 muestras
Fin Canal 1, 2, 3 y 4
Inicio transmisin
Leer un dato de
memoria externa
y enviarlo
No
Fin de
envo
No
1024
datos
Inicio transmisin
INTERRUPCIN
SERIE
Salvar contexto,
No S Decodificar parte baja
RI == 1
de SBUF.
Crear mscaras.
Fin canal serie
S
Modificar BMOD. Modo manual
No
Modificar BEST1,
BCON1, BCON2, S
Canal 1
BCON3 y BCON4.
No
Modificar BMOD,
BEST2, BCON1, S
BCON2, BCON3 y Canal 2
BCON4.
No
S
No implementado. Frec. variable
No
Modificar BEST3,
BCON1, BCON2, S
Canal 3
BCON3 y BCON4.
No
Modificar BMOD,
BEST4, BCON1, S
Canal 4
BCON2, BCON3 y
BCON4.
Restaurar contexto.
MASC0 = 0x00.
A = SBUF.
S
A.0 == 1
No
MASC0.0 = 0 MASC0.0 = 1
S
A.1 == 1
No
MASC0.1 = 0 MASC0.1 = 1
S
A.2 == 1
No
MASC0.2 = 0 MASC0.2 = 1
S
A.3 == 1
No
MASC0.3 = 0 MASC0.3 = 1
MASC1 = MASC0.
MASC1 = MASC1 | 0xF0
A = SBUF.
No S
A.5 == 1
BMOD.2 = 0 BMOD.2 = 1
S A.1 == 1
No
BMOD.3 = 1 BMOD.3 = 0
BEST1 = SBUF.
BCON1 = BCON1 & MASC1.
BCON1 = BCON1 | MASC0.
No S
BEST1.4 == 1
BCON1.4 = 0. BCON1.4 = 1.
BCON2.4 = 0. BCON2.4 = 1.
BCON3.4 = 0. BCON3.4 = 1.
BCON4.4 = 0. BCON4.4 = 1.
Fin Canal 1
BES2 = SBUF.
BCON2 = BCON2 & MASC1.
BCON2 = BCON2 | MASC0.
No S
BEST2.5 == 1
BMOD.0 = 1. BMOD.0 = 0.
BMOD.1 = 0. BMOD.1 = 1.
No S
BEST2.4 == 1
BCON1.4 = 0. BCON1.4 = 1.
BCON2.4 = 0. BCON2.4 = 1.
BCON3.4 = 0. BCON3.4 = 1.
BCON4.4 = 0. BCON4.4 = 1.
Fin Canal 2
BEST3 = SBUF.
BCON3 = BCON3 & MASC1.
BCON3 = BCON3 | MASC0.
No S
BEST3.4 == 1
BCON1.4 = 0. BCON1.4 = 1.
BCON2.4 = 0. BCON2.4 = 1.
BCON3.4 = 0. BCON3.4 = 1.
BCON4.4 = 0. BCON4.4 = 1.
Fin Canal 3
BES4 = SBUF.
BCON4 = BCON4 & MASC1.
BCON4 = BCON4 | MASC0.
No S
BEST4.5 == 1
BMOD.0 = 1. BMOD.0 = 0.
BMOD.1 = 0. BMOD.1 = 0.
No S
BEST4.4 == 1
BCON1.4 = 0. BCON1.4 = 1.
BCON2.4 = 0. BCON2.4 = 1.
BCON3.4 = 0. BCON3.4 = 1.
BCON4.4 = 0. BCON4.4 = 1.
Fin Canal 4
Inicio
CRS::232Thread_Att_RS232
CRS232::Thread_Att_RS232
No
Evento en canal serie
WaitForSingleObject
Lectura de un
S bloque
ClearCommError
Puntero a datos
pBufRxTemp BLOQUE DE DATOS
Copia un elemento del
bloque de datos R1 R2 R3 R4
R5 Rx
x = 8, 16, 32, 40 ...
Puntero a datos
No pBufRxTemp
Final copia
No
Existe funcin de
servicio
Puntero a funcin
g_pOnRxChar
Mensaje
Inicio
CScopeView::OnScopeDataRX
ScopeDetectarTrama( inicio );
No
Trama ( inicio ) i = 0;
detectada
ScopeDetectarTrama( final );
S pDoc->m_nVinPuntos = i - 8;
Trama ( final ) pDoc ScopeCrearVin( );
detectada
InvalidateRect;
No
Fin
CScopeView::OnScopeDataRX
Inicio
CScopeDoc::ScopeCrearVin
S
m_pCanalDoc[3].Enable
S
m_pCanalDoc[1].Enable
Inicio
CScopeView::OnDraw(CDC* pDC)
S
m_pCanalDoc[3].Enable
S
m_pCanalDoc[1].Enable
Fin
CScopeView::OnDraw(CDC* pDC)
Ilustracin 2.32: dibujar ventana vista
2.3.1.5 Dibujar un Canal
Inicio
CscopeView::ScopeDrawChanel( "parmetros" )
Fin
CscopeView::ScopeDrawChanel( "parmetros" )
Dilogo CcontrolDlg
if ( ControlInteractivo ) {
CControlDlg::ScopeCodificarTramaTX;
Mensaje = IDENVIAR;
}
else {
Mensaje = IDAPPLY;
}
Mensaje
If ( Mensaje == IDAPPLY ) {
Actualizar los valores de representacin por pantalla de los canales;
InvalidateRect;
}
If ( Mensaje == IDENVIAR ) {
m_pRs232 TX( m_pControlDlg m_pTXCadena , 1 );
// Se enva un solo mensaje a la cola del canal serie de transmisin
InvalidateRect;
}
Gan Div Geq Vin Vx Rango V / div V / div Rango FAC! GAN1 GAN2 GAN3
max max Vin real real
0.5 0.012 0.006 311 1.9 622 62.2 100 1000 0 0 0 0
1 0.012 0.012 208 2.5 416 41.6 50 500 0 1 0 0
2 0.012 0.024 104 2.5 208 20.8 20 200 0 0 1 0
5 0.012 0.06 41.6 2.5 83.2 8.32 10 100 0 1 1 0
10 0.012 0.12 20.8 2.5 41.6 4.16 5 50 0 0 0 1
20 0.012 0.24 10.4 2.5 20.8 2.08 2 20 0 1 0 1
50 0.012 0.6 4.16 2.5 8.32 0.832 1 10 0 0 1 1
100 0.012 1.2 2.08 2.5 4.16 0.416 0.5 5 0 1 1 1
0.5 1 0.5 5 2.5 10 1 1 10 1 0 0 0
1 1 1 2.5 2.5 5 0.5 0.5 5 1 1 0 0
2 1 2 1.25 2.5 2.5 0.25 0.2 2 1 0 1 0
5 1 5 0.5 2.5 1 0.1 0.1 1 1 1 1 0
10 1 10 0.25 2.5 0.5 0.05 0.05 0.5 1 0 0 1
20 1 20 0.125 2.5 0.25 0.025 0.02 0.2 1 1 0 1
50 1 50 0.05 2.5 0.1 0.01 0.01 0.1 1 0 1 1
100 1 100 0.025 2.5 0.05 0.005 0.005 0.05 1 1 1 1
Cuadro 2.3: codificacin de la ganancia
Los valores en negrita son los descartados.
Gan: ganancia desarrollada por el amplificador inversor de ganancia variable.
Div: atenuacin otorgada por el divisor de tensin.
Geq: valor equivalente de aplificacin o atenuacin.
Vin max: tensin de entrada mxima de un canal.
Vx max: tensin mxima en la entrada del amplificador inversor sumador.
Rango Vin: rango mximo de la tensin de entrada.
V / div: voltios partido divisin tericos.
V / div real: voltios partidos divisin reales o tpicos.
Rango real: rango mximo de tensin con V / div real.
FAC!, GAN1, GAN2, GAN3: bits para la codificacin de un Byte de Estado.
NOTA: el nmero de divisiones = 10, Vin max = 311 y todos los Vx max =
2.5 son criterios de diseo.
3 PLANOS
4 PRESUPUESTO
4.1 MEDICIONES
CDIGO DESCRIPCIN CANTIDAD UNIDADES
1 Microcontrolador 87C51 1 Ud.
2 Memoria UM6264AB 1 Ud.
3 Conversor A/D ADC0820CCN 1 Ud.
4 Driver MAX232 1 Ud.
5 Lach MC74HC473AN 2 Ud.
6 Multiplexor MC74HC4051N 3 Ud.
7 Puertas NOR MC74HC02A 1 Ud.
8 Amplificador operacional LM324N 2 Ud.
9 Regulador de tensin UA7805C 1 Ud.
10 Regulador de tensin L7806CV 1 Ud.
11 Regulador de tensin L7906CV 1 Ud.
12 Puente de diodos B40 1500/1000 2 Ud.
13 Rel RS274-059 4 Ud.
14 Driver ULN2003A 1 Ud.
15 Diodo D1N4001 1 Ud.
16 Diodo D1N4004 8 Ud.
17 Diodo zener 1N751 1 Ud.
18 Diodo zener 1N752 1 Ud.
19 Diodo luminiscente 3 Ud.
20 Cristal de cuarzo de 12 MHz 1 Ud.
21 Condensador MKT de 100 nF 18 Ud.
22 Condensador MKT de 10 pF 4 Ud.
23 Condensador MKT de 60 pF 1 Ud.
24 Condensador MKT de 3 uF 1 Ud.
25 Condensador MKT de 330 nF 3 Ud.
26 Condensador cermico de 30 pF 2 Ud.
27 Condensador electroltico de 2200 mF 1 Ud.
28 Condensador electroltico de 680 mF 2 Ud.
29 Condensador electroltico de 47 uF 1 Ud.
30 Condensador electroltico de 1 uF 5 Ud.
31 Resistencia de pelcula de carbn de 1/4 W 26 Ud.
32 Resistencia de pelcula de carbn de 1/2 W 8 Ud.
33 Potencimetro multivuelta de 1/4 W 10 Ud.
34 Conector tipo D montaje PCB de 9 vas 1 Ud.
35 Terminal roscado PCB de 3 vas 2 Ud.
36 Terminal encapsulado PCB de 10 vas 1 Ud.
4.2 PRECIOS UNITARIOS
CDIGO DESCRIPCIN PRECIO UNITARIO
EN PTS
1 Microcontrolador 87C51 1500
2 Memoria UM6264AB 1200
3 Conversor A/D ADC0820CCN 2723
4 Driver MAX232 632
5 Lach MC74HC473AN 174
6 Multiplexor MC74HC4051N 243
7 Puertas NOR MC74HC02A 60
8 Amplificador operacional LM324N 135
9 Regulador de tensin UA7805C 134
10 Regulador de tensin L7806CV 327
11 Regulador de tensin L7906CV 450
12 Puente de diodos B40 1500/1000 216
13 Rel RS274-059 622
14 Driver ULN2003A 238
15 Diodo D1N4001 13
16 Diodo D1N4004 22
17 Diodo zener 1N751 14
18 Diodo zener 1N752 14
19 Diodo luminiscente 25
20 Cristal de cuarzo de 12 MHz 150
21 Condensador MKT de 100 nF 10
22 Condensador MKT de 10 pF 10
23 Condensador MKT de 60 pF 10
24 Condensador MKT de 3 uF 30
25 Condensador MKT de 330 nF 15
26 Condensador cermico de 30 pF 25
27 Condensador electroltico de 2200 mF 215
28 Condensador electroltico de 680 mF 54
29 Condensador electroltico de 47 uF 15
30 Condensador electroltico de 1 uF 12
31 Resistencia de pelcula de carbn de 1/4 W 7
32 Resistencia de pelcula de carbn de 1/2 W 10
33 Potencimetro multivuelta de 1/4 W 480
34 Conector tipo D montaje PCB de 9 vas 259
35 Terminal roscado PCB de 3 vas 165
36 Terminal encapsulado PCB de 10 vas 218
4.3 APLICACIN DE PRECIOS
CD. DESCRIPCIN CANT. PRECIO TOTAL
UNITARIO PARCIAL EN
EN PTS PTS
1 Microcontrolador 87C51 1 1500 1000
2 Memoria UM6264AB 1 1200 1200
3 Conversor A/D ADC0820CCN 1 2723 2723
4 Driver MAX232 1 632 632
5 Lach MC74HC473AN 2 174 348
6 Multiplexor MC74HC4051N 3 243 729
7 Puertas NOR MC74HC02A 1 60 60
8 Amplificador operacional LM324N 2 135 270
9 Regulador de tensin UA7805C 1 134 134
10 Regulador de tensin L7806CV 1 327 327
11 Regulador de tensin L7906CV 1 450 450
12 Puente de diodos B40 1500/1000 2 216 431
13 Rel RS274-059 4 622 2488
14 Driver ULN2003A 1 238 238
15 Diodo D1N4001 1 13 13
16 Diodo D1N4004 8 22 176
17 Diodo zener 1N751 1 14 14
18 Diodo zener 1N752 1 14 14
19 Diodo luminiscente 3 25 75
20 Cristal de cuarzo de 12 MHz 1 150 150
21 Condensador MKT de 100 nF 18 10 180
22 Condensador MKT de 10 pF 4 10 40
23 Condensador MKT de 60 pF 1 10 10
24 Condensador MKT de 3 uF 1 30 30
25 Condensador MKT de 330 nF 3 15 45
26 Condensador cermico de 30 pF 2 25 50
27 Condensador electroltico de 2200 mF 1 215 215
28 Condensador electroltico de 680 mF 2 54 108
29 Condensador electroltico de 47 uF 1 15 15
30 Condensador electroltico de 1 uF 5 12 60
31 Resistencia de pelcula de carbn de 1/4W 26 7 183
32 Resistencia de pelcula de carbn de 1/2W 8 10 80
33 Potencimetro multivuelta de 1/4 W 10 480 4800
34 Conector tipo D montaje PCB de 9 vas 1 259 259
35 Terminal roscado PCB de 3 vas 2 165 330
36 Terminal encapsulado PCB de 10 vas 1 218 218
TOTAL 18092
5 PLIEGO DE CONDICIONES
5.1 CONDICIONES GENERALES
5.1.1 INTRODUCCIN
El presente proyecto desarrolla un osciloscopio para Windows 95 utilizando el
puerto serie.
Dada la condicin de "Final de carrera" del proyecto, las consideraciones de tipo
contractual poseen un carcter de suposicin.
El presente pliego de Condiciones tiene por objeto definir al contratista el
alcance del trabajo y la ejecucin cualitativa del mismo.
El alcance del trabajo del Contratista incluye el diseo y preparacin de todos
los planos, diagramas, lista de material y requisitos para la adquisicin e instalacin del
trabajo.
5.1.3 MATERIALES
Todos los materiales empleados sern de primera calidad, cumplirn las
especificaciones y tendrn las caractersticas indicadas en el proyecto y en las normas
tcnicas generales.
Toda especificacin o caracterstica de materiales que figuren en uno solo de los
documentos del Proyecto, an sin figurar en los otros es igualmente obligatoria.
En caso de existir contradiccin u omisin en los documentos del proyecto, el
contratista obtendr la obligacin de ponerlo de manifiesto al Tcnico Director de la
obra, quien decidir sobre el particular. En ningn caso podr suplir la falta
directamente, sin la autorizacin expresa.
No podr utilizarse materiales que no hayan sido aceptados por el director
Tcnico.
5.1.7 MODIFICACIONES
El contratista est obligado a realizar las variaciones (ampliaciones, reducciones
o modificaciones) del proyecto siempre que estas no supongan una variacin sobre el
global proyectado superior al 25%.
Si el contratista, desea realizar alguna modificacin, deber darla a conocer por
escrito al Tcnico Director, si se considera razonable y se acepta, ser confirmada por
escrito, as como las nuevas condiciones econmicas que mutuamente se acuerden. Si
lo anterior no se da como se especifica, no se aceptar modificacin alguna.
La valoracin se har de acuerdo, con los valores establecidos en el presupuesto
por el Contratista y que ha sido tomado como base del contrato.
5.1.11 RESPONSABILIDADES
El contratista es responsable de la ejecucin de los trabajos como fija el proyecto,
y tendr que reconstruir toda parte que no se ajuste al programa, sin servir de excusa la
razn de que el director de obra haya examinado y reconocido la obra.
El contratista es el nico responsable de los posibles fallos cometidos por l o su
personal, as como de los accidentes o perjuicios producidos a la propiedad, vecinos o
terceros a causa de la inexperiencia o mtodos inadecuados.
El contratista es el nico responsable del incumplimiento de las disposiciones
vigentes en la materia laboral respecto de su personal y por tanto los accidentes que
puedan sobrevenir y de los derechos que puedan derivarse de ellos.
5.1.12 FIANZA
En el contrato se establecer la fianza que el contratista deber depositar en
garanta del cumplimiento del mismo, o, se convendr una retencin sobre los pagos
realizados a cuenta del trabajo ejecutado.
De no estipularse la fianza en el contrato se entiende que se adopta como
garanta una retencin del 5% sobre los pagos a cuenta citados.
En el caso de que el Contratista se negase a hacer por su cuenta los trabajos para
ultimar el proyecto en las condiciones contratadas, o a atender la garanta, la Propiedad
podr ordenar ejecutarlas a un tercero, abonando su importe con cargo a la retencin o
fianza, sin perjuicio de las acciones legales a que tenga derecho la Propiedad si el
importe de la fianza no bastase.
La fianza retenida se abonar al Contratista en un plazo no superior a treinta das
una vez firmada el acta de recepcin definitiva de la obra.
5.2 CONDICIONES TCNICAS
5.2.1 CONDICIONES DE LAS PLACAS DE C.I.
Las placas de circuito impreso, debern ser diseadas por el fabricante bajo las
siguientes normas:
- Ancho de las pistas de seal: 0.5 mm.
- Ancho de las pistas de alimentacin: 2 mm.
- Osciladores de cuarzo tumbados sobre plano de masa.
- Los condensadores de desacoplo debern ir situados lo ms cerca posible del
pin de alimentacin.
- Dimensiones de los taladros:
1 mm para los circuitos integrados y componentes discretos.
1.25 mm para regletas y reguladores de tensin.
3.2 mm para los tornillos de los disipadores.
4 mm para los taladros de sujecin de la placa.
Todas las placas una vez salidas de produccin debern ser testeadas, de tal
forma que el ndice de fallos en pistas, sea inferior al 1%.
5.3.2 PERSONAL
El Contratista tendr al frente de la obra un encargado con autoridad sobre los
dems operarios y conocimientos acreditados y suficientes para la ejecucin del
proyecto.
El encargado recibir, cumplir y transmitir las instrucciones y rdenes del
Tcnico Director de la obra.
El Contratista tendr el nmero y clase de operarios que haga falta para el
volumen y naturaleza de los trabajos que se realicen, los cuales sern de reconocida
aptitud y experimentados en el oficio. El Contratista estar obligado a separar de la
realizacin del proyecto, a aquel personal que a juicio del Tcnico Director no cumpla
con sus obligaciones, realice el trabajo defectuosamente, bien por falta de
conocimientos o por obrar de mala fe.
5.3.4 ENSAYOS
Antes de la puesta en servicio del sistema elctrico, el Contratista habr de hacer
los ensayos adecuados para probar, a la entera satisfaccin del Tcnico Director del
proyecto, que todo el equipo, aparatos y cableado han sido instalados correctamente de
acuerdo con las normas establecidas y estn en condiciones satisfactorias para le
funcionamiento.
Todos los ensayos sern presenciados por el Ingeniero que representa el Tcnico
Director de obra.
Los resultados de los ensayos sern pasados en certificados indicando fecha y
nombre de la persona a cargo del ensayo, as como categora profesional.
Los cables, antes de ponerse en funcionamiento, se sometern a un ensayo de
resistencia de aislamiento entre fase y tierra.
5.3.5 ENSAYOS DE APARELLAJE
Antes de poner el aparellaje bajo tensin, se medir la resistencia de aislamiento
de cada equipo entre fases y tierra.
Las medidas deben repetirse con los interruptores en posicin de funcionamiento.
Todo rel de proteccin que sea ajustable ser calibrado y ensayado, usando
contador de ciclos, caja de carga, ampermetro y voltmetro, segn se necesite.
Se dispondr, en lo posible, de un sistema de proteccin selectiva. De acuerdo
con esto, los rels de proteccin se elegirn y coordinarn para conseguir un sistema que
permita actuar primero el dispositivo de interrupcin ms prximo a la falta.
Todos los interruptores automticos se colocarn en posicin de prueba y cada
interruptor ser cerrado y disparado desde su interruptor de control. Los interruptores
deben ser disparados por accionamiento manual y aplicando corriente a los rels de
proteccin. Se comprobarn todos los enclavamientos.
5.4 CONDICIONES ECONOMICAS
5.4.1 PRECIOS
El contratista presentar, al formalizarse el contrato, relacin de los precios de
las unidades de trabajo que integran el proyecto, los cuales de ser aceptados tendrn
valor contractual y se aplicarn a las posibles variaciones que puedan haber.
Estos precios unitarios, se entiende que comprenden la ejecucin total de la
unidad del proyecto, incluyendo todos los trabajos an los complementarios y los
materiales as como la parte proporcional de imposicin fiscal, las cargas laborales y
otros gastos repercutibles.
En caso de tener que realizarse unidades de trabajo no prevista en el proyecto, se
fijar su precio entre el Tcnico Director y el Contratista antes de iniciar la obra y se
presentar a la propiedad para su aceptacin o no.
5.4.4 PENALIZACIONES
Por retraso en los plazos de entrega de las obras, se podrn establecer tablas de
penalizacin cuyas cuantas y demoras se fijarn en el contrato.
5.4.5 CONTRATO
El contrato se formalizar mediante documento privado, que podr elevarse a
escritura a peticin de cualquiera de las partes. Comprender la adquisicin de todos
los materiales, transporte, mano de obra, medios auxiliares para la ejecucin de la obra
proyectada en el plazo estipulado, as como la reconstruccin de las unidades
defectuosas, la realizacin de las obras complementarias y las derivadas de las
modificaciones que se introduzcan durante la ejecucin, stas ltimas en los trminos
previstos.
La totalidad de los documentos que componen el Proyecto tcnico de la obra
sern incorporados al contrato y tanto el contratista como la Propiedad debern
firmarlos en testimonio de que los conocen y aceptan.
5.4.6 RESCISIN DEL CONTRATO
Causas de rescisin: Se consideran causas suficientes para la rescisin del
contrato las siguientes:
1- Muerte o incapacitacin del Contratista.
2- La quiebra del contratista.
3- Modificacin del proyecto cuando produzca alteracin en ms o menos 25% del
valor contratado.
4- Modificacin de las unidades de obra en nmero superior al 40% del original.
5- La no iniciacin de los trabajos en el plazo estipulado cuando sea por causas
ajenas a la Propiedad.
6- La suspensin de las obras ya iniciadas siempre que el plazo de suspensin sea
mayor de seis meses.
7- Incumplimiento de las condiciones del Contrato cuando implique mala fe.
8- Terminacin del plazo de ejecucin de la obra sin haberse llegado a completar
sta.
9- Actuacin de mala fe en la ejecucin de los trabajos.
10- Destajar o subcontratar la totalidad o parte de los trabajos a terceros sin la
autorizacin del Tcnico Director y la propiedad.
;****************************************************************************
;*** ***
;*** SOFTWARE PARA EL CONTROL DEL OSCILOSCOPIO PARA WINDOWS 95 ***
;*** ***
;****************************************************************************
;----------------------------------------------------------------------------
;--- ---
;--- Por: Ral Bartolom Castro ---
;--- Versin: 2.1. ---
;--- Fecha: 28 de Enero del 2000 ---
;--- Archivo: OSCIL1.ASM ---
;--- ---
;--- Descripcin: ---
;----------------------------------------------------------------------------
;--- Software para el microcontrolador 89C51, con una frecuencia de ---
;--- trabajo de 12 MHz => 1 Ciclo Maquina (CM) = 1 us ---
;----------------------------------------------------------------------------
;--- Existe una memoria de datos externa de 8 KBy en ---
;--- @InicialMemoria = 1xx0 0000 0000 0000 B = 8000 H ---
;--- @FinalMemoria = 1xx1 1111 1111 1111 B = 9FFF H ---
;----------------------------------------------------------------------------
;--- El Byte de Control ( BCON ) esta mapeado en memoria el la direccin:
;--- @BCON = 0xxx xxxx xxxx xxxx B = 0000H ---
;--- BCON.7--BCON.6--BCON.5--BCON.4--BCON.3--BCON.2--BCON.1--BCON.0 ---
;--- FAC4!---FAC3!---FAC2!---FAC1!---GAN1----GAN2----GAN3----AC/DC! ---
;--- ---
;--- FACx! = 0 => Canal x por factor de 0.012 ---
;--- FACx! = 1 => Canal x por factor de 1 (sin factor) ---
;--- Donde x = 1, 2, 3, 4 ---
;--- GAN3--GAN2--GAN1 GANANCIA ---
;--- 0-----0-----0 => 0.5 ---
;--- 0-----0-----1 => 1 ---
;--- 0-----1-----0 => 2 ---
;--- 0-----1-----1 => 5 ---
;--- 1-----0-----0 => 10 ---
;--- 1-----0-----1 => 20 ---
;--- 1-----1-----0 => 50 ---
;--- 1-----1-----1 => 100 ---
;--- AC/DC! = 0 => Modo DC ---
;--- AC/DC! = 1 => Modo AC ---
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;--- El Byte de Estado ( BEST ) es especifico para cada canal, que a ---
;--- a su vez es el byte que se transmite por canal serie ---
;--- BEST.7--BEST.6--BEST.5--BEST.4--BEST.3--BEST.2--BEST.1--BEST.0 ---
;--- SBUF.7--SBUF.6--SBUF.5--SBUF.4--SBUF.3--SBUF.2--SBUF.1--SBUF.0 ---
;--- CH1-----CH0-----E-------FAC!----GAN1----GAN2----GAN3----AC/DC! ---
;--- ---
;--- CH1----CH0 CANAL ---
;--- 0------0 => 1 ---
;--- 0------1 => 2 ---
;--- 1------0 => 3 ---
;--- 1------1 => 4 ---
;--- E : Enable. -- El Canal 1 siempre esta habilitado !! ---
;--- E CH1 CH0 CODIFICACION ---
;--- 0---0---0 => Control de disparo manual => FAC!=Enable, GAN1=TRIGGER
;--- 1---0---0 => Referenciado Canal 1 ---
;--- 0---0---1 => Referenciado Canal 2 e inhabilitado Canal 2 ---
;--- 1---0---1 => Referenciado Canal 2 y habilitado Canal 2 ---
;--- 0---1---0 => Frecuencia de muestreo variable ---
;--- 1---1---0 => Referenciado Canal 3 ---
;--- 0---1---1 => Referenciado Canal 3 e inhabilitados Canales 2, 3 y 4
;--- 1---1---1 => Referenciado Canal 4 y habilitados Canales 2, 3 y 4
;--- FAC! = 0 => Por el factor de 0.012 del Canal referenciado ---
;--- FAC! = 1 => Por el factor de 1 del Canal referenciado ---
;--- GAN3--GAN2--GAN1 GANANCIA DEL CANAL REFERENCIADO ---
;--- 0-----0-----0 => 0.5 ---
;--- 0-----0-----1 => 1 ---
;--- 0-----1-----0 => 2 ---
;--- 0-----1-----1 => 5 ---
;--- 1-----0-----0 => 10 ---
;--- 1-----0-----1 => 20 ---
;--- 1-----1-----0 => 50 ---
;--- 1-----1-----1 => 100 ---
;--- AC/DC! = 0 => Modo DC del Canal referenciado ---
;--- AC/DC! = 1 => Modo AC del Canal referenciado ---
;----------------------------------------------------------------------------
;--- El Byte de Modo ( BMOD ) especifica el modo de funcionamiento del ---
;--- osciloscopio de la siguiente manera ---
;--- BMOD.7--BMOD.6--BMOD.5--BMOD.4--BMOD.3--BMOD.2--BMOD.1--BMOD.0 ---
;--- ---
;--- BMOD.1--BMOD.0 MODO DE MULTIPLEXACION Y CANAL/ES ---
;--- x-------1 => Sin multiplexacin: Canal 1 ---
;--- 1-------0 => Con multiplexacin: Canales 1 y 2 ---
;--- 0-------0 => Con multiplexacin: Canales 1, 2, 3 y 4 ---
;--- BMOD.2 = 0 => Sin control manual, muestreo "infinito". ---
;--- BMOD.2 = 1 => Con control manual. ---
;--- Si (BMOD.2 = 1) entonces ---
;--- BMOD.3 = 0 => Espera activa ---
;--- BMOD.2 = 1 => Inicia muestreo (disparo). ---
;----------------------------------------------------------------------------
.org 00H
ljmp INICIO
.org 23H
ljmp SERVCOM
.org 33H
INICIO:
;----------------------------------------------------------------------------
;--- INICIALIZACIN DEL OSCILOSCOPIO ---
;----------------------------------------------------------------------------
mov 25H,#30H ;0011 0000 B = 30 H. 25H guarda el estado del Canal 1. BEST1
mov 26H,#50H ;0101 0000 B = 50 H. 26H guarda el estado del Canal 2. BEST2
mov 27H,#90H ;1001 0000 B = 90 H. 27H guarda el estado del Canal 3. BEST3
mov 28H,#D0H ;1101 0000 B = D0 H. 28H guarda el estado del Canal 4. BEST4
;----------------------------------------------------------------------------
;--- FIN INICIALIZACIN DEL OSCILOSCOPIO ---
;----------------------------------------------------------------------------
setb TR1 ;Disparo el Timer 1, comienza a transmitir
INFINITO:
mov DPTR,#8000H ;Direccin inicial de la memoria externa
;----------------------------------------------------------------------------
;--- MUESTREAR Y GUARDAR EN MEMORIA 1012 MUESTRAS ---
;----------------------------------------------------------------------------
clr T0 ;Selecciono el Canal 1
clr T1
nop ;1By,1CM;
mov R7,#02H ;2By,1CM; Retardo de 3 * 10 + 1 CM
RETARDO4:
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
djnz R7,RETARDO4 ;2By,2CM;
MUES24:
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
MUES4:
clr INT1 ;2By,1CM;Disparo el A/D
movx @DPTR,A ;1By,2CM;Guardo en memoria la muestra anterior
jb T0,T0ES14 ;3By,2CM;
jnb T0,T0ES04 ;3By,2CM;
T0ES14:
nop
nop
jb T1,T1ES1A ;3By,2CM;
jnb T1,T1ES0A ;3By,2CM;
T1ES1A:
nop ;1By,1CM;
nop ;1By,1CM;T0 = 1, T1 = 1
clr T1 ;2By,1CM;
mov A,31H ;2By,1CM;
sjmp YAMUX ;2By,2CM;
T1ES0A: ;T0 = 1, T1 = 0
setb T1 ;2By,1CM;
mov A,33H ;2By,1CM;
sjmp YAMUX ;2By,2CM;
T0ES04:
jb T1,T1ES1B ;3By,2CM;
jnb T1,T1ES0B ;3By,2CM;
T1ES1B:
nop ;1By,1CM;
nop ;1By,1CM;T0 = 0, T1 = 1
nop ;1By,1CM;
mov A,34H ;2By,1CM;
sjmp YAMUX ;2By,2CM;
T1ES0B: ;T0 = 0, T1 = 0
nop ;1By,1CM;
mov A,32H ;2By,1CM;
sjmp YAMUX ;2By,2CM;
YAMUX:
cpl T0 ;2By,1CM;CA2 de T0
mov R1,DPL ;2By,2CM;Guardo el DPTR
mov R2,DPH ;2By,2CM;
mov DPTR,#0000H ;2By,2CM;@ de BCON
movx @DPTR,A ;1By,2CM;Acto sobre la electrnica
mov DPL,R1 ;2By,2CM;Restauro el DPTR
mov DPH,R2 ;2By,2CM
ljmp FSAMPLER
;CMtotal = 1+2+2+2+2+2+1+2+1+2+2+2+2+2+2+2+1+1+2+2+2+2+2+2+1=44CM
;-----------Fin Con multiplexacion de canales 1, 2, 3 y 4--------------------
SINMUX:
;--------------------Sin multiplexacin--------------------------------------
mov A,31H ;Cargo la copia de BCON1
mov DPTR,#0000H ;Direccin del BCON
movx @DPTR,A ;Acto sobre la electrnica con BCON1
mov R7,#04H
RETARDO1:
nop
nop
nop
nop
djnz R7,RETARDO1
ljmp FSAMPLER
;CMtotal = 1+2+2+1+1+2+2+2+2+2+2 = 19 CM
;-----------------------Fin sin multiplexacin-------------------------------
MUX1Y2:
;------------------Con multiplexacin de Canales 1 y 2----------------------
mov A,31H ;Cargo la copia de BCON1
mov DPTR,#0000H ;Direccin del BCON
movx @DPTR,A ;Acto sobre la electrnica con BCON1
nop ;1By,1CM;
mov R7,#01H ;2By,1CM; Retardo de 2 * 10 + 1 CM
RETARDO2:
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
djnz R7,RETARDO2 ;2By,2CM;
MUES2:
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
nop ;1By,1CM;
MUES:
clr INT1 ;2By,1CM;Disparo el A/D
movx @DPTR,A ;1By,2CM;Guardo en memoria la muestra anterior
cpl T0 ;1By,1CM;CA2 de T0
jb T0,T0ES1 ;3By,2CM;
mov A,31H ;2By,1CM;T0 = 0, se refiere al Canal 1 => BCON1
sjmp T0ES0 ;2By,2CM;
T0ES1:
mov A,32H ;2By,1CM;T0 = 1, se refiere al Canal 2 => BCON2
nop ;1By,1CM;
nop ;1By,1CM;
T0ES0:
mov R1,DPL ;2By,2CM;Guardo el DPTR
mov R2,DPH ;2By,2CM;
mov DPTR,#0000H ;2By,2CM;@ de BCON
movx @DPTR,A ;1By,2CM;Acto sobre la electrnica
mov DPL,R1 ;2By,2CM;Restauro el DPTR
mov DPH,R2 ;2By,2CM
ljmp FSAMPLER
;CMtotal = 1+2+1+2+1+2+2+2+2+2+2+2+2+1+1+2+2+2+2+2+2 = 34 CM
;------------------Con multiplexacin de Canales 1 y 2----------------------
FSAMPLER:
;----------------------------------------------------------------------------
;--- Fin MUESTREAR Y GUARDAR EN MEMORIA 1012 MUESTRAS ---
;----------------------------------------------------------------------------
;-----------------------------Trama final------------------------------------
mov A,#04H
movx @DPTR,A
inc DPTR ;83FD H
mov A,#FBH
movx @DPTR,A
inc DPTR ;83FE H
mov A,#04H
movx @DPTR,A
inc DPTR ;83FF H
mov A,#FBH
movx @DPTR,A
;-----------------------------Fin Trama final--------------------------------
;----------------------------------------------------------------------------
;--- LECTURA DE MEMORIA Y TRANSMISION POR EL CANAL SERIE DE 1024 DATOS
;----------------------------------------------------------------------------
mov DPTR,#8000H ;Puntero a @InicialMemoria
movx A,@DPTR ;Leo de memoria una muestra
inc DPTR
ljmp TRANS
;El gran cuello de botella
ESPERA: ;Espera activa hasta fin de transmisin
jnb TI,ESPERA ;If ( TI == 0 ) then goto ESPERA
clr TI ;Reset por soft del flag de fin de transmisin
TRANS:
mov SBUF,A ;Al finalizar la transmisin se pone TI = 1 por hard
ljmp INFINITO
;----------------------------------------------------------------------------
;--- SERVICIO A LA INTERRUPCION DE COMUNICACIONES ---
;----------------------------------------------------------------------------
; R0 esta ocupado !!!
; R1 esta ocupado !!!
; R2 esta ocupado !!!
SERVCOM:
jb RI,SERVRI
;Es una transmisin
reti
;---------------------Salvar contexto--------------------------
mov R3,A ;La rutina utiliza R3 para salvar A
;LA rutina utiliza R4 para guardar SBUF
;---------------------Fin Salvar contexto----------------------
;----------------------------------------------------------------------------
;-----------------------INICIO DECODIFICACION--------------------------------
ACDCES1:
setb 2AH.0 ;Mascara 0s, AC/DC! = 1
sjmp YGAN3
GAN3ES1:
setb 2AH.1 ;Mascara 0s, G3 = 1
sjmp YGAN2
GAN2ES1:
setb 2AH.2 ;Mascara 0s, G2 = 1
sjmp YGAN1
GAN1ES1:
setb 2AH.3 ;Mascara 0s, G1 = 1
sjmp FINCOMUN
FINCOMUN:
mov 29H,2AH ;29H ser la mascara de 1s de BC
orl 29H,#F0H ;(29H) = 1-1-1-1-G1-G2-G3-AC/DC!. Mascara 1s
;(2AH) = 0-0-0-0-G1-G2-G3-AC/DC!. Mascara 0s
;La mascara de 1s pondr los ceros
;La mascara de 0s pondr los unos
;----------Fin Comun para todos los canales----------------------------------
rlc A
jc CH0ES1X ;Obtengo CH0
sjmp SON0
CH0ES1X:
ljmp CH0ES1
SON0:
;--------CH1, CH0 = 0----------
rlc A ;Obtengo E
jc ENABLE1
;.....................Modo manual............................................
;CH1, CH0, E = 0
rlc A
jc MANUAL
clr 20H.2 ;No manual
ljmp FINRX
MANUAL:
setb 20H.2 ;Manual
rlc A
jc FUEGO
clr 20H.3 ;No existe disparo
ljmp FINRX
FUEGO:
setb 20H.3 ;Disparo ON
ljmp FINRX
;.....................Fin Modo manual........................................
ENABLE1:
;---------------------------- CANAL 1 ---------------------------------------
mov 25H,R4 ; Actualizo el BE1 !
;----------CH1 = 1.-----------
CH1ES1:
rlc A ;Obtengo CH0
jnc CH0ES0
;-----CH1 = 1, CH0 = 1.-------
rlc A ;Obtengo E
jc ENABLE4
ENABLE3:
;---------------------------- CANAL 3 --------------------------------------
mov 27H,R4 ; Actualizo el BE3 !
rlc A
jc FAC3ES1
clr 21H.6 ;BC1, FAC3! = 0
clr 22H.6 ;BC2, FAC3! = 0
clr 23H.6 ;BC3, FAC3! = 0
clr 24H.6 ;BC4, FAC3! = 0
sjmp FINRX
FAC3ES1:
setb 21H.6 ;BC1, FAC3! = 1
setb 22H.6 ;BC2, FAC3! = 1
setb 23H.6 ;BC3, FAC3! = 1
setb 24H.6 ;BC4, FAC3! = 1
sjmp FINRX
;---------------------------- Fin CANAL 3 -----------------------------------
;---------CH1 = 0, CH0 = 1.---------
CH0ES1:
;--------------------------- CANAL 2 ----------------------------------------
mov 26H,R4 ; Actualizo el BE2 !
rlc A ;Obtengo E
jc ENABLE2
CANAL2:
rlc A
jc FAC2ES1
clr 21H.5 ;BC1, FAC2! = 0
clr 22H.5 ;BC2, FAC2! = 0
clr 23H.5 ;BC3, FAC2! = 0
clr 24H.5 ;BC4, FAC2! = 0
sjmp FINRX
FAC2ES1:
setb 21H.5 ;BC1, FAC2! = 1
setb 22H.5 ;BC2, FAC2! = 1
setb 23H.5 ;BC3, FAC2! = 1
setb 24H.5 ;BC4, FAC2! = 1
sjmp FINRX
;--------------------------- Fin CANAL 2 ------------------------------------
FINRX:
;------------------Restaurar contexto-----------------------
mov A,R3
;------------------Fin Restaurar contexto-------------------
reti
;----------------------------------------------------------------------------
;--- FIN SERVICIO A LA INTERRUPCION DE COMUNICACIONES ---
;----------------------------------------------------------------------------
.end
6.2 CDIGO DE ALTO NIVEL
6.2.1 CLASE CRS232
/////////////////////////////////////////////////////////////////////////////
// RS232v3.h //
/////////////////////////////////////////////////////////////////////////////
// Clase creada por Ernest Gil y modificada por Ral Bartolom //
// //
/////////////////////////////////////////////////////////////////////////////
// 1- Al rebre un char EVENT genera una crida a una funcio ext. predefinida
// amb un temps invertit de 1,5 milisegons si el Thread te la prioritat
// THREAD_PRIORITY_TIME_CRITICAL
// 2- Exemple de creaci:
//
// void (*pOnRxChar)(int,CRS232*)= &OnRxChar; // Def. punter pOnRxChar
// CRS232* m_pRs232 = new CRS232(1024,1024); // Creaci obj RS232 i punter
// CWinThread* m_pThread1; // Declaracio Thread
// //------------------------------------------------------
// UINT Thread1(LPVOID pParam)
// {
// CRS232* punter_Rs232 = (CRS232*) pParam;
//
// punter_Rs232->Thread_Att_RS232();
// return 0;
// }
// //--------------------------------------------------
// ...
// m_pThread1=AfxBeginThread( //posta en marxa del thread
// Thread1,
// m_pRs232,
// THREAD_PRIORITY_TIME_CRITICAL);
// ...
// //--------------------------------------------------
// ...
// //--------------------------------------------------
// void OnRxChar(int NumBytes, CRS232* pRs232) // funcio d'atencio RX
// {
// int x;
// BYTE pCadena[1024];
// BYTE pHola[10];
//
// pRs232->RXcopia(pCadena);
// for (x=0;x<NumBytes;x++) {
// ::PostMessage(hPantalla,WM_DADA_RX,pCadena[x],0);
// }
// }
// //--------------------------------------------------
// void OnEspiaTx(int NumBytes, BYTE* buf) // funcio d'atencio Espia TX
// { // bytes a punt d'enviar
// ...
// }
// //--------------------------------------------------
// void OnEspiaRx(int NumBytes, BYTE* buf) // funcio d'atencio Espia RX
// { // bytes acabats de rebre
// ...
// }
// //--------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
#include "winbase.h"
/////////////////////////////////////////////////////////////////////////////
class CRS232
{
public:
// Constructor ..........................................................
CRS232(int LBufRX, int LBufTX);
// Funcions de suport ...................................................
void Thread_Att_RS232(); // Thread de control RX del
RS232
// Funcions normals .....................................................
void ConfigurarPort(
int Port, // 0=Com1,1=Com2,....
int Baudis, // 0=1k2,..,4=19k2,5=38k4,6=115k
int BitsCar, //
0=4bits,1=5b,2=6b,3=7b,4=8bits
int BitsParada, // 0=1bit,1=1.5bits,2=2bits
int Paritat, //
0=No,1=Par,2=Senar,3=Mar,4=Esp
int ControlFlux, // 0=No,1=DTR,2=RTS,3=Xon
HWND hFinestra, // finestra a enviar
missatges
void (*pRxApli)(int,CRS232*));// adrea aten. apli Tx
BOOL ObrirPort();
void TancarPort();
BOOL TX(BYTE* pCad,int bytes); // Transmitir una cadena
BOOL TXacabat(); // Torna TRUE si ha acabat TX
int RXnumBytes(); // Torna Numero bytes rebuts
int RXcopia(BYTE* pCad); // Copiar el buffer de recepcio
// Torna: Numero bytes rebuts
void EspiaHab(void (*pEspTx)(int, BYTE*), // adrea aten. esp Tx
void (*pEspRx)(int, BYTE*)); //adrea aten. esp Rx
void EspiaDeshab();
// Dades
BOOL PortObert;
HWND DestiMsg; // handler Window per enviar missat WM_..
private: //........................................................
// Funcions
BOOL CarregarDCB();
void (*pRutinaAtencio)(int,CRS232*); // Avs de recepcio RX
void (*pEspAtenTX)(int, BYTE*); // Avs espia d'emissio TX
void (*pEspAtenRX)(int, BYTE*); // Avs espia de recepcio RX
// Dades
CRS232* pAquestObjecte; // punter a aquest objecte
HANDLE m_idDisCom; // Handler del dispositiu
COMx
UINT m_wTablaBaudios[6]; // Taula de baudis
BYTE m_TablaParidad[4]; // Taula de paritat
BYTE m_TablaBitsParada[2]; // Taula de bits de parada
Int m_nPort; // Config.
int m_nBaudis; // Config.
int m_nBitsCar; // Config.
int m_nBitsParada; // Config.
int m_nParitat; // Config.
int m_nControlFlux; // Config.
int LongBufRX; // Config.--Pasado al
constructor
int LongBufTX; // Config.--Pasado al
constructor
BYTE* pBufRX; // punter del buffer de recepci
BYTE* pBufTX; // punter del buffer de transmissi
int NumBytesBufRX; // Numero de bytes---ledos
int NumBytesBufTX; // Numero de bytes---enviados
// Port tancat
PortObert=FALSE;
EspiaHabilitat =FALSE;
// overlapped
hEventEscritura = CreateEvent(
NULL, // El handler no puede ser heredado
TRUE, // manual-reset event=>usar ResetEvent
FALSE, // flag for initial state
NULL); // pointer to event-object name. Sin nombre
// La funcin CreateEvent crea un objeto evento con nombre o annimo
/*
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // pointer to security attributes
// Puntero a una estructura SSCURITY_ATTRIBUTE que determina si el handle
// retornado puede ser heredado por el proceso hijo. Si IpEventAttributes es
// NULL, el handle no puede ser heredado
BOOL bManualReset, // flag for manual-reset event
// Especifica si un objeto evento creado es manual-reset o auto-reset.
// Si TRUE entonces debes usar la funcin ResetEvent para resetear
// manualmenteel estado. Si FALSE, Windows automticamente resetea
BOOL bInitialState, // flag for initial state
// Especifica el estado inicial del objeto evento.
// Si TRUE, el estado inicial es sealizado, en caso cantrario es no sealizado
LPCTSTR lpName // pointer to event-object name
// Puntero a un string terminado con null especificando el nombre del objeto
// evento. Si es NULL el objeto evento es creado sin un nombre
);
*/
overEscritura.Offset= 0;
overEscritura.OffsetHigh= 0;
overEscritura.hEvent= hEventEscritura;
// Parity
// Specifies the parity scheme to be used.
// This member can be one of the following values:
// Value Meaning
// EVENPARITY Even
// MARKPARITY Mark
// NOPARITY No parity
// ODDPARITY Odd
// SPACEPARITY Space
// StopBits
// Specifies the number of stop bits to be used.
// This member can be one of the following values:
// Value Meaning
// ONESTOPBIT 1 stop bit
// ONE5STOPBITS 1.5 stop bits
// TWOSTOPBITS 2 stop bits
*/
}
///--------------------------------------------------------------------------
void CRS232::ConfigurarPort(
int Port,
int Baudis,
int BitsCar,
int BitsParada,
int Paritat,
int ControlFlux,
HWND hFinestra,
void (*pRxApli)(int,CRS232*)) // adrea aten. apli Tx
{
// Parametres port
m_nPort= Port;
m_nBaudis= Baudis;
m_nBitsCar= BitsCar;
m_nBitsParada= BitsParada;
m_nParitat= Paritat;
m_nControlFlux= ControlFlux;
// handler per a l'emissio de missatges WM_...
DestiMsg = hFinestra;
// adrea funcis d'atencio
pRutinaAtencio = pRxApli;
}
///--------------------------------------------------------------------------
BOOL CRS232::ObrirPort()
{
char szPort[10];
BOOL a;
// Buffers de Win95
a = SetupComm(m_idDisCom, 1024/*bufIn*/, 1024/*bufOut*/);
// La funcin SetupComm inicializa los parmetros de comunicaciones
// para la comunicacin especfica de un dispositivo.
// Establir Timeouts
COMMTIMEOUTS_1.ReadIntervalTimeout= MAXDWORD;
COMMTIMEOUTS_1.ReadTotalTimeoutMultiplier= 0;
COMMTIMEOUTS_1.ReadTotalTimeoutConstant= 0;
COMMTIMEOUTS_1.WriteTotalTimeoutMultiplier= 0;
COMMTIMEOUTS_1.WriteTotalTimeoutConstant= 0;
SetCommTimeouts(m_idDisCom, &COMMTIMEOUTS_1);
// Esta funcin establece los parmetros time-out para todas las operaciones de
// lectura y escritura en un dispositivo de comunicaciones especfico.
/*
BOOL SetCommTimeouts(
HANDLE hFile, // handle of communications device
LPCOMMTIMEOUTS lpCommTimeouts // address of communications time-out structure
);
*/
return TRUE;
}
///--------------------------------------------------------------------------
BOOL CRS232::CarregarDCB()
{
DCB dcb;
GetCommState(m_idDisCom, &dcb);
// Esta funcin llena en un bloque de control-dispositivo (una estructura DCB)
// con el control actual para un dispositivo de comunicaciones concreto.
/*
BOOL GetCommState( HANDLE hFile, // handle of communications device
LPDCB lpDCB // address of device-control block structure
);
*/
dcb.BaudRate = m_wTablaBaudios[m_nBaudis];
dcb.Parity = m_TablaParidad[m_nParitat];
dcb.ByteSize = (BYTE)(m_nBitsCar + 4);
dcb.StopBits = m_TablaBitsParada[m_nBitsParada];
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fErrorChar= FALSE;
dcb.EvtChar = EVENT;
dcb.EofChar = EOT;
// Control de flux
switch(m_nControlFlux) {
case (0): // Sense ==> Sortides: DTR, RTS disable
dcb.fDsrSensitivity = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutxCtsFlow = FALSE;
break;
case (1): // DTR/DSR ==> Sortides: RTS=DISABLE, No importa
CTS.
dcb.fDsrSensitivity = TRUE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxDsrFlow = TRUE;
dcb.fOutxCtsFlow = FALSE;
break;
case (2): // RTS/CTS ==> Sortides: DTR=DISABLE, No importa
DSR.
dcb.fDsrSensitivity = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutxCtsFlow = TRUE;
break;
case (3): // Control de flux software Xon/Xoff
dcb.fInX = TRUE;
dcb.fOutX = TRUE;
dcb.XonChar = XON;
dcb.XoffChar = XOFF;
dcb.XonLim = 20;
dcb.XoffLim = 20;
dcb.fDsrSensitivity = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutxCtsFlow = FALSE;
break;
}
while(TRUE) {//----------------------------------------------------
if (PortObert==FALSE) return;
if (bitResult==FALSE) {
dwResult=GetLastError();
if (dwResult != ERROR_IO_PENDING) {
::PostMessage(DestiMsg,WM_ERROR_ACCES_PORT,1,dwResult);
return;
}
}
if (bitResult==FALSE) {
dwResult=GetLastError();
if (dwResult != ERROR_IO_PENDING) {
::PostMessage(DestiMsg,WM_ERROR_ACCES_PORT,2,dwResult);
return;
}
}
ResetEvent(hEvent1);
if ((dwResult!= WAIT_OBJECT_0)||(PortObert==FALSE)) {
return;
}
if (bitResult==FALSE) {
::PostMessage(DestiMsg,WM_ERROR_ACCES_PORT,3,dwResult);
return;
}
// Llegir bytes...........................................
bitResult = ReadFile(
m_idDisCom, // handle al port
pBufRxTemp, // buffer
Bytes, // bytes a llegir
&BytesLlegits,
&over1); // adrea estruct. overlapped
// Espia.............................
if (EspiaHabilitat==TRUE) {
(*pEspAtenRX)(BytesLlegits, pBufRxTemp);
}
// Tractament buffer......................................
// Copiar buffer.....................
for (x=0;x<NumBytes;x++) pBufTX[x]= pCadena[x];
NumBytesBufTX= NumBytes;
// Espia.............................
if (EspiaHabilitat==TRUE) {
(*pEspAtenTX)(NumBytesBufTX, pBufTX);
}
// Escriure al RS232.................
result = WriteFile( m_idDisCom,
pBufTX,
NumBytesBufTX,
&bytes_escritos,
&overEscritura);
if (result==FALSE) {
error=GetLastError();
if (error==ERROR_IO_PENDING) result=TRUE;
}
return result;
}
///--------------------------------------------------------------------------
int CRS232::RXnumBytes()
{
return NumBytesBufRX;
}
///--------------------------------------------------------------------------
int CRS232::RXcopia(BYTE* pCadena)
{
int x;
return NumBytesBufRX;
}
///--------------------------------------------------------------------------
BOOL CRS232::TXacabat()
{
DWORD dwResult;
#if !defined(AFX_SCOPEDOC_H__DA985EE4_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#define AFX_SCOPEDOC_H__DA985EE4_C77B_11D3_BB39_ACF5B442421C__INCLUDED_
public:
typedef struct { // Almacena el estado de un canal
int nGanancia;
int nDivisor;
BOOL bACDCneg;
BOOL bEnable;
} SCanalDoc;
public:
void ScopeCrearVin(); // Crea el vector para la vista
void ScopeDecodificarTramaRX(int nCanal);
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CScopeDoc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CScopeDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CScopeDoc)
afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the
previous line.
#endif // !defined(AFX_SCOPEDOC_H__DA985EE4_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
// scopeDoc.cpp : implementation of the CScopeDoc class
//
#include "stdafx.h"
#include "scope.h"
#include "scopeDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc
//int CScopeDoc::s_nMaxPoint = 1024;
double CScopeDoc::s_dValueDivisor[2] = {0.012, 1};
double CScopeDoc::s_dValueGanancia[8] = {0.5, 1, 2, 5, 10, 20, 50, 100};
IMPLEMENT_DYNCREATE(CScopeDoc, CDocument)
BEGIN_MESSAGE_MAP(CScopeDoc, CDocument)
//{{AFX_MSG_MAP(CScopeDoc)
ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc construction/destruction
CScopeDoc::CScopeDoc()
{
}
CScopeDoc::~CScopeDoc()
{
}
BOOL CScopeDoc::OnNewDocument()
{
TRACE("En CScopeV1Doc::OnNewDocument()\n");
if (!CDocument::OnNewDocument())
return FALSE;
// (SDI documents will reuse this document)
m_nVinPuntos = 0;
m_pVin = new double [m_nArrayPuntos - 12];// Puntero para la vista. En voltios
m_pCanalDoc[1].nGanancia = 0;
m_pCanalDoc[1].nDivisor = 0;
m_pCanalDoc[1].bACDCneg = FALSE;
m_pCanalDoc[1].bEnable = FALSE;
m_pCanalDoc[2].nGanancia = 0;
m_pCanalDoc[2].nDivisor = 0;
m_pCanalDoc[2].bACDCneg = FALSE;
m_pCanalDoc[2].bEnable = FALSE;
m_pCanalDoc[3].nGanancia = 0;
m_pCanalDoc[3].nDivisor = 0;
m_pCanalDoc[3].bACDCneg = FALSE;
m_pCanalDoc[3].bEnable = FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc serialization
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc diagnostics
#ifdef _DEBUG
void CScopeDoc::AssertValid() const
{
CDocument::AssertValid();
}
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc commands
void CScopeDoc::ScopeCrearVin()
{
// Crea el vector con el puntero m_pVin con doubles.
// Los valores estn en V / ms y los utilizara la vista
// para dibujar los canales en OnDraw y OnPrint
ScopeDecodificarTramaRX(0); // Se decodifican los bytes
ScopeDecodificarTramaRX(1); // de estado de cada uno de
ScopeDecodificarTramaRX(2); // los canales
ScopeDecodificarTramaRX(3);
int nNumCanales = 1;
if (m_pCanalDoc[1].bEnable) {
nNumCanales = 2;
}
if (m_pCanalDoc[3].bEnable) {
nNumCanales = 4;
}
if (nNumCanales == 1) {
for (int i = 0; i < m_nVinPuntos; i++) {
m_pVin[i] = ((((double) m_arrayMuestras[i + 4]) * 5 / 255) - 2.5)/
(s_dValueGanancia[(m_pCanalDoc[0].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[0].nDivisor)]);
}
}
else {
if (nNumCanales == 2) {
int nVinPuntos = m_nVinPuntos / 2;
for (int i = 0; i < nVinPuntos; i++) {
m_pVin[2 * i] = ((((double) m_arrayMuestras[2*i+4])*5/255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[0].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[0].nDivisor)]);
m_pVin[2 * i + 1] = ((((double) m_arrayMuestras[2*i+5])*5/255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[1].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[1].nDivisor)]);
}
}
else {
int nVinPuntos = m_nVinPuntos / 4;
for (int i = 0; i < nVinPuntos; i++) {
m_pVin[4 * i] = ((((double) m_arrayMuestras[4*i+4])*5 / 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[0].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[0].nDivisor)]);
m_pVin[4 * i + 1] = ((((double) m_arrayMuestras[4*i+5])*5/ 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[1].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[1].nDivisor)]);
m_pVin[4 * i + 2] = ((((double) m_arrayMuestras[4*i+6])*5/ 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[2].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[2].nDivisor)]);
m_pVin[4 * i + 3] = ((((double) m_arrayMuestras[4*i+7])*5/ 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[3].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[3].nDivisor)]);
}
}
}
}
void CScopeDoc::ScopeDecodificarTramaRX(int nCanal)
{
// Decodifica los Bytes de estado situados despus
// de la trama de inicio
BYTE byteEstado;
byteEstado = m_arrayMuestras[nCanal];
BYTE byteAux; // Miro G3
if (byteEstado & 0x02) { // 0000 0010
// G3 = 1
byteAux = 0x04; // 0000 0100
}
else { // G3 = 0
byteAux = 0x00;
}
byteEstado = m_arrayMuestras[nCanal]; // Miro G2
if (byteEstado & 0x04) { // 0000 0100
// G2 = 1
byteAux = byteAux | 0x02; // 0000 0010
}
else { // G2 = 0
byteAux = byteAux & 0xFD; // 1111 1101
}
byteEstado = m_arrayMuestras[nCanal]; // Miro G1
if (byteEstado & 0x08) { // 0000 1000
// G1 = 1
byteAux = byteAux | 0x01; // 0000 0001
}
else {
// G1 = 0
byteAux = byteAux & 0xFE; // 1111 1110
}
m_pCanalDoc[nCanal].nGanancia = (int) byteAux;
}
6.2.3 CLASE CPERSISTENTFRAME
// Persist.h
#ifndef _INSIDE_VISUAL_CPP_PERSISTENT_FRAME
#define _INSIDE_VISUAL_CPP_PERSISTENT_FRAME
//{{AFX_VIRTUAL(CPersistentFrame)
public:
virtual void ActivateFrame(int nCmdShow = -1);
protected:
//}}AFX_VIRTUAL
//{{AFX_MSG(CPersistentFrame)
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif // _INSIDE_VISUAL_CPP_PERSISTENT_FRAME
// Persist.cpp Clase de marco persistente para aplicaciones SDI
#include "stdafx.h"
#include "persist.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////
// CPersistentFrame
BEGIN_MESSAGE_MAP(CPersistentFrame, CFrameWnd)
//{{AFX_MSG_MAP(CPersistentFrame)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////
CPersistentFrame::CPersistentFrame()
{
m_bFirstTime = TRUE;
}
///////////////////////////////////////////////////////////////
CPersistentFrame::~CPersistentFrame()
{
}
///////////////////////////////////////////////////////////////
void CPersistentFrame::OnDestroy()
{
CString strText;
BOOL bIconic, bMaximized;
WINDOWPLACEMENT wndpl;
wndpl.length = sizeof(WINDOWPLACEMENT);
// Obtiene la posicin actual de la ventana y
// su estado (iconizada/maximizada)
BOOL bRet = GetWindowPlacement(&wndpl);
if (wndpl.showCmd == SW_SHOWNORMAL) {
bIconic = FALSE;
bMaximized = FALSE;
}
else if (wndpl.showCmd == SW_SHOWMAXIMIZED) {
bIconic = FALSE;
bMaximized = TRUE;
}
else if (wndpl.showCmd == SW_SHOWMINIMIZED) {
bIconic = TRUE;
if (wndpl.flags) {
bMaximized = TRUE;
}
else {
bMaximized = FALSE;
}
}
///////////////////////////////////////////////////////////////
void CPersistentFrame::ActivateFrame(int nCmdShow)
{
CString strText;
BOOL bIconic, bMaximized;
UINT flags;
WINDOWPLACEMENT wndpl;
CRect rect;
if (m_bFirstTime) {
m_bFirstTime = FALSE;
strText = AfxGetApp()->GetProfileString(s_profileHeading,
s_profileRect);
if (!strText.IsEmpty()) {
rect.left = atoi((const char*) strText);
rect.top = atoi((const char*) strText + 5);
rect.right = atoi((const char*) strText + 10);
rect.bottom = atoi((const char*) strText + 15);
}
else {
rect = s_rectDefault;
}
bIconic = AfxGetApp()->GetProfileInt(s_profileHeading,
s_profileIcon, 0);
bMaximized = AfxGetApp()->GetProfileInt(s_profileHeading,
s_profileMax, 0);
if (bIconic) {
nCmdShow = SW_SHOWMINNOACTIVE;
if (bMaximized) {
flags = WPF_RESTORETOMAXIMIZED;
}
else {
flags = WPF_SETMINPOSITION;
}
}
else {
if (bMaximized) {
nCmdShow = SW_SHOWMAXIMIZED;
flags = WPF_RESTORETOMAXIMIZED;
}
else {
nCmdShow = SW_NORMAL;
flags = WPF_SETMINPOSITION;
}
}
wndpl.length = sizeof(WINDOWPLACEMENT);
wndpl.showCmd = nCmdShow;
wndpl.flags = flags;
wndpl.ptMinPosition = CPoint(0, 0);
wndpl.ptMaxPosition =
CPoint(-::GetSystemMetrics(SM_CXBORDER),
-::GetSystemMetrics(SM_CYBORDER));
wndpl.rcNormalPosition = rect;
LoadBarState(AfxGetApp()->m_pszProfileName);
// dispone la posicin de la ventana, y su estado
// (minimizado/maximizado)
BOOL bRet = SetWindowPlacement(&wndpl);
}
CFrameWnd::ActivateFrame(nCmdShow);
}
6.2.4 CLASE CMAINFRAME
// MainFrm.h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_MAINFRM_H__DA985EE2_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#define AFX_MAINFRM_H__DA985EE2_C77B_11D3_BB39_ACF5B442421C__INCLUDED_
#include "persist.h"
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the
previous line.
#endif // !defined(AFX_MAINFRM_H__DA985EE2_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "scope.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CPersistentFrame)
BEGIN_MESSAGE_MAP(CMainFrame, CPersistentFrame)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}
if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Remove this if you don't want tool tips or a resizeable toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
return CPersistentFrame::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CPersistentFrame::AssertValid();
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
6.2.5 CLASE CSCOPEVIEW
// scopeView.h : interface of the CScopeView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCOPEVIEW_H__DA985EE6_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#define AFX_SCOPEVIEW_H__DA985EE6_C77B_11D3_BB39_ACF5B442421C__INCLUDED_
class CControlDlg;
class CActuarDlg;
class CRS232;
//-----------------------------GLOBALES------------------------
//Declaracin del hilo global
UINT MiThread(LPVOID);
//Dibuja un canal
void ScopeDrawChanel(CDC* pDC, // Puntero a contexto de dispositivo
CScopeDoc* pDoc, // Puntero a documento
SCanal* pCanal, // Puntero a modo representacin canal
int nMux, // Modo de multiplexacin
CSize sizeRango, // Rango de visualizacin
double dTMuestreo); // Periodo de muestreo en ms
//Dibuja el fondo
void ScopeBackground(CDC* pDC, // Puntero a contexto de dispositivo
CSize sizeBackground, // Tamao del fondo
BYTE bRedB, // Colores del marco
BYTE bGreenB,
BYTE bBlueB,
int nWidthP, // Grosor de las divisiones
BYTE bRedP, // Color de las divisiones
BYTE bGreenP,
BYTE bBlueP);
BOOL m_bOnActuarDlg;
CActuarDlg* m_pActuarDlg;
// Attributes
public:
CScopeDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CScopeView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnPrepareDC(CDC* pDC, CPrintInfo* pInfo = NULL);
virtual void OnInitialUpdate();
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CScopeView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the
previous line.
#endif // !defined(AFX_SCOPEVIEW_H__DA985EE6_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
// scopeView.cpp : implementation of the CScopeView class
//
#include "stdafx.h"
#include "scope.h"
#include "scopeDoc.h"
#include "scopeView.h"
#include "ControlDlg.h"
#include "ActuarDlg.h"
#include "Rs232v3.h"
#include "ConfigComDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScopeView
//Para el registro
const char CScopeView::s_profileHeadingCom[] = "Configuracion RS232";
const char CScopeView::s_profileCom[] = "Puerto";
const char CScopeView::s_profileBaudios[] = "Baudios";
punteroRs232->Thread_Att_RS232();
return 0;
}
//-------------------------------------------------------------------Fin GOOBAL
IMPLEMENT_DYNCREATE(CScopeView, CView)
BEGIN_MESSAGE_MAP(CScopeView, CView)
ON_MESSAGE(WM_GOODBYE_CONTROL, OnScopeControlGoodbye)
ON_MESSAGE(WM_GOODBYE_ACTUAR, OnScopeActuarGoodbye)
ON_MESSAGE(WM_ERROR_ACCES_PORT, OnScopeErrorAccesPort)
ON_MESSAGE(WM_DATA_RX, OnScopeDataRX)
//{{AFX_MSG_MAP(CScopeView)
ON_COMMAND(ID_SCOPE_ACTUAR, OnScopeActuar)
ON_UPDATE_COMMAND_UI(ID_SCOPE_ACTUAR, OnUpdateScopeActuar)
ON_COMMAND(ID_SCOPE_CONTROL, OnScopeControl)
ON_UPDATE_COMMAND_UI(ID_SCOPE_CONTROL, OnUpdateScopeControl)
ON_COMMAND(ID_SCOPE_COMUNICACION_CONFIGURAR, OnScopeComunicacionConfigurar)
ON_COMMAND(ID_SCOPE_COMUNICACION, OnScopeComunicacion)
ON_UPDATE_COMMAND_UI(ID_SCOPE_COMUNICACION, OnUpdateScopeComunicacion)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScopeView construction/destruction
CScopeView::CScopeView()
{
g_pView = this;
ScopeAbrirFicheroIni();
m_bOnComunicacionDlg = FALSE;
m_pRs232 = g_pRs232;
m_nIndiceRX = 0; // By recibidos
m_aPaintCanal[1].nCanal = 1;
m_aPaintCanal[1].nFactorX = 0;
m_aPaintCanal[1].nFactorY = 0;
m_aPaintCanal[1].nWidthC = 4;
m_aPaintCanal[1].bRedC = 255;
m_aPaintCanal[1].bGreenC = 150;
m_aPaintCanal[1].bBlueC = 150;
m_aPaintCanal[2].nCanal = 2;
m_aPaintCanal[2].nFactorX = 0;
m_aPaintCanal[2].nFactorY = 0;
m_aPaintCanal[2].nWidthC = 4;
m_aPaintCanal[2].bRedC = 150;
m_aPaintCanal[2].bGreenC = 255;
m_aPaintCanal[2].bBlueC = 150;
m_aPaintCanal[3].nCanal = 3;
m_aPaintCanal[3].nFactorX = 0;
m_aPaintCanal[3].nFactorY = 0;
m_aPaintCanal[3].nWidthC = 4;
m_aPaintCanal[3].bRedC = 150;
m_aPaintCanal[3].bGreenC = 150;
m_aPaintCanal[3].bBlueC = 255;
m_aPrintCanal[1].nCanal = 1;
m_aPrintCanal[1].nFactorX = 0;
m_aPrintCanal[1].nFactorY = 0;
m_aPrintCanal[1].nWidthC = 4;
m_aPrintCanal[1].bRedC = 255;
m_aPrintCanal[1].bGreenC = 0;
m_aPrintCanal[1].bBlueC = 0;
m_aPrintCanal[2].nCanal = 2;
m_aPrintCanal[2].nFactorX = 0;
m_aPrintCanal[2].nFactorY = 0;
m_aPrintCanal[2].nWidthC = 4;
m_aPrintCanal[2].bRedC = 0;
m_aPrintCanal[2].bGreenC = 255;
m_aPrintCanal[2].bBlueC = 0;
m_aPrintCanal[3].nCanal = 3;
m_aPrintCanal[3].nFactorX = 0;
m_aPrintCanal[3].nFactorY = 0;
m_aPrintCanal[3].nWidthC = 4;
m_aPrintCanal[3].bRedC = 0;
m_aPrintCanal[3].bGreenC = 0;
m_aPrintCanal[3].bBlueC = 255;
}
CScopeView::~CScopeView()
{
ScopeGuardarFicheroIni();
if (m_pRs232->PortObert) {
m_pRs232->TancarPort();
}
delete m_pControlDlg;
delete m_pActuarDlg;
}
void CScopeView::OnInitialUpdate()
{
// Se inicializan los datos miembros de los dilogos
// Se entra tambin despus de nuevo documento
m_pControlDlg->m_nTrackbarCanal1 = 0;
m_pControlDlg->m_nTrackbarCanal2 = 0;
m_pControlDlg->m_nTrackbarCanal3 = 0;
m_pControlDlg->m_nTrackbarCanal4 = 0;
m_pControlDlg->m_nTrackbarTimeDiv = 0;
m_pControlDlg->m_nCanales = 0;
m_pControlDlg->m_bControlManual = FALSE;
m_pControlDlg->m_bInteractivo = FALSE;
m_pControlDlg->m_nAcDcC1 = 0;
m_pControlDlg->m_nAcDcC2 = 0;
m_pControlDlg->m_nAcDcC3 = 0;
m_pControlDlg->m_nAcDcC4 = 0;
m_pActuarDlg->m_nCanal = 0;
m_pActuarDlg->m_nDivisor = 0;
m_pActuarDlg->m_nGanancia = 0;
m_pActuarDlg->m_nDCAC = 0;
m_pActuarDlg->m_nEnable = FALSE;
m_pActuarDlg->m_bSimula = FALSE;
m_pActuarDlg->m_bConTramas = TRUE;
m_pActuarDlg->m_bEnableIn = FALSE;
m_pActuarDlg->m_bEnableOut = FALSE;
UpdateData(FALSE);
if (m_bOnControlDlg==FALSE) {
OnScopeControl(); //Si el dilogo de control esta cerrado lo abro
}
m_pControlDlg->OnApplyPublic();
}
return CView::PreCreateWindow(cs);
}
////////////////////////////////////////////////////////////////////////////
// CScopeView apoyo a la visualizacin
pDC->Rectangle(CRect(0, sizeBackground.cy / 2,
sizeBackground.cx, - sizeBackground.cy / 2));//En unidades lgicas
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CScopeView::ScopeDrawChanel(CDC* pDC,
CScopeDoc* pDoc,
SCanal* pCanal,
int nMux,
CSize sizeRango,
double dTMuestreo)
{
// Dibuja un canal. En pantalla o en presentacin
// preliminar segn quien la llame
CPen newPen(PS_SOLID,
pCanal->nWidthC,
RGB(pCanal->bRedC,
pCanal->bGreenC,
pCanal->bBlueC));
CPen* pOldPen = pDC->SelectObject(&newPen);
int i, j, x, y, nYmax;
nYmax = sizeRango.cy / 2;
// Primer punto
pDC->MoveTo(CPoint(pCanal->nCanal * dTMuestreo * sizeRango.cx * 0.1 /
s_dValueTimeDiv[(pCanal->nFactorX)],
pDoc->m_pVin[pCanal->nCanal] * sizeRango.cy * 0.1 /
s_dValueCanal[(pCanal->nFactorY)]));
int nSizeMinLogical;
// Se dibuja el fondo
ScopeBackground(pDC,
CSize(nSizeMinLogical, nSizeMinLogical)/*Unidades lgicas*/,
0 /*RedB*/,
0 /*GreenB*/,
0 /*BlueB*/,
1 /*WidthP*/,
100 /*RedP*/,
100 /*GreenP*/,
100 /*BlueP*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPaintCanal[1],
2,
s_sizeRangoHimetricPaint,
0.034/*En ms*/);
}
if (nCanalMux == 3) {
ScopeDrawChanel(pDC,
pDoc,
&m_aPaintCanal[0],
4,
s_sizeRangoHimetricPaint,
0.044/*En ms*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPaintCanal[1],
4,
s_sizeRangoHimetricPaint,
0.044/*En ms*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPaintCanal[2],
4,
s_sizeRangoHimetricPaint,
0.044/*En ms*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPaintCanal[3],
4,
s_sizeRangoHimetricPaint,
0.044/*En ms*/);
}
}
/////////////////////////////////////////////////////////////////////////////
// CScopeView printing
pDC->LPtoDP(rectPrintDevice);
CSize sizePrintDevice = rectPrintDevice.Size();
// Se obtiene el tamao mnimo
if (sizePrintDevice.cx > - sizePrintDevice.cy) {
nSizeMinPrintDevice = - sizePrintDevice.cy; // en unidades dispositivo
}
else {
nSizeMinPrintDevice = sizePrintDevice.cx;
}
pDC->SetViewportOrg(0, nSizeMinPrintDevice / 2); // Se establece el origen
rectPrintLogical.NormalizeRect();
CSize sizePrintLogical = rectPrintLogical.Size();
int nSizeMinPrintLogical;
// Se establece el tamao mnimo
if (sizePrintLogical.cy > sizePrintLogical.cx) {
nSizeMinPrintLogical = sizePrintLogical.cx; // en unidades lgicas
}
else {
nSizeMinPrintLogical = sizePrintLogical.cy;
}
// Se dibuja el fondo
ScopeBackground(pDC,
CSize(nSizeMinPrintLogical, nSizeMinPrintLogical)/*Unidades lgicas*/,
255 /*RedB*/,
255 /*GreenB*/,
255 /*BlueB*/,
1 /*WidthP*/,
100 /*RedP*/,
100 /*GreenP*/,
100 /*BlueP*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPrintCanal[1],
2,
sizeRangoHimetricPrint,
2 * 0.034/*En ms*/);
}
if (nCanalMux == 3) {
ScopeDrawChanel(pDC,
pDoc,
&m_aPrintCanal[0],
4,
sizeRangoHimetricPrint,
4 * 0.044/*En ms*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPrintCanal[1],
4,
sizeRangoHimetricPrint,
4 * 0.044/*En ms*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPrintCanal[2],
4,
sizeRangoHimetricPrint,
4 * 0.044/*En ms*/);
ScopeDrawChanel(pDC,
pDoc,
&m_aPrintCanal[3],
4,
sizeRangoHimetricPrint,
4 * 0.044/*En ms*/);
}
}
/////////////////////////////////////////////////////////////////////////////
// CScopeView diagnostics
#ifdef _DEBUG
void CScopeView::AssertValid() const
{
CView::AssertValid();
}
/////////////////////////////////////////////////////////////////////////////
// CScopeView message handlers
/////////////////////////////////////////////////////////////////////////////
// Dilogo de control
void CScopeView::OnScopeControl()
{
// Crea el dilogo si todava no est creado
if (m_bOnControlDlg) { // No se pierden los datos miembro, slo se elimina
m_pControlDlg->DestroyWindow(); // la ventana
m_bOnControlDlg = FALSE;
}
else {
if (m_pControlDlg->GetSafeHwnd() == 0) {
m_pControlDlg->Create(); //Muestra la ventana del dilogo
m_bOnControlDlg = TRUE;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// Dilogo de control avanzado
void CScopeView::OnScopeActuar()
{
if (m_bOnActuarDlg) {
m_pActuarDlg->DestroyWindow();
m_bOnActuarDlg = FALSE;
}
else {
if (m_pActuarDlg->GetSafeHwnd() == 0) {
m_pActuarDlg->Create(); // muestra la ventana del dilogo
m_bOnActuarDlg = TRUE;
}
}
}
if (wParam == IDOK) {
m_pActuarDlg->DestroyWindow();
m_bOnActuarDlg = FALSE;
}
if (wParam == IDENVIAR) {
BOOL bTransmit = m_pRs232->TX(
m_pActuarDlg->m_pCadenaTX,
m_pActuarDlg->m_nNumBytesTX);
if (bTransmit == 0) {
char pcMensaje[100];
wsprintf(pcMensaje, "Error al escribir en el puerto serie");
MessageBox(pcMensaje, AfxGetAppName(), MB_OK | MB_ICONSTOP);
}
}
return 0L;
}
/////////////////////////////////////////////////////////////////////////////
// Dilogos de comunicacin
void CScopeView::OnScopeComunicacion()
{
//Abrir o cerrar el puerto serie
char pcMensaje[100];
if (m_bOnComunicacionDlg) {
UpdateData(TRUE);
if (!m_pControlDlg->m_bInteractivo) {
m_pRs232->TancarPort();
m_bOnComunicacionDlg = FALSE;
wsprintf(pcMensaje, "Puerto serie cerrado");
MessageBox(pcMensaje, AfxGetAppName(), MB_OK | MB_ICONINFORMATION);
}
else {
//Para evitar "infinitos" mensajes de error al escribir en el puerto
wsprintf(pcMensaje, "Inhabilitar antes el control interactivo");
MessageBox(pcMensaje, AfxGetAppName(), MB_OK | MB_ICONINFORMATION);
}
}
else {
m_pRs232->ConfigurarPort(
m_comRs232.nPuerto,
m_comRs232.nBaudios,
m_comRs232.nBitsCar,
m_comRs232.nBitsParada,
m_comRs232.nParidad,
m_comRs232.nControlFlujo,
GetSafeHwnd(), //Ventana a la que enviar los mensajes
g_pOnRxChar); //Puntero a funcin de servicio
BOOL bAbrir = m_pRs232->ObrirPort();
if (bAbrir == FALSE) {
wsprintf(pcMensaje, "Error al abrir el puerto serie");
MessageBox(pcMensaje, AfxGetAppName(), MB_OK | MB_ICONSTOP);
}
else {
//Puesto abierto. Puesta en marcha del Thread
g_pMiThread = AfxBeginThread(
MiThread,
m_pRs232,
THREAD_PRIORITY_TIME_CRITICAL);
m_bOnComunicacionDlg = TRUE;
wsprintf(pcMensaje, "Puerto serie abierto satisfactoriamente");
MessageBox(pcMensaje, AfxGetAppName(), MB_OK | MB_ICONINFORMATION);
}
}
}
void CScopeView::OnScopeComunicacionConfigurar()
{
//Configurar puerto
if (!m_bOnComunicacionDlg) {
CConfigComDlg dlg;
dlg.m_nCom = m_comRs232.nPuerto;
dlg.m_nBaudios = m_comRs232.nBaudios;
m_comRs232.nPuerto = dlg.m_nCom;
m_comRs232.nBaudios = dlg.m_nBaudios;
}
else {
char Mensaje[100];
wsprintf(Mensaje, "Cerrar antes el puerto serie");
MessageBox(Mensaje, AfxGetAppName(), MB_OK | MB_ICONSTOP);
}
}
void CScopeView::OnUpdateScopeComunicacion(CCmdUI* pCmdUI)
{
if (m_bOnComunicacionDlg) {
pCmdUI->SetCheck(1);
}
else {
pCmdUI->SetCheck(0);
}
}
/////////////////////////////////////////////////////////////////////////////
// Funciones de recepcin
pRs232->RXcopia(pCadena);
for (int j = 0; j < nNumBytes; j++) {
g_pView->PostMessage(WM_DATA_RX, pCadena[j], j);
}
}
UpdateData(TRUE);
if (m_pActuarDlg->m_bConTramas) { //Con trama de inicio y final
if (m_tramaInicio.bByte4) { //Trama inicio detectada,
ScopeDetectarTrama(&m_tramaFinal, byteValor);
if (m_tramaFinal.bByte4) { //Trama final detecatda =>
fin
m_tramaInicio.bByte1 = FALSE; // Reset
m_tramaInicio.bByte2 = FALSE;
m_tramaInicio.bByte3 = FALSE;
m_tramaInicio.bByte4 = FALSE;
m_tramaFinal.bByte1 = FALSE;
m_tramaFinal.bByte2 = FALSE;
m_tramaFinal.bByte3 = FALSE;
m_tramaFinal.bByte4 = FALSE;
if (m_bOnActuarDlg) {
if (m_pActuarDlg->m_bEnableIn) {
_itoa(m_nIndiceRX + 1, pcRX, 16);
m_pActuarDlg->m_strEditRX += " fb n=";
m_pActuarDlg->m_strEditRX += pcRX;
}
}
//By guardados = (m_nIndiceRX + 1) By (por empezar en 0) =
// 4 By de estado + X By de datos + 4 By trama final
//By recibidos reales = 4 By trama inicial + (m_nIndiceRX + 1) By
pDoc->m_nVinPuntos = m_nIndiceRX - 7;
// Se habilita botn guardar
GetDocument()->SetModifiedFlag();
// Se crea el nuevo vector que usar la vista
pDoc->ScopeCrearVin();
InvalidateRect(m_rectClientHimetric);
// Actualiza la vista
m_nIndiceRX = 0;
}
else { //Cargar buffer. Se detect la trama de inicio
if (m_bOnActuarDlg) {
if (m_pActuarDlg->m_bEnableIn) {
_itoa(byteValor, pcRX, 16);
if (m_nIndiceRX == 0) {
m_pActuarDlg->m_strEditRX = pcRX;
}
else {
m_pActuarDlg->m_strEditRX += " ";
m_pActuarDlg->m_strEditRX += pcRX;
}
}
}
pDoc->m_arrayMuestras[m_nIndiceRX] = byteValor;
// Se actualiza el documento
m_nIndiceRX++;
}
}
else { // Se est detectando la trama de inicio
ScopeDetectarTrama(&m_tramaInicio, byteValor);
m_nIndiceRX = 0;
}
}
else { //Sin detectar tramas. Slo se aprecia el el dilogo Control avanzado
if (m_bOnActuarDlg) {
if (m_pActuarDlg->m_bEnableIn) {
_itoa(byteValor, pcRX, 16);
m_pActuarDlg->m_strEditRX += pcRX;
m_pActuarDlg->m_strEditRX += " ";
}
}
}
if (m_bOnActuarDlg) {
if (m_pActuarDlg->m_bEnableIn) {
m_pActuarDlg->UpdateData(FALSE);
}
}
return 0L;
}
return 0L;
}
void CScopeView::ScopeDetectarTrama(STrama* pTrama, BYTE byteValor)
{
//Detecta la trama de inicio o final
if ((byteValor == pTrama->bytePrimero) || pTrama->bByte1) {
if (!pTrama->bByte1) { //1 vez
pTrama->bByte1 = TRUE;
}
else { //2, 3 o 4 vez
if ((byteValor == pTrama->byteSegundo) || pTrama->bByte2) {
if (!pTrama->bByte2) { //1 vez
pTrama->bByte2 = TRUE;
}
else { //2 o 3 vez
if ((byteValor == pTrama->byteTercero) ||
pTrama->bByte3)
{
if (!pTrama->bByte3) { //1 vez
pTrama->bByte3 = TRUE;
}
else {//2 vez
if (byteValor ==
pTrama->byteCuarto) {
pTrama->bByte4 = TRUE;
//Trama inicio o final
detectada
}
else {
pTrama->bByte1 = FALSE;
pTrama->bByte2 = FALSE;
pTrama->bByte3 = FALSE;
}
}
}
else {
pTrama->bByte1 = FALSE;
pTrama->bByte2 = FALSE;
}
}
}
else {
pTrama->bByte1 = FALSE;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// Funciones para el registro de Windows
void CScopeView::ScopeAbrirFicheroIni()
{
CScopeApp* pApp = (CScopeApp*) AfxGetApp();
m_comRs232.nPuerto = pApp->GetProfileInt(s_profileHeadingCom,
s_profileCom, 0); //Com1, valor por defecto si no encuentra el otro
m_comRs232.nBaudios = pApp->GetProfileInt(s_profileHeadingCom,
s_profileBaudios, 3); //9600baudios
m_comRs232.nParidad = 0; //Sin paridad
m_comRs232.nBitsCar = 4; //8Bits/Byte
m_comRs232.nBitsParada = 0; //1bit
m_comRs232.nControlFlujo = 0; //Sin control de flujo
}
void CScopeView::ScopeGuardarFicheroIni()
{
CScopeApp* pApp = (CScopeApp*) AfxGetApp();
pApp->WriteProfileInt(s_profileHeadingCom, s_profileCom, m_comRs232.nPuerto);
pApp->WriteProfileInt(s_profileHeadingCom, s_profileBaudios, m_comRs232.nBaudios);
}
6.2.6 CLASE CSCOPEDOC
// scopeDoc.h : interface of the CScopeDoc class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCOPEDOC_H__DA985EE4_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#define AFX_SCOPEDOC_H__DA985EE4_C77B_11D3_BB39_ACF5B442421C__INCLUDED_
private:
static double s_dValueGanancia[]; // V / div
static double s_dValueDivisor[]; // ms / div
public:
typedef struct { // Almacena el estado de un canal
int nGanancia;
int nDivisor;
BOOL bACDCneg;
BOOL bEnable;
} SCanalDoc;
public:
void ScopeCrearVin(); // Crea el vector para la vista
void ScopeDecodificarTramaRX(int nCanal);
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CScopeDoc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CScopeDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the
previous line.
#endif // !defined(AFX_SCOPEDOC_H__DA985EE4_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#include "stdafx.h"
#include "scope.h"
#include "scopeDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc
//int CScopeDoc::s_nMaxPoint = 1024;
double CScopeDoc::s_dValueDivisor[2] = {0.012, 1};
double CScopeDoc::s_dValueGanancia[8] = {0.5, 1, 2, 5, 10, 20, 50, 100};
IMPLEMENT_DYNCREATE(CScopeDoc, CDocument)
BEGIN_MESSAGE_MAP(CScopeDoc, CDocument)
//{{AFX_MSG_MAP(CScopeDoc)
ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc construction/destruction
CScopeDoc::CScopeDoc()
{
}
CScopeDoc::~CScopeDoc()
{
}
BOOL CScopeDoc::OnNewDocument()
{
TRACE("En CScopeV1Doc::OnNewDocument()\n");
if (!CDocument::OnNewDocument())
return FALSE;
// (SDI documents will reuse this document)
m_nVinPuntos = 0;
m_pVin = new double [m_nArrayPuntos - 12];// Puntero para la vista. En voltios
m_pCanalDoc[1].nGanancia = 0;
m_pCanalDoc[1].nDivisor = 0;
m_pCanalDoc[1].bACDCneg = FALSE;
m_pCanalDoc[1].bEnable = FALSE;
m_pCanalDoc[2].nGanancia = 0;
m_pCanalDoc[2].nDivisor = 0;
m_pCanalDoc[2].bACDCneg = FALSE;
m_pCanalDoc[2].bEnable = FALSE;
m_pCanalDoc[3].nGanancia = 0;
m_pCanalDoc[3].nDivisor = 0;
m_pCanalDoc[3].bACDCneg = FALSE;
m_pCanalDoc[3].bEnable = FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc serialization
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc diagnostics
#ifdef _DEBUG
void CScopeDoc::AssertValid() const
{
CDocument::AssertValid();
}
/////////////////////////////////////////////////////////////////////////////
// CScopeDoc commands
/////////////////////////////////////////////////////////////////////////////
// Codificacin y creacin del vector de la vista
void CScopeDoc::ScopeCrearVin()
{
// Crea el vector con el puntero m_pVin con doubles.
// Los valores estn en V / ms y los utilizara la vista
// para dibujar los canales en OnDraw y OnPrint
ScopeDecodificarTramaRX(0); // Se decodifican los bytes
ScopeDecodificarTramaRX(1); // de estado de cada uno de
ScopeDecodificarTramaRX(2); // los canales
ScopeDecodificarTramaRX(3);
int nNumCanales = 1;
if (m_pCanalDoc[1].bEnable) {
nNumCanales = 2;
}
if (m_pCanalDoc[3].bEnable) {
nNumCanales = 4;
}
if (nNumCanales == 1) {
for (int i = 0; i < m_nVinPuntos; i++) {
m_pVin[i] = ((((double) m_arrayMuestras[i + 4]) * 5 / 255) - 2.5)/
(s_dValueGanancia[(m_pCanalDoc[0].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[0].nDivisor)]);
}
}
else {
if (nNumCanales == 2) {
int nVinPuntos = m_nVinPuntos / 2;
for (int i = 0; i < nVinPuntos; i++) {
m_pVin[2 * i] = ((((double) m_arrayMuestras[2*i+4])*5/255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[0].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[0].nDivisor)]);
m_pVin[2 * i + 1] = ((((double) m_arrayMuestras[2*i+5])*5/255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[1].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[1].nDivisor)]);
}
}
else {
int nVinPuntos = m_nVinPuntos / 4;
for (int i = 0; i < nVinPuntos; i++) {
m_pVin[4 * i] = ((((double) m_arrayMuestras[4*i+4])*5 / 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[0].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[0].nDivisor)]);
m_pVin[4 * i + 1] = ((((double) m_arrayMuestras[4*i+5])*5/ 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[1].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[1].nDivisor)]);
m_pVin[4 * i + 2] = ((((double) m_arrayMuestras[4*i+6])*5/ 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[2].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[2].nDivisor)]);
m_pVin[4 * i + 3] = ((((double) m_arrayMuestras[4*i+7])*5/ 255)-
2.5) / (s_dValueGanancia[(m_pCanalDoc[3].nGanancia)] *
s_dValueDivisor[(m_pCanalDoc[3].nDivisor)]);
}
}
}
}
void CScopeDoc::ScopeDecodificarTramaRX(int nCanal)
{
// Decodifica los Bytes de estado situados despus
// de la trama de inicio
BYTE byteEstado;
byteEstado = m_arrayMuestras[nCanal];
BYTE byteAux; // Miro G3
if (byteEstado & 0x02) { // 0000 0010
// G3 = 1
byteAux = 0x04; // 0000 0100
}
else { // G3 = 0
byteAux = 0x00;
}
byteEstado = m_arrayMuestras[nCanal]; // Miro G2
if (byteEstado & 0x04) { // 0000 0100
// G2 = 1
byteAux = byteAux | 0x02; // 0000 0010
}
else { // G2 = 0
byteAux = byteAux & 0xFD; // 1111 1101
}
byteEstado = m_arrayMuestras[nCanal]; // Miro G1
if (byteEstado & 0x08) { // 0000 1000
// G1 = 1
byteAux = byteAux | 0x01; // 0000 0001
}
else {
// G1 = 0
byteAux = byteAux & 0xFE; // 1111 1110
}
m_pCanalDoc[nCanal].nGanancia = (int) byteAux;
}
6.2.7 CLASE CCONTROLDLG
#if !defined(AFX_CONTROLDLG_H__DA985EF0_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#define AFX_CONTROLDLG_H__DA985EF0_C77B_11D3_BB39_ACF5B442421C__INCLUDED_
/////////////////////////////////////////////////////////////////////////////
// CControlDlg dialog
// Para la transmisin
public:
BYTE* m_pTXCadena; // Puntero para transmisin
private:
void MiApply(); // Realiza una transmisin
void ScopeCodificarTramaTX(int nCanal);
BOOL* m_pTXCambio; // Cambios en el dilogo
int m_nEstadoAnteriorCanales;
int m_nTimer; // Identificador del timer
static BYTE s_byteMascara[]; // Para codificar V / div
static BYTE s_byteCanal[]; // Para codificar el canal
// Dialog Data
//{{AFX_DATA(CControlDlg)
enum { IDD = IDD_CONTROL_DLG };
int m_nCanales;
int m_nAcDcC1;
int m_nAcDcC2;
int m_nAcDcC3;
int m_nAcDcC4;
BOOL m_bInteractivo;
BOOL m_bControlManual;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CControlDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the
previous line.
#endif // !defined(AFX_CONTROLDLG_H__DA985EF0_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
// ControlDlg.cpp : implementation file
//
#include "stdafx.h"
#include "scope.h"
#include "ControlDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CControlDlg dialog
CControlDlg::CControlDlg(CView* pView)
{
// Constructor no modal
m_pView = pView;
m_nEstadoAnteriorCanales = 0;
}
void CControlDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CControlDlg)
DDX_Radio(pDX, IDC_CANALES, m_nCanales);
DDX_Radio(pDX, IDC_ACDC_C1, m_nAcDcC1);
DDX_Radio(pDX, IDC_ACDC_C2, m_nAcDcC2);
DDX_Radio(pDX, IDC_ACDC_C3, m_nAcDcC3);
DDX_Radio(pDX, IDC_ACDC_C4, m_nAcDcC4);
DDX_Check(pDX, IDC_INTERACTIVO, m_bInteractivo);
DDX_Check(pDX, IDC_CONTROL_MANUAL, m_bControlManual);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate) {
CSliderCtrl* pSlideCanal1 =(CSliderCtrl*) GetDlgItem(IDC_TRACKBAR_CANAL1);
m_nTrackbarCanal1 = pSlideCanal1->GetPos();
BOOL CControlDlg::Create()
{
return CDialog::Create(CControlDlg::IDD);
}
BEGIN_MESSAGE_MAP(CControlDlg, CDialog)
//{{AFX_MSG_MAP(CControlDlg)
ON_BN_CLICKED(IDAPPLY, OnApply)
ON_BN_CLICKED(IDC_CANALES, OnCanal1)
ON_BN_CLICKED(IDC_RADIO2, OnCanal1_2)
ON_BN_CLICKED(IDC_RADIO3, OnCanal1_2_3_4)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_BN_CLICKED(IDC_DISPARO, OnScopeDisparo)
ON_BN_CLICKED(IDC_INTERACTIVO, OnScopeInteractivo)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_ACDC_C1, OnAcdcC1)
ON_BN_CLICKED(IDC_ACDC_C2, OnAcdcC2)
ON_BN_CLICKED(IDC_ACDC_C3, OnAcdcC3)
ON_BN_CLICKED(IDC_ACDC_C4, OnAcdcC4)
ON_BN_CLICKED(IDC_CONTROL_MANUAL, OnControlManual)
ON_BN_CLICKED(IDC_RADIO23, OnAcC1)
ON_BN_CLICKED(IDC_RADIO24, OnAcC2)
ON_BN_CLICKED(IDC_RADIO25, OnAcC3)
ON_BN_CLICKED(IDC_RADIO26, OnAcC4)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CControlDlg message handlers
BOOL CControlDlg::OnInitDialog()
{
// Inicializacin del dilogo
CString strTextCanal1;
CSliderCtrl* pSlideCanal1 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR_CANAL1);
pSlideCanal1->SetRange(0, 13);
pSlideCanal1->SetPos(m_nTrackbarCanal1);
strTextCanal1.Format("%4.3f", s_dValueCanal[pSlideCanal1->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL1, strTextCanal1);
CString strTextCanal2;
CSliderCtrl* pSlideCanal2 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR_CANAL2);
pSlideCanal2->SetRange(0, 13);
pSlideCanal2->SetPos(m_nTrackbarCanal2);
strTextCanal2.Format("%4.3f", s_dValueCanal[pSlideCanal2->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL2, strTextCanal2);
CString strTextCanal3;
CSliderCtrl* pSlideCanal3 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR_CANAL3);
pSlideCanal3->SetRange(0, 13);
pSlideCanal3->SetPos(m_nTrackbarCanal3);
strTextCanal3.Format("%4.3f", s_dValueCanal[pSlideCanal3->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL3, strTextCanal3);
CString strTextCanal4;
CSliderCtrl* pSlideCanal4 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR_CANAL4);
pSlideCanal4->SetRange(0, 13);
pSlideCanal4->SetPos(m_nTrackbarCanal4);
strTextCanal4.Format("%4.3f", s_dValueCanal[pSlideCanal4->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL4, strTextCanal4);
CString strTextTimeDiv;
CSliderCtrl* pSlideTimeDiv = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR_TIMEDIV);
pSlideTimeDiv->SetRange(0, 6);
pSlideTimeDiv->SetPos(m_nTrackbarTimeDiv);
strTextTimeDiv.Format("%3.2f", s_dValueTimeDiv[pSlideTimeDiv->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_TIMEDIV, strTextTimeDiv);
return CDialog::OnInitDialog();
}
void CControlDlg::OnCancel()
{
if (m_pView != NULL) {
// caso no modal -- no llamar a OnCancel de la clase de base
m_pView->PostMessage(WM_GOODBYE_CONTROL, IDCANCEL);
}
else {
CDialog::OnCancel(); // caso modal
}
}
void CControlDlg::OnOK()
{
if (m_pView != NULL) {
// Caso no modal -- no llamar a OnOK de la clase de base
UpdateData(TRUE);
m_pView->PostMessage(WM_GOODBYE_CONTROL, IDOK);
}
else {
CDialog::OnOK(); // Caso modal
}
}
void CControlDlg::OnApply()
{
// Envia un mensaje a la vista para que actualice los
// datos de las barras de deslizamiento
if (m_pView != NULL) { // Caso no modal --
UpdateData(TRUE);
m_pView->PostMessage(WM_GOODBYE_CONTROL, IDAPPLY);
}
}
void CControlDlg::OnCanal1()
{
// Al pulsar boton de radio Canal 1
if (m_nEstadoAnteriorCanales == 1) { // Inhabilitar Canal 2
m_pTXCadena[0] = 0x40; // 0100 0000
MiApply();
}
else {
if (m_nEstadoAnteriorCanales == 3) { // Inhabilitar Canales 2, 3 y 4
m_pTXCadena[0] = 0xC0; // 1100 0000
MiApply();
}
}
m_pTXCambio[0] = TRUE;
m_nEstadoAnteriorCanales = 0;
}
void CControlDlg::OnCanal1_2()
{
// Al pulsar boton de radio Canal 1 y 2
if (m_nEstadoAnteriorCanales == 3) { //Inhabilitar Canales 2, 3 y 4
m_pTXCadena[0] = 0xC0; //1100 0000
MiApply();
}
m_nEstadoAnteriorCanales = 1;
m_pTXCambio[1] = TRUE;
}
void CControlDlg::OnCanal1_2_3_4()
{
// Al pulsar boton de radio Canal 1, 2, 3 y 4
m_nEstadoAnteriorCanales = 3;
m_pTXCambio[3] = TRUE;
}
void CControlDlg::OnAcdcC1()
{
m_pTXCambio[0] = TRUE;
}
void CControlDlg::OnAcdcC2()
{
m_pTXCambio[1] = TRUE;
}
void CControlDlg::OnAcdcC3()
{
m_pTXCambio[2] = TRUE;
}
void CControlDlg::OnAcdcC4()
{
m_pTXCambio[3] = TRUE;
}
void CControlDlg::OnAcC1()
{
m_pTXCambio[0] = TRUE;
}
void CControlDlg::OnAcC2()
{
m_pTXCambio[1] = TRUE;
}
void CControlDlg::OnAcC3()
{
m_pTXCambio[2] = TRUE;
}
void CControlDlg::OnAcC4()
{
m_pTXCambio[3] = TRUE;
}
void CControlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// Para la barra de deslizamiento ms / div
CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;
CString strText;
strText.Format("%3.2f", s_dValueTimeDiv[pSlide->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_TIMEDIV, strText);
OnApply();
}
m_pTXCambio[0] = TRUE;
OnApply();
break;
case IDC_TRACKBAR_CANAL2:
strText.Format("%4.3f", s_dValueCanal[pSlide->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL2, strText);
m_pTXCambio[1] = TRUE;
OnApply();
break;
case IDC_TRACKBAR_CANAL3:
strText.Format("%4.3f", s_dValueCanal[pSlide->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL3, strText);
m_pTXCambio[2] = TRUE;
OnApply();
break;
case IDC_TRACKBAR_CANAL4:
strText.Format("%4.3f", s_dValueCanal[pSlide->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK_CANAL4, strText);
m_pTXCambio[3] = TRUE;
OnApply();
break;
}
}
void CControlDlg::OnControlManual()
{
// Habilita el control manual
UpdateData(TRUE);
if (m_bControlManual) {
m_pTXCadena[0] = 0x10;
}
else {
m_pTXCadena[0] = 0x00;
}
MiApply();
}
void CControlDlg::OnScopeDisparo()
{
// Para realizar el muestreo
UpdateData(TRUE);
if (m_bControlManual) {
m_pTXCadena[0] = 0x18;
MiApply();
}
}
/////////////////////////////////////////////////////////////////////////////
// Funciones para la transmisin
void CControlDlg::OnScopeInteractivo()
{
// Cuando esta habilitado este dilogo a la vez que
// controla la vista hace lo mismo con la tarjeta de adquisicin
// de datos
UpdateData(TRUE);
if (m_bInteractivo) {
// Se grea un temporizador que en cada time-out enviara
// a la tarjeta una By para cambiar su estado si es necesario
m_nTimer = SetTimer(1, 1000 /*ms*/, NULL);
ASSERT(m_nTimer != 0);
}
else { // Destruye el timer
KillTimer(m_nTimer);
}
}
void CControlDlg::MiApply()
{
// Enva el mensaje a la vista para que
// sta realice una transmisin
if (m_pView != NULL) { // Caso no modal --
UpdateData(TRUE);
m_pView->PostMessage(WM_GOODBYE_CONTROL, IDC_MIAPPLY);
}
}
void CControlDlg::OnTimer(UINT nIDEvent)
{
// Se entra aqu cada Time-out, de esta forma se evita
// Enviar una cantidad excesiva de By.
UpdateData(TRUE);
if (m_nCanales ==0) {
if (m_pTXCambio[0]){
ScopeCodificarTramaTX(0); // Codificar el By a enviar
MiApply(); // Se enva el By
}
}
if (m_nCanales == 1) {
if (m_pTXCambio[0]){
ScopeCodificarTramaTX(0);
MiApply();
}
if (m_pTXCambio[1]) {
ScopeCodificarTramaTX(1);
MiApply();
}
}
if (m_nCanales == 2) {
if (m_pTXCambio[0]){
ScopeCodificarTramaTX(0);
MiApply();
}
else {
if (m_pTXCambio[1]) {
ScopeCodificarTramaTX(1);
MiApply();
}
else {
if (m_pTXCambio[2]) {
ScopeCodificarTramaTX(2);
MiApply();
}
else {
if (m_pTXCambio[3]) {
ScopeCodificarTramaTX(3);
MiApply();
}
}
}
}
}
m_pTXCambio[0] = FALSE; // Se resetean los cambios
m_pTXCambio[1] = FALSE;
m_pTXCambio[2] = FALSE;
m_pTXCambio[3] = FALSE;
}
void CControlDlg::ScopeCodificarTramaTX(int nCanal)
{
// Se codifica un By que posteriormente se enviara,
// Para ello se leen los estados de las barras de
// deslizamiento
BYTE cByteTX = 0xFF;
UpdateData(TRUE);
pAcDc[0] = m_nAcDcC1;
pAcDc[1] = m_nAcDcC2;
pAcDc[2] = m_nAcDcC3;
pAcDc[3] = m_nAcDcC4;
pTrackbar[0] = m_nTrackbarCanal1;
pTrackbar[1] = m_nTrackbarCanal2;
pTrackbar[2] = m_nTrackbarCanal3;
pTrackbar[3] = m_nTrackbarCanal4;
if (pAcDc[nCanal] == 0) { //DC--- .0 = 0
cByteTX = cByteTX & 0xFE; //FE == 1111 1110;
}
else { //AC--- .0 = 1
cByteTX = cByteTX | 0x01;
}
m_pTXCadena[0] = cByteTX;
/////////////////////////////////////////////////////////////////////////////
// Otra funcin
void CControlDlg::OnApplyPublic()
{
// La utiliza el documento para actualizar la vista
OnApply();
}
6.2.8 CLASE CACTUARDLG
#if !defined(AFX_ACTUARDLG_H__DA985EF1_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#define AFX_ACTUARDLG_H__DA985EF1_C77B_11D3_BB39_ACF5B442421C__INCLUDED_
/////////////////////////////////////////////////////////////////////////////
// CActuarDlg dialog
private:
void ScopeCodificarTramaTX(); // Codifica la trama a enciar
void ScopeSimular(); // Para la simulacin
CView* m_pView; // Puntero de la vista
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CActuarDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before //
the previous line.
#endif // !defined(AFX_ACTUARDLG_H__DA985EF1_C77B_11D3_BB39_ACF5B442421C__INCLUDED_)
#include "stdafx.h"
#include "scope.h"
#include "ActuarDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CActuarDlg dialog
m_nNumBytesTX = 1024;
m_pCadenaTX = new BYTE[m_nNumBytesTX];
BEGIN_MESSAGE_MAP(CActuarDlg, CDialog)
//{{AFX_MSG_MAP(CActuarDlg)
ON_BN_CLICKED(IDAPPLY, OnApply)
ON_BN_CLICKED(IDENVIAR, OnEnviar)
ON_BN_CLICKED(IDC_LIMPIARIN, OnLimpiarin)
ON_BN_CLICKED(IDC_LIMPIAROUT, OnLimpiarout)
ON_BN_CLICKED(IDC_ENABLEIN, OnEnablein)
ON_BN_CLICKED(IDC_ENABLEOUT, OnEnableout)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CActuarDlg message handlers
void CActuarDlg::OnCancel()
{
if (m_pView != NULL) {
// Caso no modal -- no llamar a OnCancel de la clase de base
m_pView->PostMessage(WM_GOODBYE_ACTUAR, IDCANCEL);
}
else {
CDialog::OnCancel(); // Caso modal
}
}
void CActuarDlg::OnOK()
{
if (m_pView != NULL) {
// Caso no modal -- no llamar a OnOK de la clase de base
UpdateData(TRUE);
m_pView->PostMessage(WM_GOODBYE_ACTUAR, IDOK);
}
else {
CDialog::OnOK(); // Caso modal
}
}
void CActuarDlg::OnLimpiarin()
{
// Limpiar cuadro de edicin de entrada
m_strEditRX = "";
UpdateData(FALSE);
}
void CActuarDlg::OnLimpiarout()
{
// Limpiar cuadro de edicin de salida
m_strEditTX = "";
UpdateData(FALSE);
}
void CActuarDlg::OnEnablein()
{
// Actualiza los datos del dilogo
UpdateData(TRUE);
}
void CActuarDlg::OnEnableout()
{
// Actualiza los datos del dilogo
UpdateData(TRUE);
}
void CActuarDlg::OnEnviar()
{
// Prepara los datos que sern enviados
if (m_pView != NULL) { // Caso no modal
char pcTX[10];
void CActuarDlg::OnApply()
{
// Crea la trama a enviar.
// Si se presiona el botn enviar, se transmite lo visualizado en salida
if (m_pView != NULL) { // Caso no modal
char pcTX[10];
UpdateData(TRUE);
ScopeCodificarTramaTX();
if (m_nEnable == TRUE) {
cByteTX = cByteTX | 0x20; // 0010 0000
}
else {
cByteTX = cByteTX & 0xDF; // 1101 1111
}
else {
m_pEnableCH[0] = FALSE;
}
}
else {
if (m_nCanal == 1) {
cByteTX = cByteTX & 0x7F; // 0111 1111
m_pEstadoCH[1] = cByteTX;
if (m_nEnable) {
m_pEnableCH[1] = TRUE;
}
else {
m_pEnableCH[1] = FALSE;
}
}
else {
if (m_nCanal == 2) {
cByteTX = cByteTX & 0xBF; // 1011 1111
m_pEstadoCH[2] = cByteTX;
if (m_nEnable) {
m_pEnableCH[2] = TRUE;
}
else {
m_pEnableCH[2] = FALSE;
}
}
else {
m_pEstadoCH[3] = cByteTX;
if (m_nEnable) {
m_pEnableCH[3] = TRUE;
}
else {
m_pEnableCH[3] = FALSE;
}
}
}
}
}
void CActuarDlg::ScopeSimular()
{
// Funcin para crear un trama si se desea simular.
// Para observar el resultado es necesario cortocircuitar
// los pines TX y RX del puerto serie configurado
m_pCadenaTX[0] = 0xFB; // Trama de inicio
m_pCadenaTX[1] = 0x04;
m_pCadenaTX[2] = 0xFB;
m_pCadenaTX[3] = 0x04;
m_pCadenaTX[4] = m_pEstadoCH[0]; // By de estado
m_pCadenaTX[5] = m_pEstadoCH[1];
m_pCadenaTX[6] = m_pEstadoCH[2];
m_pCadenaTX[7] = m_pEstadoCH[3];
double pi = 3.1415926535;
if (m_pEnableCH[3]) { // 4 canales
BYTE byteAux = 0x00;
BYTE byteAux2 = 0x0a;
int nContador = 0;
for (int i = 0; i < ((m_nNumBytesTX - 12) / 4); i++){
m_pCadenaTX[4 * i + 8] = (BYTE) (128 + 120 * sin(10 * i * 2 * pi /
(m_nNumBytesTX - 12)) );
m_pCadenaTX[4 * i + 9] = (BYTE) (128 + 60 * sin(25 * i * 2 * pi /
(m_nNumBytesTX - 12)) );
m_pCadenaTX[4 * i + 10] = byteAux;
byteAux += 3;
m_pCadenaTX[4 * i + 11] = byteAux2;
if (nContador == 2) {
nContador = 0;
if (byteAux2 == 0x0a) {
byteAux2 = 0xF0;
}
else {
byteAux2 = 0x0a;
}
}
nContador++;
}
}
else {
if (m_pEnableCH[1]) { // 2 canal
for (int i = 0; i < ((m_nNumBytesTX - 12) / 2); i++){
m_pCadenaTX[2 * i + 8] = (BYTE) (128 + 120 * sin(10 * i * 2
* pi / (m_nNumBytesTX - 12)) );
m_pCadenaTX[2 * i + 9] = (BYTE) (128 + 120 * sin(15 * i * 2
* pi / (m_nNumBytesTX - 12)) );
}
}
else { // 1 canal
for (int i = 0; i < (m_nNumBytesTX - 12); i++){
m_pCadenaTX[i + 8] = (BYTE) (128 + 110 * sin(50 * i * 2
* pi / (m_nNumBytesTX - 12)) );
}
}
}
m_pCadenaTX[m_nNumBytesTX - 4] = 0x04; // Trama final
m_pCadenaTX[m_nNumBytesTX - 3] = 0xFB;
m_pCadenaTX[m_nNumBytesTX - 2] = 0x04;
m_pCadenaTX[m_nNumBytesTX - 1] = 0xFB;
}
6.2.9 CLASE CCONFIGCOMDLG
#if !defined(AFX_CONFIGCOMDLG_H__4AFC49A5_CC0F_11D3_BB39_96F49A117913__INCLUDED_)
#define AFX_CONFIGCOMDLG_H__4AFC49A5_CC0F_11D3_BB39_96F49A117913__INCLUDED_
/////////////////////////////////////////////////////////////////////////////
// CConfigComDlg dialog
// Dialog Data
//{{AFX_DATA(CConfigComDlg)
enum { IDD = IDD_CONFIGCOM_DLG };
int m_nBaudios;
int m_nCom;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CConfigComDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the
previous line.
#endif // !defined(AFX_CONFIGCOMDLG_H__4AFC49A5_CC0F_11D3_BB39_96F49A117913__INCLUDED_)
#include "stdafx.h"
#include "scope.h"
#include "ConfigComDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CConfigComDlg dialog
BEGIN_MESSAGE_MAP(CConfigComDlg, CDialog)
//{{AFX_MSG_MAP(CConfigComDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CConfigComDlg message handlers
void CConfigComDlg::OnOK()
{
CDialog::OnOK();
}
void CConfigComDlg::OnCancel()
{
CDialog::OnCancel();
}
7 BIBLIOGRAFA
Ttulo: CIRCUITOS Y SEALES:
Introduccin a los circuitos lineales y de acoplamiento
Autores: R. E. Thomas
A. J. Rosa
Editorial: REVERT
Informtica Industrial I
Informtica Industrial II
Tecnologa Electrnica I
Ingeniera de Equipos Electrnicos I
Sistemas de Telecomando
Sistemas Digitales II