Versão sem FFT e aquisição por DMA. 256 amostras.

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

Committer:
rebonatto
Date:
Tue Jan 05 11:45:44 2016 +0000
Revision:
0:e57bc370d339
Vers?o est?vel sem calculo de FFT. Aquisi??o por DMA. Usa 256 amostras.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:e57bc370d339 1 #include "TftpServer.h"
rebonatto 0:e57bc370d339 2
rebonatto 0:e57bc370d339 3 #include <stdio.h>
rebonatto 0:e57bc370d339 4
rebonatto 0:e57bc370d339 5 /*
rebonatto 0:e57bc370d339 6 *
rebonatto 0:e57bc370d339 7 * TFTP Formats
rebonatto 0:e57bc370d339 8
rebonatto 0:e57bc370d339 9
rebonatto 0:e57bc370d339 10 Type Op # Format without header
rebonatto 0:e57bc370d339 11 2 bytes string 1 byte string 1 byte
rebonatto 0:e57bc370d339 12 -----------------------------------------------
rebonatto 0:e57bc370d339 13 RRQ/ | 01/02 | Filename | 0 | Mode | 0 |
rebonatto 0:e57bc370d339 14 WRQ -----------------------------------------------
rebonatto 0:e57bc370d339 15 2 bytes 2 bytes n bytes
rebonatto 0:e57bc370d339 16 ---------------------------------
rebonatto 0:e57bc370d339 17 DATA | 03 | Block # | Data |
rebonatto 0:e57bc370d339 18 ---------------------------------
rebonatto 0:e57bc370d339 19 2 bytes 2 bytes
rebonatto 0:e57bc370d339 20 -------------------
rebonatto 0:e57bc370d339 21 ACK | 04 | Block # |
rebonatto 0:e57bc370d339 22 --------------------
rebonatto 0:e57bc370d339 23 2 bytes 2 bytes string 1 byte
rebonatto 0:e57bc370d339 24 ----------------------------------------
rebonatto 0:e57bc370d339 25 ERROR | 05 | ErrorCode | ErrMsg | 0 |
rebonatto 0:e57bc370d339 26 ----------------------------------------
rebonatto 0:e57bc370d339 27
rebonatto 0:e57bc370d339 28
rebonatto 0:e57bc370d339 29 Listen to UDP port 69
rebonatto 0:e57bc370d339 30
rebonatto 0:e57bc370d339 31 On receive RRQ: Opens the file with semihosting
rebonatto 0:e57bc370d339 32 Send the file
rebonatto 0:e57bc370d339 33
rebonatto 0:e57bc370d339 34 On receive WRQ: Open the file with semihosting
rebonatto 0:e57bc370d339 35 Send Ack
rebonatto 0:e57bc370d339 36 Receive Data Packet and write into the file
rebonatto 0:e57bc370d339 37 Send Ack
rebonatto 0:e57bc370d339 38 *
rebonatto 0:e57bc370d339 39 */
rebonatto 0:e57bc370d339 40
rebonatto 0:e57bc370d339 41 //LocalFileSystem local("local");
rebonatto 0:e57bc370d339 42
rebonatto 0:e57bc370d339 43 /*
rebonatto 0:e57bc370d339 44 static const char* file_not_found_msg = "\x00\x05\x00\x01\File not found.\x00"; //20
rebonatto 0:e57bc370d339 45 static const char* file_too_big_msg = "\x00\x05\x00\x03\File is too big (>512kB).\x00"; //30
rebonatto 0:e57bc370d339 46 static const char* file_already_exists_msg = "\x00\x05\x00\x06\File already exists.\x00"; //25
rebonatto 0:e57bc370d339 47 static const char* file_unknown_error_msg = "\x00\x05\x00\x00Unable to open the file for write.\x00"; //40
rebonatto 0:e57bc370d339 48 */
rebonatto 0:e57bc370d339 49
rebonatto 0:e57bc370d339 50 char* file_not_found_msg = "\x00\x05\x00\x01\File not found.\x00"; //20
rebonatto 0:e57bc370d339 51 char* file_too_big_msg = "\x00\x05\x00\x03\File is too big (>512kB).\x00"; //30
rebonatto 0:e57bc370d339 52 char* file_already_exists_msg = "\x00\x05\x00\x06\File already exists.\x00"; //25
rebonatto 0:e57bc370d339 53 char* file_unknown_error_msg = "\x00\x05\x00\x00Unable to open the file for write.\x00"; //40
rebonatto 0:e57bc370d339 54
rebonatto 0:e57bc370d339 55
rebonatto 0:e57bc370d339 56 void TftpServer::TftpServerThread(void const *arg)
rebonatto 0:e57bc370d339 57 {
rebonatto 0:e57bc370d339 58 /*
rebonatto 0:e57bc370d339 59 printf("TFTP Thread starting...\n");
rebonatto 0:e57bc370d339 60
rebonatto 0:e57bc370d339 61 UDPSocket server;
rebonatto 0:e57bc370d339 62
rebonatto 0:e57bc370d339 63 server.bind(69,NULL);
rebonatto 0:e57bc370d339 64
rebonatto 0:e57bc370d339 65 while(1)
rebonatto 0:e57bc370d339 66 {
rebonatto 0:e57bc370d339 67 char *buffer = NULL;
rebonatto 0:e57bc370d339 68 int length = 0;
rebonatto 0:e57bc370d339 69 Endpoint remote;
rebonatto 0:e57bc370d339 70 if(server.receiveFrom(remote,&buffer,&length) == ERR_OK)
rebonatto 0:e57bc370d339 71 {
rebonatto 0:e57bc370d339 72 printf("Received %d bytes from %s:%d\n",length,remote.get_address(),remote.get_port());
rebonatto 0:e57bc370d339 73 if(length > 2)
rebonatto 0:e57bc370d339 74 {
rebonatto 0:e57bc370d339 75 unsigned short int opcode = buffer[0]*0x100 + buffer[1];
rebonatto 0:e57bc370d339 76 printf("Got opcode [%X]\n",opcode);
rebonatto 0:e57bc370d339 77 if(opcode == 1)
rebonatto 0:e57bc370d339 78 {
rebonatto 0:e57bc370d339 79 TftpDoRead(remote,buffer,length);
rebonatto 0:e57bc370d339 80 }
rebonatto 0:e57bc370d339 81 else if(opcode == 2)
rebonatto 0:e57bc370d339 82 {
rebonatto 0:e57bc370d339 83 TftpDoWrite(remote,buffer,length);
rebonatto 0:e57bc370d339 84 }
rebonatto 0:e57bc370d339 85 delete buffer;
rebonatto 0:e57bc370d339 86 }
rebonatto 0:e57bc370d339 87 }
rebonatto 0:e57bc370d339 88 }
rebonatto 0:e57bc370d339 89 */
rebonatto 0:e57bc370d339 90 }
rebonatto 0:e57bc370d339 91
rebonatto 0:e57bc370d339 92 void TftpServer::TftpDoRead(Endpoint remote,char *buffer,int length)
rebonatto 0:e57bc370d339 93 {
rebonatto 0:e57bc370d339 94 /*
rebonatto 0:e57bc370d339 95 char *filename = buffer+2;
rebonatto 0:e57bc370d339 96
rebonatto 0:e57bc370d339 97 UDPSocket conn;
rebonatto 0:e57bc370d339 98
rebonatto 0:e57bc370d339 99 if(conn.connect(remote.get_address(),remote.get_port()) != ERR_OK)
rebonatto 0:e57bc370d339 100 return;
rebonatto 0:e57bc370d339 101
rebonatto 0:e57bc370d339 102 char fullpath[256];
rebonatto 0:e57bc370d339 103 strcpy(fullpath,"/local/");
rebonatto 0:e57bc370d339 104 strcat(fullpath,filename);
rebonatto 0:e57bc370d339 105 printf("File = %s\n",fullpath);
rebonatto 0:e57bc370d339 106 FILE *f = fopen(fullpath,"rb");
rebonatto 0:e57bc370d339 107
rebonatto 0:e57bc370d339 108 char *ans=NULL;
rebonatto 0:e57bc370d339 109 int len=0;
rebonatto 0:e57bc370d339 110
rebonatto 0:e57bc370d339 111 if(f == NULL)
rebonatto 0:e57bc370d339 112 {
rebonatto 0:e57bc370d339 113 conn.send((char*)file_not_found_msg,20);
rebonatto 0:e57bc370d339 114 conn.receive(&ans,&len);
rebonatto 0:e57bc370d339 115 delete ans;
rebonatto 0:e57bc370d339 116 return;
rebonatto 0:e57bc370d339 117 }
rebonatto 0:e57bc370d339 118
rebonatto 0:e57bc370d339 119 int idx = 1;
rebonatto 0:e57bc370d339 120
rebonatto 0:e57bc370d339 121 int readbytes;
rebonatto 0:e57bc370d339 122 unsigned char *hdrptr = new unsigned char[516];
rebonatto 0:e57bc370d339 123 unsigned char *dataptr = hdrptr+4;
rebonatto 0:e57bc370d339 124
rebonatto 0:e57bc370d339 125 do
rebonatto 0:e57bc370d339 126 {
rebonatto 0:e57bc370d339 127 //opcode
rebonatto 0:e57bc370d339 128 hdrptr[0] = 0;
rebonatto 0:e57bc370d339 129 hdrptr[1] = 3;
rebonatto 0:e57bc370d339 130 //block #
rebonatto 0:e57bc370d339 131 hdrptr[2] = idx/0x100;
rebonatto 0:e57bc370d339 132 hdrptr[3] = idx%0x100;
rebonatto 0:e57bc370d339 133
rebonatto 0:e57bc370d339 134 readbytes = fread(dataptr,1,512,f);
rebonatto 0:e57bc370d339 135 conn.send((char*)hdrptr,readbytes+4);
rebonatto 0:e57bc370d339 136 conn.receive(&ans,&len);
rebonatto 0:e57bc370d339 137 delete ans;
rebonatto 0:e57bc370d339 138 idx++;
rebonatto 0:e57bc370d339 139 }
rebonatto 0:e57bc370d339 140 while(readbytes == 512);
rebonatto 0:e57bc370d339 141
rebonatto 0:e57bc370d339 142 fclose(f);
rebonatto 0:e57bc370d339 143 delete hdrptr;
rebonatto 0:e57bc370d339 144 */
rebonatto 0:e57bc370d339 145 }
rebonatto 0:e57bc370d339 146
rebonatto 0:e57bc370d339 147 void TftpServer::TftpDoWrite(Endpoint remote,char *buffer,int length)
rebonatto 0:e57bc370d339 148 {
rebonatto 0:e57bc370d339 149 /*
rebonatto 0:e57bc370d339 150 char *filename = buffer+2;
rebonatto 0:e57bc370d339 151
rebonatto 0:e57bc370d339 152 UDPSocket conn;
rebonatto 0:e57bc370d339 153 err_t e;
rebonatto 0:e57bc370d339 154 if((e=conn.connect(remote.get_address(),remote.get_port())) != ERR_OK)
rebonatto 0:e57bc370d339 155 {
rebonatto 0:e57bc370d339 156 printf("Connect error %d\n",e);
rebonatto 0:e57bc370d339 157 return;
rebonatto 0:e57bc370d339 158 }
rebonatto 0:e57bc370d339 159
rebonatto 0:e57bc370d339 160 char fullpath[256];
rebonatto 0:e57bc370d339 161 strcpy(fullpath,"/local/");
rebonatto 0:e57bc370d339 162 strcat(fullpath,filename);
rebonatto 0:e57bc370d339 163 printf("File = %s\n",fullpath);
rebonatto 0:e57bc370d339 164
rebonatto 0:e57bc370d339 165 char *ans=NULL;
rebonatto 0:e57bc370d339 166 int len=0;
rebonatto 0:e57bc370d339 167
rebonatto 0:e57bc370d339 168 FILE *f = fopen(fullpath,"rb");
rebonatto 0:e57bc370d339 169 if(f != NULL)
rebonatto 0:e57bc370d339 170 {
rebonatto 0:e57bc370d339 171 conn.send((char*)file_already_exists_msg,25);
rebonatto 0:e57bc370d339 172 //conn.receive(&ans,&len);
rebonatto 0:e57bc370d339 173 fclose(f);
rebonatto 0:e57bc370d339 174 delete ans;
rebonatto 0:e57bc370d339 175 return;
rebonatto 0:e57bc370d339 176 }
rebonatto 0:e57bc370d339 177
rebonatto 0:e57bc370d339 178 f = fopen(fullpath,"wb");
rebonatto 0:e57bc370d339 179 if(f == NULL)
rebonatto 0:e57bc370d339 180 {
rebonatto 0:e57bc370d339 181 conn.send((char*)file_unknown_error_msg,40);
rebonatto 0:e57bc370d339 182 //conn.receive(&ans,&len);
rebonatto 0:e57bc370d339 183 delete ans;
rebonatto 0:e57bc370d339 184 return;
rebonatto 0:e57bc370d339 185 }
rebonatto 0:e57bc370d339 186
rebonatto 0:e57bc370d339 187 //int buflen;
rebonatto 0:e57bc370d339 188 unsigned char ack[4];
rebonatto 0:e57bc370d339 189 ack[0] = 0;
rebonatto 0:e57bc370d339 190 ack[1] = 4;
rebonatto 0:e57bc370d339 191 ack[2] = 0;
rebonatto 0:e57bc370d339 192 ack[3] = 0;
rebonatto 0:e57bc370d339 193
rebonatto 0:e57bc370d339 194 conn.send((char*)ack,4);
rebonatto 0:e57bc370d339 195 int error_tries = 5;
rebonatto 0:e57bc370d339 196 char *buf = NULL;
rebonatto 0:e57bc370d339 197
rebonatto 0:e57bc370d339 198 do
rebonatto 0:e57bc370d339 199 {
rebonatto 0:e57bc370d339 200
rebonatto 0:e57bc370d339 201 if(conn.receive(&buf,&len) != ERR_OK)
rebonatto 0:e57bc370d339 202 {
rebonatto 0:e57bc370d339 203 printf("Error\n");
rebonatto 0:e57bc370d339 204 error_tries--;
rebonatto 0:e57bc370d339 205 if(error_tries == 0)
rebonatto 0:e57bc370d339 206 {
rebonatto 0:e57bc370d339 207 return;
rebonatto 0:e57bc370d339 208 }
rebonatto 0:e57bc370d339 209 conn.send((char*)ack,4);
rebonatto 0:e57bc370d339 210 continue;
rebonatto 0:e57bc370d339 211 }
rebonatto 0:e57bc370d339 212
rebonatto 0:e57bc370d339 213 error_tries = 5;
rebonatto 0:e57bc370d339 214 int idx = buf[2]*0x100 + buf[3];
rebonatto 0:e57bc370d339 215
rebonatto 0:e57bc370d339 216 printf("Len = %d, Idx = %d\n",len,idx);
rebonatto 0:e57bc370d339 217
rebonatto 0:e57bc370d339 218 fwrite(buf+4,1,len-4,f);
rebonatto 0:e57bc370d339 219
rebonatto 0:e57bc370d339 220 delete buf;
rebonatto 0:e57bc370d339 221
rebonatto 0:e57bc370d339 222 if(idx >= 1024)
rebonatto 0:e57bc370d339 223 {
rebonatto 0:e57bc370d339 224 conn.send((char*)file_too_big_msg,30);
rebonatto 0:e57bc370d339 225 //conn.receive(&ans,&len);
rebonatto 0:e57bc370d339 226 delete ans;
rebonatto 0:e57bc370d339 227 return;
rebonatto 0:e57bc370d339 228 }
rebonatto 0:e57bc370d339 229
rebonatto 0:e57bc370d339 230 ack[2] = idx/0x100;
rebonatto 0:e57bc370d339 231 ack[3] = idx%0x100;
rebonatto 0:e57bc370d339 232 conn.send((char*)ack,4);
rebonatto 0:e57bc370d339 233 }
rebonatto 0:e57bc370d339 234 while(len == 516);
rebonatto 0:e57bc370d339 235
rebonatto 0:e57bc370d339 236 fclose(f);
rebonatto 0:e57bc370d339 237 */
rebonatto 0:e57bc370d339 238 }