server.c 3.21 KB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif

#include "rs232.h"

int cport_nr=24,        /* /dev/ttyACM0 */
bdrate=115200;       /* 115200 baud */
char mode[]={'8','N','1',0}; /* Taille du message, parité */

#define MAX_FRAME_SIZE  1024
#define WAIT_DELAY      20

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

	unsigned char buf[4096];
	int i;
	int n = RS232_PollComport(cport_nr, buf, 4095); // Récupération du message sur la liaison série et stockage dans buf

	switch(reason){


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


	  case LWS_CALLBACK_RECEIVE:
		// Ici sont traites les messages envoyes par le navigateur
		printf("received data: %s\n",(char *)in);
		RS232_cputs(cport_nr, in);
		libwebsocket_callback_on_writable(this,wsi); // Declenchement d'un prochain envoi au navigateur
		break;



	  case LWS_CALLBACK_SERVER_WRITEABLE:
		// Ici sont envoyes les messages au navigateur
		if(n > 1) // On ne s'occupe que des messages de taille supérieure à 1
		{
			buf[n] = 0;

			for(i=0; i < n; i++)
			{
				if(buf[i] < 32) // On remplace les caractères qui ne sont pas des chiffres ou des lettres par des points
				{
					buf[i] = '.';
				}
			}	

			printf("received %i bytes: %s\n", n, (char *)buf); // On affiche sur la console les messages en provenance de l'Arduino
			unsigned char * tosend = malloc(LWS_SEND_BUFFER_PRE_PADDING + n + LWS_SEND_BUFFER_POST_PADDING);
			memcpy(tosend + LWS_SEND_BUFFER_PRE_PADDING, buf, n);
			libwebsocket_write(wsi, tosend + LWS_SEND_BUFFER_PRE_PADDING, n, LWS_WRITE_TEXT); // On envoie le message au serveur websocket
			free(tosend);
		}
		libwebsocket_callback_on_writable(this,wsi); // Declenchement d'un prochain envoi au navigateur
		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}
  };

int main(void) {

	while(RS232_OpenComport(cport_nr, bdrate, mode)) // On attend que le port soit disponible (ou que l'Arduino soit branché)
	{
		printf("Can not open comport\n");
	}

	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");
	while(1){
	  libwebsocket_service(context,WAIT_DELAY);
	}
	libwebsocket_context_destroy(context);
	
	return 0;

}