Blame view

RIOT/examples/real_time_app/main.c 12.4 KB
41eae2a4   vrobic   ajout serveur snt...
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
  /*
   * Copyright (C) 2015 Freie Universitรคt Berlin
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @ingroup     examples
   * @{
   *
   * @file
   * @brief       Example application for demonstrating the RIOT network stack
   *
   * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
   *
   * @}
   */
  #include <stdbool.h>
  #include <stdint.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <inttypes.h>
  
  #include <arpa/inet.h>
  #include "../../boards/stm32f4discovery/include/board.h"
  #include "../../boards/stm32f4discovery/include/periph_conf.h"
5345525d   root   ajout retour serv...
30
  #include "periph/gpio.h"
41eae2a4   vrobic   ajout serveur snt...
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
  #include "net/sock/udp.h"
  #include "net/gnrc/ipv6.h"
  #include "net/af.h"
  #include "net/sixlowpan.h"
  #include "net/gnrc/pktdump.h"
  #include "shell.h"
  #include "shell_commands.h"
  #include "msg.h"
  #include "thread.h"
  #include "sched.h"
  #include "thread.h"
  #include "kernel_types.h"
  #include "net/netstats.h"
  #include "net/ipv6/addr.h"
  #include "periph/timer.h"
  #include "net/gnrc/ipv6/netif.h"
  #include "net/gnrc/netif.h"
  #include "net/gnrc/netapi.h"
  #include "net/netopt.h"
  #include "net/gnrc/pkt.h"
  #include "net/gnrc/pktbuf.h"
  #include "net/gnrc/netif/hdr.h"
  #include "net/gnrc/sixlowpan/netif.h"
  #include "net/fib.h"
  #include "net/gnrc/udp.h"
  #include "periph/pwm.h"
  #include "od.h"
  #include "net/sntp.h"
  #include "net/ntp_packet.h"
  #ifdef MODULE_SCHEDSTATISTICS
  #include "xtimer.h"
  #endif
  
  #ifdef MODULE_TLSF
  #include "tlsf.h"
  #endif
  
  #define MAIN_QUEUE_SIZE     (8)
  /**
   * @brief   The maximal expected link layer address length in byte
   */
  #define MAX_ADDR_LEN            (8U)
  
  /**
   * @brief   The default IPv6 prefix length if not specified.
   */
  #define SC_NETIF_IPV6_DEFAULT_PREFIX_LEN     (64)
  
  #define _STACKSIZE      (THREAD_STACKSIZE_DEFAULT + THREAD_EXTRA_STACKSIZE_PRINTF)
  #define MSG_TYPE_ISR    (0x3456)
  
  #define PWM_FREQ 100
  #define PWM_RES 100
5345525d   root   ajout retour serv...
84
  #define DEADLINE 15000
41eae2a4   vrobic   ajout serveur snt...
85
86
87
88
89
90
  
  // addr ipv6 link local node 1: fe80::3734:510e:3317:3402
  uint8_t node1[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x34,0x51,0x0e,0x33,0x17,0x34,0x02};
  // addr ipv6 link local node 2: fe80::3634:5110:3473:3762
  uint8_t node2[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x34,0x51,0x10,0x34,0x73,0x37,0x62};
  //addr ipv6 link local node 3: fe80::3634:5110:3471:3766
5345525d   root   ajout retour serv...
91
  uint8_t node3[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x34,0x51,0x0b,0x33,0x0a,0x34,0x1e};
41eae2a4   vrobic   ajout serveur snt...
92
93
94
95
96
97
98
99
100
101
102
103
104
  
  //static char _stack_server[GNRC_PKTDUMP_STACKSIZE];
  char pwm_stack[THREAD_STACKSIZE_MAIN];
  char sock_server_stack[THREAD_STACKSIZE_MAIN];
  char sock_client_stack[THREAD_STACKSIZE_MAIN];
  char sock_time_server_stack[THREAD_STACKSIZE_MAIN];
  // static gnrc_netreg_entry_t server = GNRC_NETREG_ENTRY_INIT_PID(GNRC_NETREG_DEMUX_CTX_ALL,
  //                                                                KERNEL_PID_UNDEF);
  // 
  // kernel_pid_t gnrc_server_pid = KERNEL_PID_UNDEF;
  // 
  kernel_pid_t server, client, time_server;
  int ordre = 0;
0f803f1d   root   test application ...
105
106
  int64_t offset = 0;
  int timer_run = 0;
e873cff7   root   application real-...
107
  int tourne = 0;
41eae2a4   vrobic   ajout serveur snt...
108
109
110
111
112
113
  sock_udp_ep_t local = SOCK_IPV6_EP_ANY;
  sock_udp_t sock; 
  sock_udp_ep_t local_ntp = SOCK_IPV6_EP_ANY;
  sock_udp_t sock_ntp; 
  static ntp_packet_t sntp_packet;
  
0f803f1d   root   test application ...
114
115
116
117
118
  typedef struct tableau {
    uint32_t heure_actuelle;
    char donnees[2];
  }Data;
  
41eae2a4   vrobic   ajout serveur snt...
119
120
121
122
123
  
  void *sock_time_server_thread(void *arg)
  {
      (void) arg;
      local_ntp.port = NTP_PORT;
ceb4c7ca   root   changement carte ...
124
  
41eae2a4   vrobic   ajout serveur snt...
125
      if (sock_udp_create(&sock_ntp, &local_ntp, NULL, 0) < 0) {
ceb4c7ca   root   changement carte ...
126
127
  	  puts("Error creating UDP sock");
  	  return NULL;
41eae2a4   vrobic   ajout serveur snt...
128
        }
ceb4c7ca   root   changement carte ...
129
  
41eae2a4   vrobic   ajout serveur snt...
130
        while (1) {
ceb4c7ca   root   changement carte ...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  	  sock_udp_ep_t remote;
  	  ssize_t res;
  
  	  if ((res = sock_udp_recv(&sock_ntp,&sntp_packet, sizeof(sntp_packet), SOCK_NO_TIMEOUT,
  				  &remote)) >= 0) {
  	      puts("Received a message");
  	    //printf("TT: %lu\n", byteorder_ntohl(sntp_packet.transmit.seconds));
  	    
  	    // printf("%c\n",remote.addr.ipv6[15]);
  	    //xtimer_ticks64_t now = xtimer_now64();
  	    // heure actuelle du serveur
  	    sntp_packet.receive.seconds=byteorder_htonl( xtimer_now_usec());
  	    sntp_packet.origin.seconds=sntp_packet.transmit.seconds;
  	    sntp_packet.transmit.seconds=byteorder_htonl( xtimer_now_usec());
  	    //printf("heure actuelle : %lu\n",xtimer_now_usec());
  	    //printf("TT2: %lu\n", byteorder_ntohl(sntp_packet.transmit.seconds));
  	  //memset(&sntp_packet, 0, sizeof(sntp_packet)); 
  	    //ntp_packet_set_vn(&sntp_packet);
  	    //ntp_packet_set_mode(&sntp_packet, NTP_MODE_SERVER);
  	      if (sock_udp_send(&sock_ntp, &sntp_packet, sizeof(sntp_packet), &remote) < 0) {
  		  puts("Error sending reply");
  	      }
  	  }
41eae2a4   vrobic   ajout serveur snt...
154
155
156
        }
      return NULL;
  }
e873cff7   root   application real-...
157
  /*void *pwm_thread(void *arg)
41eae2a4   vrobic   ajout serveur snt...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  {
      (void) arg;
      int tourne = 0;
      while(1)
      {
        
  	if(ordre==1)
  	{
  	  pwm_set(PWM_DEV(0),1,45);
  	  tourne = 1;
  	}
  	else if(ordre==0)
  	{
  	  pwm_set(PWM_DEV(0),1,0);
  	  tourne = 0;
  	}
  	else if(ordre==2 && tourne == 1)
  	  pwm_set(PWM_DEV(0),1,31);
        
      }
      return NULL;
e873cff7   root   application real-...
179
  }*/
41eae2a4   vrobic   ajout serveur snt...
180
181
182
  
  void *sock_server_thread(void *arg)
  {
ceb4c7ca   root   changement carte ...
183
184
185
186
187
188
189
    (void) arg;
    Data buf;
    int compteur = 5;
    int deadline;
    local.port = 1234;
    sock_udp_ep_t server = { .port = NTP_PORT, .family = AF_INET6 };
    ipv6_addr_from_str((ipv6_addr_t *)&server.addr, "dead:beef::3402");
41eae2a4   vrobic   ajout serveur snt...
190
      
ceb4c7ca   root   changement carte ...
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
    if (sock_udp_create(&sock, &local, NULL, 0) < 0) {
      puts("Error creating UDP sock");
      return NULL;
    }
    if (sntp_sync(&server, SOCK_NO_TIMEOUT) < 0) {
      puts("Error in synchronization");
      return NULL;
    }
    offset = sntp_get_offset();
    printf("offset : %i\n",(int)offset);
    
    while (1) {
      sock_udp_ep_t remote;
      ssize_t res;
      if ((res = sock_udp_recv(&sock, &buf, sizeof(buf), SOCK_NO_TIMEOUT,&remote)) >= 0) {
        deadline = xtimer_now_usec() + offset - buf.heure_actuelle;
        printf("tps de transmission : %i\n",deadline);
        
        if(buf.donnees[0] == 'g' && buf.donnees[1] == 'o') {
  	if(deadline >= DEADLINE && compteur >=5) {
  	  compteur = 0;
  	  if(tourne == 1)
  	    pwm_set(PWM_DEV(0),1,31);
  	  if(timer_run == 0) {
5345525d   root   ajout retour serv...
215
216
217
218
219
220
  	    if (sock_udp_send(&sock, "d", sizeof("d"), &remote) < 0) {
  	     puts("Error sending reply");
  	   }
  	    gpio_clear(LED1_PIN);
  	    gpio_clear(LED2_PIN);
  	    gpio_set(LED0_PIN);
ceb4c7ca   root   changement carte ...
221
222
  	    timer_set(TIMER_DEV(1),0,25200);
  	    printf("relance timer\n");
5345525d   root   ajout retour serv...
223
224
225
226
227
228
  	    if (sntp_sync(&server, SOCK_NO_TIMEOUT) < 0) {
  	      puts("Error in synchronization");
  	      return NULL;
  	    }
  	    offset = sntp_get_offset();
  	    printf("offset : %i\n",(int)offset);
ceb4c7ca   root   changement carte ...
229
230
231
232
233
234
235
236
237
238
239
240
  	    timer_run = 1;
  	  }
  	}
  	if(deadline >= DEADLINE && compteur < 5) {
  	  compteur = 0;
  	}
  	if(deadline<=DEADLINE && compteur >=5) {
  	  pwm_set(PWM_DEV(0),1,45);
  	  tourne = 1;
  	  timer_run=0;
  	  timer_clear(TIMER_DEV(1),0);
  	  printf("clear timer\n");
5345525d   root   ajout retour serv...
241
242
243
244
245
246
  	   if (sock_udp_send(&sock, "n", sizeof("n"), &remote) < 0) {
  	     puts("Error sending reply");
  	   }
  	   gpio_clear(LED2_PIN);
  	   gpio_clear(LED0_PIN);
  	   gpio_set(LED1_PIN);
ceb4c7ca   root   changement carte ...
247
248
249
250
251
252
  	}
  	if(deadline<=DEADLINE && compteur <5) {
  	  compteur++;
  	} 
  	printf("compteur : %d\n",compteur);
  	memset(&buf,0,sizeof(buf));
41eae2a4   vrobic   ajout serveur snt...
253
        }
0f803f1d   root   test application ...
254
      }
ceb4c7ca   root   changement carte ...
255
    }
41eae2a4   vrobic   ajout serveur snt...
256
257
258
259
260
      return NULL;
  }
  
  void *sock_client_thread(void *arg)
  {
ceb4c7ca   root   changement carte ...
261
262
    (void) arg;
    Data data;
5345525d   root   ajout retour serv...
263
264
    int vitesse=2;
    uint8_t buf[3];
ceb4c7ca   root   changement carte ...
265
266
267
    data.donnees[0] = 'g';
    data.donnees[1] = 'o';
    //uint8_t paquet[];
5345525d   root   ajout retour serv...
268
    ssize_t res;
ceb4c7ca   root   changement carte ...
269
270
271
272
273
274
275
276
    sock_udp_ep_t remote = { .family = AF_INET6 };
    
    remote.port = 1234;
    remote.addr.ipv6[0] = 0xde;
    remote.addr.ipv6[1] = 0xad;
    remote.addr.ipv6[2] = 0xbe;
    remote.addr.ipv6[3] = 0xef;
    remote.addr.ipv6[14] = 0x34;
5345525d   root   ajout retour serv...
277
278
    remote.addr.ipv6[15] = 0x1e;
  
ceb4c7ca   root   changement carte ...
279
    while (1) {
ceb4c7ca   root   changement carte ...
280
281
      data.heure_actuelle = xtimer_now_usec();
      
5345525d   root   ajout retour serv...
282
      if (sock_udp_send(&sock, &data, sizeof(data), &remote) < 0) {
ceb4c7ca   root   changement carte ...
283
284
285
        puts("Error sending message");
      }
      puts("Send a message");
5345525d   root   ajout retour serv...
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
      if(vitesse==2) {
        gpio_clear(LED0_PIN);
        gpio_toggle(LED1_PIN);
      }
      else {
        gpio_clear(LED1_PIN);
        gpio_toggle(LED0_PIN);
      }
      if ((res = sock_udp_recv(&sock, buf, sizeof(buf), 0.05 * SEC_IN_USEC,NULL)) < 0) {
        if (res == -ETIMEDOUT) {
  	puts("Timed out");
        }
        else {
  	puts("Error receiving message");
        }
      }
      else {
        printf("Received message: \"");
        for (int i = 0; i < res; i++) {
  	printf("%c", buf[i]);
        }
        if(buf[0] == 'n')
  	vitesse = 2;
        else vitesse = 1;
        printf("\"\n");
      }
      xtimer_sleep(vitesse);
ceb4c7ca   root   changement carte ...
313
314
    }
    return NULL;
41eae2a4   vrobic   ajout serveur snt...
315
316
317
318
  }
  
  static void arret_urgence(void *arg,int channel)
  {
e873cff7   root   application real-...
319
320
    pwm_set(PWM_DEV(0),1,0);
    tourne = 0;
0f803f1d   root   test application ...
321
    timer_run = 0;
5345525d   root   ajout retour serv...
322
323
324
    gpio_clear(LED0_PIN);
    gpio_clear(LED1_PIN);
    gpio_set(LED2_PIN);
41eae2a4   vrobic   ajout serveur snt...
325
326
327
    printf("Arret d'urgence\n");
  }
  
0f803f1d   root   test application ...
328
  /*static void degradation(void *arg,int channel)
41eae2a4   vrobic   ajout serveur snt...
329
330
331
332
333
  {
     ordre=2;
      //pwm_set(PWM_DEV(0),1,0);
      printf("Ralentissement\n");
      timer_set(TIMER_DEV(1),0,25200);
0f803f1d   root   test application ...
334
  }*/
41eae2a4   vrobic   ajout serveur snt...
335
336
337
  
  static void _init_timer(void)
  {
ceb4c7ca   root   changement carte ...
338
339
340
341
342
343
    printf("ok timer\n");
    //timer_init(XTIMER_DEV, CLOCK_CORECLOCK/2 ,&degradation,NULL);
    //timer_set(XTIMER_DEV, 0, 8400);
    //timer_irq_enable(XTIMER_DEV);
    timer_init(TIMER_DEV(1), CLOCK_CORECLOCK/2 ,&arret_urgence,NULL);
    timer_irq_enable(TIMER_DEV(1));
41eae2a4   vrobic   ajout serveur snt...
344
345
346
347
  }
  
  static void _init_pwm(void)
  {
ceb4c7ca   root   changement carte ...
348
349
    pwm_init(PWM_DEV(0), PWM_LEFT, PWM_FREQ, PWM_RES);
    pwm_set(PWM_DEV(0),1,0);
41eae2a4   vrobic   ajout serveur snt...
350
351
  }
  
41eae2a4   vrobic   ajout serveur snt...
352
   
ceb4c7ca   root   changement carte ...
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
   static void _init_interface(void)
   {
     kernel_pid_t ifs[GNRC_NETIF_NUMOF];
     ipv6_addr_t addr = IPV6_ADDR_UNSPECIFIED;
     ipv6_addr_t tmp_addr= IPV6_ADDR_UNSPECIFIED;
     uint8_t hwaddr[MAX_ADDR_LEN];
     int res;
     
     gnrc_netif_get(ifs);
     
     //addresses gobales
     addr.u8[0] = 0xde;
     addr.u8[1] = 0xad;
     addr.u8[2] = 0xbe;
     addr.u8[3] = 0xef;
     
     res = gnrc_netapi_get(ifs[0], NETOPT_ADDRESS, 0, hwaddr, sizeof(hwaddr));
     
     if (res >= 0) {
       addr.u8[14] = *hwaddr;
       addr.u8[15] = *(hwaddr+1);
     }
     memcpy(tmp_addr.u8,addr.u8,IPV6_ADDR_BIT_LEN);
     
     gnrc_ipv6_netif_add_addr(ifs[0], &addr, 64, GNRC_IPV6_NETIF_ADDR_FLAGS_UNICAST);
     /* model ipv6 addr: dead:beef::Hwaddr */
     if((addr.u8[14]==0x34)&&(addr.u8[15]==0x02)){
       
       tmp_addr.u8[14] = 0x34;
5345525d   root   ajout retour serv...
382
       tmp_addr.u8[15] = 0x1e;
ceb4c7ca   root   changement carte ...
383
384
385
386
387
388
389
       //fibroute dest: dead:beef::3766 via fe80::3634:5110:3473:3762
       fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
       tmp_addr.u8[14] = 0x37;
       tmp_addr.u8[15] = 0x62;
       //fibroute dest: dead:beef::3762 via fe80::3634:5110:3473:3762
       fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
       client=thread_create(sock_client_stack,sizeof(sock_client_stack),8,THREAD_CREATE_STACKTEST,sock_client_thread,NULL,"sock_client_thread");
5345525d   root   ajout retour serv...
390
       //xtimer_usleep(10000);
ceb4c7ca   root   changement carte ...
391
       time_server=thread_create(sock_time_server_stack,sizeof(sock_time_server_stack),6,THREAD_CREATE_STACKTEST,sock_time_server_thread,NULL,"sock_time_server_thread");
5345525d   root   ajout retour serv...
392
     //  xtimer_usleep(200);
ceb4c7ca   root   changement carte ...
393
394
     }else if((addr.u8[14]==0x37)&&(addr.u8[15]==0x62)){
       tmp_addr.u8[14] = 0x34;
5345525d   root   ajout retour serv...
395
       tmp_addr.u8[15] = 0x1e;
ceb4c7ca   root   changement carte ...
396
397
398
399
400
401
       //fibroute dest: dead:beef::3766 via fe80::3634:5110:3471:3766
       fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node3, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
       tmp_addr.u8[14] = 0x34;
       tmp_addr.u8[15] = 0x02;
       //fibroute dest: dead:beef::3402 via fe80::3734:510e:3317:3402
       fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node1, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
5345525d   root   ajout retour serv...
402
     }else if((addr.u8[14]==0x34)&&(addr.u8[15]==0x1e)){
ceb4c7ca   root   changement carte ...
403
404
405
406
407
408
409
410
411
       tmp_addr.u8[14] = 0x34;
       tmp_addr.u8[15] = 0x02;
       //fibroute dest: dead:beef::3402 via fe80::3634:5110:3473:3762
       fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE); tmp_addr.u8[14] = 0x37;
       tmp_addr.u8[14] = 0x37;
       tmp_addr.u8[15] = 0x62;
       //fibroute dest: dead:beef::3762 via fe80::3634:5110:3473:3762
       fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
       //start_server("1234");
5345525d   root   ajout retour serv...
412
413
414
        _init_timer();
        _init_pwm();
        server=thread_create(sock_server_stack,sizeof(sock_server_stack),6,THREAD_CREATE_STACKTEST,sock_server_thread,NULL,"sock_server_thread");
ceb4c7ca   root   changement carte ...
415
416
417
418
419
420
       
       
     }else{
       puts("new node ?");
     }
   }
41eae2a4   vrobic   ajout serveur snt...
421
  
41eae2a4   vrobic   ajout serveur snt...
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  static msg_t _main_msg_queue[MAIN_QUEUE_SIZE];
  
  extern int udp_cmd(int argc, char **argv);
  
  static const shell_command_t shell_commands[] = {
      { "udp", "send data over UDP and listen on UDP ports", udp_cmd },
      { NULL, NULL, NULL }
  };
  
  
  int main(void)
  {
  
      msg_init_queue(_main_msg_queue, MAIN_QUEUE_SIZE);
      puts("RIOT network stack example application");
      _init_interface();
      
      /* start shell */
      puts("All up, running the shell now");
      char line_buf[SHELL_DEFAULT_BUFSIZE];
      shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
      
      /* should be never reached */
      return 0;
  }