Revision d796dcdf

View differences:

README.txt
69 69
    4.1  Adding a New Module
70 70
    4.2  Handling a Custom I/O Event in the Main Thread
71 71
    4.3  Implementing a New Low-Level Driver
72
    4.4  Writing a Unit Test
72
    4.4  Writing a Test
73 73

  
74 74
================================================================================
75 75

  
......
101 101
directory. Note that you will have to adapt the makefiles and scripts, and
102 102
probably the operating system as well.
103 103
AMiRo-BLT furthermore has its own required and recommended software tools as
104
described in its README.txt file. Follow th instructions to initialize the
104
described in its README.txt file. Follow the instructions to initialize the
105 105
development environment manually or use the ./setup.sh script.
106 106

  
107 107

  
......
112 112
copy of it as well. For the sake of compatibility, it is included in AMiRo-OS as
113 113
a Git submodule. It is highly recommended to use the ./setup.sh script for
114 114
initialization. Moreover, you have to apply the patches to ChibiOS in order to
115
make AMiRo-OS work properly. It is recommended to use the .setup.sh script for
115
make AMiRo-OS work properly. It is recommended to use the ./setup.sh script for
116 116
this purpose.
117 117
If you would like to use a different kernel, you can add a subfolder in the
118 118
./kernel/ directory and adapt the scripts and operating system source code.
......
164 164
AMiRo-BLT, you can replace the port value by '/dev/ttyUSB0'.
165 165
Advanced users can use several connections to multiple modules simultaneously.
166 166
Each additional programmer will be available as '/dev/ttyAMiRo<N>' (and
167
'/dev/USB<N>' respectively) with <N> being an integer number starting from zero.
168
Please note: Those interfaces are ordered by the time when they have been
169
detected by the operating system.
167
'/dev/ttyUSB<N>' respectively) with <N> being an integer number starting from
168
zero. Please note: Those interfaces are ordered by the time when they have been
169
detected by the operating system, so detaching a cable and plugging it in again
170
may result in a different port name.
170 171

  
171 172

  
172 173
2.2 - QtCreator IDE
173 174
-------------------
174 175

  
175
In order to setup QtCreator projects for the three AMiRo base modules, you can
176
use the provided ./setup.sh script. Further instructions for a more advanced
176
In order to setup QtCreator projects any supported module, you can use the
177
provided ./setup.sh script. Further instructions for a more advanced
177 178
configuration of the IDE are provided in the ./tools/qtcreator/README.txt file.
178 179

  
179 180

  
......
193 194
Each time you modify any part of AMiRo-OS, you need to recompile the whole
194 195
project for the according AMiRo module. Therefore you can use the ./Makefile by
195 196
simply executing 'make' and follow the instructions. Alternatively, you can
196
either use the makefiles provided per module in ./os/modules/<ModuleToCompile>
197
either use the makefiles provided per module in ./os/modules/<module_to_compile>
197 198
or - if you want to compile all modules at once - the makefile in the
198 199
./os/modules folder. After the build process has finished successfully, you
199
always have to flash the generated program to the robot. Therefore you need an
200
always have to flash the generated program to the module. Therefore you need an
200 201
appropriate tool, such as stm32flash (if you don't use a bootloader) or
201 202
SerialBoot (highly recommended; provided by AMiRo-BLT). Similarly to the
202 203
compilation procedure as described above, you can flash either each module
......
229 230
should be as unambiguous as possible (e.g. containing name and version number).
230 231
All files, which directly depent on the hardware, and thus are not portable,
231 232
belong here. Conversely, any code that can be reused on diferent hardware must
232
not be put in the module folder.
233
not be put in this module folder.
233 234

  
234 235
In a second step you have to initialize all requried files (see below) in the
235
newlly created module directory. It is recommended to use another module as
236
newly created module directory. It is recommended to use another module as
236 237
template for your configuration:
237 238
- alldconf.h
238 239
  Configuration header for the AMiRo-LLD project, which is part of AMiRo-OS.
240
  There are probably only very few configurations done here, since most setting
241
  depend on the content of aosconf.h and are handled modue unspecifically in in
242
  modules/aos_alldconf.h
239 243
- aosconf.h
240 244
  Configuration header for the AMiRo-OS project.
241 245
- board.h & board.c
......
243 247
  well as initialization functions.
244 248
- chconf.h
245 249
  Configuration header for the ChibiOS/RT system kernel. There are probably only
246
  very few configurations one here, since most settings depend on the content of
247
  aosconf.h and are handled module unspecific in modules/aos_chconf.h
250
  very few configurations done here, since most settings depend on the content
251
  of aosconf.h and are handled module unspecifically in modules/aos_chconf.h
248 252
- halconf.h
249 253
  Configuration header for ChibiOS/HAL (hardware abstraction layer).
250 254
- Makefile
251 255
  The GNU make script to build and flash AMiRo-OS for the module.
252 256
- mcuconf.h
253
  Configuration file for ChibiOS/JAL to initialize the microcontroller (MCU). It
257
  Configuration file for ChibiOS/HAL to initialize the microcontroller (MCU). It
254 258
  is recommended to check the kernel/ChibiOS/demos/ directory for an example
255 259
  using the according MCU and copy the mcuconf.h from there. Depending on your
256 260
  hardware you may have to modify it nevertheless, though.
......
271 275
settings are used in other modules.
272 276

  
273 277
Finally, you need to build and flash the project. The compiler might even help
274
you getting everything set up correctly. Take time to understand compilation
275
errors and warning and get rid of all of those (warnings should not be ignored
276
since they are hints that something might be amiss and the program will not act
277
as intended).
278
you getting everything set up correctly. Take the time needed to understand
279
compilation errors and warnings and get rid of all of those (warnings should not
280
be ignored since they are hints that something might be amiss and the program
281
will not act as intended).
278 282

  
279 283
Summing up, you have to
280 284
1) create a module directory.
......
288 292

  
289 293
In order to handle custom I/O events in the main thread, AMiRo-OS offers several
290 294
hooks to be used. First of all, you need to configure and enable the interrupt
291
in the according GPIO. This can be done by implementing the
295
for the according GPIO. This can be done by implementing the
292 296
MODULE_INIT_INTERRUPTS() hook in the module.h file. For information how to use
293 297
this hook, please have a look at existing modules. In the end, the interrupt
294 298
callback functions has to emit an I/O event with the according bit in the flags
295
mask set (like the _intCallback() function in aos_system.c). As result, whenever
296
a rising or falling edge (depends on configuration) is detected on that GPIO,
297
the interrupt service routine is executed and hence an I/O event is fired, which
298
can be catched by any thread in the system.
299
mask set (like the _gpioCallback() function in aos_system.c). As result,
300
whenever a rising or falling edge (depends on configuration) is detected on that
301
particular GPIO, the interrupt service routine is executed and hence an I/O
302
event is fired, which can be catched by any thread in the system.
299 303

  
300 304
Next, you have to configure the main thread to whitelist the event flag (all I/O
301 305
events are blacklisted by default). While system relevant events like power down
302
are whitelisted by the OS, any custom events need to be added exl´plicitely.
303
This is done via the optional AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK macro,
304
which should be defined in the module.h file. Example:
306
are imlicitely whitelisted by the OS, any custom events need to be added
307
exlplicitely. This is done via the optional
308
AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK macro, which should be defined in the
309
module.h file. Example:
305 310

  
306 311
  #define AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK         \
307 312
    (AOS_GPIOEVENT_FLAG(padX) | AOS_GPIOEVENT_FLAG(padY) | AOS_GPIOEVENT_FLAG(padZ))
......
309 314
When AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK has been defined correctly, the
310 315
main thread will be notified by the according events and execute its event
311 316
handling routine. Hence you have to implement another macro in module.h to
312
handle the custom event(s) appropriately: MODULE_MAIN_LOOP_GPIOEVENT(eventflags).
313
As you can see, the variable 'eventflags' is propagated to the hook. This
314
variable is a mask, that allows to identify the GPIO pad(s), which caused the
315
event, by the bits set. Following the example above, you can check which GPIOs
316
have caused events by using if-clauses in the implementation of the hook:
317
handle the custom event(s) appropriately:
318
MODULE_MAIN_LOOP_GPIOEVENT(eventflags). As you can see, the variable
319
'eventflags' is propagated to the hook. This variable is a mask, that allows to
320
identify the GPIO pad(s), which caused the event, by the individually set bits.
321
Following the example above, you can check which GPIOs have caused events by
322
using if-clauses in the implementation of the hook:
317 323

  
318 324
  #define MODULE_MAIN_LOOP_GPIOEVENT(eventflags) {          \
319 325
    if (eventflags & AOS_GPIOEVENT_FLAG(padX)) {            \
......
337 343
In the AMiRo-OS framework, low-level drivers are located in the additional Git
338 344
project AMiRo-LLD, which is included in AMiRo-OS as Git submodule at
339 345
periphery-lld/AMiRo-LLD/ and acts similar to a static library. When adding a new
340
low-level driver to the framework, you have to implement it, providing a
341
(single) header file in periphery-lld/AMiRo-LLD/include/ and the required C
342
sources in periphery-lld/AMiRo-LLD/source/. By convention, all filenames use the
343
prefix 'alld_' to avoid ambiguities. Furthermore, files should be named by the
344
exact designation of the hardware (e.g. 'alld_vcnl4020' instead of
345
'alld_proximitysensor'). Since AMiRo-LLD is intended to be usable with other
346
operating systems than AMiRo-OS, it provides an interface for accessing
347
communication interfaces and basic functionalities of the operating system. On
348
the one hand, several types are defined in periphery-lld/AMiRo-LLD/periphALtypes.h.
349
The interface functions, on the other hand, are defined by AMiRo-LLD (cf.
350
periphery-lld/AMiRo-LLD/templates/periphAL.h), but implemented by the operating
351
system (cf. periphery-lld/periphAL.h). For the implementation of the driver, you
352
must only use those types and functions to interact with the operating system.
353
If you need further functionality, which is not provided by the interface yet,
354
you are encouraged to extend periphAL.
355

  
356
Furthermore, all files must define a guard, so that the whole driver is
357
disabled, when the guard is not set explicitely. These guard again are named
358
following a convention, but instead of explaning it here, just have a look at
359
one of the existing drivers and look for lines like
360

  
361
  #if defined(AMIROLLD_CFG_USE_VCNL4020) || defined(__DOXYGEN__)
362

  
363
With these guards in place, the driver will be omitted by default and needs to
364
be enabled explicitely. In order to do so, you need to add an according #define
365
in the alldconf.h file of any module, which shall use the new driver.
366

  
367
Now the new driver is available and enabled, but not actually used yet.
368
Therefore you have to add according memory structures to the module.h and
346
low-level driver to the framework, you have to implement it, following the
347
instructions given in periphery-lld/AMiRo-LLD/README.txt
348

  
349
Now the new driver is available and can be enbled by simply including the
350
driver's makefile script in the module makefile. In order to make actuale use of
351
the driver you have to add according memory structures to the module.h and
369 352
module.c files - just have a look at existing modules how this is done. In some
370 353
cases you will have to configure additional interrupts and/or alter the
371 354
configuration of a communication interface (e.g. I²C). Once again, you should
372 355
take a look at existing modules and search the module.h for the hooks
373
MODULE_INIT_INTERRUPTS() and MODULE_INIT_PERIPHERY_COMM().
356
MODULE_INIT_INTERRUPTS(), MODULE_INIT_PERIPHERY_IF and
357
MODULE_SHUTDOWN_PERIPHERY_IF().
374 358

  
375
Finally, you will probably want to validate your implementation via a unit test.
376
How this can be done is explained in detail in the next guide.
359
Finally, you will probably want to validate your implementation via a test. How
360
this can be done is explained in detail in the next guide.
377 361

  
378 362
Summing up, you have to
379 363
1) implement the driver in AMiRo-LLD using periphAL only.
380
2) fence all code in all files by a guard.
381
3) set the guard in alldconf.h to enable the driver.
382
4) add the driver to a module.
364
4) add the driver to a module (Makefile, module.h and module.c).
383 365
5) configure interrupts and interfaces as required.
384
6) write a unit test.
366
6) write a test.
385 367

  
386 368

  
387
4.4  Writing a Unit Test
369
4.4  Writing a Test
388 370
------------------------
389 371

  
390
AMiRo-OS provides a unit test framework for conventient testing and the ability
391
to opt-out all unit tests via the aosconf.h configuration file. There is also a
392
dedicated folder, where all unit test code belongs to. In case you want to
393
implement a unit test for a newly developed low-level driver, you should use the
394
folders unittests/periphery-lld/inc and unittests/periphery-lld/src
395
respectively. As with the low-level drivers, unit test files should use a prefix
396
in their name, namely 'ut_' and all code should be fenced via guards that
397
disable it by default (have a look at existing unit tests). Before you implement
398
a vast test, however, it is highly recommended to start with some sceleton code
399
(just copy an existing unit test, scoop out the test function, and rename
400
according variables etc.) and make it compile and run.
401

  
402
After you have initialized the unit test sceleton, you have to add the according
403
aos_unittest_t (cf. core/inc/aos_unittest.h) object to the module.h and module.c
404
files. These objects again require an shell command, so the unit test can be run
405
via the AMiRo-OS shell. As with existing unit tests, this shell command callback
406
function as well as any further required data should be implemented directly in
407
module.c, so it not accessable from any other context. In most cases this
408
callback function is trivial, anyway.
409

  
410
In order to make the shell command, which executes the unit test, available in
411
shell so a user can run it, it has to be associated with the shell. AMiRo-OS
412
provides the hook MODULE_INIT_TESTS() for this purpose, which has to be
413
implemented in the module.h file. Once again I recommend to have a look at an
414
existing module, how to use this hook.
415

  
416
Since the execution pipeline is set up now, you can fille your unit test with
417
life. Remember that the test is executed by the shell thread, so you can access
418
any functionality of the system, but might encounter race conditions, depending
419
on what other applications run concurrently.
372
AMiRo-OS provides a test framework for conventient testing and the ability to
373
opt-out all tests via the aosconf.h configuration file. There is also a
374
dedicated folder, where all test code belongs to. In case you want to implement
375
a test for a newly developed low-level driver, you should have a look at the
376
folder test/periphery-lld/. As with the low-level drivers, tests are placed in
377
individual subfolders (e.g. test/periphery-lld/DEVICE1234_v1) and all should use
378
the prefix 'aos_test_' in their name. Moreover, all code must be fenced by
379
guards that disable it completely if the AMIROOS_CFG_TESTS_ENABLE flag is set to
380
false in the aosconf.h configuration file.
381

  
382
Now you will need to add the test to a specific module. Therefore, you should
383
create a new test/ directory in the module folder, if such does not exist yet.
384
In this directory, you create another subfolder, e.g. DEVICE1234/ and three
385
additional files in there:
386
 - module_test_DEVICE1234.mk
387
 - module_test_DEVICE1234.h
388
 - module_test_DEVICE1234.c
389
The makefile script is not required, but recommended to achieve maintainable
390
code. This script file should add the folder to the MODULE_INC variable and all
391
C source files to MODULE_CSRC. The .h and .c files furthermore define module
392
specific data structures and a test function.
393

  
394
In order to be able to call this function as a command via the AMiRo-OS shell,
395
you need to add an according shell command to the module.h and module.c files.
396
Whereas the command itself is typically very simple, just calling the callback
397
function defined in the test/DEVICE1234/module_test_DEVICE1234.h/.c files, you
398
have to add the command to a shell. In order to make the shell command, which
399
executes the test, available in a shell so a user can run it, it has to be
400
associated with the shell. AMiRo-OS provides the hook MODULE_INIT_TESTS() for
401
this purpose, which has to be implemented in the module.h file. Once again I
402
recommend to have a look at an existing module, how to use this hook.
420 403

  
421 404
Summing up, you have to
422
1) initialize a unit test sceleton in the unittests/ folder.
423
2) introduce an according object and configuration in module.h and module.c.
405
1) implement the test in the test/ folder.
406
2) implement a module specific wrapper in the module/test/ folder.
424 407
3) associate the shell command to a shell via the hook in module.h.
425
4) implement the full unit test in the prevously created sceleton files.
426 408

  
427 409
================================================================================
428 410

  
bootloader/AMiRo-BLT
1
Subproject commit 2b9a14a2588e910d0e7d6bc3f77975d9ea70a6c8
1
Subproject commit 9bfc7c44c293389adb8a33bb71f077efd10ee332
doc/AMiRo-OS.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="790px" preserveAspectRatio="none" style="width:1547px;height:790px;" version="1.1" viewBox="0 0 1547 790" width="1547px" zoomAndPan="magnify"><defs><filter height="300%" id="f1kd6u080ub374" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--cluster AMiRoBLT_node--><polygon fill="#FFFFFF" filter="url(#f1kd6u080ub374)" points="14,324,24,314,293,314,293,768,283,778,14,778,14,324" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="283" x2="292" y1="324" y2="315"/><line style="stroke: #000000; stroke-width: 1.5;" x1="14" x2="283" y1="324" y2="324"/><line style="stroke: #000000; stroke-width: 1.5;" x1="283" x2="283" y1="324" y2="778"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="83" x="108" y="339.9951">AMiRo-BLT</text><!--cluster ChibiOS_node--><polygon fill="#FFFFFF" filter="url(#f1kd6u080ub374)" points="301,324,311,314,1100,314,1100,577,1090,587,301,587,301,324" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1090" x2="1099" y1="324" y2="315"/><line style="stroke: #000000; stroke-width: 1.5;" x1="301" x2="1090" y1="324" y2="324"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1090" x2="1090" y1="324" y2="587"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="61" x="666" y="339.9951">ChibiOS</text><!--cluster AMiRoLLD_node--><polygon fill="#FFFFFF" filter="url(#f1kd6u080ub374)" points="1108,324,1118,314,1525,314,1525,768,1515,778,1108,778,1108,324" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1515" x2="1524" y1="324" y2="315"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1108" x2="1515" y1="324" y2="324"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1515" x2="1515" y1="324" y2="778"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="83" x="1271" y="339.9951">AMiRo-LLD</text><!--cluster AMiRoOS_node--><polygon fill="#FFFFFF" filter="url(#f1kd6u080ub374)" points="824,26,834,16,1035,16,1035,273,1025,283,824,283,824,26" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1025" x2="1034" y1="26" y2="17"/><line style="stroke: #000000; stroke-width: 1.5;" x1="824" x2="1025" y1="26" y2="26"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1025" x2="1025" y1="26" y2="283"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="76" x="887.5" y="41.9951">AMiRo-OS</text><!--entity OpenBLT--><rect fill="#D3D3D3" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="104" x="22" y="724"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="106" y="729"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="104" y="731"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="104" y="735"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="64" x="37" y="756.9951">OpenBLT</text><!--entity STM32Flash--><rect fill="#D3D3D3" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="124" x="161" y="724"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="265" y="729"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="263" y="731"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="263" y="735"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="84" x="176" y="756.9951">STM32Flash</text><!--entity amiroblt.h--><ellipse cx="228" cy="375" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="68" x="194" y="404.9951">amiroblt.h</text><!--entity AMiRoBLT--><rect fill="#FEFECE" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="114" x="166" y="533"/><rect fill="#FEFECE" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="260" y="538"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="258" y="540"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="258" y="544"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="74" x="181" y="565.9951">AMiRo-BLT</text><!--entity hal.h--><ellipse cx="738" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="33" x="721.5" y="404.9951">hal.h</text><!--entity osal.h--><ellipse cx="828" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="41" x="807.5" y="404.9951">osal.h</text><!--entity cmsis.h--><ellipse cx="343" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="53" x="316.5" y="404.9951">cmsis.h</text><!--entity ch.h--><ellipse cx="439" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="30" x="424" y="404.9951">ch.h</text><!--entity ch.hpp--><ellipse cx="644" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="48" x="620" y="404.9951">ch.hpp</text><!--entity mcuconf.h--><ellipse cx="935" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="73" x="898.5" y="404.9951">mcuconf.h</text><!--entity halconf.h--><ellipse cx="1053" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="63" x="1021.5" y="404.9951">halconf.h</text><!--entity chconf.h--><ellipse cx="539" cy="375" fill="#D3D3D3" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="60" x="509" y="404.9951">chconf.h</text><!--entity ChibiOS_HAL--><rect fill="#D3D3D3" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="125" x="818.5" y="533"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="923.5" y="538"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="921.5" y="540"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="921.5" y="544"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="833.5" y="565.9951">ChibiOS/HAL</text><!--entity ChibiOS_RT--><rect fill="#D3D3D3" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="532" y="533"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="630" y="538"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="628" y="540"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="628" y="544"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="78" x="547" y="565.9951">ChibiOS/RT</text><!--entity alldconf.h--><ellipse cx="1476" cy="556" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="66" x="1443" y="585.9951">alldconf.h</text><!--entity periphAL.h--><ellipse cx="1171" cy="375" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="73" x="1134.5" y="404.9951">periphAL.h</text><!--entity periphALtypes.h--><ellipse cx="1216" cy="556" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="111" x="1160.5" y="585.9951">periphALtypes.h</text><!--entity alldh--><ellipse cx="1357" cy="556" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="71" x="1321.5" y="585.9951">amiro-lld.h</text><!--entity AMiRoLLD--><rect fill="#FEFECE" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="113" x="1230.5" y="724"/><rect fill="#FEFECE" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="1323.5" y="729"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="1321.5" y="731"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="1321.5" y="735"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="73" x="1245.5" y="756.9951">AMiRo-LLD</text><!--entity osconf.h--><ellipse cx="870" cy="77" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="60" x="840" y="106.9951">osconf.h</text><!--entity amiroos.h--><ellipse cx="985" cy="77" fill="#FEFECE" filter="url(#f1kd6u080ub374)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="68" x="951" y="106.9951">amiroos.h</text><!--entity AMiRoOS--><rect fill="#FEFECE" filter="url(#f1kd6u080ub374)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="108" x="881" y="229"/><rect fill="#FEFECE" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="969" y="234"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="967" y="236"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="967" y="240"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="68" x="896" y="261.9951">AMiRo-OS</text><!--link AMiRoBLT to OpenBLT--><path d="M205.0271,579.0391 C180.0803,611.0178 134.6192,669.2935 104.3571,708.0858 " fill="none" id="AMiRoBLT-OpenBLT" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="109.8576,712.4156,92.0366,723.8792,98.8191,703.8044,109.8576,712.4156" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="31" x="154" y="659.0669">forks</text><!--link AMiRoBLT to STM32Flash--><path d="M223,579.0391 C223,614.0293 223,680.5023 223,718.4885 " fill="none" id="AMiRoBLT-STM32Flash" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="#A80036" points="223,723.8792,227,714.8792,223,718.8792,219,714.8792,223,723.8792" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="44" x="224" y="659.0669">utilizes</text><!--link amiroblt.h to AMiRoBLT--><path d="M227.7452,384.2247 C226.9909,411.5277 224.7532,492.5332 223.6416,532.7757 " fill="none" id="amiroblt.h-AMiRoBLT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link mcuconf.h to ChibiOS_HAL--><path d="M929.2997,394.1064 C919.3187,427.5614 898.7155,496.6203 887.9288,532.7757 " fill="none" id="mcuconf.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M923.2636,384.7565 A9,9 0 0 0 939.4721 389.5923" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link halconf.h to ChibiOS_HAL--><path d="M1037.2615,391.5621 C1006.4973,423.936 938.3234,495.6771 903.0695,532.7757 " fill="none" id="halconf.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1035.9829,380.6303 A9,9 0 0 0 1048.2442 392.2819" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link hal.h to ChibiOS_HAL--><path d="M745.288,384.2247 C766.8589,411.5277 830.8577,492.5332 862.6516,532.7757 " fill="none" id="hal.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><!--link osal.h to ChibiOS_HAL--><path d="M833.5947,394.1064 C843.3909,427.5614 863.6126,496.6203 874.1995,532.7757 " fill="none" id="osal.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M823.4497,389.5555 A9,9 0 0 0 839.6826 384.8021" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link chconf.h to ChibiOS_RT--><path d="M544.4891,394.1064 C554.1005,427.5614 573.9406,496.6203 584.3278,532.7757 " fill="none" id="chconf.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M534.3718,389.5185 A9,9 0 0 0 550.6286 384.8479" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link hal.h to ChibiOS_RT--><path d="M723.8737,392.3936 C697.2709,425.1494 639.7362,495.9915 609.8617,532.7757 " fill="none" id="hal.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M722.0027,381.2824 A9,9 0 0 0 735.1325 391.9458" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link osal.h to ChibiOS_RT--><path d="M818.9987,381.8744 C786.6997,406.5416 675.68,491.3288 621.3851,532.7945 " fill="none" id="osal.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link cmsis.h to ChibiOS_RT--><path d="M352.1206,381.6565 C385.5027,406.0201 502.0461,491.078 559.0762,532.7007 " fill="none" id="cmsis.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ch.h to ChibiOS_RT--><path d="M446.7467,384.2247 C469.6752,411.5277 537.7019,492.5332 571.4968,532.7757 " fill="none" id="ch.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ch.hpp to ChibiOS_RT--><path d="M641.2989,384.2247 C633.3041,411.5277 609.5842,492.5332 597.8005,532.7757 " fill="none" id="ch.hpp-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link alldconf.h to AMiRoLLD--><path d="M1459.6519,572.5211 C1425.9004,606.6298 1348.4436,684.9062 1309.7978,723.9609 " fill="none" id="alldconf.h-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1458.7075,561.4516 A9,9 0 0 0 1470.7305 573.349" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link periphAL.h to AMiRoLLD--><path d="M1154.376,390.7927 C1138.5077,407.6456 1117,435.9402 1117,465.5 C1117,465.5 1117,465.5 1117,654.5 C1117,707.252 1180.9394,730.0909 1230.3925,739.8663 " fill="none" id="periphAL.h-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1153.4133,379.731 A9,9 0 0 0 1165.4488 391.6157" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link alldh to AMiRoLLD--><path d="M1353.6238,565.2123 C1343.1367,593.8271 1310.9044,681.7753 1295.4436,723.9609 " fill="none" id="alldh-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><!--link periphALtypes.h to AMiRoLLD--><path d="M1219.4245,565.2123 C1230.0614,593.8271 1262.7542,681.7753 1278.4357,723.9609 " fill="none" id="periphALtypes.h-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><!--link periphAL.h to periphALtypes.h--><path d="M1173.2934,384.2247 C1180.303,412.4186 1201.5495,497.877 1211.1723,536.5817 " fill="none" id="periphAL.h-periphALtypes.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1221.1218,541.5491 A9,9 0 0 0 1204.7071 545.6303" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link osconf.h to AMiRoOS--><path d="M877.0572,96.0002 C889.0581,128.3104 913.4001,193.8464 926.3853,228.8065 " fill="none" id="osconf.h-AMiRoOS" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M866.6385,92.2391 A9,9 0 0 0 882.4945 86.3496" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link amiroos.h to AMiRoOS--><path d="M982.3118,86.4088 C974.6849,113.1028 952.7445,189.8944 941.6267,228.8065 " fill="none" id="amiroos.h-AMiRoOS" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to mcuconf.h--><path d="M935,275.1354 C935,302.5538 935,346.9112 935,365.9009 " fill="none" id="AMiRoOS-mcuconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to halconf.h--><path d="M958.4964,275.0264 C970.1893,286.6038 984.4674,300.9204 997,314 C1014.3063,332.0617 1033.9574,353.7512 1044.7708,365.793 " fill="none" id="AMiRoOS-halconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to chconf.h--><path d="M880.9137,257.6253 C797.8306,266.9689 643.3309,287.3301 595,314 C572.0917,326.6413 553.4519,352.1396 544.59,365.8245 " fill="none" id="AMiRoOS-chconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to hal.h--><path d="M880.9536,266.0825 C850.0876,275.9767 811.9031,291.5101 783,314 C767.9561,325.7059 755.5301,343.6931 747.5756,357.1064 " fill="none" id="AMiRoOS-hal.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M751.4774,367.3912 A9,9 0 0 0 736.7521 359.0688" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to ch.h--><path d="M880.8627,254.2201 C776.0891,259.3537 550.0858,274.7525 484,314 C467.4287,323.8415 455.0901,342.3867 447.5648,356.4562 " fill="none" id="AMiRoOS-ch.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M451.8862,366.7412 A9,9 0 0 0 436.7497 359.1925" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to amiroblt.h--><path d="M880.6688,252.7769 C745.496,255.4154 397.4396,266.7363 293,314 C271.7498,323.6167 252.9912,343.0537 241.1561,357.4143 " fill="none" id="AMiRoOS-amiroblt.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M243.267,368.3904 A9,9 0 0 0 229.9901 357.9107" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to alldconf.h--><path d="M989.2597,256.4206 C1076.6479,264.3507 1243.8485,283.1113 1294,314 C1392.4738,374.6507 1456.1074,509.7811 1472.057,546.5872 " fill="none" id="AMiRoOS-alldconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to alldh--><path d="M989.1373,257.6357 C1064.3117,266.3895 1195.3309,285.2921 1233,314 C1315.6039,376.9529 1347.8095,510.4287 1355.2338,546.7238 " fill="none" id="AMiRoOS-alldh" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to periphAL.h--><path d="M989.1174,264.9844 C1024.6379,275.0077 1071.1607,291.0728 1108,314 C1131.2661,328.4798 1152.9605,352.7549 1163.791,365.892 " fill="none" id="AMiRoOS-periphAL.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="778px" preserveAspectRatio="none" style="width:1475px;height:778px;" version="1.1" viewBox="0 0 1475 778" width="1475px" zoomAndPan="magnify"><defs><filter height="300%" id="fhfq0xrb38rx9" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--cluster AMiRoBLT_node--><polygon fill="#FFFFFF" filter="url(#fhfq0xrb38rx9)" points="14,324,24,314,285,314,285,756,275,766,14,766,14,324" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="275" x2="284" y1="324" y2="315"/><line style="stroke: #000000; stroke-width: 1.5;" x1="14" x2="275" y1="324" y2="324"/><line style="stroke: #000000; stroke-width: 1.5;" x1="275" x2="275" y1="324" y2="766"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="83" x="104" y="339.9951">AMiRo-BLT</text><!--cluster ChibiOS_node--><polygon fill="#FFFFFF" filter="url(#fhfq0xrb38rx9)" points="293,324,303,314,1092,314,1092,571,1082,581,293,581,293,324" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1082" x2="1091" y1="324" y2="315"/><line style="stroke: #000000; stroke-width: 1.5;" x1="293" x2="1082" y1="324" y2="324"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1082" x2="1082" y1="324" y2="581"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="61" x="658" y="339.9951">ChibiOS</text><!--cluster AMiRoLLD_node--><polygon fill="#FFFFFF" filter="url(#fhfq0xrb38rx9)" points="1111,324,1121,314,1453,314,1453,571,1443,581,1111,581,1111,324" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1443" x2="1452" y1="324" y2="315"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1111" x2="1443" y1="324" y2="324"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1443" x2="1443" y1="324" y2="581"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="83" x="1236.5" y="339.9951">AMiRo-LLD</text><!--cluster AMiRoOS_node--><polygon fill="#FFFFFF" filter="url(#fhfq0xrb38rx9)" points="816,26,826,16,1027,16,1027,273,1017,283,816,283,816,26" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1017" x2="1026" y1="26" y2="17"/><line style="stroke: #000000; stroke-width: 1.5;" x1="816" x2="1017" y1="26" y2="26"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1017" x2="1017" y1="26" y2="283"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="76" x="879.5" y="41.9951">AMiRo-OS</text><!--entity OpenBLT--><rect fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="104" x="22" y="712"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="106" y="717"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="104" y="719"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="104" y="723"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="64" x="37" y="744.9951">OpenBLT</text><!--entity stm32flash--><rect fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="116" x="161" y="712"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="257" y="717"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="255" y="719"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="255" y="723"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="76" x="176" y="744.9951">stm32flash</text><!--entity amiroblt.h--><ellipse cx="222" cy="375" fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="68" x="188" y="404.9951">amiroblt.h</text><!--entity AMiRoBLT--><rect fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="114" x="162" y="527"/><rect fill="#FEFECE" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="256" y="532"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="254" y="534"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="254" y="538"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="74" x="177" y="559.9951">AMiRo-BLT</text><!--entity hal.h--><ellipse cx="730" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="33" x="713.5" y="404.9951">hal.h</text><!--entity osal.h--><ellipse cx="820" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="41" x="799.5" y="404.9951">osal.h</text><!--entity cmsis.h--><ellipse cx="434" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="53" x="407.5" y="404.9951">cmsis.h</text><!--entity ch.h--><ellipse cx="530" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="30" x="515" y="404.9951">ch.h</text><!--entity ch.hpp--><ellipse cx="333" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="48" x="309" y="404.9951">ch.hpp</text><!--entity mcuconf.h--><ellipse cx="927" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="73" x="890.5" y="404.9951">mcuconf.h</text><!--entity halconf.h--><ellipse cx="1045" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="63" x="1013.5" y="404.9951">halconf.h</text><!--entity chconf.h--><ellipse cx="630" cy="375" fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="60" x="600" y="404.9951">chconf.h</text><!--entity ChibiOS_HAL--><rect fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="125" x="810.5" y="527"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="915.5" y="532"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="913.5" y="534"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="913.5" y="538"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="825.5" y="559.9951">ChibiOS/HAL</text><!--entity ChibiOS_RT--><rect fill="#D3D3D3" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="521" y="527"/><rect fill="#D3D3D3" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="619" y="532"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="617" y="534"/><rect fill="#D3D3D3" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="617" y="538"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="78" x="536" y="559.9951">ChibiOS/RT</text><!--entity alldconf.h--><ellipse cx="1404" cy="375" fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="66" x="1371" y="404.9951">alldconf.h</text><!--entity periphAL.h--><ellipse cx="1284" cy="375" fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="73" x="1247.5" y="404.9951">periphAL.h</text><!--entity alldh--><ellipse cx="1162" cy="375" fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="71" x="1126.5" y="404.9951">amiro-lld.h</text><!--entity AMiRoLLD--><rect fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="113" x="1227.5" y="527"/><rect fill="#FEFECE" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="1320.5" y="532"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="1318.5" y="534"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="1318.5" y="538"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="73" x="1242.5" y="559.9951">AMiRo-LLD</text><!--entity osconf.h--><ellipse cx="862" cy="77" fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="60" x="832" y="106.9951">osconf.h</text><!--entity amiroos.h--><ellipse cx="977" cy="77" fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="68" x="943" y="106.9951">amiroos.h</text><!--entity AMiRoOS--><rect fill="#FEFECE" filter="url(#fhfq0xrb38rx9)" height="46.2969" style="stroke: #A80036; stroke-width: 1.5;" width="108" x="873" y="229"/><rect fill="#FEFECE" height="10" style="stroke: #A80036; stroke-width: 1.5;" width="15" x="961" y="234"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="959" y="236"/><rect fill="#FEFECE" height="2" style="stroke: #A80036; stroke-width: 1.5;" width="4" x="959" y="240"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="68" x="888" y="261.9951">AMiRo-OS</text><!--link AMiRoBLT to OpenBLT--><path d="M200.9288,573.0563 C176.8219,603.8135 133.7946,658.7104 104.5882,695.9737 " fill="none" id="AMiRoBLT-OpenBLT" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="109.9177,700.5215,92.0706,711.9444,98.8989,691.8851,109.9177,700.5215" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="31" x="153" y="647.0669">forks</text><!--link AMiRoBLT to stm32flash--><path d="M219,573.0563 C219,606.9378 219,670.1123 219,706.7397 " fill="none" id="AMiRoBLT-stm32flash" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="#A80036" points="219,711.9444,223,702.9444,219,706.9444,215,702.9444,219,711.9444" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="44" x="220" y="647.0669">utilizes</text><!--link amiroblt.h to AMiRoBLT--><path d="M221.8387,384.4088 C221.3811,411.1028 220.0647,487.8944 219.3976,526.8065 " fill="none" id="amiroblt.h-AMiRoBLT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link mcuconf.h to ChibiOS_HAL--><path d="M921.1371,394.0002 C911.1671,426.3104 890.9445,491.8464 880.1568,526.8065 " fill="none" id="mcuconf.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M915.1078,384.8565 A9,9 0 0 0 931.2703 389.8438" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link halconf.h to ChibiOS_HAL--><path d="M1028.3496,391.9408 C997.384,423.4465 930.9036,491.0864 895.7959,526.8065 " fill="none" id="halconf.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1027.5631,380.6759 A9,9 0 0 0 1039.6265 392.5324" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link hal.h to ChibiOS_HAL--><path d="M737.6883,384.4088 C759.5011,411.1028 822.2509,487.8944 854.0476,526.8065 " fill="none" id="hal.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><!--link osal.h to ChibiOS_HAL--><path d="M825.7543,394.0002 C835.5397,426.3104 855.3878,491.8464 865.9757,526.8065 " fill="none" id="osal.h-ChibiOS_HAL" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M815.6476,389.8063 A9,9 0 0 0 831.8359 384.9033" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link chconf.h to ChibiOS_RT--><path d="M624.4504,394.4235 C615.1772,426.8797 596.5719,491.9984 586.6267,526.8065 " fill="none" id="chconf.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M618.3343,385.0451 A9,9 0 0 0 634.5979 389.692" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link hal.h to ChibiOS_RT--><path d="M715.1329,392.3449 C687.9815,424.0216 630.3671,491.2384 599.8801,526.8065 " fill="none" id="hal.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M713.5108,381.2421 A9,9 0 0 0 726.3533 392.2498" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link osal.h to ChibiOS_RT--><path d="M810.8848,381.6465 C778.3481,405.3712 666.927,486.6158 611.6381,526.9306 " fill="none" id="osal.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link cmsis.h to ChibiOS_RT--><path d="M441.8496,384.4088 C464.12,411.1028 528.1862,487.8944 560.65,526.8065 " fill="none" id="cmsis.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ch.h to ChibiOS_RT--><path d="M532.6882,384.4088 C540.3151,411.1028 562.2555,487.8944 573.3733,526.8065 " fill="none" id="ch.h-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ch.hpp to ChibiOS_RT--><path d="M342.0838,381.4359 C375.1572,404.8685 490.1916,486.3706 547.3079,526.8376 " fill="none" id="ch.hpp-ChibiOS_RT" style="stroke: #A80036; stroke-width: 1.0;"/><!--link alldconf.h to AMiRoLLD--><path d="M1391.8265,392.753 C1369.9916,424.5955 1324.1894,491.3904 1299.9041,526.8065 " fill="none" id="alldconf.h-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1388.8326,382.1647 A9,9 0 0 0 1402.7824 391.7303" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link periphAL.h to AMiRoLLD--><path d="M1284,394.4235 C1284,426.8797 1284,491.9984 1284,526.8065 " fill="none" id="periphAL.h-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1275.5428,387.4871 A9,9 0 0 0 1292.4573 387.4869" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link alldh to AMiRoLLD--><path d="M1168.5592,384.4088 C1187.1688,411.1028 1240.7035,487.8944 1267.8308,526.8065 " fill="none" id="alldh-AMiRoLLD" style="stroke: #A80036; stroke-width: 1.0;"/><!--link osconf.h to AMiRoOS--><path d="M869.0572,96.0002 C881.0581,128.3104 905.4001,193.8464 918.3853,228.8065 " fill="none" id="osconf.h-AMiRoOS" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M858.6385,92.2391 A9,9 0 0 0 874.4945 86.3496" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link amiroos.h to AMiRoOS--><path d="M974.3118,86.4088 C966.6849,113.1028 944.7445,189.8944 933.6267,228.8065 " fill="none" id="amiroos.h-AMiRoOS" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to mcuconf.h--><path d="M927,275.1354 C927,302.5538 927,346.9112 927,365.9009 " fill="none" id="AMiRoOS-mcuconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to halconf.h--><path d="M950.4964,275.0264 C962.1893,286.6038 976.4674,300.9204 989,314 C1006.3063,332.0617 1025.9574,353.7512 1036.7708,365.793 " fill="none" id="AMiRoOS-halconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to chconf.h--><path d="M872.8525,257.0004 C821.6408,263.711 744.1784,279.1298 686,314 C663.8043,327.3034 645.1358,352.0564 636.0075,365.5809 " fill="none" id="AMiRoOS-chconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to hal.h--><path d="M872.9536,266.0825 C842.0876,275.9767 803.9031,291.5101 775,314 C759.9561,325.7059 747.5301,343.6931 739.5756,357.1064 " fill="none" id="AMiRoOS-hal.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M743.4774,367.3912 A9,9 0 0 0 728.7521 359.0688" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to ch.h--><path d="M872.747,256.6188 C786.7655,264.7486 623.9211,283.6836 575,314 C558.6173,324.1524 546.2516,342.6528 538.6684,356.627 " fill="none" id="AMiRoOS-ch.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M542.9376,366.9016 A9,9 0 0 0 527.855 359.2456" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to amiroblt.h--><path d="M872.6241,252.6791 C737.3471,255.0897 389.0676,265.9227 285,314 C264.1694,323.6233 246.0295,343.0592 234.6324,357.4177 " fill="none" id="AMiRoOS-amiroblt.h" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M237.0407,368.2313 A9,9 0 0 0 223.5693 358.0029" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to alldconf.h--><path d="M981.105,255.6183 C1079.516,262.9132 1283.4248,281.5217 1346,314 C1369.6059,326.2521 1388.9622,351.9146 1398.1802,365.727 " fill="none" id="AMiRoOS-alldconf.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--link AMiRoOS to alldh--><path d="M981.1781,264.8874 C1016.7242,274.8698 1063.2527,290.9257 1100,314 C1118.8825,325.8566 1136.6088,344.3292 1148.2309,357.8414 " fill="none" id="AMiRoOS-alldh" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1159.462,358.105 A9,9 0 0 0 1146.4708 368.9368" fill="none" style="stroke: #A80036; stroke-width: 1.5;"/><!--link AMiRoOS to periphAL.h--><path d="M981.2458,259.567 C1054.8513,270.4754 1181.9011,291.7639 1223,314 C1246.974,326.9709 1267.6914,352.3301 1277.6653,365.9072 " fill="none" id="AMiRoOS-periphAL.h" style="stroke: #A80036; stroke-width: 1.0;"/><!--
2 2
@startuml
3 3
skinparam componentStyle uml2
4 4

  
......
8 8

  
9 9
node "AMiRo-BLT" as AMiRoBLT_node {
10 10
	component OpenBLT #lightgrey
11
	component STM32Flash #lightgrey
11
	component stm32flash #lightgrey
12 12

  
13 13
	interface amiroblt.h
14 14

  
15 15
	component "AMiRo-BLT" as AMiRoBLT
16 16
	AMiRoBLT -down-|> OpenBLT : forks
17
	AMiRoBLT .down.> STM32Flash : utilizes
17
	AMiRoBLT .down.> stm32flash : utilizes
18 18
	AMiRoBLT -up- amiroblt.h
19 19
}
20 20

  
......
53 53
node "AMiRo-LLD" as AMiRoLLD_node {
54 54
	interface alldconf.h
55 55
	interface periphAL.h
56
	interface periphALtypes.h
57 56
	interface "amiro-lld.h" as alldh
58 57

  
59 58
	component "AMiRo-LLD" as AMiRoLLD
60 59
	AMiRoLLD -up-( alldconf.h
61 60
	AMiRoLLD -up-( periphAL.h
62 61
	AMiRoLLD -up- alldh
63
	AMiRoLLD -up- periphALtypes.h
64
	periphAL.h - -( periphALtypes.h
65 62
}
66 63

  
67 64

  
......
84 81
AMiRoOS - -( ch.h
85 82
AMiRoOS - -( amiroblt.h
86 83
AMiRoOS - - alldconf.h
87
AMiRoOS - - alldh
84
AMiRoOS - -( alldh
88 85
AMiRoOS - - periphAL.h
89 86

  
90 87
@enduml
91 88

  
92
PlantUML version 1.2018.13(Mon Nov 26 18:11:51 CET 2018)
89
PlantUML version 1.2019.08(Sat Jul 13 21:25:14 CEST 2019)
93 90
(GPL source distribution)
94 91
Java Runtime: OpenJDK Runtime Environment
95 92
JVM: OpenJDK 64-Bit Server VM
96
Java Version: 10.0.2+13-Ubuntu-1ubuntu0.18.04.4
93
Java Version: 11.0.4+11-post-Ubuntu-1ubuntu218.04.3
97 94
Operating System: Linux
98
OS Version: 4.15.0-46-generic
95
OS Version: 4.15.0-66-generic
99 96
Default Encoding: UTF-8
100 97
Language: en
101 98
Country: US
doc/AMiRo-OS.uml
86 86
AMiRoOS --( ch.h
87 87
AMiRoOS --( amiroblt.h
88 88
AMiRoOS -- alldconf.h
89
AMiRoOS -- alldh
89
AMiRoOS --( alldh
90 90
AMiRoOS -- periphAL.h
91 91

  
92 92
@enduml
periphery-lld/AMiRo-LLD
1
Subproject commit 1304b12bd859603ad9f9b68493e1a3257f5e4595
1
Subproject commit 72369edc914c55785d0654e4aa5bee9a3aed9290

Also available in: Unified diff