TCP Server that can be used as a debug interface
Fork of TCPDebug by
Debug.cpp@0:c2bfbcc99b65, 2013-06-13 (annotated)
- Committer:
- lemniskata
- Date:
- Thu Jun 13 20:01:01 2013 +0000
- Revision:
- 0:c2bfbcc99b65
V1
Who changed what in which revision?
User | Revision | Line number | New 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 | } |