This is WIZwiki-REST-io upper version. This version possible to handle PWM, I2C, GPIO.
Dependencies: Adafruit_GFX MbedJSONValue_copy WIZnetInterface mbed
Fork of WIZwiki-REST-io by
Revision 4:0b5a199e91f3, committed 2016-05-31
- Comitter:
- joon874
- Date:
- Tue May 31 10:31:30 2016 +0000
- Parent:
- 3:31ffbba7e8e9
- Child:
- 5:473a66ae9596
- Commit message:
- WIZwiki-REST-io ver.2 ; Add POST Method
Changed in this revision
--- a/HTTPServer.cpp Tue May 03 02:21:56 2016 +0000
+++ b/HTTPServer.cpp Tue May 31 10:31:30 2016 +0000
@@ -104,22 +104,22 @@
printf("Type = %s\r\n", request_type);
#endif
- if(request_type)
+ if(request_type)
{
- request = strtok(NULL, " \r\n"); // corrested " " -> " /" : /Name -> Name
+ request = strtok(NULL, " \r\n"); // corrested " " -> " /" : /Name -> Name
if(request)
{
#ifdef DEBUG_HTTP
printf("URI = %s\r\n", request);
#endif
- }
- else
- {
- strcpy(rest_result, "Invaild URI");
+ }
+ else
+ {
+ strcpy(rest_result, "Invaild URI");
#ifdef DEBUG_HTTP
- printf("%s\r\n",rest_result);
+ printf("%s\r\n",rest_result);
#endif
- return HTTP_INVALID_URI;
+ return HTTP_INVALID_URI;
}
}
}
@@ -133,7 +133,17 @@
//if(itor != NULL)
//itor->handle(request, rest_result.c_str());
if(itor->second != NULL)
- itor->second->handle(request, rest_result);
+ {
+ char* request_data = 0;
+ if(!strcmp(request_type,"POST"))
+ {
+ request_data = strstr(request+strlen(request)+1, "\r\n\r\n");
+#ifdef DEBUG_HTTP
+ printf("POST:request_data=%s\r\n",request_data+4);
+#endif
+ }
+ itor->second->handle(request, request_data, rest_result);
+ }
else
{
strcpy(rest_result, "Invalid request handler");
--- a/HTTPServer.h Tue May 03 02:21:56 2016 +0000
+++ b/HTTPServer.h Tue May 31 10:31:30 2016 +0000
@@ -19,8 +19,8 @@
}HTTP_RESULT;
-static char HTTPBUF[512] ={0,};
-static char rest_result[512] = {0,};
+static char HTTPBUF[600] = {0,};
+static char rest_result[532] = {0,};
class HTTPServer
{
--- a/MbedJSONValue.lib Tue May 03 02:21:56 2016 +0000 +++ b/MbedJSONValue.lib Tue May 31 10:31:30 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/users/joon874/code/MbedJSONValue1/#174bc7a49aa2 +https://developer.mbed.org/users/joon874/code/MbedJSONValue_copy/#fb820325a830
--- a/RequestHandler.cpp Tue May 03 02:21:56 2016 +0000
+++ b/RequestHandler.cpp Tue May 31 10:31:30 2016 +0000
@@ -6,7 +6,9 @@
extern MbedJSONValue WIZwikiREST;
-void GetRequestHandler::handle(char* rest_uri, char *reply)
+MbedJSONValue* pDataJson = 0;
+
+void GetRequestHandler::handle(char* rest_uri, char* request_data, char *reply)
{
MbedJSONValue* tmpJson;
@@ -16,55 +18,46 @@
#ifdef DEBUG_HTTPREQ
printf("GetRequestHandler():%s\r\n",rest_uri);
#endif
- if(!strcmp(rest_uri, "/"))
- {
+ if(!strcmp(rest_uri, "/")){
tmpJson = &WIZwikiREST;
}
- else
- {
- tok = strtok_r(rest_uri+1, "/", &last); // 20160226
+ else{
+ tok = strtok_r(rest_uri+1, "/", &last);
tmpJson = &WIZwikiREST;
- char depth = 0;
char* name = 0;
while(tok)
{
#ifdef DEBUG_HTTPREQ
- printf("tok = %s \r\n", tok); // Name
+ printf("tok = %s \r\n", tok);
#endif
- if(tmpJson->hasMember(tok))
- {
+ if(tmpJson->hasMember(tok)){
tmpJson = &((*tmpJson)[tok]);
name = tok;
tok = strtok_r(0, "/", &last);
- depth++;
}
- else
- {
+ else{
#ifdef DEBUG_HTTPREQ
printf("No Member\r\n");
#endif
break;
}
}
- if(name)
- {
- if(tok)
- {
- if(tmpJson->accessible)
- {
+ if(name){
+ if(tok){
+ if(tmpJson->accessible){
#ifdef DEBUG_HTTPREQ
printf("accessible : tmpJson->size()=%d\r\n",tmpJson->size());
#endif
- if(tmpJson->size() > 0) {
+ if(tmpJson->size() > 0){
*tmpJson = std::string(tok);
tmpJson->cb_action((void*)tok);
#ifdef DEBUG_HTTPREQ
printf("set string:%s\r\n",tok);
#endif
}
- else {
+ else{
*tmpJson = atoi(tok);
tmpJson->cb_action(&tmpJson->_value);
#ifdef DEBUG_HTTPREQ
@@ -72,8 +65,7 @@
#endif
}
}
- else
- {
+ else{
strcpy (reply, "HTTP/1.1 403 OK\r\n");
strcat (reply, "Sever: WIZwiki-REST\r\n");
strcat (reply, "content-Type: text/json\r\n");
@@ -84,8 +76,7 @@
}
}
}
- else
- {
+ else{
strcpy (reply, "HTTP/1.1 404 OK\r\n");
strcat (reply, "Sever: WIZwiki-REST\r\n");
strcat (reply, "content-Type: text/json\r\n");
@@ -106,10 +97,190 @@
return;
}
-void PutRequestHandler::handle(char* rest_uri, char *reply)
+void PostRequestHandler::handle(char* rest_uri, char* request_data, char *reply)
+{
+ MbedJSONValue* tmpJson;
+ char* tok;
+ char* last;
+ int errnum = 200;
+
+#ifdef DEBUG_HTTPREQ
+ printf("PostRequestHandler():%s\r\n",request_data+4);
+#endif
+ if(!pDataJson){
+ pDataJson = new MbedJSONValue();
+ }
+#ifdef DEBUG_HTTPREQ
+ printf("Before Parse\r\n");
+ debug_info();
+#endif
+ parse(*pDataJson,(const char*)request_data);
+#ifdef DEBUG_HTTPREQ
+ printf("After Parse\r\n");
+ debug_info();
+ printf("DataJson._type=%d\r\n",pDataJson->_type);
+ printf("DataJson=%s\r\n",pDataJson->serialize().c_str());
+ printf("DataJson.size()=%d\r\n",pDataJson->size());
+ printf("DataJason.type=%d\r\n",pDataJson->_type);
+#endif
+
+ if(!strcmp(rest_uri, "/")){
+ tmpJson = &WIZwikiREST;
+ }
+ else{
+ tok = strtok_r(rest_uri+1, "/", &last);
+ tmpJson = &WIZwikiREST;
+
+ char* name = 0;
+ while(tok)
+ {
+#ifdef DEBUG_HTTPREQ
+ printf("tok = %s \r\n", tok);
+#endif
+ if(tmpJson->hasMember(tok)){
+ tmpJson = &((*tmpJson)[tok]);
+ name = tok;
+ tok = strtok_r(0, "/", &last);
+ }
+ else{
+#ifdef DEBUG_HTTPREQ
+ printf("No Member\r\n");
+#endif
+ break;
+ }
+ }
+ if(name){
+#ifdef DEBUG_HTTPREQ
+ printf("Token_name=%s\r\n",name);
+#endif
+ if(tok){
+#ifdef DEBUG_HTTPREQ
+ printf("It should be no parameters : tok=%s\r\n",tok);
+#endif
+ errnum = 403;
+ }
+ }
+ else{
+ errnum = 404;
+ }
+ }
+ if(errnum != 0){
+ switch(pDataJson->_type)
+ {
+ case MbedJSONValue::TypeInt:
+ if(tmpJson->accessible){
+ *tmpJson = pDataJson->_value.asInt;
+ tmpJson->cb_action(&tmpJson->_value);
+#ifdef DEBUG_HTTPREQ
+ printf("set int:%d\r\n",atoi(tok));
+#endif
+ }
+ else{
+ errnum = 403;
+ }
+ break;
+
+ case MbedJSONValue::TypeString:
+ if(tmpJson->accessible){
+ *tmpJson = pDataJson->_value.asString;
+ }
+ else{
+ errnum = 403;
+ }
+ break;
+
+ case MbedJSONValue::TypeObject:
+ for(int i = 0; i < pDataJson->index_token; i++)
+ {
+ tok = (char*)pDataJson->token_name[i]->c_str();
+#ifdef DEBUG_HTTPREQ
+ printf("pDataJson.token_name[%d]->c_str()=%s\r\n",i,tok);
+#endif
+ if(tmpJson->hasMember(tok)){
+ if((*tmpJson)[tok].accessible){
+ errnum = 200;
+ if((*pDataJson)[i].size() > 0){
+ (*tmpJson)[tok] = (*pDataJson)[i]._value.asString;
+#ifdef DEBUG_HTTPREQ
+ printf("String Updated: %s : %s\r\n", tok,(*tmpJson)[tok].get<std::string>().c_str());
+#endif
+ }
+ else{
+ (*tmpJson)[tok] = (*pDataJson)[i]._value.asInt;
+ (*tmpJson)[tok].cb_action((void*)&((*pDataJson)[i]._value.asInt));
+#ifdef DEBUG_HTTPREQ
+ printf("Int Updated: %s : %d\r\n", tok,(*tmpJson)[tok].get<int>());
+#endif
+ }
+ }
+ else{
+ errnum = 403; break;
+ }
+ }
+ else{
+ errnum = 404; break;
+ }
+ }
+ break;
+
+ default:
+ errnum = 403; break;
+ }
+ }
+
+ switch(errnum)
+ {
+ case 403:
+ strcpy (reply, "HTTP/1.1 403 OK\r\n");
+ strcat (reply, "Sever: WIZwiki-REST\r\n");
+ strcat (reply, "content-Type: text/json\r\n");
+ sprintf(reply + strlen(reply), "Content-Length: %d\r\n\r\n", 26+4);
+ strcat(reply, "{\"Result : No Accessible\"}");
+ strcat (reply, "\r\n\r\n");
+ break;
+
+ case 404:
+ strcpy (reply, "HTTP/1.1 404 OK\r\n");
+ strcat (reply, "Sever: WIZwiki-REST\r\n");
+ strcat (reply, "content-Type: text/json\r\n");
+ sprintf(reply + strlen(reply), "Content-Length: %d\r\n\r\n", 33+4);
+ strcat(reply, "{\"Result\" : \"No defined Resource\"}");
+ strcat (reply, "\r\n\r\n");
+ break;
+
+ case 200:
+ strcpy (reply, "HTTP/1.1 200 OK\r\n");
+ strcat (reply, "Sever: WIZwiki-REST\r\n");
+ strcat (reply, "content-Type: text/json\r\n");
+ sprintf(reply + strlen(reply), "Content-Length: %d\r\n\r\n", 15+4);
+ strcat (reply, "{\"Result\":\"OK\"}");
+ strcat (reply, "\r\n\r\n");
+ break;
+ }
+
+#ifdef DEBUG_HTTPREQ
+ printf("Before Delete\r\n");
+ debug_info();
+#endif
+ if(pDataJson){
+#ifdef DEBUG_HTTPREQ
+ printf("type;%d, pDataJson->index_token=%d\r\n",pDataJson->_type,pDataJson->index_token);
+#endif
+ delete pDataJson;
+ pDataJson = 0;
+ }
+#ifdef DEBUG_HTTPREQ
+ printf("After Delete\r\n");
+ debug_info();
+#endif
+}
+
+/*
+void PutRequestHandler::handle(char* rest_uri, char* request_data, char *reply)
{
}
-void DeleteRequestHandler::handle(char* rest_uri, char *reply)
+void DeleteRequestHandler::handle(char* rest_uri, char* request_data, char *reply)
{
}
+*/
\ No newline at end of file
--- a/RequestHandler.h Tue May 03 02:21:56 2016 +0000
+++ b/RequestHandler.h Tue May 31 10:31:30 2016 +0000
@@ -3,34 +3,44 @@
//#define DEBUG_HTTPREQ
+extern void debug_info();
+
class RequestHandler
{
public :
-
- virtual void handle(char* rest_uri, char* reply) = 0;
+ virtual void handle(char* rest_uri, char* req_data, char* reply) = 0;
};
class GetRequestHandler : public RequestHandler
{
public :
-
- virtual void handle(char* rest_uri, char* reply);
+ virtual void handle(char* rest_uri, char* req_data, char* reply);
+
};
+class PostRequestHandler : public RequestHandler
+{
+ public :
+ virtual void handle(char* rest_uri, char* req_data, char* reply);
+
+};
+
+/*
class PutRequestHandler : public RequestHandler
{
public :
-
- virtual void handle(char* rest_uri, char* reply);
+ virtual void handle(char* rest_uri, char* req_data, char* reply);
};
+*/
-
+/*
class DeleteRequestHandler : public RequestHandler
{
public :
-
- virtual void handle(char* rest_uri, char* reply);
+ virtual void handle(char* rest_uri, char* req_data, char* reply);
};
+*/
+
#endif
--- a/main.cpp Tue May 03 02:21:56 2016 +0000
+++ b/main.cpp Tue May 31 10:31:30 2016 +0000
@@ -8,6 +8,8 @@
#define DHCP
+//#define DEBUG
+
EthernetInterface eth;
HTTPServer WIZwikiWebSvr;
MbedJSONValue WIZwikiREST;
@@ -15,10 +17,13 @@
// Enter a MAC address for your controller below.
uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0xFE};
char mac_str[20];
-char ip_addr[] = "192.168.100.100";
-char subnet_mask[] = "255.255.255.0";
+char ip_addr[] = "192.168.100.100";
+char subnet_mask[] = "255.255.255.0";
char gateway_addr[] = "192.168.100.1";
+GetRequestHandler myGetReq;
+PostRequestHandler myPostReq;
+
DigitalOut LED_1(PA_1);
DigitalOut LED_2(PA_2);
@@ -51,9 +56,42 @@
DigitalInOut GP31(P31);
DigitalInOut GP32(P32);
+
+bool gpio_all(void* param)
+{
+ if(!param) return false;
+ GP05.write(*(int*)param);
+ GP06.write(*(int*)param);
+ GP07.write(*(int*)param);
+ GP08.write(*(int*)param);
+ GP09.write(*(int*)param);
+ GP10.write(*(int*)param);
+ GP11.write(*(int*)param);
+ GP12.write(*(int*)param);
+ GP13.write(*(int*)param);
+ GP14.write(*(int*)param);
+ GP15.write(*(int*)param);
+ GP16.write(*(int*)param);
+ GP17.write(*(int*)param);
+ GP18.write(*(int*)param);
+ GP19.write(*(int*)param);
+ GP20.write(*(int*)param);
+ GP21.write(*(int*)param);
+ GP22.write(*(int*)param);
+ GP23.write(*(int*)param);
+ GP24.write(*(int*)param);
+ GP25.write(*(int*)param);
+ GP26.write(*(int*)param);
+ GP27.write(*(int*)param);
+ GP28.write(*(int*)param);
+ GP29.write(*(int*)param);
+ return true;
+}
+
+
bool p5_set(void* param)
{
- if(!param) return false;
+ if(!param) return false;
GP05.write(*(int*)param);
return true;
}
@@ -224,16 +262,21 @@
{
printf("SP:0x%X\r\n",__current_sp());
__heapstats((__heapprt)fprintf,stderr);
+#ifdef DEBUG
+ __heapvalid((__heapprt)fprintf,stderr, 1);
+#endif
printf("\r\n");
}
+
void WIZwiki_REST_init();
int main(void)
{
-
- sprintf(mac_str, "%02X:%02X:%02X:%02X:%02X:%02X",mac_addr[0],mac_addr[1],
- mac_addr[2],mac_addr[3],
- mac_addr[4],mac_addr[5]);
+#ifdef DEBUG
+ debug_info();
+#endif
+ sprintf(mac_str, "%02X:%02X:%02X:%02X:%02X:%02X",mac_addr[0],mac_addr[1],mac_addr[2],mac_addr[3],mac_addr[4],mac_addr[5]);
+
//GPIO Set
GP05.output();
GP05.write(1);
@@ -286,28 +329,31 @@
GP29.output();
GP29.write(1);
-
//LED Setbit
- LED_1.write(0); // LED On
- LED_2.write(1); // LED Off
+ //LED_1.write(0); // LED On
+ //LED_2.write(1); // LED Off
printf("START \r\n");
printf("sizeof(MbedJSONValue)=%d\r\n",sizeof(MbedJSONValue));
printf("sizeof(vector)=%d\r\n",sizeof(std::vector<string*>));
printf("sizeof(string)=%d\r\n",sizeof(std::string));
+#ifdef DEBUG
debug_info();
+#endif
WIZwiki_REST_init();
+#ifdef DEBUG
debug_info();
+#endif
// Serialize it into a JSON string
- printf("\r\n");
printf("-------------------------WIZwikiREST--------------------------- \r\n");
- printf("%s\r\n", WIZwikiREST.serialize().c_str());
+ printf("\r\n%s\r\n", WIZwikiREST.serialize().c_str());
printf("--------------------------------------------------------------- \r\n");
- WIZwikiWebSvr.add_request_handler("GET", new GetRequestHandler());
- //WIZwikiWebSvr.add_request_handler("DELETE", new DeleteRequestHandler());
+ WIZwikiWebSvr.add_request_handler("GET", &myGetReq);
+ WIZwikiWebSvr.add_request_handler("POST", &myPostReq);
+ //WIZwikiWebSvr.add_request_handler("DELETE", new PostRequestHandler());
//WIZwikiWebSvr.add_request_handler("PUT", new PutRequestHandler());
#ifdef DHCP
@@ -318,7 +364,7 @@
printf("Check Ethernet Link\r\n");
- //Add
+
do{
printf(" Link - Wait... \r\n");
wait(1);
@@ -334,15 +380,12 @@
printf(" MASK : %s\r\n\r\n", eth.getNetworkMask());
printf(" GW : %s\r\n\r\n", eth.getGateway());
}
-
- //while(1) //Wait link up
- //{
- // if(eth.link() == true)
- // break;
- //}
printf("Link up\r\n");
printf("IP Address is %s\r\n", eth.getIPAddress());
+#ifdef DEBUG
+ debug_info();
+#endif
if(!WIZwikiWebSvr.init(SERVER_PORT))
{
@@ -361,30 +404,28 @@
//Fill the object
WIZwikiREST["Name"] = "WIZwiki-RESTful-01";
WIZwikiREST["Name"].accessible = false;
+#ifdef DEBUG
debug_info();
+#endif
//Network
-
WIZwikiREST["Network"]["MAC"] = mac_str;
- debug_info();
WIZwikiREST["Network"]["IP"] = ip_addr;
WIZwikiREST["Network"]["IP"].accessible = true;
- debug_info();
WIZwikiREST["Network"]["SN"] = subnet_mask;
WIZwikiREST["Network"]["SN"].accessible = true;
- debug_info();
WIZwikiREST["Network"]["GW"] = gateway_addr;
WIZwikiREST["Network"]["GW"].accessible = true;
- debug_info();
//LEDs
- WIZwikiREST["LED1"] = (LED_1.read() ? "Off" : "On");
- WIZwikiREST["LED1"].accessible = true;
- debug_info();
- WIZwikiREST["LED2"] = (LED_2.read() ? "Off" : "On");
- WIZwikiREST["LED2"].accessible = true;
- debug_info();
+ //WIZwikiREST["LED1"] = (LED_1.read() ? "Off" : "On");
+ //WIZwikiREST["LED1"].accessible = true;
+ //WIZwikiREST["LED2"] = (LED_2.read() ? "Off" : "On");
+ //WIZwikiREST["LED2"].accessible = true;
+
// GPIOs
+ WIZwikiREST["GPIOs"]["all"].accessible = true;
+ WIZwikiREST["GPIOs"]["all"].cb_action = gpio_all;
WIZwikiREST["GPIOs"]["P05"] = GP05.read();
WIZwikiREST["GPIOs"]["P05"].accessible = true;
WIZwikiREST["GPIOs"]["P05"].cb_action = p5_set;
@@ -439,7 +480,6 @@
WIZwikiREST["GPIOs"]["P22"] = GP22.read();
WIZwikiREST["GPIOs"]["P22"].accessible = true;
WIZwikiREST["GPIOs"]["P22"].cb_action = p22_set;
-
WIZwikiREST["GPIOs"]["P23"] = GP23.read();
WIZwikiREST["GPIOs"]["P23"].accessible = true;
WIZwikiREST["GPIOs"]["P23"].cb_action = p23_set;
@@ -461,16 +501,8 @@
WIZwikiREST["GPIOs"]["P29"] = GP29.read();
WIZwikiREST["GPIOs"]["P29"].accessible = true;
WIZwikiREST["GPIOs"]["P29"].cb_action = p29_set;
-/*
- WIZwikiREST["GPIOs"]["P30"] = GP30.read();
- WIZwikiREST["GPIOs"]["P30"].accessible = true;
- WIZwikiREST["GPIOs"]["P30"].cb_action = p30_set;
- WIZwikiREST["GPIOs"]["P31"] = GP31.read();
- WIZwikiREST["GPIOs"]["P31"].accessible = true;
- WIZwikiREST["GPIOs"]["P31"].cb_action = p31_set;
- WIZwikiREST["GPIOs"]["P32"] = GP32.read();
- WIZwikiREST["GPIOs"]["P32"].accessible = true;
- WIZwikiREST["GPIOs"]["P32"].cb_action = p32_set;
-*/
+
+#ifdef DEBUG
debug_info();
+#endif
}
--- a/mbed.bld Tue May 03 02:21:56 2016 +0000 +++ b/mbed.bld Tue May 31 10:31:30 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/252557024ec3 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/6c34061e7c34 \ No newline at end of file
