This application translates HTTP GET requests into the proper RS232 commands to control a Sharp Aquos TV
Dependencies: EthernetInterface mbed-rtos mbed
Diff: AquosTV.cpp
- Revision:
- 2:3637af74f7f0
- Parent:
- 1:64bfc05e387d
--- a/AquosTV.cpp Tue Jul 29 23:10:14 2014 +0000 +++ b/AquosTV.cpp Sat Sep 06 23:47:21 2014 +0000 @@ -13,21 +13,57 @@ 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(httpcmd[0] == 'G' && httpcmd[1] == 'E' && httpcmd[2]=='T' && httpcmd[3]==' ' && httpcmd[4]=='/') { + 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 } @@ -38,44 +74,97 @@ if(strncmp(request,"poweron",BUF_SIZE-1)==0) { strncpy(rs232cmd,"POWR1 \r",BUF_SIZE-1); - ret = true; + ret = this->sendcmd(rs232cmd); } else if(strncmp(request,"poweroff",BUF_SIZE-1)==0) { strncpy(rs232cmd,"POWR0 \r",BUF_SIZE-1); - ret = true; + ret = this->sendcmd(rs232cmd); } else if(strncmp(request,"selecttv",BUF_SIZE-1)==0) { strncpy(rs232cmd,"ITVD0 \r",BUF_SIZE-1); - ret = true; + ret = this->sendcmd(rs232cmd); } else if(strncmp(request,"input",5)==0) { - i=request[5]-'0'; + p=&(request[5]); + i=getNumber(&p); if(i>0 && i<10) { - snprintf(rs232cmd,BUF_SIZE-1,"IAVD%i \r",i); - ret = true; + snprintf(rs232cmd,BUF_SIZE-1,"IAVD%i \r",i); + ret = this->sendcmd(rs232cmd); } } else if(strncmp(request,"volume",6)==0) { - i=request[6]-'0'; - j=request[7]-'0'; - if(i>=0&&i<10) { - if(j>=0&&j<10) { - i = 10*i + j; - } + p=&(request[6]); + i=getNumber(&p); + if(i>=0 && i<100) { snprintf(rs232cmd,BUF_SIZE-1,"VOLM%02i \r",i); - ret = true; + 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; + } + } - if(ret) { - m_dbg->send("\n\rCommand Interpreted: "); - m_dbg->send(rs232cmd); - m_dbg->send("\n"); - m_tv->printf(rs232cmd); - } else { - m_dbg->send("Unknown Command Request\n\r"); + m_dbg->send("Improper Command Request\n\r"); + ret = false; } return ret; }