#include #include #include #include #ifdef _WIN32 #include #else #include #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; }