main.c 4.38 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/ttyACM0"

/*****************************************************************************/
/**********************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=serialOpen(SERIAL_DEVICE,SERIAL_BOTH);
	serialConfig(sd,B9600);

	int i;
	char *reponse = NULL;

	//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 : ");

	reponse = malloc(3*sizeof(char));

	for(i=0;i < 3;i++)
	{
		if(read(sd,(void*)&reponse[i],sizeof(char))!=1)
		{ 
			perror("main.read"); exit(-1); 
		}
	}
	printf("\nTemperature : %d",reponse[1]);
	printf("\nPressure : %d",reponse[0]);
	printf("\nHumidity : %d\n",reponse[2]);

	serialClose(sd);

	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;
	static int msize=0;

  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+LWS_SEND_BUFFER_PRE_PADDING,in,len);
		          // Declenchement d'un prochain envoi au navigateur
		msize=len;
		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')
			{
				char *reponse = NULL;
				reponse = getDataFromSensors(requete,3);
				int length = 3;
				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_TEXT);
				free(reponse);

				free(requete);
				requete = NULL;
				reponse = NULL;
			}
		}

    break;
    default:
      break;
    }
  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);

	//Initialisation com Serie


	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;

}


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