Net Remote Controller

Dependencies:   EthernetNetIf HTTPServer mbed

Committer:
nobuki
Date:
Sun Dec 09 13:07:14 2012 +0000
Revision:
0:e37991cede92
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nobuki 0:e37991cede92 1 #include "RemoteControllerHandler.h"
nobuki 0:e37991cede92 2
nobuki 0:e37991cede92 3 //#define __DEBUG
nobuki 0:e37991cede92 4 #include <dbg.h>
nobuki 0:e37991cede92 5
nobuki 0:e37991cede92 6 #define CHECK_PASSCODE
nobuki 0:e37991cede92 7
nobuki 0:e37991cede92 8 #define DELIMITER ("&")
nobuki 0:e37991cede92 9 #define PASSCODE (170) // 1357 : 010101010
nobuki 0:e37991cede92 10
nobuki 0:e37991cede92 11 // Turn ON the power of Air Conditioner
nobuki 0:e37991cede92 12 short ARRAY_HIGHLOW_ON[] = { 5067, 2061, 389, 1730, 412, 631, 388, 658, 385, 656, 388, 1729, 413, 630, 389, 656, 387, 657, 387, 657,
nobuki 0:e37991cede92 13 385, 1732, 412, 630, 391, 1727, 414, 1703, 412, 631, 388, 1731, 411, 1707, 385, 1731, 386, 1729, 413, 1705,
nobuki 0:e37991cede92 14 388, 657, 388, 656, 387, 1730, 386, 656, 390, 654, 385, 660, 386, 657, 387, 656, 388, 656, 387, 1731,
nobuki 0:e37991cede92 15 411, 1707, 386, 1730, 411, 1705, 388, 1730, 388, 655, 388, 1732, 409, 1704, 412, 633, 388, 655, 414, 628,
nobuki 0:e37991cede92 16 390, 658, 384, 660, 385, 659, 384, 656, 414, 629, 389, 657, 386, 658, 386, 657, 385, 658, 387, 1730,
nobuki 0:e37991cede92 17 412, 1705, 389, 1729, 409, 1707, 388, 656, 387, 655, 414, 629, 390, 657, 385, 29221, 5067, 2062, 413, 1704,
nobuki 0:e37991cede92 18 388, 655, 389, 657, 387, 656, 412, 1706, 386, 658, 385, 657, 412, 632, 387, 658, 385, 1729, 391, 655,
nobuki 0:e37991cede92 19 386, 1729, 413, 1705, 388, 657, 384, 1731, 414, 1706, 385, 1733, 409, 1707, 385, 1731, 411, 631, 388, 658,
nobuki 0:e37991cede92 20 385, 1730, 414, 630, 389, 656, 386, 658, 412, 630, 388, 658, 384, 659, 410, 630, 389, 658, 386, 659,
nobuki 0:e37991cede92 21 410, 630, 389, 1732, 410, 1704, 388, 658, 385, 655, 414, 1705, 389, 655, 386, 1730, 414, 1703, 388, 1731,
nobuki 0:e37991cede92 22 409, 633, 387, 659, 385, 660, 409, 630, 387, 660, 385, 1731, 386, 660, 383, 1731, 388, 655, 388, 658,
nobuki 0:e37991cede92 23 386, 657, 411, 631, 388, 658, 384, 1731, 413, 631, 389, 657, 384, 659, 410, 632, 384, 662, 358, 685,
nobuki 0:e37991cede92 24 386, 657, 386, 658, 385, 657, 412, 633, 386, 659, 382, 711, 360, 631, 388, 684, 358, 661, 409, 632,
nobuki 0:e37991cede92 25 386, 660, 383, 658, 388, 656, 387, 1732, 411, 1704, 387, 1732, 409, 632, 388, 659, 383, 658, 411, 631,
nobuki 0:e37991cede92 26 388, 1732, 386, 656, 388, 1731, 410, 633, 386, 660, 383, 658, 387, 657, 387, 659, 383, 684, 386, 634,
nobuki 0:e37991cede92 27 385, 1732, 408, 633, 385, 661, 358, 685, 408, 634, 386, 1732, 387, 656, 387, 1731, 386, 656, 387, 1733,
nobuki 0:e37991cede92 28 409, 632, 387, 659, 384, 1731, 411,};
nobuki 0:e37991cede92 29 // Turn OFF the power of Air Conditioner
nobuki 0:e37991cede92 30 short ARRAY_HIGHLOW_OFF[] = { 5067, 2063, 411, 1706, 387, 658, 386, 656, 388, 656, 388, 1730, 411, 631, 389, 657, 386, 658, 385, 658,
nobuki 0:e37991cede92 31 386, 1729, 413, 631, 388, 1730, 388, 1730, 411, 631, 389, 1729, 388, 1728, 413, 1704, 388, 1732, 385, 1731,
nobuki 0:e37991cede92 32 411, 631, 389, 656, 386, 1730, 412, 631, 388, 657, 389, 655, 389, 654, 389, 655, 386, 658, 409, 1708,
nobuki 0:e37991cede92 33 386, 1730, 412, 1706, 410, 1708, 386, 1730, 412, 631, 388, 1730, 386, 1731, 387, 657, 389, 655, 386, 657,
nobuki 0:e37991cede92 34 410, 634, 384, 659, 386, 658, 387, 655, 389, 655, 388, 657, 387, 657, 386, 658, 385, 660, 385, 1730,
nobuki 0:e37991cede92 35 387, 1730, 411, 1705, 388, 1730, 387, 657, 388, 655, 388, 656, 386, 658, 408, 29198, 5067, 2062, 412, 1705,
nobuki 0:e37991cede92 36 389, 656, 389, 655, 437, 605, 386, 1731, 413, 631, 412, 632, 387, 658, 411, 632, 386, 1732, 411, 631,
nobuki 0:e37991cede92 37 388, 1729, 412, 1705, 388, 656, 386, 1731, 412, 1705, 386, 1731, 411, 1705, 388, 1733, 410, 631, 388, 658,
nobuki 0:e37991cede92 38 385, 1729, 412, 632, 389, 656, 386, 657, 412, 631, 388, 657, 385, 657, 414, 628, 391, 656, 388, 656,
nobuki 0:e37991cede92 39 412, 630, 386, 1732, 410, 1705, 389, 659, 384, 658, 411, 1705, 388, 656, 387, 1730, 411, 1705, 388, 658,
nobuki 0:e37991cede92 40 384, 659, 412, 630, 388, 658, 385, 657, 412, 631, 389, 1730, 411, 631, 387, 1729, 413, 632, 387, 660,
nobuki 0:e37991cede92 41 383, 659, 409, 634, 385, 660, 384, 1730, 412, 632, 388, 657, 360, 683, 411, 632, 386, 659, 385, 659,
nobuki 0:e37991cede92 42 412, 628, 391, 656, 388, 656, 409, 633, 386, 659, 357, 689, 408, 632, 388, 659, 383, 656, 413, 631,
nobuki 0:e37991cede92 43 388, 658, 385, 682, 387, 633, 386, 1732, 412, 1703, 387, 1731, 410, 633, 386, 659, 386, 656, 414, 630,
nobuki 0:e37991cede92 44 388, 1754, 413, 605, 412, 1706, 411, 632, 387, 658, 385, 660, 410, 632, 385, 659, 385, 660, 411, 628,
nobuki 0:e37991cede92 45 389, 1730, 412, 632, 387, 658, 385, 659, 410, 632, 385, 660, 386, 658, 412, 1703, 386, 659, 385, 1731,
nobuki 0:e37991cede92 46 388, 656, 386, 657, 411, 1707, 386, };
nobuki 0:e37991cede92 47
nobuki 0:e37991cede92 48 AnalogIn g_ain_temperature(p16);
nobuki 0:e37991cede92 49 PwmOut g_pwmout(p21);
nobuki 0:e37991cede92 50
nobuki 0:e37991cede92 51 RemoteControllerHandler::RemoteControllerHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket)
nobuki 0:e37991cede92 52 {
nobuki 0:e37991cede92 53 DBG("RemoteControllerHandler()\r\n");
nobuki 0:e37991cede92 54 }
nobuki 0:e37991cede92 55
nobuki 0:e37991cede92 56 RemoteControllerHandler::~RemoteControllerHandler()
nobuki 0:e37991cede92 57 {
nobuki 0:e37991cede92 58 DBG("~RemoteControllerHandler()\r\n");
nobuki 0:e37991cede92 59 }
nobuki 0:e37991cede92 60 void RemoteControllerHandler::printString( const char* pszString )
nobuki 0:e37991cede92 61 {
nobuki 0:e37991cede92 62 writeData( pszString, strlen(pszString) );
nobuki 0:e37991cede92 63 }
nobuki 0:e37991cede92 64
nobuki 0:e37991cede92 65 double GetTemperature()
nobuki 0:e37991cede92 66 {
nobuki 0:e37991cede92 67 double dV = g_ain_temperature * 3.3;
nobuki 0:e37991cede92 68 return dV * 100.0;
nobuki 0:e37991cede92 69 }
nobuki 0:e37991cede92 70
nobuki 0:e37991cede92 71 void RemoteControllerHandler::printHtml( int iSignalType = 0, int iIsCorrectPassCode = 0 )
nobuki 0:e37991cede92 72 {
nobuki 0:e37991cede92 73 respHeaders()["Connection"] = "close";
nobuki 0:e37991cede92 74
nobuki 0:e37991cede92 75 printString("<html>\n");
nobuki 0:e37991cede92 76 printString("<head>\n");
nobuki 0:e37991cede92 77 printString("<title>Net Remote Controller</title>\n");
nobuki 0:e37991cede92 78 printString("</head>\n");
nobuki 0:e37991cede92 79 printString("<body>\n");
nobuki 0:e37991cede92 80
nobuki 0:e37991cede92 81 printString("<h1>Net Remote Controller</h1>\n");
nobuki 0:e37991cede92 82 printString( "Temperature : " );
nobuki 0:e37991cede92 83 char szTemperature[10];
nobuki 0:e37991cede92 84 sprintf( szTemperature, "%4.1f", GetTemperature() );
nobuki 0:e37991cede92 85 printString( szTemperature );
nobuki 0:e37991cede92 86 printString( " [degree]\n" );
nobuki 0:e37991cede92 87
nobuki 0:e37991cede92 88 printString("<hr>\n");
nobuki 0:e37991cede92 89
nobuki 0:e37991cede92 90 if( 1 == iSignalType )
nobuki 0:e37991cede92 91 {
nobuki 0:e37991cede92 92 if( 0 == iIsCorrectPassCode )
nobuki 0:e37991cede92 93 {
nobuki 0:e37991cede92 94 printString("<p><font color=\"#ff0000\">PassCode is wrong.</font></p>\n");
nobuki 0:e37991cede92 95 }
nobuki 0:e37991cede92 96 else
nobuki 0:e37991cede92 97 {
nobuki 0:e37991cede92 98 printString("<p><font color=\"#008000\">ON signal was transmitted.</font></p>\n");
nobuki 0:e37991cede92 99 }
nobuki 0:e37991cede92 100 }
nobuki 0:e37991cede92 101 else if( 2 == iSignalType )
nobuki 0:e37991cede92 102 {
nobuki 0:e37991cede92 103 if( 0 == iIsCorrectPassCode )
nobuki 0:e37991cede92 104 {
nobuki 0:e37991cede92 105 printString("<p><font color=\"#ff0000\">PassCode is wrong.</font></p>\n");
nobuki 0:e37991cede92 106 }
nobuki 0:e37991cede92 107 else
nobuki 0:e37991cede92 108 {
nobuki 0:e37991cede92 109 printString("<p><font color=\"#008000\">OFF signal was transmitted.</font></p>\n");
nobuki 0:e37991cede92 110 }
nobuki 0:e37991cede92 111 }
nobuki 0:e37991cede92 112 else
nobuki 0:e37991cede92 113 {
nobuki 0:e37991cede92 114 printString("<p><font color=\"#0000ff\">Select the type of signal, enter the PassCode, please click the submit button</font></p>\n");
nobuki 0:e37991cede92 115 }
nobuki 0:e37991cede92 116 printString("<form method=\"post\" action=\"\">\n");
nobuki 0:e37991cede92 117 printString("<h3>Type of signal</h3>\n");
nobuki 0:e37991cede92 118 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");
nobuki 0:e37991cede92 119 printString("<h3>PassCode</h3>\n");
nobuki 0:e37991cede92 120 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");
nobuki 0:e37991cede92 121 printString("<br>\n");
nobuki 0:e37991cede92 122
nobuki 0:e37991cede92 123 printString("<input type=\"submit\" value=\"submit\">\n");
nobuki 0:e37991cede92 124 printString("</form>\n");
nobuki 0:e37991cede92 125
nobuki 0:e37991cede92 126 printString("<hr>\n");
nobuki 0:e37991cede92 127 printString("</body>\n");
nobuki 0:e37991cede92 128 printString("</html>\n");
nobuki 0:e37991cede92 129 }
nobuki 0:e37991cede92 130
nobuki 0:e37991cede92 131 void RemoteControllerHandler::doGet()
nobuki 0:e37991cede92 132 {
nobuki 0:e37991cede92 133 DBG("doGet()\r\n");
nobuki 0:e37991cede92 134
nobuki 0:e37991cede92 135 printHtml();
nobuki 0:e37991cede92 136 }
nobuki 0:e37991cede92 137
nobuki 0:e37991cede92 138 void analyzePostData( char* pszLine, int& riSignalType, int& riPassCode )
nobuki 0:e37991cede92 139 {
nobuki 0:e37991cede92 140 riSignalType = 0;
nobuki 0:e37991cede92 141 riPassCode = 0;
nobuki 0:e37991cede92 142 char* pszToken = strtok(pszLine, DELIMITER);
nobuki 0:e37991cede92 143 while(pszToken)
nobuki 0:e37991cede92 144 {
nobuki 0:e37991cede92 145 if( 12 == strlen(pszToken)
nobuki 0:e37991cede92 146 && 0 == strncmp(pszToken, "signaltype", 10) )
nobuki 0:e37991cede92 147 { // signaltype=0/1/2
nobuki 0:e37991cede92 148 if( '0' == pszToken[11] ){ riSignalType = 0; }
nobuki 0:e37991cede92 149 else if( '1' == pszToken[11] ){ riSignalType = 1; }
nobuki 0:e37991cede92 150 else if( '2' == pszToken[11] ){ riSignalType = 2; }
nobuki 0:e37991cede92 151 }
nobuki 0:e37991cede92 152 else if( 6 == strlen(pszToken)
nobuki 0:e37991cede92 153 && 0 == strncmp(pszToken, "pc", 2) )
nobuki 0:e37991cede92 154 { // pc?=on
nobuki 0:e37991cede92 155 riPassCode |= (1 << (pszToken[2] - '0'));
nobuki 0:e37991cede92 156 }
nobuki 0:e37991cede92 157 pszToken = strtok(NULL, DELIMITER);
nobuki 0:e37991cede92 158 }
nobuki 0:e37991cede92 159 }
nobuki 0:e37991cede92 160
nobuki 0:e37991cede92 161 void sendSignal( int iSignalType )
nobuki 0:e37991cede92 162 {
nobuki 0:e37991cede92 163 g_pwmout.period_us( 26 ); // 38KHz => 1/38000[s] = 26.315 * 10 ^ 6 [s] = 26.315 [us]
nobuki 0:e37991cede92 164
nobuki 0:e37991cede92 165 short* aHighLow = NULL;
nobuki 0:e37991cede92 166 int iCountHighLow = 0;
nobuki 0:e37991cede92 167 if( 1 == iSignalType )
nobuki 0:e37991cede92 168 {
nobuki 0:e37991cede92 169 aHighLow = ARRAY_HIGHLOW_ON;
nobuki 0:e37991cede92 170 iCountHighLow = sizeof( ARRAY_HIGHLOW_ON ) / sizeof( ARRAY_HIGHLOW_ON[0] );
nobuki 0:e37991cede92 171 }
nobuki 0:e37991cede92 172 else if( 2 == iSignalType )
nobuki 0:e37991cede92 173 {
nobuki 0:e37991cede92 174 aHighLow = ARRAY_HIGHLOW_OFF;
nobuki 0:e37991cede92 175 iCountHighLow = sizeof( ARRAY_HIGHLOW_OFF ) / sizeof( ARRAY_HIGHLOW_OFF[0] );
nobuki 0:e37991cede92 176 }
nobuki 0:e37991cede92 177
nobuki 0:e37991cede92 178 if( NULL == aHighLow )
nobuki 0:e37991cede92 179 {
nobuki 0:e37991cede92 180 return;
nobuki 0:e37991cede92 181 }
nobuki 0:e37991cede92 182
nobuki 0:e37991cede92 183 DBG( "CountHighLow = % d\r\n", iCountHighLow );
nobuki 0:e37991cede92 184 for( int iIndexHighLow = 0; iIndexHighLow < iCountHighLow; iIndexHighLow++ )
nobuki 0:e37991cede92 185 {
nobuki 0:e37991cede92 186 g_pwmout.write( 0.5 * (1 - (iIndexHighLow % 2)) ); // iIndexHighLow : even number -> 0.5, uneven number -> 0
nobuki 0:e37991cede92 187 wait_us( aHighLow[iIndexHighLow] );
nobuki 0:e37991cede92 188 }
nobuki 0:e37991cede92 189 }
nobuki 0:e37991cede92 190
nobuki 0:e37991cede92 191 void RemoteControllerHandler::doPost()
nobuki 0:e37991cede92 192 {
nobuki 0:e37991cede92 193 DBG("doPost()\r\n");
nobuki 0:e37991cede92 194
nobuki 0:e37991cede92 195 int iCountData = dataLen();
nobuki 0:e37991cede92 196 if( 0 == iCountData )
nobuki 0:e37991cede92 197 {
nobuki 0:e37991cede92 198 printHtml();
nobuki 0:e37991cede92 199 return;
nobuki 0:e37991cede92 200 }
nobuki 0:e37991cede92 201
nobuki 0:e37991cede92 202 char* pszData = (char*) malloc( sizeof(char) * (iCountData + 1) );
nobuki 0:e37991cede92 203 readData( pszData, iCountData );
nobuki 0:e37991cede92 204 pszData[iCountData] = '\0';
nobuki 0:e37991cede92 205
nobuki 0:e37991cede92 206 DBG( pszData );
nobuki 0:e37991cede92 207
nobuki 0:e37991cede92 208 int iSignalType = 0;
nobuki 0:e37991cede92 209 int iPassCode = 0;
nobuki 0:e37991cede92 210 analyzePostData( pszData, iSignalType, iPassCode );
nobuki 0:e37991cede92 211
nobuki 0:e37991cede92 212 #ifdef CHECK_PASSCODE
nobuki 0:e37991cede92 213 // Check the PassCode
nobuki 0:e37991cede92 214 int iIsCorrectPassCode = 0;
nobuki 0:e37991cede92 215 if( PASSCODE == iPassCode )
nobuki 0:e37991cede92 216 {
nobuki 0:e37991cede92 217 iIsCorrectPassCode = 1;
nobuki 0:e37991cede92 218 }
nobuki 0:e37991cede92 219 // Send Signal
nobuki 0:e37991cede92 220 if( 1 == iIsCorrectPassCode )
nobuki 0:e37991cede92 221 {
nobuki 0:e37991cede92 222 sendSignal( iSignalType );
nobuki 0:e37991cede92 223 }
nobuki 0:e37991cede92 224 #else
nobuki 0:e37991cede92 225 int iIsCorrectPassCode = 1;
nobuki 0:e37991cede92 226 sendSignal( iSignalType );
nobuki 0:e37991cede92 227 #endif
nobuki 0:e37991cede92 228
nobuki 0:e37991cede92 229 printHtml( iSignalType, iIsCorrectPassCode );
nobuki 0:e37991cede92 230 }
nobuki 0:e37991cede92 231
nobuki 0:e37991cede92 232 void RemoteControllerHandler::doHead()
nobuki 0:e37991cede92 233 {
nobuki 0:e37991cede92 234 DBG("doHead()\r\n");
nobuki 0:e37991cede92 235 }
nobuki 0:e37991cede92 236
nobuki 0:e37991cede92 237 void RemoteControllerHandler::onReadable() //Data has been read
nobuki 0:e37991cede92 238 {
nobuki 0:e37991cede92 239 DBG("onReadable()\r\n");
nobuki 0:e37991cede92 240 }
nobuki 0:e37991cede92 241
nobuki 0:e37991cede92 242 void RemoteControllerHandler::onWriteable() //Data has been written & buf is free
nobuki 0:e37991cede92 243 {
nobuki 0:e37991cede92 244 DBG("onWriteable()\r\n");
nobuki 0:e37991cede92 245 close(); //Data written, we can close the connection
nobuki 0:e37991cede92 246 }
nobuki 0:e37991cede92 247
nobuki 0:e37991cede92 248 void RemoteControllerHandler::onClose() //Connection is closing
nobuki 0:e37991cede92 249 {
nobuki 0:e37991cede92 250 DBG("onClose()\r\n");
nobuki 0:e37991cede92 251 }