You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
			
		
		
		
		
			
		
			
				
	
	
		
			328 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			328 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
/**
 | 
						|
 * @file	userHandler.c
 | 
						|
 * @brief	User Control Example
 | 
						|
 * @version 1.0
 | 
						|
 * @date	2014/07/15
 | 
						|
 * @par Revision
 | 
						|
 *			2014/07/15 - 1.0 Release
 | 
						|
 * @author	
 | 
						|
 * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
//#include "board.h"
 | 
						|
#include "httpUtil.h"
 | 
						|
#include "userHandler.h"
 | 
						|
//#include "adcHandler.h"
 | 
						|
#include "wizchip_conf.h"
 | 
						|
#include "globals.h"
 | 
						|
 | 
						|
/* Unavailable Pins  (W5500-EVB component preempted) */
 | 
						|
// >> UART Rx/Tx 		: D0 (Rx), D1 (Tx)
 | 
						|
// >> W5500 SPI(SPI0)	: D11 (MOSI), D12 (MISO), D13 (SCK)
 | 
						|
 | 
						|
/* On-board Devices */
 | 
						|
// >> Input		: D14 (SW1) / D15 (SW2)
 | 
						|
// >> Input		: AIN (Potentiometer / TEMP.Sensor)
 | 
						|
// >> Output	: D8 (LED R) / D9 (LED G) / D10 (LED B)
 | 
						|
 | 
						|
/* NXP LPC11Exx GPIO functions */
 | 
						|
// GPIO: Pin state
 | 
						|
//Chip_GPIO_GetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | 
						|
//Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], true);
 | 
						|
//Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], false);
 | 
						|
 | 
						|
// GPIO: Pin direction
 | 
						|
//Chip_GPIO_GetPinDIR((LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | 
						|
//Chip_GPIO_SetPinDIROutput(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | 
						|
//Chip_GPIO_SetPinDIRInput(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | 
						|
 | 
						|
// Pre-defined Get CGI functions
 | 
						|
//void make_json_dio(uint8_t * buf, uint16_t * len, uint8_t pin);
 | 
						|
void make_json_ain(uint8_t * buf, uint16_t * len, uint8_t pin);
 | 
						|
void make_json_netinfo(uint8_t * buf, uint16_t * len);
 | 
						|
void make_json_led1(uint8_t * buf, uint16_t * len);
 | 
						|
void make_info(uint8_t * buf, uint16_t * len);
 | 
						|
 | 
						|
// Pre-defined Set CGI functions
 | 
						|
int8_t set_diodir(uint8_t * uri);
 | 
						|
int8_t set_diostate(uint8_t * uri);
 | 
						|
 | 
						|
uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len)
 | 
						|
{
 | 
						|
	//return 0; //Just a stub, not used yet..
 | 
						|
	//uint8_t ret = 1;	// ret = 1 means 'uri_name' matched
 | 
						|
	uint8_t ret = 0;	// ret = 0 means 'uri_name' not matched
 | 
						|
	uint8_t cgibuf[14] = {0, };
 | 
						|
	int8_t cgi_dio = -1;
 | 
						|
	int8_t cgi_ain = -1;
 | 
						|
 | 
						|
	uint8_t i;
 | 
						|
 | 
						|
	if(strcmp_P((const char *)uri_name,PSTR("todo.cgi")) == 0)
 | 
						|
	{
 | 
						|
//		// to do
 | 
						|
//		;//make_json_todo(buf, len);
 | 
						|
	}
 | 
						|
	else if(strcmp_P((const char *)uri_name,PSTR("get_netinfo.cgi")) == 0)
 | 
						|
	{
 | 
						|
		make_json_netinfo(buf, len);
 | 
						|
		ret = 1; // ret = 1 means 'uri_name' matched
 | 
						|
	}
 | 
						|
	else if(strcmp_P((const char *)uri_name,PSTR("get_led1.cgi")) == 0)
 | 
						|
	{
 | 
						|
		make_json_led1(buf, len);
 | 
						|
		ret = 1; // ret = 1 means 'uri_name' matched
 | 
						|
	}
 | 
						|
	else if(strcmp_P((const char *)uri_name,PSTR("get_info.cgi")) == 0)
 | 
						|
	{
 | 
						|
		make_info(buf, len);
 | 
						|
		ret = 1; // ret = 1 means 'uri_name' matched
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
//		// get_dio0.cgi ~ get_dio15.cgi
 | 
						|
//		for(i = 0; i < DIOn; i++)
 | 
						|
//		{
 | 
						|
//			memset(cgibuf, 0x00, 14);
 | 
						|
//			sprintf((char *)cgibuf, "get_dio%d.cgi", i);
 | 
						|
//			if(strcmp((const char *)uri_name, (const char *)cgibuf) == 0)
 | 
						|
//			{
 | 
						|
//				make_json_dio(buf, len, i);
 | 
						|
//				cgi_dio = i;
 | 
						|
//				break;
 | 
						|
//			}
 | 
						|
//		}
 | 
						|
//
 | 
						|
//		if(cgi_dio < 0)
 | 
						|
		//Analog Ins reading  get_ain0.cgi ~ get_ain7.cgi
 | 
						|
		if(1)
 | 
						|
		{
 | 
						|
			// get_ain0.cgi ~ get_ain5.cgi (A0 - A5), get_ain6.cgi for on-board potentiometer / Temp.Sensor - LPC11Exx
 | 
						|
			//for(i = 0; i < AINn; i++) //for LPC11xx
 | 
						|
			for(i = 0; i < 8; i++) //for AVR Mega1284p, available AIN0..AIN7
 | 
						|
			{
 | 
						|
				memset(cgibuf, 0x00, 14);
 | 
						|
				sprintf((char *)cgibuf, "get_ain%d.cgi", i);
 | 
						|
				if(strcmp((const char *)uri_name, (const char *)cgibuf) == 0)
 | 
						|
				{
 | 
						|
					make_json_ain(buf, len, i);
 | 
						|
					cgi_ain = i;
 | 
						|
					ret = 1;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
//		if((cgi_dio < 0) && (cgi_ain < 0)) ret = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	return ret;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len)
 | 
						|
{
 | 
						|
//	return 0; //Just a stub, not used yet..
 | 
						|
	uint8_t ret = 0; // ret = 0 means 'uri_name' not matched
 | 
						|
//	uint8_t ret = 1;	// ret = '1' means 'uri_name' matched
 | 
						|
	uint8_t val = 0;
 | 
						|
 | 
						|
	if(strcmp_P((const char *)uri_name,PSTR("todo.cgi")) == 0)
 | 
						|
	{
 | 
						|
		// to do
 | 
						|
		;//val = todo(uri);
 | 
						|
		//*len = sprintf((char *)buf, "%d", val);
 | 
						|
	}
 | 
						|
//	// Digital I/O; dio_s, dio_d
 | 
						|
//	else if(strcmp_P((const char *)uri_name,PSTR("set_diodir.cgi")) == 0)
 | 
						|
//	{
 | 
						|
//		//val = set_diodir(uri);
 | 
						|
//		//printf_P(PSTR("+++set_diodir.cgi uri_name: %s; uri: %s;\r\n"));
 | 
						|
//		*len = sprintf_P((char *)buf, PSTR("%d"), val);
 | 
						|
//		ret = 1;
 | 
						|
//	}
 | 
						|
	else if(strcmp((const char *)uri_name, "set_diostate.cgi") == 0)
 | 
						|
	{
 | 
						|
		//When uri_name=set_diostate.cgi, and uri HTTP POST request which contains something like:
 | 
						|
		//pin=8&val=1; or pin=8&val=1; (look <dio.html> && <dio.js>)
 | 
						|
 | 
						|
		/*
 | 
						|
		This is LPC11xx handler
 | 
						|
		val = set_diostate(uri);
 | 
						|
		len = sprintf((char *)buf, "%d", val);
 | 
						|
		len ret = 1;
 | 
						|
		*/
 | 
						|
 | 
						|
 | 
						|
		//!!Just for debug
 | 
						|
		PRINTF("\r\n+++set_diostate.cgi uri_name: %s\r\nuri: %s\r\n", uri_name, uri);
 | 
						|
 | 
						|
		//Parse URI (Very dirty!!)
 | 
						|
		if(strstr_P(uri,PSTR("pin=LED1&val=0")))
 | 
						|
		{
 | 
						|
			led1_low();
 | 
						|
			*len = sprintf_P((char *)buf, PSTR("LED1: OFF"));
 | 
						|
			ret = 1;
 | 
						|
		}
 | 
						|
		else if(strstr_P(uri,PSTR("pin=LED1&val=1")))
 | 
						|
		{
 | 
						|
			led1_high();
 | 
						|
			*len = sprintf_P((char *)buf, PSTR("LED1: ON"));
 | 
						|
			ret = 1;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			//*len = sprintf_P((char *)buf, PSTR("%d"), -1);
 | 
						|
			*len = sprintf_P((char *)buf, PSTR("???"));
 | 
						|
			ret = 1;
 | 
						|
		}
 | 
						|
	}
 | 
						|
//	else
 | 
						|
//	{
 | 
						|
//		ret = 0;
 | 
						|
//	}
 | 
						|
//
 | 
						|
	return ret;
 | 
						|
}
 | 
						|
 | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
// Pre-defined Get CGI functions
 | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
//void make_json_dio(uint8_t * buf, uint16_t * len, uint8_t pin)
 | 
						|
//{
 | 
						|
//	uint8_t pin_state 	= Chip_GPIO_GetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | 
						|
//	uint8_t pin_dir 	= Chip_GPIO_GetPinDIR(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | 
						|
//
 | 
						|
//	*len = sprintf((char *)buf, "DioCallback({\"dio_p\":\"%d\",\
 | 
						|
//											\"dio_s\":\"%d\",\
 | 
						|
//											\"dio_d\":\"%d\"\
 | 
						|
//											});",
 | 
						|
//											pin,					// Digital io pin number
 | 
						|
//											pin_state,				// Digital io status
 | 
						|
//											pin_dir					// Digital io directions
 | 
						|
//											);
 | 
						|
//}
 | 
						|
//
 | 
						|
void make_json_led1(uint8_t * buf, uint16_t * len)
 | 
						|
{
 | 
						|
	if(led1_read())
 | 
						|
	{
 | 
						|
		*len = sprintf_P((char *)buf,PSTR( "led1Callback({\"led1_txt\":\"LED1: ON\"});")); //Send back LED1 state via call-back function
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		*len = sprintf_P((char *)buf,PSTR( "led1Callback({\"led1_txt\":\"LED1: OFF\"});")); //Send back LED1 state via call-back function
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
void make_info(uint8_t * buf, uint16_t * len)
 | 
						|
{
 | 
						|
	/*
 | 
						|
	 * Send program metrics:
 | 
						|
	 * Program name
 | 
						|
	 * time-date compile
 | 
						|
	 * MCU info
 | 
						|
	 * free ram info
 | 
						|
	 * uptime device
 | 
						|
	 */
 | 
						|
	*len = sprintf_P((char *)buf,PSTR(\
 | 
						|
			"<pre>%S"\
 | 
						|
			"Compiled at: %S %S\r\n"\
 | 
						|
			"MCU is: %S; CLK is: %luHz\r\n"\
 | 
						|
			"Free RAM: %dbytes\r\n"\
 | 
						|
			"Uptime: %lusec\r\n</pre>"),\
 | 
						|
			str_prog_name,\
 | 
						|
			compile_time, compile_date,\
 | 
						|
			str_mcu, F_CPU,\
 | 
						|
			freeRam(),\
 | 
						|
			millis()/1000);
 | 
						|
}
 | 
						|
 | 
						|
void make_json_ain(uint8_t * buf, uint16_t * len, uint8_t pin)
 | 
						|
{
 | 
						|
	*len = sprintf_P((char *)buf,PSTR( "AinCallback({\"ain_p\":\"%d\",\
 | 
						|
											\"ain_v\":\"%d\"\
 | 
						|
											});"),
 | 
						|
											pin,					// ADC input pin number
 | 
						|
											//get_ADC_val(pin)		// ADC input value for LPC11xx
 | 
						|
											adc_read(pin) // ADC input value for AVR
 | 
						|
											);
 | 
						|
}
 | 
						|
 | 
						|
void make_json_netinfo(uint8_t * buf, uint16_t * len)
 | 
						|
{
 | 
						|
	wiz_NetInfo netinfo;
 | 
						|
	ctlnetwork(CN_GET_NETINFO, (void*) &netinfo);
 | 
						|
 | 
						|
	// DHCP: 1 - Static, 2 - DHCP
 | 
						|
	*len = sprintf_P((char *)buf,PSTR( "NetinfoCallback({\"mac\":\"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\",\
 | 
						|
											\"ip\":\"%d.%d.%d.%d\",\
 | 
						|
											\"gw\":\"%d.%d.%d.%d\",\
 | 
						|
											\"sn\":\"%d.%d.%d.%d\",\
 | 
						|
											\"dns\":\"%d.%d.%d.%d\",\
 | 
						|
											\"dhcp\":\"%d\"\
 | 
						|
											});"),
 | 
						|
											netinfo.mac[0], netinfo.mac[1], netinfo.mac[2], netinfo.mac[3], netinfo.mac[4], netinfo.mac[5],
 | 
						|
											netinfo.ip[0], netinfo.ip[1], netinfo.ip[2], netinfo.ip[3],
 | 
						|
											netinfo.gw[0], netinfo.gw[1], netinfo.gw[2], netinfo.gw[3],
 | 
						|
											netinfo.sn[0], netinfo.sn[1], netinfo.sn[2], netinfo.sn[3],
 | 
						|
											netinfo.dns[0], netinfo.dns[1], netinfo.dns[2], netinfo.dns[3],
 | 
						|
											netinfo.dhcp
 | 
						|
											);
 | 
						|
}
 | 
						|
 | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
// Pre-defined Set CGI functions
 | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
//int8_t set_diodir(uint8_t * uri)
 | 
						|
//{
 | 
						|
//	uint8_t * param;
 | 
						|
//	uint8_t pin = 0, val = 0;
 | 
						|
//
 | 
						|
//	if((param = get_http_param_value((char *)uri, "pin"))) // GPIO; D0 ~ D15
 | 
						|
//	{
 | 
						|
//		pin = (uint8_t)ATOI(param, 10);
 | 
						|
//		if(pin > 15) return -1;
 | 
						|
//
 | 
						|
//		if((param = get_http_param_value((char *)uri, "val")))  // Direction; NotUsed/Input/Output
 | 
						|
//		{
 | 
						|
//			val = (uint8_t)ATOI(param, 10);
 | 
						|
//			if(val > Output) val = Output;
 | 
						|
//		}
 | 
						|
//	}
 | 
						|
//
 | 
						|
//	if(val == Input) 		Chip_GPIO_SetPinDIRInput(LPC_GPIO, dio_ports[pin], dio_pins[pin]);	// Input
 | 
						|
//	else 					Chip_GPIO_SetPinDIROutput(LPC_GPIO, dio_ports[pin], dio_pins[pin]); // Output
 | 
						|
//
 | 
						|
//	return pin;
 | 
						|
//}
 | 
						|
//
 | 
						|
//int8_t set_diostate(uint8_t * uri)
 | 
						|
//{
 | 
						|
//	uint8_t * param;
 | 
						|
//	uint8_t pin = 0, val = 0;
 | 
						|
//
 | 
						|
//	if((param = get_http_param_value((char *)uri, "pin"))) // GPIO; D0 ~ D15
 | 
						|
//	{
 | 
						|
//		pin = (uint8_t)ATOI(param, 10);
 | 
						|
//		if(pin > 15) return -1;
 | 
						|
//
 | 
						|
//		if((param = get_http_param_value((char *)uri, "val")))  // State; high(on)/low(off)
 | 
						|
//		{
 | 
						|
//			val = (uint8_t)ATOI(param, 10);
 | 
						|
//			if(val > On) val = On;
 | 
						|
//		}
 | 
						|
//
 | 
						|
//		if(val == On) 		Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], true); 	// High
 | 
						|
//		else				Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], false);	// Low
 | 
						|
//	}
 | 
						|
//
 | 
						|
//	return pin;
 | 
						|
//}
 |