67b73333
amoreau
Ajout du squelette
|
1
|
#include <avr/io.h>
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
2
|
#include <avr/interrupt.h>
|
67b73333
amoreau
Ajout du squelette
|
3
4
|
#include <util/delay.h>
#include <stdio.h>
|
df742988
pifou
Modif tangible
|
5
6
7
|
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
|
67b73333
amoreau
Ajout du squelette
|
8
9
10
11
12
13
14
|
#include "serial.h"
#include "ethernet.h"
#include "w5100.h"
#include "socket.h"
#define MAC_SIZE 6
#define IPV4_SIZE 4
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
15
16
17
18
|
#define PRESCALER 1024
#define NB_TICK 6250
#define DELAY 300
|
f8d20e5d
Antoine Moreau
cat focntion
|
19
|
bool sleep = false; //Etat de l'interface : true = mode sommeil / false = mode eveillé
|
8450f712
Antoine Moreau
fin
|
20
21
|
unsigned char comMem[2] = {'\0'}; //Commande en mémoire
unsigned char msg[2]; //Message qui sera envoyé via TCP
|
f8d20e5d
Antoine Moreau
cat focntion
|
22
|
typedef enum type_msg {TCP,UDP}type_msg;
|
8450f712
Antoine Moreau
fin
|
23
|
bool isTCP_received = false; // <- Msg TCP reçu ou non? Permet la réouverture de la socket TCP pour la réécoute TCP
|
3e25c332
pifou
Big upload
|
24
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
25
26
27
|
void init_led(void)
{
DDRD = 0xFF;
|
f8d20e5d
Antoine Moreau
cat focntion
|
28
29
30
31
32
33
34
35
|
if (sleep == true) // si IT dort
{
PORTD = 0x08;
}
else
{
PORTD = 0x00;
}
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
36
|
}
|
3e25c332
pifou
Big upload
|
37
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
38
39
|
void init_timer(void)
{
|
8450f712
Antoine Moreau
fin
|
40
41
42
43
44
|
TCCR1B |= _BV(WGM12);
TCCR1B |= _BV(CS12); // Facteur de division 1024
TCCR1B |= _BV(CS10);
OCR1A = NB_TICK;
TIMSK1 |= _BV(OCIE1A);
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
45
|
}
|
df742988
pifou
Modif tangible
|
46
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
47
48
49
50
51
52
|
ISR(TIMER1_COMPA_vect)
{
if(sleep == false)
PORTD ^= 0x20;
}
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
53
|
|
f8d20e5d
Antoine Moreau
cat focntion
|
54
|
void request(SOCKET sock,uint8 rq[2],uint8 addr[IPV4_SIZE],type_msg type)
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
55
|
{
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
56
57
58
59
60
61
|
uint8 x = rq [0] & 0xE0; //Récupération de la commande
x = x >> 5;
uint16 y = rq[0] & 0x1F; //Récupération du pourcentage
y = y << 8;
y += rq[1];
float per = y*0.0122;
|
f8d20e5d
Antoine Moreau
cat focntion
|
62
|
|
f8d20e5d
Antoine Moreau
cat focntion
|
63
|
if (type == UDP)
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
64
|
{
|
8450f712
Antoine Moreau
fin
|
65
|
SOCKET s = 2; //Creation socket TCP pour réponse à la broadcast UDP
|
f8d20e5d
Antoine Moreau
cat focntion
|
66
|
switch(x)
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
67
|
{
|
8450f712
Antoine Moreau
fin
|
68
69
70
|
case 0: // GETSTATUS + connection ( Reçu via UDP broadcast, mais on répond en TCP ! )
printf("Reception UDP getstatus\n");
|
f8d20e5d
Antoine Moreau
cat focntion
|
71
72
73
|
if(socket(s,Sn_MR_TCP,2020,0) == 0)
{
printf("SOCKET TCP NON INITILIASEE \n");
|
8450f712
Antoine Moreau
fin
|
74
|
break;
|
f8d20e5d
Antoine Moreau
cat focntion
|
75
76
77
78
79
80
81
82
83
84
85
86
87
|
}
if (connect(s,addr,2020))
{
_delay_ms(DELAY); //l'IT doit attendre un peu avant d'envoyer
if (sleep==false)
{
strcpy(msg,"\x20\x01");
}
else
{
strcpy(msg,"\x20\x00");
}
send(s,msg,sizeof(char)*strlen(msg));
|
8450f712
Antoine Moreau
fin
|
88
89
|
disconnect(s);
}
|
f8d20e5d
Antoine Moreau
cat focntion
|
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
break;
case 2: // SLEEP MODE ON/OFF
if ((y == 0x0001) & (sleep == true))
{
sleep = false;
printf("MODE EVEILLE\n");
PORTD = PORTD ^ 0x08;
}
else if ((y == 0x0000) & (sleep == false))
{
sleep = true;
printf("MODE SOMMEIL\n");
PORTD = 0x08;
}
break;
|
8450f712
Antoine Moreau
fin
|
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
case 3: // GETCOMMAND
if(socket(s,Sn_MR_TCP,2020,0) == 0)
{
printf("SOCKET TCP NON INITILIASEE \n");
break;
}
if (connect(s,addr,2020))
{
_delay_ms(DELAY); //l'IT doit attendre un peu avant d'envoyer
msg[0]=comMem[0];
msg[1]=comMem[1];
send(s,msg,sizeof(char)*strlen(msg));
disconnect(s);
}
break;
|
f8d20e5d
Antoine Moreau
cat focntion
|
123
124
125
126
127
128
|
case 5: // SETCOMMANDE
if (sleep == false)
{
OCR1A = NB_TICK - 53*(int)per;
comMem[0] = rq[0]; comMem[1] = rq [1]; //save
}
|
8450f712
Antoine Moreau
fin
|
129
130
|
break;
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
131
|
}
|
f8d20e5d
Antoine Moreau
cat focntion
|
132
|
}
|
f8d20e5d
Antoine Moreau
cat focntion
|
133
134
135
|
else if (type == TCP)
{
switch(x)
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
136
|
{
|
8450f712
Antoine Moreau
fin
|
137
|
|
f8d20e5d
Antoine Moreau
cat focntion
|
138
|
case 0: // GETSTATUS
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
139
140
141
142
143
144
|
if (sleep==false)
{
strcpy(msg,"\x20\x01");
}
else
{
|
8450f712
Antoine Moreau
fin
|
145
|
strcpy(msg,"\x20\x00");
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
146
|
}
|
8450f712
Antoine Moreau
fin
|
147
148
|
send(sock,msg,sizeof(char)*strlen(msg));
disconnect(sock);
|
f8d20e5d
Antoine Moreau
cat focntion
|
149
|
break;
|
8450f712
Antoine Moreau
fin
|
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
case 2: // SLEEP MODE ON/OFF
if ((y == 0x0001) & (sleep == true))
{
sleep = false;
printf("MODE EVEILLE\n");
PORTD = PORTD ^ 0x08;
}
else if ((y == 0x0000) & (sleep == false))
{
sleep = true;
printf("MODE SOMMEIL\n");
PORTD = 0x08;
}
disconnect(sock);
break;
case 3: // GETCOMMAND
|
f8d20e5d
Antoine Moreau
cat focntion
|
168
169
170
|
printf("Request ComMem\n");
strcpy(msg,comMem);
send(sock,msg,sizeof(char)*strlen(msg));
|
f8d20e5d
Antoine Moreau
cat focntion
|
171
172
173
|
disconnect(sock);
break;
|
8450f712
Antoine Moreau
fin
|
174
175
176
177
178
179
180
181
|
case 5: // SETCOMMANDE
if (sleep == false)
{
OCR1A = NB_TICK - 53*(int)per;
comMem[0] = rq[0]; comMem[1] = rq [1]; //save
}
disconnect(sock);
break;
|
f8d20e5d
Antoine Moreau
cat focntion
|
182
183
|
}
}
|
df742988
pifou
Modif tangible
|
184
|
}
|
b34a6f00
pifou
modif socket .h .c
|
185
|
|
df742988
pifou
Modif tangible
|
186
|
|
8450f712
Antoine Moreau
fin
|
187
188
189
190
191
192
|
int main(void)
{
/* VARIABLES */
SOCKET sUDP=0,sTCP=1;
uint8_t mac[MAC_SIZE] = {0xA0,0xBD,0xCD,0xDD,0xED,0xFD}; // <- Adresse MAC de l'IT
|
5227cd0e
Antoine Moreau
IT fin.
|
193
194
|
uint8_t ip[IPV4_SIZE] = {172,26,145,205}; // <- Adresse IPV4 de l'IT
uint8_t gateway[4] = {172,26,145,35}; // <- Adresse passerelle
|
8450f712
Antoine Moreau
fin
|
195
196
197
198
199
200
201
202
203
204
205
206
207
|
uint8_t mask[4] = {255,255,255,0}; // <- Masque de sous réseau
uint8_t buf[2]; // <- Sert à stocker les deux octets recus via TCP & UDP
uint16_t datasize; // <- Sert à stocker la longueur du datagramme
uint8_t addr[IPV4_SIZE]; // <- Sert à stocker l'adresse IP de l'émetteur
uint16_t port; // <- Sert à stocker le port utilisé par l'émetteur
type_msg type; // <- Enumeration : type de message recu {TCP,UDP}
/* INITIALISATION */
init_led(); // <- Initialise les LEDS
init_timer(); // <- Initialise le compteur pour la fréquence du clignotement LED
init_printf(); // <- Initialise la communication série
ethernet_init(mac,ip,gateway,mask); // <- Initialise le shield ethernet
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
208
|
|
8450f712
Antoine Moreau
fin
|
209
210
211
212
213
214
215
216
217
|
if (!socket(sUDP,Sn_MR_UDP,2020,0))
{
return -1;
}
if (!socket(sTCP,Sn_MR_TCP,2020,0))
{
return -1;
}
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
218
|
|
8450f712
Antoine Moreau
fin
|
219
|
comMem[0] = 0xA0; comMem[1] = 0x00; // Commande en mémoire (default)
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
220
|
|
8450f712
Antoine Moreau
fin
|
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
|
listen(sTCP);
/* BOUCLE PRINCIPALE */
while(1)
{
sei();
if (isTCP_received == true)
{
socket(sTCP,Sn_MR_TCP,2020,0);
listen(sTCP);
isTCP_received=false;
}
if (IINCHIP_READ(Sn_SR(sTCP)) == SOCK_ESTABLISHED) // Quelqu'un s'est connecté en TCP
{
cli();
while(!isTCP_received) // On boucle en attendant le message du client
{
if(recv(sTCP,buf,2)>0)
{
type=TCP;
request(sTCP,buf,NULL,type); // On traite le message du client
isTCP_received=true;
}
}
}
if((datasize=recvfrom(sUDP,buf,sizeof(buf),addr,&port)) == 8) // Quelqu'un a envoyé 2 octets via UDP
{
cli();
type=UDP;
printf("MESSAGE RECU VIA UDP %x %x \n",buf[0],buf[1]);
request(sUDP,buf,addr,type); // On traite le message du client
}
}
close(sTCP);
close(sUDP);
return 0;
}
|