
#include "powertrace.h"
#include "contiki.h"
#include "net/rime.h"
#include "random.h"
#include "dev/button-sensor.h"
#include <stdlib.h>
#include "dev/leds.h"
#include <string.h>
#include <stdio.h>
#include "shell.h"
#include "serial-shell.h"
#include "collect-view.h"

static struct etimer et_hello;

/*
Ci-dessous, vous avez la definition de la structure "Broadcast_type" qui comporte 2 entier (id_diffusion et couleur)
qui vont nous permettre d'envoyer un message de difusion contenant un identifiant et une couleur. 
*/
struct Broadcast_type
{
  int id_diffusion;
  int couleur;
};
typedef struct Broadcast_type broadcast_type;

static struct broadcast_conn broadcast;
static void envoie(int id, int couleur);
static int generer_nombre_aleatoire(int min, int max);

PROCESS(example_broadcast_process, "[Exemple2] Exemple de diffusion");
AUTOSTART_PROCESSES(&example_broadcast_process);

static void broadcast_recv(struct broadcast_conn *c, const rimeaddr_t *from)
{
  // L'implementation de broadcast_recv pour l'interpretation du message se trouve dans le fichier "capteur_de_reception.c"
}

static const struct broadcast_callbacks broadcast_call = {broadcast_recv};

PROCESS_THREAD(example_broadcast_process, ev, data)
{
  static struct etimer et;
  static int cpt = 0;
  PROCESS_EXITHANDLER(broadcast_close(&broadcast);)

  PROCESS_BEGIN();
    /* Commencez powertracing, une fois toutes les 100 secondes. */
  /*powertrace_start(CLOCK_SECOND*20); 

  serial_shell_init();
  shell_reboot_init();
  shell_rime_init();
  shell_rime_netcmd_init();
  shell_powertrace_init();
  shell_text_init();
  shell_time_init();
  shell_collect_view_init();
*/
  broadcast_open(&broadcast, 129, &broadcast_call);

  while (1)
  {
    cpt++;
    etimer_set(&et_hello, CLOCK_SECOND * 20); // attendre 20 secondes entre chaque envoi de messages
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
    envoie(cpt, generer_nombre_aleatoire(1, 3)); // On genere un entier aleatoire entre 1 et 3 (avec bleu = 1 , vert =2, rouge = 3) a chaque iteration
  }
  PROCESS_END();
}

/*
Ci-dessous, vous avez la fonction "envoie" qui permet d'envoyer un message de diffusion.
Cette fonction comporte 2 parametre :
  - id : identifiant ;
  - couleur : code de couleur.
  le message qui sera envoyer sera de type broadcast_type (id;couleur)
*/

static void envoie(int id, int couleur)
{
  broadcast_type message_envoyer;
  message_envoyer.id_diffusion = id;
  message_envoyer.couleur = couleur; // La couleur coder en entier sera decripter au moment de la reception du message
  packetbuf_copyfrom(&message_envoyer, 7);
  broadcast_send(&broadcast);
  printf("Envoi du message : %d;%d\n", message_envoyer.id_diffusion, message_envoyer.couleur);
}

/*
Ci-dessous, vous avez la fonction "generer_nombre_aleatoire" qui permet 
de generer un nombre aleatoire entre 1 et 3.
Ces nombres servirons de couleur a la reception du message comme suit : bleu = 1 , vert =2, rouge = 3.
*/
static int generer_nombre_aleatoire(int min, int max)
{
  return random_rand() % (max - min + 1) + min; // resultat de l'entier aléatoire
}
