/* * Test on serial device */ //// // Include files //// #include #include #include #include #include #include #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; } //********************************************************************************//