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:
Tue Jul 29 23:01:55 2014 +0000
Revision:
0:427a14ebab60
Child:
2:3637af74f7f0
Initial working copy of HTTP-to-RS232 server for a Sharp Aquos TV

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davisw00 0:427a14ebab60 1 #include "AquosHTTP.h"
davisw00 0:427a14ebab60 2
davisw00 0:427a14ebab60 3
davisw00 0:427a14ebab60 4 AquosHTTP::AquosHTTP(DebugPort *dbg) {
davisw00 0:427a14ebab60 5 m_dbg = dbg;
davisw00 0:427a14ebab60 6 init();
davisw00 0:427a14ebab60 7 }
davisw00 0:427a14ebab60 8
davisw00 0:427a14ebab60 9 void AquosHTTP::arrayinit(char* ary) {
davisw00 0:427a14ebab60 10 memset(ary,0,sizeof(char)*BUF_SIZE);
davisw00 0:427a14ebab60 11 }
davisw00 0:427a14ebab60 12 void AquosHTTP::init() {
davisw00 0:427a14ebab60 13 arrayinit(m_buffer);
davisw00 0:427a14ebab60 14 arrayinit(m_response);
davisw00 0:427a14ebab60 15 }
davisw00 0:427a14ebab60 16
davisw00 0:427a14ebab60 17 AquosHTTP::~AquosHTTP() {
davisw00 0:427a14ebab60 18 m_eth.disconnect();
davisw00 0:427a14ebab60 19 }
davisw00 0:427a14ebab60 20
davisw00 0:427a14ebab60 21 AquosHTTP& AquosHTTP::init(const char* ipaddr, const char* netmask, const char* gateway) {
davisw00 0:427a14ebab60 22 int ret;
davisw00 0:427a14ebab60 23 init();
davisw00 0:427a14ebab60 24 ret = m_eth.init(ipaddr,netmask,gateway);
davisw00 0:427a14ebab60 25 if(ret<0) {
davisw00 0:427a14ebab60 26 m_dbg->send("EthernetInterface failed initialization",1);
davisw00 0:427a14ebab60 27 } else {
davisw00 0:427a14ebab60 28 m_dbg->send("EthernetInterface initialized: ");
davisw00 0:427a14ebab60 29 m_dbg->send(m_eth.getIPAddress());
davisw00 0:427a14ebab60 30 m_dbg->send("\n\r");
davisw00 0:427a14ebab60 31 }
davisw00 0:427a14ebab60 32
davisw00 0:427a14ebab60 33 wait(0.1);
davisw00 0:427a14ebab60 34 m_eth.connect(1000); //usually fails, so no throw
davisw00 0:427a14ebab60 35 wait(0.1);
davisw00 0:427a14ebab60 36 //m_server.set_blocking(true);
davisw00 0:427a14ebab60 37 ret = m_server.bind(80);
davisw00 0:427a14ebab60 38 if(ret<0) m_dbg->send("Server failed to bind",1);
davisw00 0:427a14ebab60 39 ret = m_server.listen(1);
davisw00 0:427a14ebab60 40 if(ret<0) m_dbg->send("Server failed to listen",1);
davisw00 0:427a14ebab60 41
davisw00 0:427a14ebab60 42 return *this;
davisw00 0:427a14ebab60 43 }
davisw00 0:427a14ebab60 44
davisw00 0:427a14ebab60 45
davisw00 0:427a14ebab60 46 AquosHTTP& AquosHTTP::waitForRequest() {
davisw00 0:427a14ebab60 47 int n;
davisw00 0:427a14ebab60 48 int ret;
davisw00 0:427a14ebab60 49 ret = m_server.accept(m_client);
davisw00 0:427a14ebab60 50 if(ret<0) {
davisw00 0:427a14ebab60 51 m_dbg->send("Error accepting client request");
davisw00 0:427a14ebab60 52 return *this;
davisw00 0:427a14ebab60 53 }
davisw00 0:427a14ebab60 54 n = m_client.receive(m_buffer,BUF_SIZE-1);
davisw00 0:427a14ebab60 55 if(n>=BUF_SIZE-1) {
davisw00 0:427a14ebab60 56 m_dbg->send("Request exceeds buffer ... ignoring");
davisw00 0:427a14ebab60 57 return *this;
davisw00 0:427a14ebab60 58 }
davisw00 0:427a14ebab60 59 m_buffer[BUF_SIZE-1] = '\0';
davisw00 0:427a14ebab60 60 m_buffer[n] = '\0';
davisw00 0:427a14ebab60 61 return *this;
davisw00 0:427a14ebab60 62 }
davisw00 0:427a14ebab60 63
davisw00 0:427a14ebab60 64 const char* AquosHTTP::getRequest() const {return m_buffer; }
davisw00 0:427a14ebab60 65
davisw00 0:427a14ebab60 66 int AquosHTTP::setResponse(const char* msg) {
davisw00 0:427a14ebab60 67 snprintf(m_response,BUF_SIZE-1,"<html><body>%s for:<br/><pre>%s</pre></body></html>\n",msg,m_buffer);
davisw00 0:427a14ebab60 68 return strlen(m_response);
davisw00 0:427a14ebab60 69 }
davisw00 0:427a14ebab60 70
davisw00 0:427a14ebab60 71 AquosHTTP& AquosHTTP::returnSuccess() {
davisw00 0:427a14ebab60 72 int msglen = setResponse("SUCCESS!");
davisw00 0:427a14ebab60 73 char* buf = new char[msglen + 256];
davisw00 0:427a14ebab60 74 snprintf(buf,msglen+255,"HTTP/1.1 200 OK\r\nContent-Length: %i\r\nConnection: close\r\nContent-type: text/html\r\n\r\n%s",msglen,m_response);
davisw00 0:427a14ebab60 75 m_client.send(buf,strlen(buf));
davisw00 0:427a14ebab60 76 m_client.close();
davisw00 0:427a14ebab60 77 delete [] buf;
davisw00 0:427a14ebab60 78 return *this;
davisw00 0:427a14ebab60 79 }
davisw00 0:427a14ebab60 80
davisw00 0:427a14ebab60 81 AquosHTTP& AquosHTTP::returnFailure() {
davisw00 0:427a14ebab60 82 int msglen = setResponse("FAILED!");
davisw00 0:427a14ebab60 83 char* buf = new char[msglen + 256];
davisw00 0:427a14ebab60 84 snprintf(buf,msglen+255,"HTTP/1.1 501 Not Implemented\r\nContent-Length: %i\r\nConnection: close\r\nContent-type: text/html\r\n\r\n%s",msglen,m_response);
davisw00 0:427a14ebab60 85 m_client.send(buf,strlen(buf));
davisw00 0:427a14ebab60 86 m_client.close();
davisw00 0:427a14ebab60 87 delete [] buf;
davisw00 0:427a14ebab60 88 return *this;
davisw00 0:427a14ebab60 89 }