![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versão do protegemed que calcula o tempo em ms da fuga, calcula o numero de onverflow (valores muito baixo) e underflow (valores muito altos). Além disso, calcula um valor médio a partir dos valores capturados e não apenas pela fft.
Dependencies: EthernetInterface mbed-rtos mbed
Diff: Codes/TftpServer.cpp
- Revision:
- 0:c64e1194230b
diff -r 000000000000 -r c64e1194230b Codes/TftpServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Codes/TftpServer.cpp Wed Jul 09 21:16:23 2014 +0000 @@ -0,0 +1,239 @@ +#include "TftpServer.h" + +#include <stdio.h> + +/* + * + * TFTP Formats + + +Type Op # Format without header + 2 bytes string 1 byte string 1 byte + ----------------------------------------------- +RRQ/ | 01/02 | Filename | 0 | Mode | 0 | +WRQ ----------------------------------------------- + 2 bytes 2 bytes n bytes + --------------------------------- +DATA | 03 | Block # | Data | + --------------------------------- + 2 bytes 2 bytes + ------------------- +ACK | 04 | Block # | + -------------------- + 2 bytes 2 bytes string 1 byte + ---------------------------------------- +ERROR | 05 | ErrorCode | ErrMsg | 0 | + ---------------------------------------- + + + Listen to UDP port 69 + + On receive RRQ: Opens the file with semihosting + Send the file + + On receive WRQ: Open the file with semihosting + Send Ack + Receive Data Packet and write into the file + Send Ack + * + */ + + //LocalFileSystem local("local"); + +/* +static const char* file_not_found_msg = "\x00\x05\x00\x01\File not found.\x00"; //20 +static const char* file_too_big_msg = "\x00\x05\x00\x03\File is too big (>512kB).\x00"; //30 +static const char* file_already_exists_msg = "\x00\x05\x00\x06\File already exists.\x00"; //25 +static const char* file_unknown_error_msg = "\x00\x05\x00\x00Unable to open the file for write.\x00"; //40 +*/ + +char* file_not_found_msg = "\x00\x05\x00\x01\File not found.\x00"; //20 +char* file_too_big_msg = "\x00\x05\x00\x03\File is too big (>512kB).\x00"; //30 +char* file_already_exists_msg = "\x00\x05\x00\x06\File already exists.\x00"; //25 +char* file_unknown_error_msg = "\x00\x05\x00\x00Unable to open the file for write.\x00"; //40 + + + +void TftpServer::TftpServerThread(void const *arg) +{ +/* + printf("TFTP Thread starting...\n"); + + UDPSocket server; + + server.bind(69,NULL); + + while(1) + { + char *buffer = NULL; + int length = 0; + Endpoint remote; + if(server.receiveFrom(remote,&buffer,&length) == ERR_OK) + { + printf("Received %d bytes from %s:%d\n",length,remote.get_address(),remote.get_port()); + if(length > 2) + { + unsigned short int opcode = buffer[0]*0x100 + buffer[1]; + printf("Got opcode [%X]\n",opcode); + if(opcode == 1) + { + TftpDoRead(remote,buffer,length); + } + else if(opcode == 2) + { + TftpDoWrite(remote,buffer,length); + } + delete buffer; + } + } + } +*/ +} + +void TftpServer::TftpDoRead(Endpoint remote,char *buffer,int length) +{ +/* + char *filename = buffer+2; + + UDPSocket conn; + + if(conn.connect(remote.get_address(),remote.get_port()) != ERR_OK) + return; + + char fullpath[256]; + strcpy(fullpath,"/local/"); + strcat(fullpath,filename); + printf("File = %s\n",fullpath); + FILE *f = fopen(fullpath,"rb"); + + char *ans=NULL; + int len=0; + + if(f == NULL) + { + conn.send((char*)file_not_found_msg,20); + conn.receive(&ans,&len); + delete ans; + return; + } + + int idx = 1; + + int readbytes; + unsigned char *hdrptr = new unsigned char[516]; + unsigned char *dataptr = hdrptr+4; + + do + { + //opcode + hdrptr[0] = 0; + hdrptr[1] = 3; + //block # + hdrptr[2] = idx/0x100; + hdrptr[3] = idx%0x100; + + readbytes = fread(dataptr,1,512,f); + conn.send((char*)hdrptr,readbytes+4); + conn.receive(&ans,&len); + delete ans; + idx++; + } + while(readbytes == 512); + + fclose(f); + delete hdrptr; +*/ +} + +void TftpServer::TftpDoWrite(Endpoint remote,char *buffer,int length) +{ +/* + char *filename = buffer+2; + + UDPSocket conn; + err_t e; + if((e=conn.connect(remote.get_address(),remote.get_port())) != ERR_OK) + { + printf("Connect error %d\n",e); + return; + } + + char fullpath[256]; + strcpy(fullpath,"/local/"); + strcat(fullpath,filename); + printf("File = %s\n",fullpath); + + char *ans=NULL; + int len=0; + + FILE *f = fopen(fullpath,"rb"); + if(f != NULL) + { + conn.send((char*)file_already_exists_msg,25); + //conn.receive(&ans,&len); + fclose(f); + delete ans; + return; + } + + f = fopen(fullpath,"wb"); + if(f == NULL) + { + conn.send((char*)file_unknown_error_msg,40); + //conn.receive(&ans,&len); + delete ans; + return; + } + + //int buflen; + unsigned char ack[4]; + ack[0] = 0; + ack[1] = 4; + ack[2] = 0; + ack[3] = 0; + + conn.send((char*)ack,4); + int error_tries = 5; + char *buf = NULL; + + do + { + + if(conn.receive(&buf,&len) != ERR_OK) + { + printf("Error\n"); + error_tries--; + if(error_tries == 0) + { + return; + } + conn.send((char*)ack,4); + continue; + } + + error_tries = 5; + int idx = buf[2]*0x100 + buf[3]; + + printf("Len = %d, Idx = %d\n",len,idx); + + fwrite(buf+4,1,len-4,f); + + delete buf; + + if(idx >= 1024) + { + conn.send((char*)file_too_big_msg,30); + //conn.receive(&ans,&len); + delete ans; + return; + } + + ack[2] = idx/0x100; + ack[3] = idx%0x100; + conn.send((char*)ack,4); + } + while(len == 516); + + fclose(f); + */ +} \ No newline at end of file