TCP Server that can be used as a debug interface

Dependents:   ThreadServer

Fork of TCPDebug by Ivan Shindev

Committer:
lemniskata
Date:
Thu Jun 13 20:01:01 2013 +0000
Revision:
0:c2bfbcc99b65
V1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lemniskata 0:c2bfbcc99b65 1 /*
lemniskata 0:c2bfbcc99b65 2 ** File name: Debug.cpp
lemniskata 0:c2bfbcc99b65 3 ** Descriptions: TCP Server that sends debug messages to a connected client
lemniskata 0:c2bfbcc99b65 4 **
lemniskata 0:c2bfbcc99b65 5 **------------------------------------------------------------------------------------------------------
lemniskata 0:c2bfbcc99b65 6 ** Created by: Ivan Shindev
lemniskata 0:c2bfbcc99b65 7 ** Created date: 06/11/2013
lemniskata 0:c2bfbcc99b65 8 ** Version: 1.0
lemniskata 0:c2bfbcc99b65 9 ** Descriptions: The original version
lemniskata 0:c2bfbcc99b65 10 **
lemniskata 0:c2bfbcc99b65 11 **------------------------------------------------------------------------------------------------------
lemniskata 0:c2bfbcc99b65 12 ** Modified by:
lemniskata 0:c2bfbcc99b65 13 ** Modified date:
lemniskata 0:c2bfbcc99b65 14 ** Version:
lemniskata 0:c2bfbcc99b65 15 ** Descriptions:
lemniskata 0:c2bfbcc99b65 16 ********************************************************************************************************/
lemniskata 0:c2bfbcc99b65 17 /* How to use the library
lemniskata 0:c2bfbcc99b65 18 Include Debug.h in any file that sends debugging messages
lemniskata 0:c2bfbcc99b65 19
lemniskata 0:c2bfbcc99b65 20 Start the debugging server in the main
lemniskata 0:c2bfbcc99b65 21 initDebug(); //initialize Debug server
lemniskata 0:c2bfbcc99b65 22 startDebug(debug_port); //start the Debug server
lemniskata 0:c2bfbcc99b65 23 while(!isDebugConnected()) //do nothing until a debug client is connected (optional)
lemniskata 0:c2bfbcc99b65 24 {
lemniskata 0:c2bfbcc99b65 25
lemniskata 0:c2bfbcc99b65 26 }
lemniskata 0:c2bfbcc99b65 27
lemniskata 0:c2bfbcc99b65 28 Send a debugging message to the connected client using sendDebugMessage(char *message)
lemniskata 0:c2bfbcc99b65 29 Example: sendDebugMessage("Initialization failed");
lemniskata 0:c2bfbcc99b65 30
lemniskata 0:c2bfbcc99b65 31
lemniskata 0:c2bfbcc99b65 32 */
lemniskata 0:c2bfbcc99b65 33
lemniskata 0:c2bfbcc99b65 34 #include "Debug.h"
lemniskata 0:c2bfbcc99b65 35 #include "mbed.h"
lemniskata 0:c2bfbcc99b65 36
lemniskata 0:c2bfbcc99b65 37 int _debug_socket;
lemniskata 0:c2bfbcc99b65 38 int _debug_connected;
lemniskata 0:c2bfbcc99b65 39 Mutex debug_mutex;
lemniskata 0:c2bfbcc99b65 40 /* sendDebugMessage(char *message) sends a message to the connected client
lemniskata 0:c2bfbcc99b65 41
lemniskata 0:c2bfbcc99b65 42 */
lemniskata 0:c2bfbcc99b65 43 void sendDebugMessage(char *message)
lemniskata 0:c2bfbcc99b65 44 {
lemniskata 0:c2bfbcc99b65 45
lemniskata 0:c2bfbcc99b65 46 lwip_send(_debug_socket ,message,strlen(message)*sizeof(char),0);
lemniskata 0:c2bfbcc99b65 47 }
lemniskata 0:c2bfbcc99b65 48
lemniskata 0:c2bfbcc99b65 49 /* connectDebug(void const *port) is the main Debug server Thread
lemniskata 0:c2bfbcc99b65 50
lemniskata 0:c2bfbcc99b65 51 */
lemniskata 0:c2bfbcc99b65 52 void connectDebug(void const *port)
lemniskata 0:c2bfbcc99b65 53 {
lemniskata 0:c2bfbcc99b65 54 int _port=(int) port;
lemniskata 0:c2bfbcc99b65 55 int socket_server;
lemniskata 0:c2bfbcc99b65 56 struct sockaddr_in localHost;
lemniskata 0:c2bfbcc99b65 57 memset(&localHost, 0, sizeof(localHost));
lemniskata 0:c2bfbcc99b65 58
lemniskata 0:c2bfbcc99b65 59 if( (socket_server= lwip_socket(AF_INET, SOCK_STREAM, 0))<0)
lemniskata 0:c2bfbcc99b65 60 {
lemniskata 0:c2bfbcc99b65 61 // return -1;
lemniskata 0:c2bfbcc99b65 62 }
lemniskata 0:c2bfbcc99b65 63 localHost.sin_family = AF_INET;
lemniskata 0:c2bfbcc99b65 64 localHost.sin_port = htons(_port); //port
lemniskata 0:c2bfbcc99b65 65 localHost.sin_addr.s_addr = INADDR_ANY; //localhost address
lemniskata 0:c2bfbcc99b65 66
lemniskata 0:c2bfbcc99b65 67 if (lwip_bind(socket_server, (const struct sockaddr *) &localHost, sizeof(localHost)) < 0) {
lemniskata 0:c2bfbcc99b65 68
lemniskata 0:c2bfbcc99b65 69 // return -1;
lemniskata 0:c2bfbcc99b65 70 }
lemniskata 0:c2bfbcc99b65 71 if (lwip_listen(socket_server,5)<0)
lemniskata 0:c2bfbcc99b65 72 {
lemniskata 0:c2bfbcc99b65 73
lemniskata 0:c2bfbcc99b65 74 perror("listen");
lemniskata 0:c2bfbcc99b65 75 exit(EXIT_FAILURE);
lemniskata 0:c2bfbcc99b65 76 }
lemniskata 0:c2bfbcc99b65 77
lemniskata 0:c2bfbcc99b65 78 socklen_t newSockRemoteHostLen = sizeof(localHost);
lemniskata 0:c2bfbcc99b65 79
lemniskata 0:c2bfbcc99b65 80 while(1)
lemniskata 0:c2bfbcc99b65 81 {
lemniskata 0:c2bfbcc99b65 82 int nn = lwip_accept(socket_server, (struct sockaddr*) &localHost, &newSockRemoteHostLen);
lemniskata 0:c2bfbcc99b65 83 debug_mutex.lock();
lemniskata 0:c2bfbcc99b65 84 _debug_connected=1;
lemniskata 0:c2bfbcc99b65 85 debug_mutex.unlock();
lemniskata 0:c2bfbcc99b65 86 _debug_socket=nn;
lemniskata 0:c2bfbcc99b65 87 sendDebugMessage("You are now connected to Debug Server");
lemniskata 0:c2bfbcc99b65 88
lemniskata 0:c2bfbcc99b65 89
lemniskata 0:c2bfbcc99b65 90
lemniskata 0:c2bfbcc99b65 91 }
lemniskata 0:c2bfbcc99b65 92 }
lemniskata 0:c2bfbcc99b65 93
lemniskata 0:c2bfbcc99b65 94 osThreadDef(connectDebug, osPriorityNormal, DEFAULT_STACK_SIZE);
lemniskata 0:c2bfbcc99b65 95
lemniskata 0:c2bfbcc99b65 96 /* startDebug(int port) starts the debugging server in a new Thread
lemniskata 0:c2bfbcc99b65 97
lemniskata 0:c2bfbcc99b65 98 */
lemniskata 0:c2bfbcc99b65 99 void startDebug(int port)
lemniskata 0:c2bfbcc99b65 100 {
lemniskata 0:c2bfbcc99b65 101 osThreadCreate(osThread(connectDebug), (void *) port);
lemniskata 0:c2bfbcc99b65 102 }
lemniskata 0:c2bfbcc99b65 103
lemniskata 0:c2bfbcc99b65 104
lemniskata 0:c2bfbcc99b65 105
lemniskata 0:c2bfbcc99b65 106 /* initDebug() initializes the _debug_connected variable
lemniskata 0:c2bfbcc99b65 107
lemniskata 0:c2bfbcc99b65 108 */
lemniskata 0:c2bfbcc99b65 109 void initDebug()
lemniskata 0:c2bfbcc99b65 110 {
lemniskata 0:c2bfbcc99b65 111 debug_mutex.lock();
lemniskata 0:c2bfbcc99b65 112 _debug_connected=0;
lemniskata 0:c2bfbcc99b65 113 debug_mutex.unlock();
lemniskata 0:c2bfbcc99b65 114 }
lemniskata 0:c2bfbcc99b65 115
lemniskata 0:c2bfbcc99b65 116 /* isDebugConnected() returns 1 if a debug client is connected
lemniskata 0:c2bfbcc99b65 117
lemniskata 0:c2bfbcc99b65 118 */
lemniskata 0:c2bfbcc99b65 119 int isDebugConnected()
lemniskata 0:c2bfbcc99b65 120 {
lemniskata 0:c2bfbcc99b65 121 int temp;
lemniskata 0:c2bfbcc99b65 122 debug_mutex.lock();
lemniskata 0:c2bfbcc99b65 123 temp=_debug_connected;
lemniskata 0:c2bfbcc99b65 124 debug_mutex.unlock();
lemniskata 0:c2bfbcc99b65 125 return temp;
lemniskata 0:c2bfbcc99b65 126 }