#include "mem.h"
#include "c_types.h"
#include "user_interface.h"
#include "ets_sys.h"
#include "driver/uart.h"
#include "osapi.h"
#include "espconn.h"
#include "mystuff.h"
#include <math.h>
#include "../config.h"

#define PORT 8888
#define SERVER_TIMEOUT 1000
#define MAX_CONNS 5

#define at_procTaskPrio        0
#define at_procTaskQueueLen    1


static struct espconn *pUdpServer;


int UpdateBright( int quality )
{
	if( quality < 0 ) quality = 0;
	if( quality > 255 ) quality = 255;
	int i;
	uint8_t ws_buffer[16*3];
	for( i = 0; i < sizeof( ws_buffer )/3; i++ )
	{
		ws_buffer[i*3+0] = quality;
		ws_buffer[i*3+1] = 255-quality;//255-quality;;
		ws_buffer[i*3+2] = 0;
	}
	WS2812OutBuffer( ws_buffer, sizeof(ws_buffer) );
}

int in_scan = 0;

static void ICACHE_FLASH_ATTR
scan_done(void *arg, STATUS status)
{
  uint8 ssid[33];
  char temp[64];

  if (status == OK)
  {
    struct bss_info *bss_link = (struct bss_info *)arg;

    while (bss_link != NULL)
    {
		printf( "\r\n***********%s*************", bss_link->ssid );
		if( strcmp( bss_link->ssid, NETWORK ) == 0 )
		{
			printf( "\r\nMATCH. %d\n", bss_link->rssi );
			UpdateBright( (bss_link->rssi+95) * 7 );
		}
/*
      os_memset(ssid, 0, 33);
      if (os_strlen(bss_link->ssid) <= 32)
      {
        os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid));
      }
      else
      {
        os_memcpy(ssid, bss_link->ssid, 32);
      }
      os_sprintf(temp,"+CWLAP:(%d,\"%s\",%d)\r\n",
                 bss_link->authmode, ssid, bss_link->rssi);
      uart0_sendStr(temp);
*/
      bss_link = bss_link->next.stqe_next;
    }
  }
	in_scan = 0;
}

void ReqUpdate()
{
	if( !in_scan ) 
	{
		in_scan = 1;
	  wifi_station_scan(scan_done);
	}
}


os_event_t    at_procTaskQueue[at_procTaskQueueLen];

static void at_procTask(os_event_t *events);

int firstupdatedone = 0;
int cyc = 0;
int holdup = 10;




static void ICACHE_FLASH_ATTR
at_procTask(os_event_t *events)
{
	system_os_post(at_procTaskPrio, 0, 0 );
	if( events->sig == 0 && events->par == 0 )
	{
		if( firstupdatedone  == 0)
		{
			uart0_sendStr( "...............ATTEMPTING.................\r\n" );

			ETS_UART_INTR_DISABLE();
			wifi_set_opmode( 1 ); //Station (we look for a host)
			ETS_UART_INTR_ENABLE();


			char outbuffer[] = { 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00 };
			WS2812OutBuffer( outbuffer, sizeof(outbuffer) );

			firstupdatedone = 1;
		}
		uart0_sendStr( "................................................" );
		if( cyc++ == 200 )
		{
			if( holdup )
			{
				holdup--;
				if( !holdup )
				{
					char outbuffer[] = { 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff };
					WS2812OutBuffer( outbuffer, sizeof(outbuffer) );
					uart0_sendStr("\r\nHOLDUP\r\n");
				}
			}
			else
			{
					uart0_sendStr("\r\nRU\r\n");
				ReqUpdate();
			}
			cyc = 0;
		}
		//Idle Event.
/*		if( connections[0].pespconn && connections[0].cansend )
		{
		    espconn_sent( connections[0].pespconn, "hello\r\n", 7 );
		}
*/
	}
}


void at_recvTask()
{
	//Start popping stuff off fifo. (UART)
}

void user_init(void)
{
	uart_init(BIT_RATE_115200, BIT_RATE_115200);
	int at_wifiMode = wifi_get_opmode();

	uart0_sendStr("\r\nCustom Server\r\n");


	char outbuffer[] = { 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff };
	WS2812OutBuffer( outbuffer, sizeof(outbuffer) );

	system_os_task(at_procTask, at_procTaskPrio, at_procTaskQueue, at_procTaskQueueLen);

	uart0_sendStr("\r\nCustom Server\r\n");
	system_os_post(at_procTaskPrio, 0, 0 );
}
