Blame view

Tangible/tangibleInterface.c 5.13 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
  
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 lmetteur
    uint16_t port; // <- Sert à stocker le port utilisé par lmetteur
    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
  }