main.c 4.77 KB
/*
 * Test on serial device
 */

////
// Include files
////
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
#include <libwebsockets.h>
#include "serial.h"


#define MAX_FRAME_SIZE  1024
#define WAIT_DELAY      50


#define         SERIAL_DEVICE           "/dev/ttyUSB0" //utiliser USB0 pour le shield Xbee branché en USB

/*****************************************************************************/
/**********************PARTIE WEBSOCKETS + COM SERIE**************************/
/*****************************************************************************/

//Fonction qui retourne un tableau de char, chaque char correspondant à une donnée d'un capteur

char * getDataFromSensors(char *request,int sizeOfRequest,int sd)
{

	int i;
	//la réponse est récupérée sous un type charactère non signé. Il est possible de la stocker dans un charactère signé, mais la valeur affichée par un printf sera différente
	unsigned char *reponse = NULL;
	reponse = malloc(4*sizeof(unsigned char));
	

	//On envoie le GET au FPGA pour récupérer les données
	for(i = 0; i < sizeOfRequest;i++)
	{
		
		if(write(sd,(void*)&request[i],sizeof(char))!=1)
		{ 
			perror("main.write"); exit(-1); 
		}
	}

	printf("\nReponse : ");

	//NE PAS OUBLIER DE LIBERER LA MEMOIRE EN DEHORS DE LA FONCTION

	for(i=0;i < 4;i++)
	{	//on lit ce que nous envoie l'arduino à la suite de la requete GET
		if(read(sd,(void*)&reponse[i],sizeof(unsigned char))!=1)
		{ 
			perror("main.read"); exit(-1); 
		}
	}
	printf("\nTemperature (C) : %d",reponse[1]);
	printf("\nPression (hPa) : %d",reponse[0]+845);
	printf("\nHumidite (pourcents) : %d",reponse[2]);
	printf("\nLuminosité : %d\n",reponse[3]);


	return reponse;
}



static int callback_http(struct libwebsocket_context *this, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user,void *in,size_t len)
{
  return 0;
}

static int callback_my(struct libwebsocket_context * this, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user,void *in,size_t len)
{
	static char *requete = NULL;
	static char *reponse = NULL;
	//Initialisation com Serie
	int sd=serialOpen(SERIAL_DEVICE,SERIAL_BOTH);
	serialConfig(sd,B9600);

  switch(reason)
  {
    case LWS_CALLBACK_ESTABLISHED:
      printf("connection established\n");
      requete=NULL;
      // Declenchement d'un prochain envoi au navigateur
      libwebsocket_callback_on_writable(this,wsi);
    break;

    case LWS_CALLBACK_RECEIVE:
                  // Ici sont traites les messages envoyes par le navigateur
		printf("received data: %s\n",(char *)in);
		requete=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);

		if(requete==NULL)
		{ 
			perror("callback_my.malloc"); exit(EXIT_FAILURE); 
		}

		memcpy(requete,in,len);
		          // Declenchement d'un prochain envoi au navigateur
		libwebsocket_callback_on_writable(this,wsi);
    break;

    case LWS_CALLBACK_SERVER_WRITEABLE:
		// Ici sont envoyes les messages au navigateur
    	//Si la requete a pour valeur GET, on envoie les donnée au site
    		
		if(requete!= NULL)
		{
			if(requete[0] == 'G' && requete[1] == 'E' && requete[2] == 'T')
			{
				reponse = getDataFromSensors(requete,3,sd);
				int length = 4;
				unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + length + LWS_SEND_BUFFER_POST_PADDING);
				memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, reponse, length );
				libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, length, LWS_WRITE_BINARY); //LWS_WRITE_TEXT
				free(reponse);
				free(requete);
				requete = NULL;
				reponse = NULL;
			}
		}

    break;
    default:
      break;
    }
  serialClose(sd);
  return 0;
}

static struct libwebsocket_protocols protocols[] = {
  {
    "http-only",   // name
    callback_http, // callback
    0,             // data size
    0              // maximum frame size
  },
  {"myprotocol",callback_my,0,MAX_FRAME_SIZE},
  {NULL,NULL,0,0}
};




/*****************************************************************/
/**********************MAIN***************************************/
/*****************************************************************/

int main(void){


	char j;
	int i;
	unsigned long count = 0;

	//Initialisation WebSockets
	int port=9000;
	struct lws_context_creation_info info;
	memset(&info,0,sizeof info);
	info.port=port;
	info.protocols=protocols;
	info.gid=-1;
	info.uid=-1;
	struct libwebsocket_context *context=libwebsocket_create_context(&info);





	if(context==NULL)
	{
		fprintf(stderr, "libwebsocket init failed\n");
		return -1;
	}
	printf("starting server...\n");


	//boucle infinie du main
	while(1)
	{
		libwebsocket_service(context,WAIT_DELAY);
	}
	libwebsocket_context_destroy(context);

	return 0;

}


//********************************************************************************//