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

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
davisw00
Date:
Sat Sep 06 23:47:21 2014 +0000
Revision:
2:3637af74f7f0
Parent:
1:64bfc05e387d
Implemented Channel commands.  Wait for response is not working; therefore commands are followed by a 50ms wait

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davisw00 0:427a14ebab60 1 #include "AquosTV.h"
davisw00 0:427a14ebab60 2
davisw00 0:427a14ebab60 3 AquosTV::AquosTV(DebugPort* dbg) {
davisw00 0:427a14ebab60 4 m_dbg = dbg;
davisw00 0:427a14ebab60 5 init();
davisw00 0:427a14ebab60 6 }
davisw00 0:427a14ebab60 7
davisw00 0:427a14ebab60 8 AquosTV::~AquosTV() {
davisw00 0:427a14ebab60 9 delete m_tv;
davisw00 0:427a14ebab60 10 }
davisw00 0:427a14ebab60 11
davisw00 0:427a14ebab60 12 void AquosTV::init() {
davisw00 0:427a14ebab60 13 m_tv = new Serial(PTC17,PTC16);
davisw00 0:427a14ebab60 14 m_tv->baud(9600);
davisw00 0:427a14ebab60 15 m_tv->format(8,SerialBase::None,1);
davisw00 2:3637af74f7f0 16 //m_tv->set_flow_control(SerialBase::Disabled);
davisw00 0:427a14ebab60 17 memset(httpcmd,0,sizeof(char)*BUF_SIZE);
davisw00 0:427a14ebab60 18 memset(rs232cmd,0,sizeof(char)*BUF_SIZE);
davisw00 1:64bfc05e387d 19 m_tv->printf("RSPW1 \r"); //--- enable rs232 commands for power on/off
davisw00 0:427a14ebab60 20 }
davisw00 2:3637af74f7f0 21
davisw00 2:3637af74f7f0 22 bool AquosTV::sendcmd(const char* cmd) {
davisw00 2:3637af74f7f0 23 bool ret=false;
davisw00 2:3637af74f7f0 24 char status[5];
davisw00 2:3637af74f7f0 25 int i = 0;
davisw00 2:3637af74f7f0 26 m_dbg->send("\n\rSending TV Command: ");
davisw00 2:3637af74f7f0 27 m_dbg->send(cmd);
davisw00 2:3637af74f7f0 28 m_dbg->send("\n");
davisw00 2:3637af74f7f0 29 m_tv->printf(cmd);
davisw00 2:3637af74f7f0 30 wait(0.05);
davisw00 2:3637af74f7f0 31
davisw00 2:3637af74f7f0 32 ret=true;
davisw00 2:3637af74f7f0 33 /*
davisw00 2:3637af74f7f0 34 for(i=0;i<5;++i) status[i]='\0';
davisw00 2:3637af74f7f0 35 for(i=0; !ret && i<5; ++i) {
davisw00 2:3637af74f7f0 36 status[i] = m_tv->getc();
davisw00 2:3637af74f7f0 37 ret = (status[i]=='\r');
davisw00 2:3637af74f7f0 38 }
davisw00 2:3637af74f7f0 39 ret = (strncmp(status,"OK",2)==0);
davisw00 2:3637af74f7f0 40 */
davisw00 2:3637af74f7f0 41 if(ret) m_dbg->send("Command Received 'OK' Status\n\r");
davisw00 2:3637af74f7f0 42 else m_dbg->send("Command did NOT receive 'OK' Status -- Error condition\n\r");
davisw00 2:3637af74f7f0 43 return ret;
davisw00 2:3637af74f7f0 44 }
davisw00 2:3637af74f7f0 45
davisw00 2:3637af74f7f0 46 int AquosTV::getNumber(char** input, const char eol) {
davisw00 2:3637af74f7f0 47 int ret=0;
davisw00 2:3637af74f7f0 48 for(;**input!=eol;++(*input)) {
davisw00 2:3637af74f7f0 49 ret*=10;
davisw00 2:3637af74f7f0 50 ret+=**input-'0';
davisw00 2:3637af74f7f0 51 }
davisw00 2:3637af74f7f0 52 ++(*input);
davisw00 2:3637af74f7f0 53 return ret;
davisw00 2:3637af74f7f0 54 }
davisw00 0:427a14ebab60 55
davisw00 0:427a14ebab60 56 bool AquosTV::processCommand(const char* httpin) {
davisw00 0:427a14ebab60 57 int i;
davisw00 0:427a14ebab60 58 int j;
davisw00 2:3637af74f7f0 59 char* p;
davisw00 0:427a14ebab60 60 bool ret=false;
davisw00 0:427a14ebab60 61
davisw00 0:427a14ebab60 62 char request[BUF_SIZE];
davisw00 0:427a14ebab60 63 strncpy(httpcmd,httpin,BUF_SIZE-1);
davisw00 0:427a14ebab60 64 httpcmd[AQUOSBUF-1] = '\0';
davisw00 0:427a14ebab60 65 rs232cmd[0]='\0';
davisw00 2:3637af74f7f0 66 if(strncmp(httpcmd,"GET /",5)==0) {
davisw00 0:427a14ebab60 67 for(i=5;httpcmd[i]!=' '&&httpcmd[i]!='\0'&&i<AQUOSBUF-1;++i) {
davisw00 0:427a14ebab60 68 request[i-5]=(httpcmd[i] | 0x20); //make lower case
davisw00 0:427a14ebab60 69 }
davisw00 0:427a14ebab60 70 request[i-5]='\0';
davisw00 0:427a14ebab60 71 m_dbg->send("\n\rReceived Command Request: ");
davisw00 0:427a14ebab60 72 m_dbg->send(request);
davisw00 0:427a14ebab60 73 m_dbg->send("\n\r");
davisw00 0:427a14ebab60 74
davisw00 0:427a14ebab60 75 if(strncmp(request,"poweron",BUF_SIZE-1)==0) {
davisw00 0:427a14ebab60 76 strncpy(rs232cmd,"POWR1 \r",BUF_SIZE-1);
davisw00 2:3637af74f7f0 77 ret = this->sendcmd(rs232cmd);
davisw00 0:427a14ebab60 78 }
davisw00 0:427a14ebab60 79 else if(strncmp(request,"poweroff",BUF_SIZE-1)==0) {
davisw00 0:427a14ebab60 80 strncpy(rs232cmd,"POWR0 \r",BUF_SIZE-1);
davisw00 2:3637af74f7f0 81 ret = this->sendcmd(rs232cmd);
davisw00 0:427a14ebab60 82 }
davisw00 0:427a14ebab60 83 else if(strncmp(request,"selecttv",BUF_SIZE-1)==0) {
davisw00 0:427a14ebab60 84 strncpy(rs232cmd,"ITVD0 \r",BUF_SIZE-1);
davisw00 2:3637af74f7f0 85 ret = this->sendcmd(rs232cmd);
davisw00 0:427a14ebab60 86 }
davisw00 0:427a14ebab60 87 else if(strncmp(request,"input",5)==0) {
davisw00 2:3637af74f7f0 88 p=&(request[5]);
davisw00 2:3637af74f7f0 89 i=getNumber(&p);
davisw00 0:427a14ebab60 90 if(i>0 && i<10) {
davisw00 2:3637af74f7f0 91 snprintf(rs232cmd,BUF_SIZE-1,"IAVD%i \r",i);
davisw00 2:3637af74f7f0 92 ret = this->sendcmd(rs232cmd);
davisw00 0:427a14ebab60 93 }
davisw00 0:427a14ebab60 94 }
davisw00 0:427a14ebab60 95 else if(strncmp(request,"volume",6)==0) {
davisw00 2:3637af74f7f0 96 p=&(request[6]);
davisw00 2:3637af74f7f0 97 i=getNumber(&p);
davisw00 2:3637af74f7f0 98 if(i>=0 && i<100) {
davisw00 0:427a14ebab60 99 snprintf(rs232cmd,BUF_SIZE-1,"VOLM%02i \r",i);
davisw00 2:3637af74f7f0 100 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 101 }
davisw00 2:3637af74f7f0 102 }
davisw00 2:3637af74f7f0 103 else if(strncmp(request,"chanalog",8)==0) {
davisw00 2:3637af74f7f0 104 p=&(request[8]);
davisw00 2:3637af74f7f0 105 i=getNumber(&p);
davisw00 2:3637af74f7f0 106 if(i>0 && i<136) {
davisw00 2:3637af74f7f0 107 snprintf(rs232cmd,BUF_SIZE-1,"DCCH%03i \r",i);
davisw00 2:3637af74f7f0 108 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 109 }
davisw00 2:3637af74f7f0 110 }
davisw00 2:3637af74f7f0 111
davisw00 2:3637af74f7f0 112 else if(strncmp(request,"chdigiair",9)==0) {
davisw00 2:3637af74f7f0 113 p=&(request[9]);
davisw00 2:3637af74f7f0 114 i=getNumber(&p);
davisw00 2:3637af74f7f0 115 if(i>0 && i<10000) {
davisw00 2:3637af74f7f0 116 snprintf(rs232cmd,BUF_SIZE-1,"DA2P%04i\r",i);
davisw00 2:3637af74f7f0 117 ret = this->sendcmd(rs232cmd);
davisw00 0:427a14ebab60 118 }
davisw00 0:427a14ebab60 119 }
davisw00 2:3637af74f7f0 120 else if(strncmp(request,"chdigicable",11)==0) {
davisw00 2:3637af74f7f0 121 p=&(request[11]);
davisw00 2:3637af74f7f0 122 i=getNumber(&p,'.');
davisw00 2:3637af74f7f0 123 if(i>0 && i<1000) {
davisw00 2:3637af74f7f0 124 j=getNumber(&p);
davisw00 2:3637af74f7f0 125 if(j>=0 && j<1000) {
davisw00 2:3637af74f7f0 126 snprintf(rs232cmd,BUF_SIZE-1,"DC2U%03i \r",i);
davisw00 2:3637af74f7f0 127 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 128 wait(0.1);
davisw00 2:3637af74f7f0 129 snprintf(rs232cmd,BUF_SIZE-1,"DC2L%03i \r",j);
davisw00 2:3637af74f7f0 130 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 131 }
davisw00 2:3637af74f7f0 132 }
davisw00 2:3637af74f7f0 133 }
davisw00 2:3637af74f7f0 134 else if(strncmp(request,"chdigi2cable",12)==0) {
davisw00 2:3637af74f7f0 135 p=&(request[12]);
davisw00 2:3637af74f7f0 136 i=getNumber(&p);
davisw00 2:3637af74f7f0 137 if(i>0 && i<=63839999) {
davisw00 2:3637af74f7f0 138 j=i%10000;
davisw00 2:3637af74f7f0 139 i-=j;
davisw00 2:3637af74f7f0 140 i/=10000;
davisw00 2:3637af74f7f0 141 snprintf(rs232cmd,BUF_SIZE-1,"DC10%04i\r",j);
davisw00 2:3637af74f7f0 142 ret = this
davisw00 2:3637af74f7f0 143 ->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 144 wait(0.1);
davisw00 2:3637af74f7f0 145 snprintf(rs232cmd,BUF_SIZE-1,"DC11%04i\r",i);
davisw00 2:3637af74f7f0 146 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 147 }
davisw00 2:3637af74f7f0 148 }
davisw00 2:3637af74f7f0 149 else if(strncmp(request,"chup",4)==0) {
davisw00 2:3637af74f7f0 150 snprintf(rs232cmd,BUF_SIZE-1,"CHUP1 \r");
davisw00 2:3637af74f7f0 151 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 152 }
davisw00 2:3637af74f7f0 153 else if(strncmp(request,"chdw",4)==0) {
davisw00 2:3637af74f7f0 154 snprintf(rs232cmd,BUF_SIZE-1,"CHDW1 \r");
davisw00 2:3637af74f7f0 155 ret = this->sendcmd(rs232cmd);
davisw00 2:3637af74f7f0 156 }
davisw00 2:3637af74f7f0 157
davisw00 2:3637af74f7f0 158 else {
davisw00 2:3637af74f7f0 159 m_dbg->send("Unknown Command Request\n\r");
davisw00 2:3637af74f7f0 160 ret = false;
davisw00 2:3637af74f7f0 161 }
davisw00 2:3637af74f7f0 162
davisw00 0:427a14ebab60 163 }
davisw00 0:427a14ebab60 164
davisw00 0:427a14ebab60 165 else {
davisw00 2:3637af74f7f0 166 m_dbg->send("Improper Command Request\n\r");
davisw00 2:3637af74f7f0 167 ret = false;
davisw00 0:427a14ebab60 168 }
davisw00 0:427a14ebab60 169 return ret;
davisw00 0:427a14ebab60 170 }
davisw00 0:427a14ebab60 171
davisw00 0:427a14ebab60 172 const char* AquosTV::tvcmd() { return rs232cmd; }
davisw00 0:427a14ebab60 173 const char* AquosTV::http() { return httpcmd; }