Hallo,
Ik ben bezig met de code voor een robot, en heb een vraagje over hoe ik iets zo handig mogelijk kan aanpakken. Ik zal eerst even uitleggen hoe de situatie nu is: De robot is opgebouwd uit verschillende classes (elke sensor, verwerkingsunit en motor heeft een eigen class), al deze classes hebben allemaal verschillende getters en setters om informatie op te halen of instellingen aan te passen (denk aan doel aanpassen, maar ook finetuning van filters). Deze dingen moeten allemaal via de seriële poort benaderd kunnen worden, dus heb ik een communicatie class geschreven waarin door middel van een sscanf, een string compare en een if/elseif structuur de commando's uitgefilterd worden. Voor elk comando is er dus een apparte "if" die iets met een specifieke class doet. Ook is er nog een algemene status info opdracht die alle informatie in één keer doorstuurt.
Dit systeem werkt prima, alleen is het een vreselijk werk om te onderhouden. Er komen de hele tijd functies bij en oude worden aangepast. Als ik nu een functie toevoeg moet ik dat op vier plekken doen(in de code van de betreffende class, in de .h file van de class, in de communicatie class, en op de pc).
Is er een manier om dit handig te doen?
Klein stukje uit de communicatie class:
Ik ben bezig met de code voor een robot, en heb een vraagje over hoe ik iets zo handig mogelijk kan aanpakken. Ik zal eerst even uitleggen hoe de situatie nu is: De robot is opgebouwd uit verschillende classes (elke sensor, verwerkingsunit en motor heeft een eigen class), al deze classes hebben allemaal verschillende getters en setters om informatie op te halen of instellingen aan te passen (denk aan doel aanpassen, maar ook finetuning van filters). Deze dingen moeten allemaal via de seriële poort benaderd kunnen worden, dus heb ik een communicatie class geschreven waarin door middel van een sscanf, een string compare en een if/elseif structuur de commando's uitgefilterd worden. Voor elk comando is er dus een apparte "if" die iets met een specifieke class doet. Ook is er nog een algemene status info opdracht die alle informatie in één keer doorstuurt.
Dit systeem werkt prima, alleen is het een vreselijk werk om te onderhouden. Er komen de hele tijd functies bij en oude worden aangepast. Als ik nu een functie toevoeg moet ik dat op vier plekken doen(in de code van de betreffende class, in de .h file van de class, in de communicatie class, en op de pc).
Is er een manier om dit handig te doen?
Klein stukje uit de communicatie class:
C++:
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
| if (c1 == "s") { zender.printf("%d %d %d %f %f %d %f %f %d\n\r",roer->get(),zeil->get(),kompas->get(),gps->get().lat,gps->get().lon,route->getActive(),route->afstand_tot_doel(), route->koers_tot_doel(),zeilmanual); } else if (c1 == "roer") { if (c2 == "set") { if (set) { sscanf (c3.c_str(),"%d",&n); roer->set(n); } } else if (c2 == "get") { if (!set) { zender.printf("%d\n\r",roer->get()); } } } else if (c1 == "zeil") { if (c2 == "set") { if (set) { sscanf (c3.c_str(),"%d",&n); zeil->set(n); } } else if (c2 == "get") { if (!set) { zender.printf("%d\n\r",zeil->get()); } } else if (c2 == "auto") { if (set) { sscanf (c3.c_str(),"%d",&n); if (n == 1) { zeiltimer.attach(this,&Status::autoZeil,0.1); zeilmanual = 0; } if (n == 0) { zeiltimer.detach(); zeilmanual = 1; } } if (!set) { zender.printf("%d\n\r",zeilmanual); } } |