-
Notifications
You must be signed in to change notification settings - Fork 3
/
main.c
141 lines (116 loc) · 4.22 KB
/
main.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
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
/** @file main.c
* @author Antoine Albertelli
* @author Florian "Flopy" Glardon
* @date 2011
* @brief Le fichier principal du programme.
*
* Ce fichier contient uniquement les fonctions de bases du code. Il se charge
* de l'init des differents systemes et d'appeller le scheduling toutes les ms.
*/
#include <aversive.h>
#include <aversive/error.h>
#include <scheduler.h>
#include <fast_math.h>
#include <stdio.h>
#include <stdarg.h>
#include <uptime.h>
#include <string.h>
#include <commandline.h>
#ifdef COMPILE_ON_ROBOT
#include <cvra_beacon.h>
#endif
/* nios2.h contient toutes les fonctions dont nous avons besoin pour dialoguer
* avec le nios alt_irq_register, IORD, etc... */
#ifdef COMPILE_ON_ROBOT
#include <nios2.h>
#endif
#include "hardware.h"
#include "cvra_cs.h"
/** Logs an event.
*
* This function is never called directly, but instead, the error
* modules fills an error structure and calls it.
* @param [in] e The error structure, filled with every needed info.
*/
void mylog(struct error * e, ...) {
va_list ap;
va_start(ap, e);
/* Prints the filename (not the full path) and line number. */
printf("%s:%d ", strrchr(e->file, '/') ? strrchr(e->file, '/')+1:e->file, e->line);
vprintf(e->text, ap);
printf("\r\n");
va_end(ap);
}
/** Cette variable contient le temps maximum passe dans une boucle du scheduler.
* Elle donne donc une assez bonne indication de l'occupation du CPU. */
int32_t longest_scheduler_interrupt_time=0;
extern command_t commands_list[];
#ifdef COMPILE_ON_ROBOT
/** Cette fonction est appellee a chaque overflow du timer (toutes les ms).
* Elle execute une la routine du timer (effectuer les taches programmer selon
* leurs priorites)
* @param param Unused parameter, but requested by the NIOSII API.
*/
void main_timer_interrupt(__attribute__((unused)) void *param) {
static int i=0;
int32_t time;
/* Chenillard sur les LEDs */
i++;
IOWR(LED_BASE, 0, i/100);
if(i==0xfe*100)
i=0;
/* Reset le timer. */
IOWR(TICK_BASE, 0, 0x00);
/* Execute les taches programmees en mesurant le temps mis. */
time = uptime_get();
scheduler_interrupt();
time = uptime_get() - time;
/* Si le temps est plus grand que le maximum, on le garde en memoire. */
if(time > longest_scheduler_interrupt_time) {
longest_scheduler_interrupt_time = time;
}
}
#endif
/** @brief Demarre le robot
*
* Cette fonction est la premiere executee par notre code. Elle est responsable
* de l'initialisation de tous les sous-systemes dans un ordre permettant leur
* bon fonctionnement.
*
* @bug Est-ce qu'on peut se debarasser de argc et argv ? antoine
* @param argc, argv Unused parameters, but requested by the Nios II API.
* @returns Never returns
*/
int main(__attribute__((unused)) int argc, __attribute__((unused)) char **argv) {
robot.verbosity_level = ERROR_SEVERITY_NOTICE;
/* Step 1 : Setup UART speed. Doit etre en premier car necessaire pour le log. */
//cvra_set_uart_speed(COMPC_BASE, 57600);
//
error_register_emerg(mylog);
error_register_error(mylog);
error_register_warning(mylog);
error_register_notice(mylog);
//error_register_debug(mylog);
/* Step 2 : Init de la librairie math de Mathieu. */
/**FIXME @todo Est-ce qu'on a encore besoin de fast_math_init() dans la version finale ? */
fast_math_init();
/* Step 3 : Demarre le scheduler pour le multitache. */
scheduler_init();
#ifdef COMPILE_ON_ROBOT
/* Step 3 (suite) : Si on est sur le robot on inscrit le tick dans la table des interrupts. */
alt_ic_isr_register(0, TICK_IRQ, main_timer_interrupt, NULL, 0);
#endif
/* Step 4 : Init les IO.
* Init de l'ADC et planification des updates des capteurs */
//cvra_board_init(); /** @todo : c'est bien le bon harware.c qui est appelé */
/* Step 5 : Init la regulation et l'odometrie (+ planification). */
cvra_cs_init();
/* Step 6 : Demarre la comm avec le PC, pas de retour de cette fonction. */
commandline_init(commands_list);
#ifdef COMPILE_ON_ROBOT
//cvra_beacon_init(&robot.beacon, AVOIDING_BASE, AVOIDING_IRQ);
IOWR(AVOIDING_BASE, 3, 127);
#endif
for(;;) commandline_input_char(getchar());
return 0;
}