Net Remote Controller
Dependencies: EthernetNetIf HTTPServer mbed
RemoteControllerHandler.cpp
00001 #include "RemoteControllerHandler.h" 00002 00003 //#define __DEBUG 00004 #include <dbg.h> 00005 00006 #define CHECK_PASSCODE 00007 00008 #define DELIMITER ("&") 00009 #define PASSCODE (170) // 1357 : 010101010 00010 00011 // Turn ON the power of Air Conditioner 00012 short ARRAY_HIGHLOW_ON[] = { 5067, 2061, 389, 1730, 412, 631, 388, 658, 385, 656, 388, 1729, 413, 630, 389, 656, 387, 657, 387, 657, 00013 385, 1732, 412, 630, 391, 1727, 414, 1703, 412, 631, 388, 1731, 411, 1707, 385, 1731, 386, 1729, 413, 1705, 00014 388, 657, 388, 656, 387, 1730, 386, 656, 390, 654, 385, 660, 386, 657, 387, 656, 388, 656, 387, 1731, 00015 411, 1707, 386, 1730, 411, 1705, 388, 1730, 388, 655, 388, 1732, 409, 1704, 412, 633, 388, 655, 414, 628, 00016 390, 658, 384, 660, 385, 659, 384, 656, 414, 629, 389, 657, 386, 658, 386, 657, 385, 658, 387, 1730, 00017 412, 1705, 389, 1729, 409, 1707, 388, 656, 387, 655, 414, 629, 390, 657, 385, 29221, 5067, 2062, 413, 1704, 00018 388, 655, 389, 657, 387, 656, 412, 1706, 386, 658, 385, 657, 412, 632, 387, 658, 385, 1729, 391, 655, 00019 386, 1729, 413, 1705, 388, 657, 384, 1731, 414, 1706, 385, 1733, 409, 1707, 385, 1731, 411, 631, 388, 658, 00020 385, 1730, 414, 630, 389, 656, 386, 658, 412, 630, 388, 658, 384, 659, 410, 630, 389, 658, 386, 659, 00021 410, 630, 389, 1732, 410, 1704, 388, 658, 385, 655, 414, 1705, 389, 655, 386, 1730, 414, 1703, 388, 1731, 00022 409, 633, 387, 659, 385, 660, 409, 630, 387, 660, 385, 1731, 386, 660, 383, 1731, 388, 655, 388, 658, 00023 386, 657, 411, 631, 388, 658, 384, 1731, 413, 631, 389, 657, 384, 659, 410, 632, 384, 662, 358, 685, 00024 386, 657, 386, 658, 385, 657, 412, 633, 386, 659, 382, 711, 360, 631, 388, 684, 358, 661, 409, 632, 00025 386, 660, 383, 658, 388, 656, 387, 1732, 411, 1704, 387, 1732, 409, 632, 388, 659, 383, 658, 411, 631, 00026 388, 1732, 386, 656, 388, 1731, 410, 633, 386, 660, 383, 658, 387, 657, 387, 659, 383, 684, 386, 634, 00027 385, 1732, 408, 633, 385, 661, 358, 685, 408, 634, 386, 1732, 387, 656, 387, 1731, 386, 656, 387, 1733, 00028 409, 632, 387, 659, 384, 1731, 411,}; 00029 // Turn OFF the power of Air Conditioner 00030 short ARRAY_HIGHLOW_OFF[] = { 5067, 2063, 411, 1706, 387, 658, 386, 656, 388, 656, 388, 1730, 411, 631, 389, 657, 386, 658, 385, 658, 00031 386, 1729, 413, 631, 388, 1730, 388, 1730, 411, 631, 389, 1729, 388, 1728, 413, 1704, 388, 1732, 385, 1731, 00032 411, 631, 389, 656, 386, 1730, 412, 631, 388, 657, 389, 655, 389, 654, 389, 655, 386, 658, 409, 1708, 00033 386, 1730, 412, 1706, 410, 1708, 386, 1730, 412, 631, 388, 1730, 386, 1731, 387, 657, 389, 655, 386, 657, 00034 410, 634, 384, 659, 386, 658, 387, 655, 389, 655, 388, 657, 387, 657, 386, 658, 385, 660, 385, 1730, 00035 387, 1730, 411, 1705, 388, 1730, 387, 657, 388, 655, 388, 656, 386, 658, 408, 29198, 5067, 2062, 412, 1705, 00036 389, 656, 389, 655, 437, 605, 386, 1731, 413, 631, 412, 632, 387, 658, 411, 632, 386, 1732, 411, 631, 00037 388, 1729, 412, 1705, 388, 656, 386, 1731, 412, 1705, 386, 1731, 411, 1705, 388, 1733, 410, 631, 388, 658, 00038 385, 1729, 412, 632, 389, 656, 386, 657, 412, 631, 388, 657, 385, 657, 414, 628, 391, 656, 388, 656, 00039 412, 630, 386, 1732, 410, 1705, 389, 659, 384, 658, 411, 1705, 388, 656, 387, 1730, 411, 1705, 388, 658, 00040 384, 659, 412, 630, 388, 658, 385, 657, 412, 631, 389, 1730, 411, 631, 387, 1729, 413, 632, 387, 660, 00041 383, 659, 409, 634, 385, 660, 384, 1730, 412, 632, 388, 657, 360, 683, 411, 632, 386, 659, 385, 659, 00042 412, 628, 391, 656, 388, 656, 409, 633, 386, 659, 357, 689, 408, 632, 388, 659, 383, 656, 413, 631, 00043 388, 658, 385, 682, 387, 633, 386, 1732, 412, 1703, 387, 1731, 410, 633, 386, 659, 386, 656, 414, 630, 00044 388, 1754, 413, 605, 412, 1706, 411, 632, 387, 658, 385, 660, 410, 632, 385, 659, 385, 660, 411, 628, 00045 389, 1730, 412, 632, 387, 658, 385, 659, 410, 632, 385, 660, 386, 658, 412, 1703, 386, 659, 385, 1731, 00046 388, 656, 386, 657, 411, 1707, 386, }; 00047 00048 AnalogIn g_ain_temperature(p16); 00049 PwmOut g_pwmout(p21); 00050 00051 RemoteControllerHandler::RemoteControllerHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket) 00052 { 00053 DBG("RemoteControllerHandler()\r\n"); 00054 } 00055 00056 RemoteControllerHandler::~RemoteControllerHandler() 00057 { 00058 DBG("~RemoteControllerHandler()\r\n"); 00059 } 00060 void RemoteControllerHandler::printString( const char* pszString ) 00061 { 00062 writeData( pszString, strlen(pszString) ); 00063 } 00064 00065 double GetTemperature() 00066 { 00067 double dV = g_ain_temperature * 3.3; 00068 return dV * 100.0; 00069 } 00070 00071 void RemoteControllerHandler::printHtml( int iSignalType = 0, int iIsCorrectPassCode = 0 ) 00072 { 00073 respHeaders()["Connection"] = "close"; 00074 00075 printString("<html>\n"); 00076 printString("<head>\n"); 00077 printString("<title>Net Remote Controller</title>\n"); 00078 printString("</head>\n"); 00079 printString("<body>\n"); 00080 00081 printString("<h1>Net Remote Controller</h1>\n"); 00082 printString( "Temperature : " ); 00083 char szTemperature[10]; 00084 sprintf( szTemperature, "%4.1f", GetTemperature() ); 00085 printString( szTemperature ); 00086 printString( " [degree]\n" ); 00087 00088 printString("<hr>\n"); 00089 00090 if( 1 == iSignalType ) 00091 { 00092 if( 0 == iIsCorrectPassCode ) 00093 { 00094 printString("<p><font color=\"#ff0000\">PassCode is wrong.</font></p>\n"); 00095 } 00096 else 00097 { 00098 printString("<p><font color=\"#008000\">ON signal was transmitted.</font></p>\n"); 00099 } 00100 } 00101 else if( 2 == iSignalType ) 00102 { 00103 if( 0 == iIsCorrectPassCode ) 00104 { 00105 printString("<p><font color=\"#ff0000\">PassCode is wrong.</font></p>\n"); 00106 } 00107 else 00108 { 00109 printString("<p><font color=\"#008000\">OFF signal was transmitted.</font></p>\n"); 00110 } 00111 } 00112 else 00113 { 00114 printString("<p><font color=\"#0000ff\">Select the type of signal, enter the PassCode, please click the submit button</font></p>\n"); 00115 } 00116 printString("<form method=\"post\" action=\"\">\n"); 00117 printString("<h3>Type of signal</h3>\n"); 00118 printString("<input type=\"radio\" name=\"signaltype\" value=\"0\" checked>None <input type=\"radio\" name=\"signaltype\" value=\"1\">On signal <input type=\"radio\" name=\"signaltype\" value=\"2\" >OFF signal <br>\n"); 00119 printString("<h3>PassCode</h3>\n"); 00120 printString("<input type=\"checkbox\" name=\"pc0\">0 <input type=\"checkbox\" name=\"pc1\">1 <input type=\"checkbox\" name=\"pc2\">2 <input type=\"checkbox\" name=\"pc3\">3 <input type=\"checkbox\" name=\"pc4\">4 <input type=\"checkbox\" name=\"pc5\">5 <input type=\"checkbox\" name=\"pc6\">6 <input type=\"checkbox\" name=\"pc7\">7<br>\n"); 00121 printString("<br>\n"); 00122 00123 printString("<input type=\"submit\" value=\"submit\">\n"); 00124 printString("</form>\n"); 00125 00126 printString("<hr>\n"); 00127 printString("</body>\n"); 00128 printString("</html>\n"); 00129 } 00130 00131 void RemoteControllerHandler::doGet() 00132 { 00133 DBG("doGet()\r\n"); 00134 00135 printHtml(); 00136 } 00137 00138 void analyzePostData( char* pszLine, int& riSignalType, int& riPassCode ) 00139 { 00140 riSignalType = 0; 00141 riPassCode = 0; 00142 char* pszToken = strtok(pszLine, DELIMITER); 00143 while(pszToken) 00144 { 00145 if( 12 == strlen(pszToken) 00146 && 0 == strncmp(pszToken, "signaltype", 10) ) 00147 { // signaltype=0/1/2 00148 if( '0' == pszToken[11] ){ riSignalType = 0; } 00149 else if( '1' == pszToken[11] ){ riSignalType = 1; } 00150 else if( '2' == pszToken[11] ){ riSignalType = 2; } 00151 } 00152 else if( 6 == strlen(pszToken) 00153 && 0 == strncmp(pszToken, "pc", 2) ) 00154 { // pc?=on 00155 riPassCode |= (1 << (pszToken[2] - '0')); 00156 } 00157 pszToken = strtok(NULL, DELIMITER); 00158 } 00159 } 00160 00161 void sendSignal( int iSignalType ) 00162 { 00163 g_pwmout.period_us( 26 ); // 38KHz => 1/38000[s] = 26.315 * 10 ^ 6 [s] = 26.315 [us] 00164 00165 short* aHighLow = NULL; 00166 int iCountHighLow = 0; 00167 if( 1 == iSignalType ) 00168 { 00169 aHighLow = ARRAY_HIGHLOW_ON; 00170 iCountHighLow = sizeof( ARRAY_HIGHLOW_ON ) / sizeof( ARRAY_HIGHLOW_ON[0] ); 00171 } 00172 else if( 2 == iSignalType ) 00173 { 00174 aHighLow = ARRAY_HIGHLOW_OFF; 00175 iCountHighLow = sizeof( ARRAY_HIGHLOW_OFF ) / sizeof( ARRAY_HIGHLOW_OFF[0] ); 00176 } 00177 00178 if( NULL == aHighLow ) 00179 { 00180 return; 00181 } 00182 00183 DBG( "CountHighLow = % d\r\n", iCountHighLow ); 00184 for( int iIndexHighLow = 0; iIndexHighLow < iCountHighLow; iIndexHighLow++ ) 00185 { 00186 g_pwmout.write( 0.5 * (1 - (iIndexHighLow % 2)) ); // iIndexHighLow : even number -> 0.5, uneven number -> 0 00187 wait_us( aHighLow[iIndexHighLow] ); 00188 } 00189 } 00190 00191 void RemoteControllerHandler::doPost() 00192 { 00193 DBG("doPost()\r\n"); 00194 00195 int iCountData = dataLen(); 00196 if( 0 == iCountData ) 00197 { 00198 printHtml(); 00199 return; 00200 } 00201 00202 char* pszData = (char*) malloc( sizeof(char) * (iCountData + 1) ); 00203 readData( pszData, iCountData ); 00204 pszData[iCountData] = '\0'; 00205 00206 DBG( pszData ); 00207 00208 int iSignalType = 0; 00209 int iPassCode = 0; 00210 analyzePostData( pszData, iSignalType, iPassCode ); 00211 00212 #ifdef CHECK_PASSCODE 00213 // Check the PassCode 00214 int iIsCorrectPassCode = 0; 00215 if( PASSCODE == iPassCode ) 00216 { 00217 iIsCorrectPassCode = 1; 00218 } 00219 // Send Signal 00220 if( 1 == iIsCorrectPassCode ) 00221 { 00222 sendSignal( iSignalType ); 00223 } 00224 #else 00225 int iIsCorrectPassCode = 1; 00226 sendSignal( iSignalType ); 00227 #endif 00228 00229 printHtml( iSignalType, iIsCorrectPassCode ); 00230 } 00231 00232 void RemoteControllerHandler::doHead() 00233 { 00234 DBG("doHead()\r\n"); 00235 } 00236 00237 void RemoteControllerHandler::onReadable() //Data has been read 00238 { 00239 DBG("onReadable()\r\n"); 00240 } 00241 00242 void RemoteControllerHandler::onWriteable() //Data has been written & buf is free 00243 { 00244 DBG("onWriteable()\r\n"); 00245 close(); //Data written, we can close the connection 00246 } 00247 00248 void RemoteControllerHandler::onClose() //Connection is closing 00249 { 00250 DBG("onClose()\r\n"); 00251 }
Generated on Tue Jul 12 2022 18:32:26 by 1.7.2