Net Remote Controller

Dependencies:   EthernetNetIf HTTPServer mbed

RemoteControllerHandler.cpp

Committer:
nobuki
Date:
2012-12-09
Revision:
0:e37991cede92

File content as of revision 0:e37991cede92:

#include "RemoteControllerHandler.h"

//#define __DEBUG
#include <dbg.h>

#define CHECK_PASSCODE

#define DELIMITER   ("&")
#define PASSCODE    (170)   // 1357 : 010101010

// Turn ON the power of Air Conditioner
short ARRAY_HIGHLOW_ON[] = { 5067, 2061, 389, 1730, 412, 631, 388, 658, 385, 656, 388, 1729, 413, 630, 389, 656, 387, 657, 387, 657,
                             385, 1732, 412, 630, 391, 1727, 414, 1703, 412, 631, 388, 1731, 411, 1707, 385, 1731, 386, 1729, 413, 1705,
                             388, 657, 388, 656, 387, 1730, 386, 656, 390, 654, 385, 660, 386, 657, 387, 656, 388, 656, 387, 1731,
                             411, 1707, 386, 1730, 411, 1705, 388, 1730, 388, 655, 388, 1732, 409, 1704, 412, 633, 388, 655, 414, 628,
                             390, 658, 384, 660, 385, 659, 384, 656, 414, 629, 389, 657, 386, 658, 386, 657, 385, 658, 387, 1730,
                             412, 1705, 389, 1729, 409, 1707, 388, 656, 387, 655, 414, 629, 390, 657, 385, 29221, 5067, 2062, 413, 1704,
                             388, 655, 389, 657, 387, 656, 412, 1706, 386, 658, 385, 657, 412, 632, 387, 658, 385, 1729, 391, 655,
                             386, 1729, 413, 1705, 388, 657, 384, 1731, 414, 1706, 385, 1733, 409, 1707, 385, 1731, 411, 631, 388, 658,
                             385, 1730, 414, 630, 389, 656, 386, 658, 412, 630, 388, 658, 384, 659, 410, 630, 389, 658, 386, 659,
                             410, 630, 389, 1732, 410, 1704, 388, 658, 385, 655, 414, 1705, 389, 655, 386, 1730, 414, 1703, 388, 1731,
                             409, 633, 387, 659, 385, 660, 409, 630, 387, 660, 385, 1731, 386, 660, 383, 1731, 388, 655, 388, 658,
                             386, 657, 411, 631, 388, 658, 384, 1731, 413, 631, 389, 657, 384, 659, 410, 632, 384, 662, 358, 685,
                             386, 657, 386, 658, 385, 657, 412, 633, 386, 659, 382, 711, 360, 631, 388, 684, 358, 661, 409, 632,
                             386, 660, 383, 658, 388, 656, 387, 1732, 411, 1704, 387, 1732, 409, 632, 388, 659, 383, 658, 411, 631,
                             388, 1732, 386, 656, 388, 1731, 410, 633, 386, 660, 383, 658, 387, 657, 387, 659, 383, 684, 386, 634,
                             385, 1732, 408, 633, 385, 661, 358, 685, 408, 634, 386, 1732, 387, 656, 387, 1731, 386, 656, 387, 1733,
                             409, 632, 387, 659, 384, 1731, 411,};
// Turn OFF the power of Air Conditioner
short ARRAY_HIGHLOW_OFF[] = { 5067, 2063, 411, 1706, 387, 658, 386, 656, 388, 656, 388, 1730, 411, 631, 389, 657, 386, 658, 385, 658,
                             386, 1729, 413, 631, 388, 1730, 388, 1730, 411, 631, 389, 1729, 388, 1728, 413, 1704, 388, 1732, 385, 1731,
                             411, 631, 389, 656, 386, 1730, 412, 631, 388, 657, 389, 655, 389, 654, 389, 655, 386, 658, 409, 1708,
                             386, 1730, 412, 1706, 410, 1708, 386, 1730, 412, 631, 388, 1730, 386, 1731, 387, 657, 389, 655, 386, 657,
                             410, 634, 384, 659, 386, 658, 387, 655, 389, 655, 388, 657, 387, 657, 386, 658, 385, 660, 385, 1730,
                             387, 1730, 411, 1705, 388, 1730, 387, 657, 388, 655, 388, 656, 386, 658, 408, 29198, 5067, 2062, 412, 1705,
                             389, 656, 389, 655, 437, 605, 386, 1731, 413, 631, 412, 632, 387, 658, 411, 632, 386, 1732, 411, 631,
                             388, 1729, 412, 1705, 388, 656, 386, 1731, 412, 1705, 386, 1731, 411, 1705, 388, 1733, 410, 631, 388, 658,
                             385, 1729, 412, 632, 389, 656, 386, 657, 412, 631, 388, 657, 385, 657, 414, 628, 391, 656, 388, 656,
                             412, 630, 386, 1732, 410, 1705, 389, 659, 384, 658, 411, 1705, 388, 656, 387, 1730, 411, 1705, 388, 658,
                             384, 659, 412, 630, 388, 658, 385, 657, 412, 631, 389, 1730, 411, 631, 387, 1729, 413, 632, 387, 660,
                             383, 659, 409, 634, 385, 660, 384, 1730, 412, 632, 388, 657, 360, 683, 411, 632, 386, 659, 385, 659,
                             412, 628, 391, 656, 388, 656, 409, 633, 386, 659, 357, 689, 408, 632, 388, 659, 383, 656, 413, 631,
                             388, 658, 385, 682, 387, 633, 386, 1732, 412, 1703, 387, 1731, 410, 633, 386, 659, 386, 656, 414, 630,
                             388, 1754, 413, 605, 412, 1706, 411, 632, 387, 658, 385, 660, 410, 632, 385, 659, 385, 660, 411, 628,
                             389, 1730, 412, 632, 387, 658, 385, 659, 410, 632, 385, 660, 386, 658, 412, 1703, 386, 659, 385, 1731,
                             388, 656, 386, 657, 411, 1707, 386, };

AnalogIn g_ain_temperature(p16);
PwmOut g_pwmout(p21);

RemoteControllerHandler::RemoteControllerHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket)
{
    DBG("RemoteControllerHandler()\r\n");
}

RemoteControllerHandler::~RemoteControllerHandler()
{
    DBG("~RemoteControllerHandler()\r\n");
}
void RemoteControllerHandler::printString( const char* pszString )
{
    writeData( pszString, strlen(pszString) );
}

double GetTemperature()
{
    double dV = g_ain_temperature * 3.3;
    return dV * 100.0;
}

void RemoteControllerHandler::printHtml( int iSignalType = 0, int iIsCorrectPassCode = 0 )
{
    respHeaders()["Connection"] = "close";

    printString("<html>\n");
    printString("<head>\n");
    printString("<title>Net Remote Controller</title>\n");
    printString("</head>\n");
    printString("<body>\n");

    printString("<h1>Net Remote Controller</h1>\n");
    printString( "Temperature : " );
    char szTemperature[10];
    sprintf( szTemperature, "%4.1f", GetTemperature() );
    printString( szTemperature );
    printString( " [degree]\n" );

    printString("<hr>\n");

    if( 1 == iSignalType )
    {
        if( 0 == iIsCorrectPassCode )
        {
            printString("<p><font color=\"#ff0000\">PassCode is wrong.</font></p>\n");
        }
        else
        {
            printString("<p><font color=\"#008000\">ON signal was transmitted.</font></p>\n");
        }
    }
    else if( 2 == iSignalType )
    {
        if( 0 == iIsCorrectPassCode )
        {
            printString("<p><font color=\"#ff0000\">PassCode is wrong.</font></p>\n");
        }
        else
        {
            printString("<p><font color=\"#008000\">OFF signal was transmitted.</font></p>\n");
        }
    }
    else
    {
        printString("<p><font color=\"#0000ff\">Select the type of signal, enter the PassCode, please click the submit button</font></p>\n");
    }
    printString("<form method=\"post\" action=\"\">\n");
    printString("<h3>Type of signal</h3>\n");
    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");
    printString("<h3>PassCode</h3>\n");
    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");
    printString("<br>\n");
    
    printString("<input type=\"submit\" value=\"submit\">\n");
    printString("</form>\n");

    printString("<hr>\n");
    printString("</body>\n");
    printString("</html>\n");
}

void RemoteControllerHandler::doGet()
{
    DBG("doGet()\r\n");

    printHtml();
}

void analyzePostData( char* pszLine, int& riSignalType, int& riPassCode )
{
    riSignalType = 0;
    riPassCode = 0;
    char* pszToken = strtok(pszLine, DELIMITER);
    while(pszToken)
    {
        if( 12 == strlen(pszToken)
         && 0 == strncmp(pszToken, "signaltype", 10) )
        {   // signaltype=0/1/2
            if(      '0' == pszToken[11] ){ riSignalType = 0; }
            else if( '1' == pszToken[11] ){ riSignalType = 1; }
            else if( '2' == pszToken[11] ){ riSignalType = 2; }
        }
        else if( 6 == strlen(pszToken)
        && 0 == strncmp(pszToken, "pc", 2) )
        {   // pc?=on
            riPassCode |= (1 << (pszToken[2] - '0'));
        }
        pszToken = strtok(NULL, DELIMITER);
    }
}

void sendSignal( int iSignalType )
{
    g_pwmout.period_us( 26 );   // 38KHz => 1/38000[s] = 26.315 * 10 ^ 6 [s] = 26.315 [us]

    short* aHighLow = NULL;
    int iCountHighLow = 0;
    if( 1 == iSignalType )
    {
        aHighLow = ARRAY_HIGHLOW_ON;
        iCountHighLow = sizeof( ARRAY_HIGHLOW_ON ) / sizeof( ARRAY_HIGHLOW_ON[0] );
    }
    else if( 2 == iSignalType )
    {
        aHighLow = ARRAY_HIGHLOW_OFF;
        iCountHighLow = sizeof( ARRAY_HIGHLOW_OFF ) / sizeof( ARRAY_HIGHLOW_OFF[0] );
    }
    
    if( NULL == aHighLow )
    {
        return;
    }
    
    DBG( "CountHighLow = % d\r\n", iCountHighLow );
    for( int iIndexHighLow = 0; iIndexHighLow < iCountHighLow; iIndexHighLow++ )
    {
        g_pwmout.write( 0.5 * (1 - (iIndexHighLow % 2)) );    // iIndexHighLow : even number -> 0.5, uneven number -> 0
        wait_us( aHighLow[iIndexHighLow] );
    }
}

void RemoteControllerHandler::doPost()
{
    DBG("doPost()\r\n");

    int iCountData = dataLen();
    if( 0 == iCountData )
    {
            printHtml();
            return;
    }
    
    char* pszData = (char*) malloc( sizeof(char) * (iCountData + 1) );
    readData( pszData, iCountData );
    pszData[iCountData] = '\0';
    
    DBG( pszData );
 
    int iSignalType = 0;
    int iPassCode = 0;
    analyzePostData( pszData, iSignalType, iPassCode );

#ifdef CHECK_PASSCODE
    // Check the PassCode
    int iIsCorrectPassCode = 0;
    if( PASSCODE == iPassCode )
    {
        iIsCorrectPassCode = 1;
    }
    // Send Signal
    if( 1 == iIsCorrectPassCode )
    {
        sendSignal( iSignalType );
    }
#else
    int iIsCorrectPassCode = 1;
    sendSignal( iSignalType );
#endif

    printHtml( iSignalType, iIsCorrectPassCode );
}

void RemoteControllerHandler::doHead()
{
    DBG("doHead()\r\n");
}
  
void RemoteControllerHandler::onReadable() //Data has been read
{
    DBG("onReadable()\r\n");
}

void RemoteControllerHandler::onWriteable() //Data has been written & buf is free
{
    DBG("onWriteable()\r\n");
    close(); //Data written, we can close the connection
}

void RemoteControllerHandler::onClose() //Connection is closing
{
    DBG("onClose()\r\n");
}