전시회용
Fork of httpServer-orgel by
Handler/FsHandler.cpp
- Committer:
- justinkim
- Date:
- 2016-10-21
- Revision:
- 7:d19f02b618d0
- Parent:
- 6:9aefb9ff74ce
File content as of revision 7:d19f02b618d0:
/* FsHandler.cpp */ #include "mbed.h" #include "FsHandler.h" //#define DEBUG #include "hl_debug.h" #include "pwm_tone.h" PwmOut Buzzer1(P9); PwmOut Buzzer2(P8); PwmOut Buzzer3(P7); PwmOut Buzzer4(P10); float C_3 = 1000000/Do3, Cs_3 = 1000000/Do3s, D_3 = 1000000/Re3, Ds_3 = 1000000/Re3s, E_3 = 1000000/Mi3, F_3 = 1000000/Fa3, Fs_3 = 1000000/Fa3s, G_3 = 1000000/So3, Gs_3 = 1000000/So3s, A_3 = 1000000/La3, As_3 = 1000000/La3s, B_3 = 1000000/Ti3, C_4 = 1000000/Do4, Cs_4 = 1000000/Do4s, D_4 = 1000000/Re4, Ds_4 = 1000000/Re4s, E_4 = 1000000/Mi4, F_4 = 1000000/Fa4, Fs_4 = 1000000/Fa4s, G_4 = 1000000/So4, Gs_4 = 1000000/So4s, A_4 = 1000000/La4, As_4 = 1000000/La4s, B_4 = 1000000/Ti4, C_5 = 1000000/Do5, Cs_5 = 1000000/Do5s, D_5 = 1000000/Re5, Ds_5 = 1000000/Re5s, E_5 = 1000000/Mi5, F_5 = 1000000/Fa5, Fs_5 = 1000000/Fa5s, G_5 = 1000000/So5, Gs_5 = 1000000/So5s, A_5 = 1000000/La5, As_5 = 1000000/La5s, B_5 = 1000000/Ti5, C_6 = 1000000/Do6, Cs_6 = 1000000/Do6s, D_6 = 1000000/Re6, Ds_6 = 1000000/Re6s, E_6 = 1000000/Mi6, F_6 = 1000000/Fa6, Fs_6 = 1000000/Fa6s, G_6 = 1000000/So6, Gs_6 = 1000000/So6s, A_6 = 1000000/La6, As_6 = 1000000/La6s, B_6 = 1000000/Ti6; int mario1[80] = {E_5,E_5,0,E_5,0,C_5,E_5,0, G_5,0,0,0,G_4,0,0,0, C_5,0,0,G_4,0,0,E_4,0, E_4,A_4,0,B_4,0,As_4,A_4,0, G_4,E_5,G_5,0,A_5,0,F_5,G_5, 0,E_5,0,C_5,D_5,B_4,0,0, C_5,0,0,G_4,0,0,E_4,0, E_4,A_4,0,B_4,0,As_4,A_4,0, G_4,E_5,G_5,0,A_5,0,F_5,G_5, 0,E_5,0,C_5,D_5,B_4,0,0 }; int mario2[80] = {Fs_4,F_4,0,F_4,0,F_4,F_4,0, G_4,0,0,0,0,0,0,0, E_4,0,0,E_4,0,0,C_4,0, C_4,C_4,0,D_4,0,Cs_4,C_4,0, C_4,G_4,B_4,0,C_5,0,A_4,B_4, 0,G_4,0,E_4,F_4,D_4,0,0, E_4,0,0,E_4,0,0,C_4,0, C_4,C_4,0,D_4,0,Cs_4,C_4,0, C_4,G_4,B_4,0,C_5,0,A_4,B_4, 0,G_4,0,E_4,F_4,D_4,0,0 }; int mario3[80] = {B_4,B_4,0,B_4,0,B_4,B_4,0, E_5,0,0,0,E_5,0,0,0, E_5,0,0,C_4,0,0,A_4,0, A_4,D_5,0,E_5,0,Ds_5,D_5,0, C_5,A_5,C_6,0,D_6,0,B_5,C_6, 0,A_5,0,F_5,G_5,E_5,0,0, E_5,0,0,C_5,0,0,A_4,0, A_4,D_5,0,E_5,0,Ds_5,D_5,0, C_5,A_5,C_6,0,D_6,0,B_5,C_6, 0,A_5,0,F_5,G_5,E_5,0,0 }; //int love1[512] = {G_4,0,0,0,0,0,0,0,0,0,0,0,B_4,0,0,G_4,F_4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,E_4,0,0,0,0,0,0,0,0,0,0,0,C_5,0,0,G_4,D_4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,C_5,0,0,0,0,0,0,0,0,0,0,0,C_5,B_4,A_4,0,G_4,0,0,B_4,B_4,0,0,0,0,0,0,0,0,0,0,0,A_4,0,0,0,0,0,0,0,0,0,0,0,A_4,0,0,G_4,G_4,0,0,0,0,0,0,0,0,0,0,0,B_4,0,C_5,B_4,G_4,0,0,0,0,0,0,0,0,0,0,0,0,B_4,C_5,B_4,A_4,0,0,0,0,0,0,0,0,0,0,0,0,A_4,B_4,A_4,D_4,0,0,0,0,0,0,0,0,0,0,0,0,C_5,C_5,B_4,B_4,0,0,0,0,0,0,0,0,0,0,0,0,B_4,C_5,B_4,G_4,0,G_4,0,G_4,0,0,0,0,0,0,0,B_4,0,C_5,B_4,A_4,0,A_4,0,A_4,0,0,0,0,0,0,0,0,A_4,B_4,A_4,D_4,0,0,0,0,0,0,0,0,0,0,0,0,0,A_4,B_4,A_4,G_4,0,0,0,0,0,0,0,F_4,0,0,0,F_4,0,0,0,E_4,0,E_4,0,0,0,G_4,0,C_5,0,0,0,0,0,0,0,D_4,0,D_4,0,0,0,G_4,0,B_4,0,0,0,0,0,0,0,A_4,A_4,A_4,0,B_4,0,B_4,0,C_5,C_5,C_5,0,B_4,A_4,B_4,0,0,0,0,0,0,0,F_4,0,0,0,F_4,0,0,0,E_4,0,E_4,0,0,0,G_4,0,C_5,0,0,0,0,0,0,0,D_4,0,D_4,0,0,0,G_4,0,B_4,0,0,0,0,0,0,0,A_4,A_4,A_4,0,B_4,0,B_4,0,C_5,C_5,C_5,0,B_4,A_4,G_4,0,0,0,0,0,0,0,0,0,0,0,0,B_4,C_5,B_4,G_4,0,0,0,0,0,0,0,0,0,0,0,B_4,C_5,B_4,A_4,0,0,0,0,0,0,0,0,0,0,0,0,A_4,B_4,A_4,D_4,0,D_4,0,D_4,0,0,0,0,0,0,0,0,C_5,C_5,B_4,B_4,0,0,0,0,0,0,0,0,0,0,0,B_4,C_5,B_4,G_4,0,0,0,0,0,0,0,0,0,0,0,B_4,C_5,B_4,A_4,0,0,0,0,0,0,0,0,0,0,0,0,A_4,B_4,A_4,D_4,0,0,0,0,0,0,0,0,0,0,0,A_4,0,B_4,A_4,G_4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //int love2[512] = {G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,D_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,C_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0}; //int love3[512] = {B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,E_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,Fs_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0,B_3,0,0,0}; //int love4[512] = {D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,G_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,A_3,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0,D_4,0,0,0}; int tones_num = 80; int love_num = 512; static int matchstrings(const char* one, const char* two) { int m = 0; for (m = 0; m < min(strlen(one), strlen(two)) ; m++) { if (one[m] != two[m]) return m; } return m; } std::map<const char*, const char*> HTTPFsRequestHandler::m_fsMap; HTTPFsRequestHandler::HTTPFsRequestHandler(const char* rootPath, const char* localPath, HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp) : HTTPRequestHandler(Msg, Tcp) { m_rootPath = rootPath; m_localPath = localPath; string myPath = m_rootPath + m_localPath; // Now replace the virtual root path with a mounted device path std::map<const char*, const char*>::iterator it; const char *bestMatch = NULL; const char *bestMatchExchange = NULL; int match_ind = -1; for (it = m_fsMap.begin() ; it != m_fsMap.end() ; it++) { // find best match (if the given logical path is containted in the root int s = matchstrings(myPath.c_str(), it->second); INFO("Matching Root %s with handler %s results in %d identical characters\n", myPath.c_str(), it->second, s); if ((s == strlen(it->second)) && (s > match_ind)) { match_ind = s; bestMatch = it->first; bestMatchExchange = it->second; } } if (bestMatch != NULL) { m_rootPath = bestMatch; m_localPath = string(myPath).substr(strlen(bestMatchExchange)); } handleRequest(); } HTTPFsRequestHandler::~HTTPFsRequestHandler() { } std::map<int, EthernetInterface*> HTTPFsRequestHandler::m_eth_list; int HTTPFsRequestHandler::handleGetRequest() { HTTPHeaders headers; EthernetInterface test_eth; int retval = 0; //success if( std::string::npos != msg.uri.find("get_netinfo.cgi") ) { char buf[256]; sprintf(buf, "NetinfoCallback({\"mac\":\"%s\",\"ip\":\"%s\",\"sn\":\"%s\",\"gw\":\"%s\",\"temp\":\"%s\"});" ,m_eth_list[0]->getMACAddress(),m_eth_list[0]->getIPAddress(),m_eth_list[0]->getNetworkMask(),m_eth_list[0]->getGateway()); tcp.send(buf, strlen(buf)); } else if( std::string::npos != msg.uri.find("get_ain.cgi") ) { char buf[256]; //sprintf(buf, "AinCallback({\"ain_v0\":\"%.3f\",\"ain_v1\":\"%.3f\"});",ain0.read()*100, ain1.read()*100); tcp.send(buf, strlen(buf)); } else //read html pages { if (m_localPath.length() > 4) getStandardHeaders(headers, m_localPath.substr(m_localPath.length()-4).c_str()); else getStandardHeaders(headers); INFO("Handling Get Request (root = %s, local = %s).", m_rootPath.c_str(), m_localPath.c_str()); std::string reqPath; // Check if we received a directory with the local bath if ((m_localPath.length() == 0) || (m_localPath.substr( m_localPath.length()-1, 1) == "/")) { // yes, we shall append the default page name m_localPath += "index.html"; } reqPath = m_rootPath + m_localPath; INFO("Mapping \"%s\" to \"%s\"", msg.uri.c_str(), reqPath.c_str()); FILE *fp = fopen(reqPath.c_str(), "r"); if (fp != NULL) { char * pBuffer = NULL; int sz = 8192; while( pBuffer == NULL) { sz /= 2; pBuffer = (char*)malloc(sz); if (sz < 128) error ("OutOfMemory"); } // File was found and can be returned // first determine the size fseek(fp, 0, SEEK_END); long size = ftell(fp); fseek(fp, 0, SEEK_SET); startResponse(200, size); while(!feof(fp) && !ferror(fp)) { int cnt = fread(pBuffer, 1, sz , fp); if (cnt < 0) cnt = 0; processResponse(cnt, pBuffer); } delete pBuffer; endResponse(); fclose(fp); } else { retval = 404; ERR("Requested file was not found !"); } } return retval; } int HTTPFsRequestHandler::handlePostRequest() { int pin = 0; int i; if( std::string::npos != msg.uri.find("set_LED.cgi") ) { pin = get_http_param_value("pin"); if(pin==0) Tune(Buzzer1, C_4, 4); else if(pin==1) Tune(Buzzer1, Cs_4, 4); else if(pin==2) Tune(Buzzer1, D_4, 4); else if(pin==3) Tune(Buzzer1, Ds_4, 4); else if(pin==4) Tune(Buzzer1, E_4, 4); else if(pin==5) Tune(Buzzer1, F_4, 4); else if(pin==6) Tune(Buzzer1, Fs_4, 4); else if(pin==7) Tune(Buzzer1, G_4, 4); else if(pin==8) Tune(Buzzer1, Gs_4, 4); else if(pin==9) Tune(Buzzer1, A_4, 4); else if(pin==10) Tune(Buzzer1, As_4, 4); else if(pin==11) Tune(Buzzer1, B_4, 4); else if(pin==12) Tune(Buzzer1, C_5, 4); else if(pin==13) Tune(Buzzer1, Cs_5, 4); else if(pin==14) Tune(Buzzer1, D_5, 4); else if(pin==15) Tune(Buzzer1, Ds_5, 4); else if(pin==16) Tune(Buzzer1, E_5, 4); else if(pin==17) Tune(Buzzer1, F_5, 4); else if(pin==18) Tune(Buzzer1, Fs_5, 4); else if(pin==19) Tune(Buzzer1, G_5, 4); else if(pin==20) Tune(Buzzer1, Gs_5, 4); else if(pin==21) Tune(Buzzer1, A_5, 4); else if(pin==22) Tune(Buzzer1, As_5, 4); else if(pin==23) Tune(Buzzer1, B_5, 4); else { WARN("Wrong pin number"); } return 0; } else if( std::string::npos != msg.uri.find("set_AUTO.cgi") ) { pin = get_http_param_value("pin"); if(pin==0) { for(i=0; i<tones_num; i++) { Auto_tunes(Buzzer1, mario1[i], 1); // Auto performance Auto_tunes(Buzzer2, mario2[i], 1); // Auto performance Auto_tunes(Buzzer3, mario3[i], 1); // Auto performance Stop_tunes(Buzzer1); Stop_tunes(Buzzer2); Stop_tunes(Buzzer3); } } else if(pin == 1) { for(i=0; i<love_num; i++) { //Auto_tunes(Buzzer1, love1[i], 1); // Auto performance //Auto_tunes(Buzzer2, love2[i], 1); // Auto performance //Auto_tunes(Buzzer3, love3[i], 1); // Auto performance //Auto_tunes(Buzzer4, love4[i], 1); // Auto performance Stop_tunes(Buzzer1); Stop_tunes(Buzzer2); Stop_tunes(Buzzer3); Stop_tunes(Buzzer4); } } else if(pin == 99) { ; } else { WARN("Wrong pin number"); } return 0; } else { return 404; } } int HTTPFsRequestHandler::handlePutRequest() { return 404; } uint32_t HTTPFsRequestHandler::get_http_param_value(char* param_name) { uint8_t * name = 0; uint8_t * pos2; uint16_t len = 0; char value[10]; uint32_t ret = 0; //msg.attri if((name = (uint8_t *)strstr(msg.attri, param_name))) { name += strlen(param_name) + 1; pos2 = (uint8_t*)strstr((char*)name, "&"); if(!pos2) { pos2 = name + strlen((char*)name); } len = pos2 - name; if(len) { strncpy(value, (char*)name, len); ret = atoi(value); } } return ret; }