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_P(PSTR("\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;
|
|
//}
|