Net Remote Controller

Dependencies:   EthernetNetIf HTTPServer mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers RemoteControllerHandler.cpp Source File

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 }