-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunit1.pas
238 lines (188 loc) · 5.87 KB
/
unit1.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls,
ExtCtrls, Serial, dbugintf;
type
{ TForm1 }
TForm1 = class(TForm)
BackwardsTB: TButton;
ForwardTB: TButton;
FwdLeftTB: TButton;
FwdRightTB: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
LeftTB: TButton;
NopTB: TButton;
PortEdit: TEdit;
DurationSlider: TTrackBar;
RightTB: TButton;
Stop1TB: TButton;
StopTB: TButton;
UpDown1: TUpDown;
procedure DurationSliderChange(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure GroupBox1Click(Sender: TObject);
procedure SetButtonSizes;
procedure FwdLeftTBClick(Sender: TObject);
procedure FwdRightTBClick(Sender: TObject);
procedure LeftTBClick(Sender: TObject);
procedure PortEditChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ForwardTBClick(Sender: TObject);
procedure MoveJoystick(xpos:integer;ypos:integer);
procedure BackwardsTBClick(Sender: TObject);
procedure RightTBClick(Sender: TObject);
procedure StopTBClick(Sender: TObject);
procedure Stop1TBClick(Sender: TObject);
procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
procedure Stop();
private
public
end;
const
maxpos = 8; // maximum servo angle
midpos = 4; // middle position is at 4 (0-8)
maxspeed = 4; // speed 0-4
var
Form1: TForm1;
portname: String; // serial port name
speed,duration:integer; // global setting , that affects joystick movement
status: LongInt;
Xposition,Yposition: Integer; // numbers forwarded as parameters to Move Joystick procedure
hoverdrive: boolean; // mouse click control or both click hover/eyegaze/
// control. if charged we can move - charging done by activating charge button-this prevents stuck cursor driving
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.ForwardTBClick(Sender: TObject);
begin
Xposition := midpos - speed;
Yposition := midpos;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := IntToStr(UpDown1.Position); // Display initial speed value
speed := UpDown1.Position; // set from 0 to 4, affects both y and x positions of the joystick
duration := DurationSlider.Position; // after this time joystick returns to middle position
portname := PortEdit.Text;
hoverdrive := False; // if enabled, we activate move by either
// mouse hover and click , if disabled, only click works
end;
procedure TForm1.PortEditChange(Sender: TObject);
begin
portname := PortEdit.Text;
end;
procedure TForm1.DurationSliderChange(Sender: TObject);
begin
duration := DurationSlider.Position;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
SetButtonSizes;
end;
procedure TForm1.GroupBox1Click(Sender: TObject);
begin
end;
procedure TForm1.SetButtonSizes;
var
btnheight,btnwidth: integer;
begin
// we set button position, rest will align by anchors:
btnwidth:= Form1.GroupBox1.Width div 3;
btnheight:= (Form1.GroupBox1.Height-30) div 3;
Form1.RightTB.Width:=btnwidth;
Form1.BackwardsTB.Height:=btnheight;
Form1.LeftTB.Width:=btnwidth;
Form1.ForwardTB.Height:=btnheight;
end;
procedure TForm1.FwdLeftTBClick(Sender: TObject);
begin
// forward left
Xposition := midpos - speed;
Yposition := midpos - speed;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.FwdRightTBClick(Sender: TObject);
begin
// forward right
Xposition := midpos - speed;
Yposition := midpos + speed;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.LeftTBClick(Sender: TObject);
begin
// turn Left
Xposition := midpos;
Yposition := midpos - speed;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.MoveJoystick(xpos:integer;ypos:integer);
// this procedure opens serial port, sends message to arduino, closes the port
// the message tells to which x and y positions will servos move and for how long (DurationSlider)
var
msglen, i: integer;
serHandle: Tserialhandle; // Handle for serial port
message: String;
status: LongInt;
begin
serHandle := SerOpen(portname); // Bei Windows 'COMx' // COM-Port öffnen.
// writeln(serHandle,' ',message,' ', portname);
message := '(' + IntToStr(xpos) + ':' + IntToStr(ypos) + ':' + IntToStr(duration) + ')';
SerSetParams(serHandle, 9600, 8, NoneParity, 1, []);
msglen := length(message);
for i := 1 to msglen do begin
status := SerWrite(serHandle, message[i], 1); // Zeichen senden.
end;
message := '';
if(status > 0) then begin
// writeln('written to serial port');
end else begin
// writeln('can not write to serial port, quitting');
SerSync(serHandle); { flush out any remaining before closure }
SerFlushOutput(serHandle); { discard any remaining output }
SerClose(serHandle);
// report error
end;
//arduino response code here:
//
SerSync(serHandle); { flush out any remaining before closure }
SerFlushOutput(serHandle); { discard any remaining output }
SerClose(serHandle); // COM-Port schliessen.
end;
procedure TForm1.BackwardsTBClick(Sender: TObject);
begin
// back
Xposition := midpos + speed;
Yposition := midpos;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.RightTBClick(Sender: TObject);
begin
// turn right
Xposition := midpos;
Yposition := midpos + speed;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.StopTBClick(Sender: TObject);
begin
Stop();
end;
procedure TForm1.Stop1TBClick(Sender: TObject);
begin
Stop();
end;
procedure TForm1.Stop();
begin
Xposition := midpos;
Yposition := midpos;
MoveJoystick(Xposition,Yposition);
end;
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
Label1.Caption := IntToStr(UpDown1.Position);
speed := UpDown1.Position;
end;
end.