This application translates HTTP GET requests into the proper RS232 commands to control a Sharp Aquos TV

Dependencies:   EthernetInterface mbed-rtos mbed

AquosTV.cpp

Committer:
davisw00
Date:
2014-09-06
Revision:
2:3637af74f7f0
Parent:
1:64bfc05e387d

File content as of revision 2:3637af74f7f0:

#include "AquosTV.h"

AquosTV::AquosTV(DebugPort* dbg) {
    m_dbg = dbg;
    init();
}

AquosTV::~AquosTV() {
    delete m_tv;
}

void AquosTV::init() {
    m_tv = new Serial(PTC17,PTC16);
    m_tv->baud(9600);
    m_tv->format(8,SerialBase::None,1);
    //m_tv->set_flow_control(SerialBase::Disabled);
    memset(httpcmd,0,sizeof(char)*BUF_SIZE);
    memset(rs232cmd,0,sizeof(char)*BUF_SIZE);
    m_tv->printf("RSPW1   \r");  //--- enable rs232 commands for power on/off
}

bool AquosTV::sendcmd(const char* cmd) {
    bool ret=false;
    char status[5];
    int i = 0;
    m_dbg->send("\n\rSending TV Command:  ");
    m_dbg->send(cmd);
    m_dbg->send("\n");
    m_tv->printf(cmd);
    wait(0.05);
    
    ret=true;
    /*
    for(i=0;i<5;++i) status[i]='\0';
    for(i=0; !ret && i<5; ++i) {
        status[i] = m_tv->getc();
        ret = (status[i]=='\r');
    }
    ret = (strncmp(status,"OK",2)==0);
    */
    if(ret) m_dbg->send("Command Received 'OK' Status\n\r");
    else m_dbg->send("Command did NOT receive 'OK' Status -- Error condition\n\r");
    return ret;
}

int AquosTV::getNumber(char** input, const char eol) {
    int ret=0;
    for(;**input!=eol;++(*input)) {
        ret*=10;
        ret+=**input-'0';
    }
    ++(*input);
    return ret;
}
        
bool AquosTV::processCommand(const char* httpin) {
    int i;
    int j;
    char* p;
    bool ret=false;
    
    char request[BUF_SIZE];
    strncpy(httpcmd,httpin,BUF_SIZE-1);
    httpcmd[AQUOSBUF-1] = '\0';
    rs232cmd[0]='\0';
    if(strncmp(httpcmd,"GET /",5)==0) {
        for(i=5;httpcmd[i]!=' '&&httpcmd[i]!='\0'&&i<AQUOSBUF-1;++i) {
            request[i-5]=(httpcmd[i] | 0x20);  //make lower case
        }
        request[i-5]='\0';
        m_dbg->send("\n\rReceived Command Request:  ");
        m_dbg->send(request);
        m_dbg->send("\n\r");
            
        if(strncmp(request,"poweron",BUF_SIZE-1)==0) {
            strncpy(rs232cmd,"POWR1   \r",BUF_SIZE-1);
            ret = this->sendcmd(rs232cmd);
        }
        else if(strncmp(request,"poweroff",BUF_SIZE-1)==0) {
            strncpy(rs232cmd,"POWR0   \r",BUF_SIZE-1);
            ret = this->sendcmd(rs232cmd);
        }
        else if(strncmp(request,"selecttv",BUF_SIZE-1)==0) {
            strncpy(rs232cmd,"ITVD0   \r",BUF_SIZE-1);
            ret = this->sendcmd(rs232cmd);
        }
        else if(strncmp(request,"input",5)==0) {
            p=&(request[5]);
            i=getNumber(&p);
            if(i>0 && i<10) {
                snprintf(rs232cmd,BUF_SIZE-1,"IAVD%i   \r",i);
                ret = this->sendcmd(rs232cmd);
            }
        }
        else if(strncmp(request,"volume",6)==0) {
            p=&(request[6]);
            i=getNumber(&p);
            if(i>=0 && i<100) {
                snprintf(rs232cmd,BUF_SIZE-1,"VOLM%02i  \r",i);
                ret = this->sendcmd(rs232cmd);
            }
        }
        else if(strncmp(request,"chanalog",8)==0) {
            p=&(request[8]);
            i=getNumber(&p);
            if(i>0 && i<136) {
                snprintf(rs232cmd,BUF_SIZE-1,"DCCH%03i \r",i);
                ret = this->sendcmd(rs232cmd);
            }
        }
        
        else if(strncmp(request,"chdigiair",9)==0) {
            p=&(request[9]);
            i=getNumber(&p);
            if(i>0 && i<10000) {
                snprintf(rs232cmd,BUF_SIZE-1,"DA2P%04i\r",i);
                ret = this->sendcmd(rs232cmd);
            }
        }
        else if(strncmp(request,"chdigicable",11)==0) {
            p=&(request[11]);
            i=getNumber(&p,'.');
            if(i>0 && i<1000) {
                j=getNumber(&p);
                if(j>=0 && j<1000) {
                    snprintf(rs232cmd,BUF_SIZE-1,"DC2U%03i \r",i);
                    ret = this->sendcmd(rs232cmd);
                    wait(0.1);
                    snprintf(rs232cmd,BUF_SIZE-1,"DC2L%03i \r",j);
                    ret = this->sendcmd(rs232cmd);
                }
            }
        }
        else if(strncmp(request,"chdigi2cable",12)==0) {
            p=&(request[12]);
            i=getNumber(&p);
            if(i>0 && i<=63839999) {
                j=i%10000;
                i-=j;
                i/=10000;
                snprintf(rs232cmd,BUF_SIZE-1,"DC10%04i\r",j);
                ret = this
                ->sendcmd(rs232cmd);
                wait(0.1);
                snprintf(rs232cmd,BUF_SIZE-1,"DC11%04i\r",i);
                ret = this->sendcmd(rs232cmd);
            }
        }    
        else if(strncmp(request,"chup",4)==0) {
            snprintf(rs232cmd,BUF_SIZE-1,"CHUP1   \r");
            ret = this->sendcmd(rs232cmd);
        }
        else if(strncmp(request,"chdw",4)==0) {
            snprintf(rs232cmd,BUF_SIZE-1,"CHDW1   \r");
            ret = this->sendcmd(rs232cmd);
        }
        
        else {
            m_dbg->send("Unknown Command Request\n\r");
            ret = false;
        }
        
    }
    
    else {
        m_dbg->send("Improper Command Request\n\r");
        ret = false;
    }
    return ret;
}
        
const char* AquosTV::tvcmd()  { return rs232cmd; }
const char* AquosTV::http() { return httpcmd; }