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
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
\section{Funktioner och filer}
\subsection{System}
\label{app:funktioner och filer:system}
choose\_position(position, segment, track, track\_len)
Körs när en givare passerats. Gör en bedömning om en givare (eller flera) har
missats genom att kontrollera vilken givare som är närmast den nuvarande
uppskattade position och kompenserar om en givare bedöms ha missats. Se
\ref{sec:missade givare}
clamp(n, m, M)
En hjälpfunktion som returnerar n om $m < n < M$, annars m om $n < m$, annars M
om $n > M$.
detect\_missed(position, segment, track, track\_len)
Returnerar true om position ligger utanför det nuvarande segmentet.
do\_boot(car, boot)
Anropas en gång per programcykel i den så kallade boostrap-fasen. Se
\ref{sec:systembeskrivning:uppstart} för information.
do\_car(car, t, displa\_data, boot)
Anropas en gång per programcykel. Se \ref{sec:systembeskrivning:korning} och EN ANNAN DEL
AV TEXTEN (vadå?) för information om hur en programcykel ser ut och NÅGOT MER
(vadå?).
do\_gov(car)
Anropas varje gång en givare passerats. Vid målgivaren jämförs referenstiden och
den förra varvtiden och car.constant anpassas efter differensen mellan dem. Om
differensen är högre ändras car.constant mer, och vice versa om differensen är
låg. Vid givare 5 och 8 jämförs referenstiden och en uppskattning av hur lång
tid det nuvarande varvet troligen kommer ta. Se \ref{sec:systembeskrivning:governor} för
mer information.
fit\_percents(percents, lap\_time, seg\_times)
Anropas vid varje nytt varv. Räknar ut den procentuella tiden varje segment tog
det förra varvet och sparar medelvärdet mellan den förra procentsatsen och den
nya, uträknade procentsatsen. Procentsatsen normeras sedan så summan är 1
(100%).
format\_seg\_times(car)
Anropas när körningen avslutas. Returnerar den genomsnittliga tiden för varje
segment.
get\_aprox\_v(cur\_seg, car)
Anropas varje programcykel. Uppskattar bilens nuvarande hastighet genom att
dividera den senast uppmätta segmentstiden med segmentets längd.
get\_new\_u(new\_v, seg\_constant
FLYTTA BERÄKNINGEN TILL DO\_CAR, BEHÖVER INTE VARA EN EGEN FUNKTION
get\_new\_v(position, list)
Anropas varje programcykel. Söker igenom bankartan och returnerar värdet v som
matchar position.
get\_position(aprox\_v, prev\_p, delta\_t)
Anropas varje programcykel. Räknar ut hur långt bilen rört sig sedan senaste
programcykeln.
get\_seg\_constant(position, lap\_constants, track, track\_len)
TA BORT
get\_time\_as\_string(millis)
Omvandlar en mängd millisekunder till formatet "mm:ss.s". Till exempel omvandlas 1250
ms till "00:01.3" och 11240 till "00:11.2".
main.m
Det script som programmet ligger i. I main.m ligger alla funktioner.
Det är denna fil som ska startas
vid systemuppstart, se \ref{app:handhavande}
\subsection{Display}
\label{app:funktioner och filer:display}
bar\_graph(direction, no, x1, x2, y1, y2, start\_value, end\_value, type, pattern):
Skapar ett stapeldiagram med ett hörn i (*x1*, *y1*) och ett diagonellt
hörn i (*x2*, *y2*). *direction* är en av 'O', 'U', 'L' och 'R' och
bestämmer åt vilket håll "upp" är på stapeln. 'O' står för upp ('oben'
på tyska), 'U' står för ner ('unter' på tyska), 'L' står för vänster
('links') och 'R' står för höger ('rechts'). Värdet stapeldiagrammet ska
visa specifieras med *update\_bar\_graph*. *start\_value* och
*end\_value* bestämmer vad som ska vara noll- respektive maxvärde för
stapeldiagrammet. *no* är stapeldiagrammets nummer och behöver
specifieras när stapeldiagrammets värde ska uppdateras. *type* sätts
till 0 för en enkel stapel och 1 för en stapel inuti en ram.
box(x1, y1, x2, y2, n1)
Ritar en rektangel med diagonella hörn i (*x1*, *y1*) och (*x2*, *y2*)
och mönster-nummer *n1*.
clear\_display()
Rensa displayen.
continue\_line(x2, y2)
Fortsätt en linje från den senast specifierade linjens slut till (*x2*,
*y2*).
delete\_area(x1, y1, x2, y2)
Ta bort (släck) alla pixlar i det rektangulära området mellan (*x1*,
*y1*) och (*x2*, *y2*).
draw\_line(x1, y1, x2, y2)
Rita en linje mellan (*x1*, *y1*) och (*x2*, *y2*).
draw rectangle(x1, y1, x2, y2)
Rita en rektangel (ej ifylld) mellan (*x1*, *y1*) och (*x2*, *y2*).
fill\_area(x1, y1, x2, y2)
Tänd alla pixlar i det rektangulära området mellan (*x1*, *y1*) och
(*x2*, *y2*).
fill\_area\_with\_pattern(x1, y1, x2, y2, n1)
Fyll det rektangulära området mellan (*x1*, *y1*) och (*x2*, *y2*) med
mönster *n1*.
fill\_display()
Tänd alla pixlar på displayen.
flashing\_area(x1, y1, x2, y2)
Fyll det rektangulära området mellan (*x1*, *y1*) och (*x2*, *y2*) med
blinkande pixlar. Blinkintervallet kan sättas med *set\_flashing\_time*.
flashing\_area\_with\_pattern(x1, y1, x2, y2)
Fyll det rektangulära området mellan (*x1*, *y1*) och (*x2*, *y2*) med
blinkande pixlar i ett mönster. Blinkintervallet kan sättas med
*set\_flashing\_time*.
invert\_area(x1, y1, x2, y2)
Tänd alla släckta pixlar och släck alla tända pixlar i det rektangulära
området mellan (*x1*, *y1*) och (*x2*, *y2*).
invert\_display()
Tänd alla släcka pixlar och släck alla tända pixlar på hela displayen.
key(x1, y1, x2, y2, down\_code, up\_code, just, text)
Skapa en tryckbar knapp (till skillnad från en omkopplare, se
*toggle(...)*) med diagonella hörn i (*x1*, *y1*) och (*x2*, *y2*) och
texten *text*. Hur texten justeras beror på *just* där 'R' gör texten
högerjusterad ('right'), 'C' gör texten centerjusterad och 'L' gör
texten vänsterjusterad ('left'). Om knappen trycks ned läggs
*down\_code* i displayens interna minne och om knappen släpps läggs
*up\_code* i displayens interna minne.
point(x1, y1)
Rita en punkt i (*x1*, *y1*). Punktens storlek kan anpassas med
*set\_point\_size*.
put\_text(x, y, justification, text)
Skriv ut texten *text* i (*x*, *y*). Hur texten justeras beror på
*justification* där 'R' gör texten högerjusterad ('right'), 'C' gör
texten centerjusterad och 'L' gör texten vänsterjusterad ('left'). Om
*justification* är 'R' bestämmer *x* och *y* textens övre högra
koordinat, om *justification* är 'C' bestämmer *x* och *y* textens
mittre koordinat och om *justification* är 'L' bestämmer *x* och *y*
textens övre vänstra koordinat.
redraw\_bar\_graph(num)
Tvinga stapeldiagram *num* att ritas om.
remove\_flashing\_area(x1, y1, x2, y2)
Ta bort blinkade pixlar i det rektangulära området mellan (*x1*, *y1*)
och (*x2*, *y2*).
request\_bar\_graph\_value(num)
Lägg nuvarande värdet för stapeldiagram *num* i displayens interna
minne.
restore\_display\_from\_clipboard()
Flytta innehållet från displayens urklipp till displayen.
restore\_display\_from\_clipboard\_to\_point(x1, y1)
Flytta innehållet från displayens urklipp till displayen med övre
vänstra hörn i (*x1*, *y1*). Spara ett område med
\_save\_area\_to\_clipboard(...).
save\_area\_to\_clipboard(x1, y1, x2, y2)
Kopiera innehållet i den rektangel mellan (*x1*, *y1*) och (*x2*, *y2*)
till displayens urklipp. Återställ med
*restore\_display\_from\_clipboard\_to\_point(...)*.
save\_display\_to\_clipboard()
Kopiera displayens nuvarande innehåll till displayens urklipp. Återställ
med *restore\_display\_from\_clipboard()*.
set\_display\_visible(visible)
Sätt om displayen ska vara synlig (*visible* = true) eller om displayen
ska vara osynlig (*visible* = false). Att displayen är osynlig innebär
att innehållet inte syns men finns kvar i bakgrunden och kan visas igen
om *set\_display\_visible(true)* skickas.
set\_drawing\_mode(n1)
Sätt displayens ritläge. *n1* = 1 innebär att pixlar slås på eller av
(som vanligt) enligt kommandot som skickas, *n1* = 2 innebär att pixlar
enbart slås av (som ett suddgummi) och *n1* = 3 innebär att pixlar
inverteras (släckta pixlar slås på och tända pixlar stängs av)
set\_flashing\_time(n1)
Sätt intervallet blinkande objekt blinkar i. *n1* är ett intervall i
tiondelar av en sekund mellan 0,1 sekunder och 1,5 sekunder.
set\_line\_pattern(n1)
Sätt mönstret linjer ritas ut med.
set\_point\_size(n1, n2)
Sätt storleken på punkter och linjer som ritas ut. *n1* är storleken i
x-led (mellan 1 och 15 pixlar) och *n2* är storleken i y-led (mellan 1
och 15 pixlar).
set\_text\_flashing(n1)
Sätt om ny text som skrivs ut ska blinka eller inte. *n1* = 1 slår på
blinkande och *n1* = 2 stänger av blinkande.
set\_text\_font(font\_num)
Sätt typsnittet på ny text som skrivs ut. Se *REF*(vadå?) för information om de
olika typsnitten.
set\_text\_zoom(x\_scale, y\_scale)
Sätt skalfaktorn för ny text som skrivs ut. *x\_scale* är skalfaktorn i
x-led (mellan x1 och x8) och *y\_scale* är skalfaktorn i y-led (mellan
x1 och x8).
set\_touch\_sound\_response(state)
Sätt om displayen ska göra ljud när knappar trycks ned. *state* = 1 slår
på ljudet och *state* = 0 stänger av ljudet.
toggle(x1, y1, x2, y2, down\_code, up\_code, just, text)
Skapa en tryckbar omkopplare (till skillnad från en knapp, se
*key(...)*) med diagonella hörn i (*x1*, *y1*) och (*x2*, *y2*) och
texten *text*. Hur texten justeras beror på *just* där 'R' gör texten
högerjusterad ('right'), 'C' gör texten centerjusterad och 'L' gör
texten vänsterjusterad ('left'). Om knappen aktiveras läggs *down\_code*
i displayens interna minne och om knappen avaktiveras läggs *up\_code* i
displayens interna minne.
update\_bar\_graph(num, val)
Skicka värdet *val* till stapeldiagram *num*.
|