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
|
3e25c332
pifou
Big upload
|
19
20
|
bool isComMem = false; // Commande déjà enregistrée ou non?
bool sleep = true; //Etat de l'interface : true = mode sommeil / false = mode eveillé
|
3e25c332
pifou
Big upload
|
21
|
uint8 comMem[2]; //Commande en mémoire
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
22
|
char msg[30]={'\0'};
|
3e25c332
pifou
Big upload
|
23
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
24
25
26
27
28
|
void init_led(void)
{
DDRD = 0xFF;
PORTD = 0x08;
}
|
3e25c332
pifou
Big upload
|
29
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
30
31
32
33
34
35
36
37
|
void init_timer(void)
{
TCCR1B |= _BV(WGM12);
TCCR1B |= _BV(CS12); // Facteur de division 1024
TCCR1B |= _BV(CS10);
OCR1A = NB_TICK;
TIMSK1 |= _BV(OCIE1A);
}
|
df742988
pifou
Modif tangible
|
38
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
39
40
41
42
43
44
45
|
ISR(TIMER1_COMPA_vect)
{
if(sleep == false)
PORTD ^= 0x20;
}
void requestTCP(SOCKET s,uint8 rq [2])
|
67b73333
amoreau
Ajout du squelette
|
46
|
{
|
bb11e508
pifou
tangible test
|
47
48
49
50
51
52
53
|
if (!isComMem) //Aucune commande en mémoire
{
isComMem = true;
comMem[0] = rq[0]; comMem[1] = rq [1];
}
|
3e25c332
pifou
Big upload
|
54
55
56
57
58
|
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];
|
3e25c332
pifou
Big upload
|
59
|
switch(x)
|
df742988
pifou
Modif tangible
|
60
|
{
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
61
62
63
64
65
66
67
68
69
70
71
72
73
|
case 0: // GETSTATUS
if (sleep==false)
{
strcpy(msg,"\x20\x01");
}
else
{
strcpy(msg,"\x20\x00");
}
send(s,msg,sizeof(char)*strlen(msg)); // REPONSE JE DORS OU NON
disconnect(s);
comMem[0] = rq[0]; comMem[1] = rq [1]; // SAVE
break;
|
bb11e508
pifou
tangible test
|
74
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
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
|
case 3:
printf("Request ComMem\n");
strcpy(msg,comMem);
send(s,msg,sizeof(char)*strlen(msg));
comMem[0] = rq[0]; comMem[1] = rq [1]; // SAVE
break;
}
}
void requestUDP(uint8_t addr[IPV4_SIZE],uint8 rq [2])
{
SOCKET s = 2; //Socket TCP pour réponse à la broadcast UDP
if (!isComMem) //Aucune commande en mémoire
{
isComMem = true;
comMem[0] = rq[0]; comMem[1] = rq [1];
}
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;
switch(x)
{
case 0: // GETSTATUS ( Via UDP broadcast, on répond en TCP ! )
if(socket(s,Sn_MR_TCP,2020,0) == 0)
{
printf("SOCKET NON INITILIASEE \n");
}
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));
disconnect(s);
}
|
3e25c332
pifou
Big upload
|
122
|
comMem[0] = rq[0]; comMem[1] = rq [1]; //save
|
df742988
pifou
Modif tangible
|
123
124
|
break;
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
125
126
127
|
case 2: // SLEEP MODE ON/OFF
if ((y == 0x0001) & (sleep == true))
|
bb11e508
pifou
tangible test
|
128
|
{
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
129
130
131
|
sleep = false;
printf("MODE EVEILLE\n");
PORTD = PORTD ^ 0x08;
|
bb11e508
pifou
tangible test
|
132
|
}
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
133
|
else if ((y == 0x0000) & (sleep == false))
|
bb11e508
pifou
tangible test
|
134
|
{
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
135
136
137
|
sleep = true;
printf("MODE SOMMEIL\n");
PORTD = 0x08;
|
bb11e508
pifou
tangible test
|
138
139
|
}
comMem[0] = rq[0]; comMem[1] = rq [1]; //save
|
df742988
pifou
Modif tangible
|
140
141
|
break;
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
142
143
144
145
146
147
|
case 5: // SETCOMMANDE
if (sleep == false)
{
OCR1A = NB_TICK - 53*(int)per;
comMem[0] = rq[0]; comMem[1] = rq [1]; //save
}
|
df742988
pifou
Modif tangible
|
148
149
150
|
break;
}
|
df742988
pifou
Modif tangible
|
151
152
|
}
|
94783af9
Antoine Moreau
tangible maj
|
153
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
154
155
156
157
158
|
int main(void)
{
/*variables*/
SOCKET sUDP=0,sTCP=1;
|
b34a6f00
pifou
modif socket .h .c
|
159
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
160
161
162
163
164
165
166
167
168
169
|
uint8_t mac[MAC_SIZE] = {0xA0,0xBD,0xCD,0xDD,0xED,0xFD}; // <- Adresse MAC de l'IT
uint8_t ip[IPV4_SIZE] = {192,168,1,205}; // <- Adresse IPV4 de l'IT
uint8_t gateway[4] = {192,168,1,1}; // <- Adresse passerelle
uint8_t mask[4] = {255,255,255,0}; // <- Masque de sous réseau
uint8 buf[2]; // <- Sert à stocker les deux octets recus via TCP & UDP
uint16 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
bool isTCP_received = false; // <- Msg TCP reçu ou non? Permet la réouverture de la socket TCP pour permettre la réécoute TCP
|
df742988
pifou
Modif tangible
|
170
|
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
171
172
173
174
175
176
177
|
/*init*/
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
|
3e25c332
pifou
Big upload
|
178
179
180
181
182
183
184
185
|
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é
|
186
|
|
3e25c332
pifou
Big upload
|
187
188
|
while(1)
{
|
6c0230af
Antoine Moreau
TCP/UDP terminé
|
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
socket(sTCP,Sn_MR_TCP,2020,0);
listen(sTCP);
isTCP_received=false;
while(!isTCP_received)
{
sei();
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)
{
printf("MESSAGE RECU VIA TCP %x %x \n",buf[0],buf[1]);
requestTCP(sTCP,buf); // 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();
printf("MESSAGE RECU VIA UDP %x %x \n",buf[0],buf[1]);
requestUDP(addr,buf); // On traite le message du client
isTCP_received = true;
}
}
|
3e25c332
pifou
Big upload
|
216
217
218
219
|
}
close(sTCP);
close(sUDP);
return 0;
|
67b73333
amoreau
Ajout du squelette
|
220
|
}
|