Está en la página 1de 3

1: unit U_PRINCIPAL;

2:
3: {$mode objfpc}{$H+}
4:
5: interface
6:
7: uses
8: Classes, SysUtils, FileUtil, vsComPort, Forms, Controls,
9: Graphics, Dialogs, StdCtrls, ExtCtrls;
10:
11: type
12:
13: { TF_PRINCIPAL }
14:
15:
16: TF_PRINCIPAL = class(TForm)
17: BT_STEP: TButton;
18: ED_RETARDO: TEdit;
19: ED_DURACION: TEdit;
20: LB_DURACION: TLabel;
21: LB_DURACION1: TLabel;
22: LB_RESULTADO: TLabel;
23: SP: TvsComPort;
24: TMR_REGISTRAR: TTimer;
25: procedure BT_STEPClick(Sender: TObject);
26: procedure FormShow(Sender: TObject);
27: procedure SPRxData(Sender: TObject);
28: procedure TMR_REGISTRARTimer(Sender: TObject);
29:
30: private
31:
32: public
33: function EjecutarOperacion(tp:integer):integer;
34: function WaitACK():boolean;
35: const NM=60; // ESPERA EN MS PARA RECIBIR DATOS
36: end;
37:
38: var
39: F_PRINCIPAL: TF_PRINCIPAL;
40: rs:string;
41: RecibidoOK,ensayando:boolean;
42: fichero_csv:TextFile;
43: implementation
44:
45: {$R *.frm}
46:
47: { TF_PRINCIPAL }
48:
49: //************************************************************************
50: // Evento generado al pulsar el boton de STEP
51: //************************************************************************
52: procedure TF_PRINCIPAL.BT_STEPClick(Sender: TObject);
53: begin
54: AssignFile(fichero_csv,'datos.csv'); // Asocia el nombre del fichero
55: Rewrite(fichero_csv); // Abre el fichero
56: rs:='';
57: if EjecutarOperacion(1)=1 then
58: begin
59: TMR_REGISTRAR.Interval:=StrToInt(ED_DURACION.Text)+1000; // Alarga 1000 ms el tiempo
hasta el fin del ensayo para asegurar la recepcion
60: TMR_REGISTRAR.Enabled:=True; // Arranca el temporizador
61: end
62: else LB_RESULTADO.Caption:='Error en el comando';
63: end;
64:
65: //************************************************************************
66: // Este evento se genera cuando la aplicacion muestra la ventana en primer
67: // plano
68: //************************************************************************
69: procedure TF_PRINCIPAL.FormShow(Sender: TObject);
70: begin
71: SP.Active:=TRUE;
72: ensayando:=FALSE;
73:
74: end;
75:
76: //************************************************************************************
77: // Este evento se produce cuando se reciben datos por el puerto serie desde ARDUINO
78: // Se van anadiendo a rs hasta que aparece un CRLF (retorno de carro+avance de linea)
79: // En el caso de que la cadena contenga un OK pone a TRUE la variable RecibidoOK para
80: // que la funcion WaitACK devuelva TRUE.
81: //***********************************************************************************
82: procedure TF_PRINCIPAL.SPRxData(Sender: TObject);
83: var
84: r:string;
85: q,v:integer;
86: begin
87: if ensayando=true then
88: begin
89: r:=SP.ReadData;
90: rs:=rs+r;
91: exit;
92: end;
93: r:=SP.ReadData;
94: rs:=rs+r;
95: v:=pos(#13#10,rs);
96: if v>1 then
97: begin
98: q:=pos('R=',rs);
99: if ((q>0) and (v>q)) then
100: begin
101: LB_RESULTADO.Caption:=copy(rs,q,v-q);
102: rs:='';
103: exit;
104: end;
105:
106: if pos('OK',rs)>0 then
107: begin
108: RecibidoOK:=True;
109: rs:='';
110: exit;
111: end;
112:
113: end;
114: end;
115:
116: //************************************************************************
117: //
118: //************************************************************************
119: procedure TF_PRINCIPAL.TMR_REGISTRARTimer(Sender: TObject);
120: begin
121: ensayando:=false;
122: TMR_REGISTRAR.Enabled:=FALSE;
123: write(fichero_csv,rs);
124: CloseFile(fichero_csv);
125: LB_RESULTADO.Caption:='Fichero LISTO';
126: end;
127: //************************************************************************
128: // Esta funcion espera NM ms a que la respuesta desde arduino haya llegado
129: // si se recibe un OK devuelve TRUE
130: //************************************************************************
131: Function TF_PRINCIPAL.WaitACK():boolean;
132: begin
133: rs:='';
134: RecibidoOK:=False;
135: sleep(NM); //Tiempo para que el valor devuelto llegue interno del programa
136: Application.ProcessMessages;//
137: result:=RecibidoOK;
138: end;
139:
140: //************************************************************************
141: // Esta funcion envia la secuencia correspondiente al modulo
142: // ARDUINO para que realice la operacion solicitada
143: //************************************************************************
144: function TF_PRINCIPAL.EjecutarOperacion(tp:integer):integer;
145: var op:ansistring;
146: begin
147: result:=0;
148: case tp of
149: 1: begin
150: LB_RESULTADO.caption:='.....';
151: OP:='#SD'+ED_DURACION.Text+'$';
152: SP.WriteData(OP);
153: if WaitACK()=False then exit; // Espera recibir un OK para sincronizar
154: OP:='#SR'+ED_RETARDO.Text+'$';
155: SP.WriteData(OP);
156: if WaitACK()=False then exit; // Espera recibir un OK para sincronizar
157: OP:='#ST$'; // Arranca el ensayo
158: SP.WriteData(OP);
159: Ensayando:=True;
160: result:=1;
161: end;
162: end;
163:
164:
165: end;
166:
167: end.
168:

También podría gustarte