Blame view

Tangible/tangibleInterface.c 5.79 KB
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
  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
    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_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 lmetteur
    uint16_t port; // <- Sert à stocker le port utilisé par lmetteur
    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;
  }