Derek Fukumori / Mbed 2 deprecated NetworkAnimator

Dependencies:   mbed

Committer:
dfukumori
Date:
Wed Jun 20 22:16:31 2012 +0000
Revision:
0:b6a536e40b5d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dfukumori 0:b6a536e40b5d 1 #include "TCPEchoHandler.h"
dfukumori 0:b6a536e40b5d 2
dfukumori 0:b6a536e40b5d 3
dfukumori 0:b6a536e40b5d 4 char* screenBufB;
dfukumori 0:b6a536e40b5d 5 int n = 0;
dfukumori 0:b6a536e40b5d 6 extern int bytes_received;
dfukumori 0:b6a536e40b5d 7 extern bool drawReadyFlag;
dfukumori 0:b6a536e40b5d 8 extern bool networkFlag;
dfukumori 0:b6a536e40b5d 9
dfukumori 0:b6a536e40b5d 10 #define SCRBUFSIZE 1440
dfukumori 0:b6a536e40b5d 11
dfukumori 0:b6a536e40b5d 12 // When the constructor's called, initialise the member variables
dfukumori 0:b6a536e40b5d 13 TCPEchoHandler::TCPEchoHandler(TCPSocket* tcpClientSocket, char* scrbuf)
dfukumori 0:b6a536e40b5d 14 : NetService()
dfukumori 0:b6a536e40b5d 15 , clientSocket(tcpClientSocket)
dfukumori 0:b6a536e40b5d 16 , closed(0)
dfukumori 0:b6a536e40b5d 17 , timeoutWatchdog() {
dfukumori 0:b6a536e40b5d 18 // Wire up the event handler on the client TCP socket
dfukumori 0:b6a536e40b5d 19 clientSocket->setOnEvent(this, &TCPEchoHandler::onTCPSocketEvent);
dfukumori 0:b6a536e40b5d 20 screenBufB = scrbuf;
dfukumori 0:b6a536e40b5d 21 }
dfukumori 0:b6a536e40b5d 22
dfukumori 0:b6a536e40b5d 23 TCPEchoHandler::~TCPEchoHandler() {
dfukumori 0:b6a536e40b5d 24 // Close the socket on destruction
dfukumori 0:b6a536e40b5d 25 close();
dfukumori 0:b6a536e40b5d 26 }
dfukumori 0:b6a536e40b5d 27
dfukumori 0:b6a536e40b5d 28 void TCPEchoHandler::onTCPSocketEvent(TCPSocketEvent e) {
dfukumori 0:b6a536e40b5d 29 //printf("socketevent %i\r\n", (int) e);
dfukumori 0:b6a536e40b5d 30 switch (e) {
dfukumori 0:b6a536e40b5d 31 // If the socket is readable, do stuff
dfukumori 0:b6a536e40b5d 32 case TCPSOCKET_READABLE: {
dfukumori 0:b6a536e40b5d 33 timeoutWatchdog.detach();
dfukumori 0:b6a536e40b5d 34 //printf("starting read\r\n");
dfukumori 0:b6a536e40b5d 35 int len = 0;
dfukumori 0:b6a536e40b5d 36 while (len = clientSocket->recv(&screenBufB[bytes_received], 1440 - bytes_received)) {
dfukumori 0:b6a536e40b5d 37 //printf("len: %d\r\n", len);
dfukumori 0:b6a536e40b5d 38 bytes_received += len;
dfukumori 0:b6a536e40b5d 39 }
dfukumori 0:b6a536e40b5d 40 //printf("received: %d\r\n", bytes_received);
dfukumori 0:b6a536e40b5d 41 if (bytes_received >= 1440) {
dfukumori 0:b6a536e40b5d 42 //printf("setting draw flag\r\n");
dfukumori 0:b6a536e40b5d 43 bytes_received = 0;
dfukumori 0:b6a536e40b5d 44 drawReadyFlag = true;
dfukumori 0:b6a536e40b5d 45 }
dfukumori 0:b6a536e40b5d 46
dfukumori 0:b6a536e40b5d 47 // Reset timeout countdown
dfukumori 0:b6a536e40b5d 48 //printf("setting timeout");
dfukumori 0:b6a536e40b5d 49 setTimeout(ECHO_TIMEOUT);
dfukumori 0:b6a536e40b5d 50 //close();
dfukumori 0:b6a536e40b5d 51 //printf("breaking");
dfukumori 0:b6a536e40b5d 52 break;
dfukumori 0:b6a536e40b5d 53 }
dfukumori 0:b6a536e40b5d 54 case TCPSOCKET_CONTIMEOUT:
dfukumori 0:b6a536e40b5d 55 case TCPSOCKET_CONRST:
dfukumori 0:b6a536e40b5d 56 case TCPSOCKET_CONABRT:
dfukumori 0:b6a536e40b5d 57 case TCPSOCKET_ERROR:
dfukumori 0:b6a536e40b5d 58 case TCPSOCKET_DISCONNECTED: {
dfukumori 0:b6a536e40b5d 59 // Close the socket on any terminal TCP event
dfukumori 0:b6a536e40b5d 60 printf("finished\r\n");
dfukumori 0:b6a536e40b5d 61 close();
dfukumori 0:b6a536e40b5d 62 break;
dfukumori 0:b6a536e40b5d 63 }
dfukumori 0:b6a536e40b5d 64 }
dfukumori 0:b6a536e40b5d 65 }
dfukumori 0:b6a536e40b5d 66
dfukumori 0:b6a536e40b5d 67 void TCPEchoHandler::close() {
dfukumori 0:b6a536e40b5d 68 // Prevent recursive calling or calling on an object being destructed by someone else
dfukumori 0:b6a536e40b5d 69 if ( closed )
dfukumori 0:b6a536e40b5d 70 return;
dfukumori 0:b6a536e40b5d 71 closed = 1;
dfukumori 0:b6a536e40b5d 72 timeoutWatchdog.detach();
dfukumori 0:b6a536e40b5d 73 if ( clientSocket ) {
dfukumori 0:b6a536e40b5d 74 clientSocket->resetOnEvent();
dfukumori 0:b6a536e40b5d 75 clientSocket->close();
dfukumori 0:b6a536e40b5d 76 delete clientSocket; //This fn might have been called by this socket (through an event), so DO NOT DESTROY IT HERE
dfukumori 0:b6a536e40b5d 77 }
dfukumori 0:b6a536e40b5d 78 // Flags this service as closed - will be destructed and deleted on
dfukumori 0:b6a536e40b5d 79 // the next call of NetService::poll() by Net::poll()
dfukumori 0:b6a536e40b5d 80 NetService::close();
dfukumori 0:b6a536e40b5d 81 }
dfukumori 0:b6a536e40b5d 82
dfukumori 0:b6a536e40b5d 83 void TCPEchoHandler::setTimeout(unsigned int timeout) {
dfukumori 0:b6a536e40b5d 84 // Attach our timeout handler to the timeout watchdog timer to close the socket if no activity
dfukumori 0:b6a536e40b5d 85 //timeoutWatchdog.attach_us<TCPEchoHandler>(this, &TCPEchoHandler::onTimeout, ECHO_TIMEOUT * 1000);
dfukumori 0:b6a536e40b5d 86 }
dfukumori 0:b6a536e40b5d 87
dfukumori 0:b6a536e40b5d 88 void TCPEchoHandler::onTimeout() {
dfukumori 0:b6a536e40b5d 89 // Nothing fancy, just close the socket and mark this class for destruction
dfukumori 0:b6a536e40b5d 90 close();
dfukumori 0:b6a536e40b5d 91 }