-
Notifications
You must be signed in to change notification settings - Fork 0
/
message.cpp
183 lines (155 loc) · 3.13 KB
/
message.cpp
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
#if defined(ARDUINO) && ARDUINO >= 100
# include "Arduino.h"
#else
# include "WProgram.h"
# include "wiring.h"
#endif
#include "message.h"
#include "command.h"
void initSerialLink()
{
Serial.begin(SERIAL_BAUD);
}
///
/// Envoie un int
///
void sendMessage(int id, int i)
{
Serial.print(id);
Serial.print(SEP);
Serial.println(i);
}
///
/// Envoie un string
///
void sendMessage(int id, char* str)
{
Serial.print(id);
Serial.print(SEP);
Serial.println(str);
}
///
/// Envoie un int et un string
///
void sendMessage(int id, int i, char* str)
{
Serial.print(id);
Serial.print(SEP);
Serial.print(i);
Serial.print(SEP);
Serial.println(str);
}
///
/// Envoie un string et un int
///
void sendMessage(int id, char* str, int i)
{
Serial.print(id);
Serial.print(SEP);
Serial.print(str);
Serial.print(SEP);
Serial.println(i);
}
///
/// Envoie un tableau d'int
///
void sendMessage(int id, int *tabi, int size)
{
Serial.print(id);
Serial.print(SEP);
for (int i=0; i<size-1; ++i)
{
Serial.print(tabi[i]);
Serial.print(SEP);
}
Serial.println(tabi[size-1]);
}
///
/// Envoie des strings et des int
/// aucune protection, il faut au moins envoyer une chaine et un int
///
void sendMessage(int id, char** tabs, int nbStr, int *tabi, int nbInt)
{
Serial.print(id);
Serial.print(SEP);
for (int i=0; i<nbStr; ++i)
{
Serial.print(tabs[i]);
Serial.print(SEP);
}
for (int i=0; i<nbInt-1; ++i)
{
Serial.print(tabi[i]);
Serial.print(SEP);
}
Serial.println(tabi[nbInt-1]);
}
///
/// Envoie des int et des strings
/// aucune protection, il faut au moins envoyer une chaine et un int
///
void sendMessage(int id, char cmd, int* tabi, int nbInt, char** tabs, int nbStr)
{
Serial.print(id);
Serial.print(SEP);
for (int i=0; i<nbInt; ++i)
{
Serial.print(tabi[i]);
Serial.print(SEP);
}
for (int i=0; i<nbStr-1; ++i)
{
Serial.print(tabs[i]);
Serial.print(SEP);
}
Serial.println(tabs[nbStr-1]);
}
///
/// Parse les donnees recues sur le port serie et appel la fonction cmd pour effectuer les traitements
///
void readIncomingData()
{
static char currentArg[10]; //<= cedric : je reduis ici pour menager la memoire des arduino (vu qu'on les cast en entier avec atoi, le max c'est 6 normalement (-32000 -> +32000)
static int args[10];
static int argsIndex = 0;
static int currentArgIndex = 0;
/*
* A propos du protocole :
* id_cmd:arg1:arg2:...
* - un message se termine par \n
*/
// s'il y a des donnees a lire
int available = Serial.available();
for(int i = 0; i < available; i++){
// recuperer l'octet courant
int data = Serial.read();
Serial.print(data);
switch(data){
// separateur
case SEP:
{
currentArg[currentArgIndex] = '\0';
args[argsIndex] = atoi(currentArg);
argsIndex++;
currentArgIndex = 0;
break;
}
// fin de trame
case '\n':
{
currentArg[currentArgIndex] = '\0';
args[argsIndex] = atoi(currentArg);
cmd(args[0],args[1],args+2,argsIndex-1); // id_cmd, *args, sizeArgs
argsIndex = 0;
currentArgIndex = 0;
break;
}
default:
{
currentArg[currentArgIndex] = data;
currentArgIndex++;
break;
}
}
}
}