// PARA aplicacion web 1: html + servlet.
#include <stdio.h>
#include <string.h>
#include <msp430x16x.h>
#include "uip.h"
#include "appweb1.h"
#include "display.h"
//#include "servo.h"
void pos1(int);
void pos2(int);

#define MOV 20

#define NO_CONECTADO 0
#define CONECTADO    1
#define SALIR        2
                          
unsigned char welcome[10]= "On_Line";
unsigned char led[13]= "LED_ON/OFF";
unsigned char salir[10]= "Off_Line";

//inicializaci on de la aplicacion
void appweb1_init(void){
   struct appweb1_struct *s = (struct appweb1_struct *)uip_conn->appstate;

   P6SEL = 0;
   P6OUT = 0;                                     
   P6DIR = BIT5;                    //habilitar P6.5 
   uip_listen(HTONS(1234));         //escucha por conexiones
   set_pos(0x01); printf("listen");        
   s->state = NO_CONECTADO;
    welcome[9]='\0';
    led[12]='\0';
    salir[9]='\0';
}
//administrador de eventos
void call_appweb1(void) {

  struct appweb1_struct *s;
  s = (struct appweb1_struct *)uip_conn->appstate;

  if(uip_aborted()) {
    aborted();
  }
  if(uip_timedout()) {
    timedout();
  }
  if(uip_closed()) {
    closed();
  }
  if(uip_connected()) {
    connected(s);
    senddata(s);
  }
  if(uip_acked()) {
    acked(s);
  }
  if(uip_newdata()) {
    newdata(s);
    senddata(s);
  }
}

static void aborted(struct appweb1_struct *s) {
  s->state = NO_CONECTADO;
}
static void timedout(struct appweb1_struct *s) {
  s->state = NO_CONECTADO;
}
static void closed(struct appweb1_struct *s) {
  s->state = NO_CONECTADO;
}
//ACK recibido
static void acked(struct appweb1_struct *s) {
  s->textlen -= uip_conn->len;
  s->textptr += uip_conn->len;
  if (s->textlen == 0) {
   switch (s->state) {
    case CONECTADO:
     break;
    case SALIR:
     uip_close();
     break;
    default: 
     break;  
   } 
  }
}

//conexion establecida
static void connected (struct appweb1_struct *s) {
  s->state   = CONECTADO;
  s->textptr = welcome;
  s->textlen = sizeof(welcome)+1;
}

// recepción de comando
static void newdata (struct appweb1_struct *s) {

  // led on/off
  if(( (*(char *)uip_appdata) == 'L' ) || ( (*(char *)uip_appdata) == 'l') )
   {
    send_cmd(0x01); printf("i: %c",(*(char *)uip_appdata));
    P6OUT ^= BIT5;   
    s->textptr = led;
    s->textlen = sizeof(led)+1;   
   }
   
   //exit, desconectarse
   if(( (*(char *)uip_appdata) == 'E' ) || ( (*(char *)uip_appdata) == 'e') )
   {
    send_cmd(0x01); printf("i: %c",(*(char *)uip_appdata));
    s->state = SALIR;    
    s->textptr = salir;
    s->textlen = sizeof(salir)+1;   
   }
   
   if(( (*(char *)uip_appdata) == 'W' ) || ( (*(char *)uip_appdata) == 'w') )
   {
    //send_cmd(0x01); printf("i: %c",(*(char *)uip_appdata));
    pos1(-MOV);  
   }
   
   if(( (*(char *)uip_appdata) == 'S' )  || ( (*(char *)uip_appdata) == 's') )
   {
    //send_cmd(0x01); printf("i: %c",(*(char *)uip_appdata));
    pos1(+MOV);  
   }
   
   if(( (*(char *)uip_appdata) == 'A' ) || ( (*(char *)uip_appdata) == 'a') )
   {
    //send_cmd(0x01); printf("i: %c",(*(char *)uip_appdata));
    pos2(-MOV);  
   }
   
   if(( (*(char *)uip_appdata) == 'D' ) || ( (*(char *)uip_appdata) == 'd') )
   {
    //send_cmd(0x01); printf("i: %c",(*(char *)uip_appdata));
    pos2(+MOV);  
   }
     
}
//envio de datos
static void senddata(struct appweb1_struct *s) {
  if(s->textlen > 0) {
     uip_send(s->textptr, s->textlen);
     send_cmd(0x01);
     set_pos(0x40); printf(" o: %s",s->textptr); 
  }
}

