A S / Mbed 2 deprecated aos_mbed

Dependencies:   C12832_lcd EthernetInterface USBHost mbed-rtos mbed wave_player

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tcp_task.cpp Source File

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 }