This application translates HTTP GET requests into the proper RS232 commands to control a Sharp Aquos TV
Dependencies: EthernetInterface mbed-rtos mbed
AquosTV.cpp@2:3637af74f7f0, 2014-09-06 (annotated)
- 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?
User | Revision | Line number | New 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; } |