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 "tftpsrv.h"
rebonatto 0:e57bc370d339 2 #include <ctype.h>
rebonatto 0:e57bc370d339 3
rebonatto 0:e57bc370d339 4 void tftpsrv::tftpsrv_Thread(void const* arg)
rebonatto 0:e57bc370d339 5 {
rebonatto 0:e57bc370d339 6 printf("\r\nTFTP start...\r\n");
rebonatto 0:e57bc370d339 7
rebonatto 0:e57bc370d339 8 tftpInicia();
rebonatto 0:e57bc370d339 9
rebonatto 0:e57bc370d339 10 int tam = 0;
rebonatto 0:e57bc370d339 11 char buffer[516];
rebonatto 0:e57bc370d339 12
rebonatto 0:e57bc370d339 13 int instancias = 10;
rebonatto 0:e57bc370d339 14 while (instancias > 0) {
rebonatto 0:e57bc370d339 15 // DEBUG ("\r\nEsperando pacote...\r\n");
rebonatto 0:e57bc370d339 16 tam = server.receiveFrom(client, buffer, sizeof(buffer));
rebonatto 0:e57bc370d339 17 while ( tam > 0 ) {
rebonatto 0:e57bc370d339 18 // DEBUG ("\r\nPacote recebido...\r\n");
rebonatto 0:e57bc370d339 19 switch (estado) {
rebonatto 0:e57bc370d339 20 case ESCUTANDO:
rebonatto 0:e57bc370d339 21 tftpEscutando(buffer);
rebonatto 0:e57bc370d339 22 break;
rebonatto 0:e57bc370d339 23 case LENDO:
rebonatto 0:e57bc370d339 24 tftpLendo(buffer);
rebonatto 0:e57bc370d339 25 break;
rebonatto 0:e57bc370d339 26 case ESCREVENDO:
rebonatto 0:e57bc370d339 27 tftpEscrevendo(tam, buffer);
rebonatto 0:e57bc370d339 28 break;
rebonatto 0:e57bc370d339 29 default:
rebonatto 0:e57bc370d339 30 tftpErr("Desconhecido ou nao implementado");
rebonatto 0:e57bc370d339 31 }
rebonatto 0:e57bc370d339 32 // DEBUG ("\r\nEsperando pacote...\r\n");
rebonatto 0:e57bc370d339 33 tam = server.receiveFrom(client, buffer, sizeof(buffer));
rebonatto 0:e57bc370d339 34 }
rebonatto 0:e57bc370d339 35 tftpReinicia();
rebonatto 0:e57bc370d339 36 instancias--;
rebonatto 0:e57bc370d339 37 printf("\r\nRestam %d instancias...\r\n", instancias);
rebonatto 0:e57bc370d339 38 //DEBUG ("\r\nRestam %d instancias...\r\n", instancias);
rebonatto 0:e57bc370d339 39 }
rebonatto 0:e57bc370d339 40 printf("Caiu fora TFTP\n");
rebonatto 0:e57bc370d339 41
rebonatto 0:e57bc370d339 42 // DEBUG ("\r\nTFTP end...\r\n");
rebonatto 0:e57bc370d339 43 }
rebonatto 0:e57bc370d339 44
rebonatto 0:e57bc370d339 45
rebonatto 0:e57bc370d339 46
rebonatto 0:e57bc370d339 47 void tftpsrv::tftpInicia()
rebonatto 0:e57bc370d339 48 {
rebonatto 0:e57bc370d339 49 // DEBUG ("\r\nIniciando TFTP...\r\n");
rebonatto 0:e57bc370d339 50 //server.init();
rebonatto 0:e57bc370d339 51 server.bind(69);
rebonatto 0:e57bc370d339 52 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 53 server.set_blocking(false, 20000);
rebonatto 0:e57bc370d339 54 }
rebonatto 0:e57bc370d339 55
rebonatto 0:e57bc370d339 56 void tftpsrv::tftpPara()
rebonatto 0:e57bc370d339 57 {
rebonatto 0:e57bc370d339 58 // DEBUG ("\r\nParando TFTP...\r\n");
rebonatto 0:e57bc370d339 59 server.close();
rebonatto 0:e57bc370d339 60 if (fp!=NULL) fclose(fp);
rebonatto 0:e57bc370d339 61 }
rebonatto 0:e57bc370d339 62
rebonatto 0:e57bc370d339 63 void tftpsrv::tftpReinicia()
rebonatto 0:e57bc370d339 64 {
rebonatto 0:e57bc370d339 65 tftpPara();
rebonatto 0:e57bc370d339 66 tftpInicia();
rebonatto 0:e57bc370d339 67 }
rebonatto 0:e57bc370d339 68
rebonatto 0:e57bc370d339 69 // send ACK to remote
rebonatto 0:e57bc370d339 70 void tftpsrv::tftpAck(int val)
rebonatto 0:e57bc370d339 71 {
rebonatto 0:e57bc370d339 72 char ack[4];
rebonatto 0:e57bc370d339 73 ack[0] = 0x00;
rebonatto 0:e57bc370d339 74 ack[1] = 0x04;
rebonatto 0:e57bc370d339 75 if ((val>603135) || (val<0)) val = 0;
rebonatto 0:e57bc370d339 76 ack[2] = val >> 8;
rebonatto 0:e57bc370d339 77 ack[3] = val & 255;
rebonatto 0:e57bc370d339 78
rebonatto 0:e57bc370d339 79 // DEBUG ("\r\nEnviando ACK...\r\n");
rebonatto 0:e57bc370d339 80 server.sendTo(client, ack, 4);
rebonatto 0:e57bc370d339 81 }
rebonatto 0:e57bc370d339 82
rebonatto 0:e57bc370d339 83 // send ERR message to named client
rebonatto 0:e57bc370d339 84 void tftpsrv::tftpErr(char* msg)
rebonatto 0:e57bc370d339 85 {
rebonatto 0:e57bc370d339 86 char message[32];
rebonatto 0:e57bc370d339 87 strncpy(message, msg, 32);
rebonatto 0:e57bc370d339 88 char err[37];
rebonatto 0:e57bc370d339 89 sprintf(err, "0000%s0", message);
rebonatto 0:e57bc370d339 90 err[0] = 0x00;
rebonatto 0:e57bc370d339 91 err[1] = 0x05;
rebonatto 0:e57bc370d339 92 err[2]=0x00;
rebonatto 0:e57bc370d339 93 err[3]=0x00;
rebonatto 0:e57bc370d339 94 int len = strlen(err);
rebonatto 0:e57bc370d339 95 err[len-1] = 0x00;
rebonatto 0:e57bc370d339 96 // DEBUG ("\r\nEnviando ERR ( %s )...\r\n", message);
rebonatto 0:e57bc370d339 97 server.sendTo(client, err, len);
rebonatto 0:e57bc370d339 98 }
rebonatto 0:e57bc370d339 99
rebonatto 0:e57bc370d339 100 int tftpsrv::tftpModo(char* buff)
rebonatto 0:e57bc370d339 101 {
rebonatto 0:e57bc370d339 102 int x = 2;
rebonatto 0:e57bc370d339 103 while (buff[x++] != 0); // get beginning of mode field
rebonatto 0:e57bc370d339 104 int y = x;
rebonatto 0:e57bc370d339 105 while (buff[y] != 0) {
rebonatto 0:e57bc370d339 106 buff[y] = tolower(buff[y]);
rebonatto 0:e57bc370d339 107 y++;
rebonatto 0:e57bc370d339 108 } // make mode field lowercase
rebonatto 0:e57bc370d339 109 return (strcmp(&buff[x++], "octet") == 0);
rebonatto 0:e57bc370d339 110 }
rebonatto 0:e57bc370d339 111
rebonatto 0:e57bc370d339 112 // get DATA block from file on disk into memory
rebonatto 0:e57bc370d339 113 void tftpsrv::tftpGetBlock()
rebonatto 0:e57bc370d339 114 {
rebonatto 0:e57bc370d339 115 // DEBUG ("\r\nLendo bloco... (em %d)\r\n", blockcnt);
rebonatto 0:e57bc370d339 116 blockcnt++;
rebonatto 0:e57bc370d339 117 char *p;
rebonatto 0:e57bc370d339 118 p = &sendbuff[4];
rebonatto 0:e57bc370d339 119 int len = fread(p, 1, 512, fp);
rebonatto 0:e57bc370d339 120 sendbuff[0] = 0x00;
rebonatto 0:e57bc370d339 121 sendbuff[1] = 0x03;
rebonatto 0:e57bc370d339 122 sendbuff[2] = blockcnt >> 8;
rebonatto 0:e57bc370d339 123 sendbuff[3] = blockcnt & 255;
rebonatto 0:e57bc370d339 124 blocksize = len+4;
rebonatto 0:e57bc370d339 125 }
rebonatto 0:e57bc370d339 126
rebonatto 0:e57bc370d339 127 // send DATA block to the client
rebonatto 0:e57bc370d339 128 void tftpsrv::tftpSendBlock()
rebonatto 0:e57bc370d339 129 {
rebonatto 0:e57bc370d339 130 // DEBUG ("\r\nEnviando bloco ( tam = %d )...\r\n", blocksize);
rebonatto 0:e57bc370d339 131 server.sendTo(client, sendbuff, blocksize);
rebonatto 0:e57bc370d339 132 }
rebonatto 0:e57bc370d339 133
rebonatto 0:e57bc370d339 134
rebonatto 0:e57bc370d339 135 void tftpsrv::tftpLer(char* buff)
rebonatto 0:e57bc370d339 136 {
rebonatto 0:e57bc370d339 137 tftpAck(0);
rebonatto 0:e57bc370d339 138
rebonatto 0:e57bc370d339 139 blockcnt = 0;
rebonatto 0:e57bc370d339 140 dupcnt = 0;
rebonatto 0:e57bc370d339 141
rebonatto 0:e57bc370d339 142 sprintf(filename, "/local/%s", &buff[2]);
rebonatto 0:e57bc370d339 143
rebonatto 0:e57bc370d339 144 fp = fopen(filename, "rb");
rebonatto 0:e57bc370d339 145 if (fp == NULL) {
rebonatto 0:e57bc370d339 146 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 147 tftpErr("Could not read file");
rebonatto 0:e57bc370d339 148 } else {
rebonatto 0:e57bc370d339 149 // file ready for reading
rebonatto 0:e57bc370d339 150 estado = LENDO;
rebonatto 0:e57bc370d339 151 // DEBUG ("\r\nRequisitado arquivo %s para %s\r\n", filename, client.get_address());
rebonatto 0:e57bc370d339 152 tftpGetBlock();
rebonatto 0:e57bc370d339 153 tftpSendBlock();
rebonatto 0:e57bc370d339 154 }
rebonatto 0:e57bc370d339 155 }
rebonatto 0:e57bc370d339 156
rebonatto 0:e57bc370d339 157 void tftpsrv::tftpEscrever(char* buff)
rebonatto 0:e57bc370d339 158 {
rebonatto 0:e57bc370d339 159 struct dirent *p;
rebonatto 0:e57bc370d339 160 DIR *dir = opendir("/local");
rebonatto 0:e57bc370d339 161 while ((p = readdir(dir)) != NULL) {
rebonatto 0:e57bc370d339 162 char *str = p->d_name;
rebonatto 0:e57bc370d339 163 if ((strstr(str, ".bin") != NULL) || (strstr(str, ".BIN") != NULL)) {
rebonatto 0:e57bc370d339 164 char buf[BUFSIZ];
rebonatto 0:e57bc370d339 165 snprintf(buf, sizeof(buf) - 1, "/local/%s", str);
rebonatto 0:e57bc370d339 166 remove(buf) == 0;
rebonatto 0:e57bc370d339 167 }
rebonatto 0:e57bc370d339 168 }
rebonatto 0:e57bc370d339 169 closedir(dir);
rebonatto 0:e57bc370d339 170
rebonatto 0:e57bc370d339 171 tftpAck(0);
rebonatto 0:e57bc370d339 172 blockcnt = 0;
rebonatto 0:e57bc370d339 173 dupcnt = 0;
rebonatto 0:e57bc370d339 174
rebonatto 0:e57bc370d339 175 sprintf(filename, "/local/%s", &buff[2]);
rebonatto 0:e57bc370d339 176
rebonatto 0:e57bc370d339 177 fp = fopen(filename, "ab");
rebonatto 0:e57bc370d339 178 if (fp == NULL) {
rebonatto 0:e57bc370d339 179 tftpErr("Could not open file to write");
rebonatto 0:e57bc370d339 180 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 181 } else {
rebonatto 0:e57bc370d339 182 // file ready for writing
rebonatto 0:e57bc370d339 183 fseek(fp, 0, SEEK_SET);
rebonatto 0:e57bc370d339 184 blockcnt = 0;
rebonatto 0:e57bc370d339 185 estado = ESCREVENDO;
rebonatto 0:e57bc370d339 186 // DEBUG ("\r\nRecebendo arquivo %s de %s\r\n", filename, client.get_address());
rebonatto 0:e57bc370d339 187 }
rebonatto 0:e57bc370d339 188 }
rebonatto 0:e57bc370d339 189
rebonatto 0:e57bc370d339 190 void tftpsrv::tftpEscutando(char* buff)
rebonatto 0:e57bc370d339 191 {
rebonatto 0:e57bc370d339 192 // DEBUG ("\r\nEscutando...\r\n");
rebonatto 0:e57bc370d339 193 switch (buff[1]) {
rebonatto 0:e57bc370d339 194 case 0x01: // RRQ
rebonatto 0:e57bc370d339 195 if (tftpModo(buff))
rebonatto 0:e57bc370d339 196 tftpLer(buff);
rebonatto 0:e57bc370d339 197 else
rebonatto 0:e57bc370d339 198 tftpErr("Not in octet mode");
rebonatto 0:e57bc370d339 199 break;
rebonatto 0:e57bc370d339 200 case 0x02: // WRQ
rebonatto 0:e57bc370d339 201 if (tftpModo(buff))
rebonatto 0:e57bc370d339 202 tftpEscrever(buff);
rebonatto 0:e57bc370d339 203 else
rebonatto 0:e57bc370d339 204 tftpErr("Not in octet mode");
rebonatto 0:e57bc370d339 205 break;
rebonatto 0:e57bc370d339 206 case 0x03: // DATA before connection established
rebonatto 0:e57bc370d339 207 tftpErr("No data expected");
rebonatto 0:e57bc370d339 208 break;
rebonatto 0:e57bc370d339 209 case 0x04: // ACK before connection established
rebonatto 0:e57bc370d339 210 tftpErr("No ack expected");
rebonatto 0:e57bc370d339 211 break;
rebonatto 0:e57bc370d339 212 case 0x05: // ERROR packet received
rebonatto 0:e57bc370d339 213 // DEBUG ("TFTP Eror received\n\r");
rebonatto 0:e57bc370d339 214 break;
rebonatto 0:e57bc370d339 215 default: // unknown TFTP packet type
rebonatto 0:e57bc370d339 216 tftpErr("Unknown TFTP packet type");
rebonatto 0:e57bc370d339 217 break;
rebonatto 0:e57bc370d339 218 } // switch buff[1]
rebonatto 0:e57bc370d339 219 }
rebonatto 0:e57bc370d339 220
rebonatto 0:e57bc370d339 221 void tftpsrv::tftpLendo(char *buff)
rebonatto 0:e57bc370d339 222 {
rebonatto 0:e57bc370d339 223 // DEBUG ("\r\nLendo...\r\n");
rebonatto 0:e57bc370d339 224 switch (buff[1]) {
rebonatto 0:e57bc370d339 225 case 0x01:
rebonatto 0:e57bc370d339 226 // to-do: verificar host e ip
rebonatto 0:e57bc370d339 227 break;
rebonatto 0:e57bc370d339 228 case 0x02:
rebonatto 0:e57bc370d339 229 // this should never happen, ignore
rebonatto 0:e57bc370d339 230 break; // case 0x02
rebonatto 0:e57bc370d339 231 case 0x03:
rebonatto 0:e57bc370d339 232 // we are the sending side, ignore
rebonatto 0:e57bc370d339 233 break;
rebonatto 0:e57bc370d339 234 case 0x04:
rebonatto 0:e57bc370d339 235 // last packet received, send next if there is one
rebonatto 0:e57bc370d339 236 dupcnt = 0;
rebonatto 0:e57bc370d339 237 if (blocksize == 516) {
rebonatto 0:e57bc370d339 238 tftpGetBlock();
rebonatto 0:e57bc370d339 239 tftpSendBlock();
rebonatto 0:e57bc370d339 240 } else { //EOF
rebonatto 0:e57bc370d339 241 // DEBUG ("\r\nFim de arquivo\r\n");
rebonatto 0:e57bc370d339 242 fclose(fp);
rebonatto 0:e57bc370d339 243 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 244 }
rebonatto 0:e57bc370d339 245 break;
rebonatto 0:e57bc370d339 246 default: // this includes 0x05 errors
rebonatto 0:e57bc370d339 247 fclose(fp);
rebonatto 0:e57bc370d339 248 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 249 break;
rebonatto 0:e57bc370d339 250 } // switch (buff[1])
rebonatto 0:e57bc370d339 251 }
rebonatto 0:e57bc370d339 252
rebonatto 0:e57bc370d339 253 void tftpsrv::tftpEscrevendo(int tam, char *buff)
rebonatto 0:e57bc370d339 254 {
rebonatto 0:e57bc370d339 255 // DEBUG ("\r\nEscrevendo...\r\n");
rebonatto 0:e57bc370d339 256
rebonatto 0:e57bc370d339 257 int block;
rebonatto 0:e57bc370d339 258 switch (buff[1]) {
rebonatto 0:e57bc370d339 259 case 0x02:
rebonatto 0:e57bc370d339 260 // a fazer: verificar host, ip e porta
rebonatto 0:e57bc370d339 261 break; // case 0x02
rebonatto 0:e57bc370d339 262 case 0x03:
rebonatto 0:e57bc370d339 263 block = (buff[2] << 8) + buff[3];
rebonatto 0:e57bc370d339 264 if ((blockcnt+1) == block) {
rebonatto 0:e57bc370d339 265 tftpAck(block);
rebonatto 0:e57bc370d339 266 // new packet
rebonatto 0:e57bc370d339 267 char *data = &buff[4];
rebonatto 0:e57bc370d339 268 fwrite(data, 1,tam-4, fp);
rebonatto 0:e57bc370d339 269 blockcnt++;
rebonatto 0:e57bc370d339 270 dupcnt = 0;
rebonatto 0:e57bc370d339 271 } else {
rebonatto 0:e57bc370d339 272 if ((blockcnt+1) < block) { // high block nr
rebonatto 0:e57bc370d339 273 // we missed a packet, error
rebonatto 0:e57bc370d339 274 // DEBUG ("\r\nMissed packet!\r\n");
rebonatto 0:e57bc370d339 275 fclose(fp);
rebonatto 0:e57bc370d339 276 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 277 } else { // duplicate packet, do nothing
rebonatto 0:e57bc370d339 278 // DEBUG ("\r\nPacote duplicado ( %d )\r\n", blockcnt);
rebonatto 0:e57bc370d339 279 if (dupcnt > 10) {
rebonatto 0:e57bc370d339 280 tftpErr("Too many dups");
rebonatto 0:e57bc370d339 281 fclose(fp);
rebonatto 0:e57bc370d339 282 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 283 } else {
rebonatto 0:e57bc370d339 284 tftpAck(blockcnt);
rebonatto 0:e57bc370d339 285 }
rebonatto 0:e57bc370d339 286 dupcnt++;
rebonatto 0:e57bc370d339 287 }
rebonatto 0:e57bc370d339 288 }
rebonatto 0:e57bc370d339 289 // DEBUG ("\r\nLendo pacote %d com blocksize = %d\n\r", blockcnt, tam);
rebonatto 0:e57bc370d339 290 if (tam<516) {
rebonatto 0:e57bc370d339 291 // DEBUG ("\r\nFim do arquivo -> %d\r\n", tam);
rebonatto 0:e57bc370d339 292 fflush(fp);
rebonatto 0:e57bc370d339 293 fclose(fp);
rebonatto 0:e57bc370d339 294 estado = ESCUTANDO;
rebonatto 0:e57bc370d339 295 }
rebonatto 0:e57bc370d339 296 break; // case 0x03
rebonatto 0:e57bc370d339 297 default:
rebonatto 0:e57bc370d339 298 tftpErr("No idea why you're sending me this!");
rebonatto 0:e57bc370d339 299 break; // default
rebonatto 0:e57bc370d339 300 } // switch (buff[1])
rebonatto 0:e57bc370d339 301 }