Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832_lcd EthernetInterface USBHost mbed-rtos mbed wave_player
tcp_task.cpp
00001 /* FILE: tcp_task.cpp by Chu Van Thiem 00002 */ 00003 #include "tcp_task.h" 00004 00005 TCPSocketConnection connect; 00006 Queue<char, QUEUE_MAX_LEN> tcp_queue; 00007 TCPSocketServer sock; 00008 char tcp_buf[256]; 00009 char data_frame[DATA_MAX_LEN]; 00010 char ack[ACK_MAX_LEN]; 00011 char fname[NAME_MAX_LEN]; 00012 const char ack_wdata[4] = {ACK_1, ACK_2, ACK_MBED, ACK_WDATA}; 00013 osEvent evt; 00014 extern volatile int cmd_en; 00015 extern volatile int play_en; 00016 00017 void tcp_thread(void const *args) 00018 { 00019 int n; 00020 00021 sock.bind(TCP_PORT); 00022 sock.listen(); 00023 while (1) 00024 { 00025 sock.accept(connect); 00026 printf("New connection\n"); 00027 // Handle incoming connection 00028 while (connect.is_connected()) 00029 { 00030 n = connect.receive(tcp_buf, 256); 00031 if (n < 0) // Error or disconnected 00032 { 00033 printf("Connection error\n"); 00034 break; 00035 } 00036 if (cmd_en) 00037 { 00038 for (int i = 0; i < n; i++) 00039 { 00040 tcp_queue.put(&tcp_buf[i]); 00041 } 00042 } 00043 } 00044 connect.close(); 00045 play_en = 1; 00046 } 00047 } 00048 00049 void cmd_thread(void const *args) 00050 { 00051 char *c; 00052 int cmd_state; 00053 char d; 00054 int i = 0; 00055 int idx = 0; 00056 char last_frame = 0; 00057 00058 int data_len = 0; 00059 int cnt = 0; 00060 int fname_len = 0; 00061 FILE *fp = NULL; 00062 usb *u = (usb *)args; 00063 00064 cmd_state = STATE_IDLE; 00065 00066 while (1) 00067 { 00068 if (cmd_en && connect.is_connected()) 00069 { 00070 while (connect.is_connected()) 00071 { 00072 evt = tcp_queue.get(); 00073 if (evt.status == osEventMessage) 00074 { 00075 c = (char *)evt.value.p; 00076 d = *c; 00077 switch (cmd_state) 00078 { 00079 case STATE_IDLE: 00080 if (d == CMD_1) 00081 { 00082 cmd_state = STATE_1; 00083 } 00084 break; 00085 00086 case STATE_1: 00087 if (d == CMD_2) 00088 { 00089 cmd_state = STATE_2; 00090 } 00091 else 00092 { 00093 cmd_state = STATE_IDLE; 00094 } 00095 break; 00096 00097 case STATE_2: 00098 if (d == CMD_PC) 00099 { 00100 cmd_state = STATE_CMD; 00101 } 00102 else 00103 { 00104 cmd_state = STATE_IDLE; 00105 } 00106 break; 00107 00108 case STATE_CMD: 00109 if (d == CMD_READ) 00110 { 00111 play_en = 0; 00112 // Read filenames 00113 u->listdir("/"); 00114 ack[0] = ACK_1; 00115 ack[1] = ACK_2; 00116 ack[2] = ACK_MBED; 00117 ack[3] = ACK_READ; 00118 ack[4] = (char)(u->filenames.size()); 00119 cnt = 5; 00120 for(vector<string>::iterator it = u->filenames.begin(); it < u->filenames.end(); it++) 00121 { 00122 //printf("%s\n", it->c_str()); 00123 for (i = 0; i < it->length(); i++) 00124 { 00125 ack[cnt] = (*it)[i]; 00126 cnt++; 00127 if (cnt == ACK_MAX_LEN) 00128 { 00129 // Send 00130 connect.send_all(ack, cnt); 00131 // Reset counter 00132 cnt = 0; 00133 } 00134 } 00135 ack[cnt] = SPR_CHAR; 00136 cnt++; 00137 if (cnt == ACK_MAX_LEN) 00138 { 00139 // Send 00140 connect.send_all(ack, cnt); 00141 // Reset counter 00142 cnt = 0; 00143 } 00144 } 00145 connect.send_all(ack, cnt); 00146 cmd_state = STATE_IDLE; 00147 play_en = 1; 00148 } 00149 else if (d == CMD_WFILE) 00150 { 00151 cmd_state = STATE_WFILE; 00152 i = 0; 00153 play_en = 0; 00154 } 00155 else if (d == CMD_WDATA) 00156 { 00157 cmd_state = STATE_WDATA; 00158 idx = 0; 00159 } 00160 else 00161 { 00162 cmd_state = STATE_IDLE; 00163 } 00164 break; 00165 00166 case STATE_WFILE: 00167 if (i == 0) 00168 { 00169 // Length of the filename 00170 fname_len = d; 00171 i++; 00172 fname[0] = '/'; 00173 fname[1] = 'u'; 00174 fname[2] = 's'; 00175 fname[3] = 'b'; 00176 fname[4] = '/'; 00177 } 00178 else 00179 { 00180 if (i <= fname_len) 00181 { 00182 fname[i + 4] = d; 00183 } 00184 if (i == fname_len) 00185 { 00186 // Create a file named fname 00187 fp = fopen(fname, "wb"); 00188 //fprintf(fp, "Hello World!"); 00189 // Send ACK to PC 00190 ack[0] = ACK_1; 00191 ack[1] = ACK_2; 00192 ack[2] = ACK_MBED; 00193 ack[3] = ACK_WFILE; 00194 // Send 00195 connect.send_all(ack, 4); 00196 cmd_state = STATE_IDLE; 00197 } 00198 else 00199 { 00200 i++; 00201 } 00202 } 00203 break; 00204 00205 case STATE_WDATA: 00206 if (idx == 0) 00207 { 00208 // Is last frame? 00209 last_frame = d; 00210 data_len = 0; 00211 } 00212 else if (idx == 1) 00213 { 00214 data_len = d * 256; 00215 } 00216 else if (idx == 2) 00217 { 00218 data_len = data_len + d; 00219 cnt = 0; 00220 } 00221 else 00222 { 00223 data_frame[cnt] = d; 00224 cnt++; 00225 if (cnt == data_len) 00226 { 00227 fwrite(data_frame, sizeof(char), data_len, fp); 00228 connect.send_all((char*)ack_wdata, 4); 00229 if (last_frame) 00230 { 00231 fclose(fp); 00232 // Reload filenames 00233 u->listdir("/"); 00234 play_en = 1; 00235 } 00236 cmd_state = STATE_IDLE; 00237 } 00238 } 00239 idx++; 00240 break; 00241 00242 default: 00243 cmd_state = STATE_IDLE; 00244 break; 00245 } 00246 } 00247 } 00248 } 00249 else 00250 { 00251 cmd_state = STATE_IDLE; 00252 Thread::wait(5); 00253 } 00254 } 00255 }
Generated on Tue Aug 2 2022 16:59:57 by
1.7.2