sftd.c

Go to the documentation of this file.
00001 
00017 #include "sftd.h"
00018 #include "uip.h"
00019 
00020 #include "grlib/grlib.h"
00021 #include "../uart/uart.h"
00022 #include "../cli/debug.h"
00023 #include "string.h"
00024 
00026 #define TAM_BUFF_TEMP 3
00027 #define TOTAL_PIXEL 26136
00028 int contImg, n_buff, flag_buff_temp;//flag_buff_temp usada para controlar quando pacotes estão com pixel repetidos divididos.
00029 int buff_temp[TAM_BUFF_TEMP]; //3 vlr maximo de pixel repetidos
00030 int break_geral;
00031 
00033 int flag_sendu;
00034 
00038 void sftd_init(void){
00039         uip_listen(HTONS(SFTD_PORT));
00040 }
00041 
00048 void sftd_appcall(void){
00049 
00050         struct sftd_state *s = (struct sftd_state *)&(uip_conn->appstate.sftd_st);
00051 
00052         //uma nova conexão é estabelecida.
00053         if(uip_connected()){
00054                 DEBUG_SFT("try connection\n");
00055                 DEBUG_SFT("connection .. ok");
00056                 s->state = ST_INIT;
00057                 flag_sendu=0;
00058         }
00059 
00060         if(s->state == ST_CLOSE) {
00061                 s->state = ST_INIT;
00062                 uip_close();
00063                 return;
00064         }
00065 
00066         if(uip_closed() || uip_aborted() || uip_timedout()) {
00067                 DEBUG_SFT("closed... SFT\n");
00068                 sft_closed(s);
00069         }
00070 
00071         if(uip_newdata()) {
00072                 DEBUG_SFT("new data sft\n");
00073                 sft_trata(s);
00074         }
00075 
00076         if(uip_rexmit() || uip_newdata() || uip_acked() || uip_connected() || uip_poll()) {
00077                 DEBUG_SFT("send data sft\n");
00078                 sft_senddata(s);
00079         }
00080 
00081 }
00082 
00088 void sft_closed(struct sftd_state *s){
00089           memb_free(&s, s->buff);
00090           s->state = ST_CLOSE;
00091 }
00092 
00098 void sft_senddata(struct sftd_state *s){
00099         uip_send(s->data_send, s->len_send);
00100 }
00101 
00112 int sft_trata(struct sftd_state *s){
00113         char estado[20];
00114         char *dataptr;
00115         char cmd[3], id[4], mf[2], len[5], nro[3];
00116         int i;
00117         static struct sft_hdr_uip *sftptr;
00118 
00119         sprintf(estado,"Estado: %d\n", s->state);
00120         DEBUG_SFT(estado);
00121 
00122         sftptr = (struct sft_hdr_uip *)uip_appdata;
00123 
00124 //      printf("\nSFTPKT CMD%s\t LEN %s\t MF %c\t ID %s\t PKT %s\t", sftptr->cmd, sftptr->len, sftptr->mf,
00125 //                      sftptr->id, sftptr->nro_pkt);
00126 
00127         //significa que é um comando sem seguranca e o primeiro pacote com o cabecalho ja foi tratado.
00128         if(flag_sendu>0){
00129                 DEBUG_SFT("FLAG_SENDU");
00130                 s->len_buff = uip_datalen();
00131                 s->nr_pkt = flag_sendu++;
00132                 strncpy(s->buff, uip_appdata, s->len_buff);
00133                 carrega_img(s);
00134                 s->state = ST_RECVU;
00135                 return 0;
00136         }
00137 
00138         //para ser um protocolo tem que ser maior que 8. é o header do protocolo. E nao pode ser continuacao do protocolo sendu.
00139         if(uip_datalen()>5){
00140 
00141                 //pega o tipo de comando.
00142                 strncpy(cmd, sftptr->cmd,2);
00143                 cmd[3] = '\0';
00144                 s->cmd = atoi(cmd);
00145                 sprintf(estado, "\ncmd: %02d\t", s->cmd);
00146                 DEBUG_SFT(estado);
00147 //              printf(estado);
00148 
00149                 //tamanho do pacote
00150                 strncpy(len, sftptr->len, 4);
00151                 len[5]='\0';
00152                 s->len_buff = atoi(len);
00153                 sprintf(estado, "len: %04d\t", s->len_buff);
00154                 DEBUG_SFT(estado);
00155 //              printf(estado);
00156 
00157                 //se tem mais fragmentos da mesma mensagem.
00158                 strncpy(mf, sftptr->mf,1);
00159                 mf[2]='\0';
00160                 s->mf = atoi(mf);
00161                 sprintf(estado, "MF: %d\t", s->mf);
00162                 DEBUG_SFT(estado);
00163 //              printf(estado);
00164 
00165                 //pega o nro do pacote.
00166                 strncpy(nro, sftptr->nro_pkt,2);
00167                 nro[3]='\0';
00168                 s->nr_pkt = atoi(nro);
00169                 sprintf(estado, "NRO PKT: %02d\t", s->nr_pkt);
00170                 DEBUG_SFT(estado);
00171 //              printf(estado);
00172                 if(s->nr_pkt==0) printf("");
00173 
00174                 //pega o ID
00175                 strncpy(id, sftptr->id,3);
00176                 id[4]='\0';
00177                 s->id = atoi(id);
00178                 sprintf(estado, "ID: %d\t", s->id);
00179                 DEBUG_SFT(estado);
00180 //              printf(estado);
00181 
00182                 fflush(stdout);
00183                 //strncpy(s->buff, sftptr->buff_send,s->len_buff);
00184                 //s->buff[s->len_buff + 1] = '\0';
00185                 for(i=0; i<s->len_buff;i++) s->buff[i] = sftptr->buff_send[i];
00186 
00187                 switch (s->cmd){
00188 
00189                         //comando que recebe uma imagem.
00190                         case CMD_RECV:
00191                                 s->state = ST_RECV;
00192                                 carrega_img(s);
00193                                 break;
00194 
00195                         case CMD_STOP:
00196                                 s->state = ST_STOP;
00197                                 info_host_ans(s, CMD_STOP);
00198                                 break;
00199                         case CMD_RECV_X:
00200                                 s->state = ST_RECV;
00201                                 carrega_img_old(s);
00202                                 break;
00203                         case CMD_RECVU:
00204                                 s->state = ST_RECVU;
00205                                 flag_sendu = 1;
00206                                 carrega_img(s);
00207                                 break;
00208                         case CMD_MSG:
00209                                 s->state = ST_RECV;
00210                                 envia_msg(s);
00211                         default: break;
00212 
00213                 }
00214 
00215                 //maquina de estados do protocolo.
00216                 switch(s->state){
00217                         case ST_WAIT_RECV:
00218                                 info_host_ans(s, CMD_RECV_ANS);
00219                                 break;
00220 
00221                         case ST_FINISHED_RECV:
00222         //                      uart_puts("\nSFT enviou uma imagem para o display.");
00223                                 info_host_ans(s, CMD_FINISHED);
00224                         default: break;
00225 
00226                 }
00227 
00228                 if((FIO4PIN & (1<<8))==0){
00229                         //DEBUG_ENTER;
00230                         printf("\nfim do envio de imagens.\n");
00231                         s->state = ST_STOP;
00232                         for(i=0; i < 26136;){
00233                                 WriteSpiData(0xff); i++;
00234                                 WriteSpiData(0xff); i++;
00235                                 WriteSpiData(0xff); i++;
00236                         }
00237                         info_host_ans(s, CMD_STOP);
00238                 }
00239         }
00240 
00241         return 0;
00242 }
00243 
00244 
00250 void info_host_ans(struct sftd_state *s, int cmd){
00251         char bf[100];
00252         int len;
00253         struct sft_hdr_uip *sptr;
00254 
00255         //copia comando de resposta.
00256         sprintf(sptr->cmd, "%02d", cmd);
00257         //strncpy(s->data_send, bf, 2);
00258 
00259         //tamamnho da resposta do comando.
00260         sprintf(sptr->len, "0002");
00261 
00262         //more fragments == 0.
00263         sprintf(sptr->mf, "0");
00264 
00265         //nro do pacote
00266         sprintf(sptr->nro_pkt, "00");
00267 
00268         //id
00269         sprintf(sptr->id, "%s", s->id);
00270         //mensagem
00271         sprintf(sptr->buff_send, "ok");
00272 
00273         //id
00274 //      strncat(bf, "%03d", s->id);
00275 //      len  = 14;
00276         uip_send((struct sft_hdr_uip *)sptr, sizeof(sptr));
00277 }
00278 
00285 void carrega_img_old(struct sftd_state *s){
00286         int i;
00287         char a[20];
00288 
00289         DEBUG_ENTER;
00290 
00291         if(s->nr_pkt == 0){
00292                 //Carrega ponteiro do display para o inicio dele.
00293                 WriteSpiCommand(0x2b);  // PASET Linha inicial e final
00294                 WriteSpiData(0);
00295                 WriteSpiData(131);
00296                 WriteSpiCommand(0x2a);  // CASET Coluna inicial e final
00297                 WriteSpiData(0);
00298                 WriteSpiData(131);
00299                 WriteSpiCommand(0x2c);  // Write Memory
00300 
00301         }
00302 
00303         for(i=0;i < s->len_buff; i++){
00304                 //como o LPC2378 possui pouca memória o byte recebido é enviado direto para o display.
00305                 //printf("%x ",s->buff[i]);
00306                 WriteSpiData(s->buff[i]);
00307         }
00308 
00309         //carrega o estado do protocolo.
00310         s->state = (s->mf==1) ?  ST_WAIT_RECV : ST_FINISHED_RECV;
00311 
00312 }
00313 
00322 void carrega_img(struct sftd_state *s){
00323         int i;
00324         char a[20];
00325 
00326         DEBUG_ENTER;
00327         if(s->nr_pkt == 0){
00328                 //Carrega ponteiro do display para o inicio dele.
00329                 WriteSpiCommand(0x2b);  // PASET Linha inicial e final
00330                 WriteSpiData(0);
00331                 WriteSpiData(131);
00332                 WriteSpiCommand(0x2a);  // CASET Coluna inicial e final
00333                 WriteSpiData(0);
00334                 WriteSpiData(131);
00335                 WriteSpiCommand(0x2c);  // Write Memory
00336 
00337                 contImg = 0;    //contador da imagem é inicializado.
00338                 for(i=0;i<TAM_BUFF_TEMP;i++) buff_temp[i]=0;//zera o buffer de dados temporarios para caracteres repetidos.
00339                 flag_buff_temp = 0;
00340                 n_buff = 0;
00341                 break_geral = 0;
00342         }
00343 
00344         if(contImg < TOTAL_PIXEL && break_geral==0){    //atualmente total_pixel é 26136.
00345                 for(i=0;i<s->len_buff;){//é limitado em relação ao tamanho do buffer do arquivo.
00346                         if(contImg >= TOTAL_PIXEL) break;       //ja completou o lcd.
00347 
00348                         if(flag_buff_temp > 0){ //significa que tem pixel repetidos.
00349                                 while(n_buff--){        //grava três pixels
00350                                         if(flag_buff_temp == 3){ //significa que dois pixels é dobuffer anterior.
00351                                                 WriteSpiData(buff_temp[0]);     // R1G1
00352                                                 WriteSpiData(buff_temp[1]);     // B1R2
00353                                                 WriteSpiData(s->buff[i]);       // G2B2
00354                                                 contImg+=3;
00355                                         }
00356                                         else{   //um é do buffer antigo.
00357                                                 WriteSpiData(buff_temp[0]);     // R1G1
00358                                                 WriteSpiData(s->buff[i]);       // B1R2
00359                                                 WriteSpiData(s->buff[i+1]);     // G2B2
00360                                                 contImg+=3;
00361                                         }
00362                                 }
00363                                 i = flag_buff_temp -1;  //quantidade de pacotes utilizados do buffer que chegou.
00364                                 if(flag_buff_temp!=1) flag_buff_temp = 0; //se for1 é igual a n_buff...
00365                         }//flag 1
00366 
00367                         //n_buff só é alterado caso o ultimo dado do pacote anterior não tenha sido ele mesmo.
00368                         if(flag_buff_temp ==1) flag_buff_temp = 0;      //n_buff fica com o valor do ultimo pacote.
00369                         else n_buff = s->buff[i] & 0xff; //nro de pixels repetidos.
00370                         if(n_buff == 0xfa) { break_geral = 1; break; }//break total...................................................
00371                         while(n_buff--){        //grava três pixel
00372                                 WriteSpiData(s->buff[i+1]);     // R1G1
00373                                 WriteSpiData(s->buff[i+2]);     // B1R2
00374                                 WriteSpiData(s->buff[i+3]);     // G2B2
00375                                 contImg+=3;
00376                         }
00377                         i +=4;//contador do buffer do pacote.
00378 
00379                         if(i > s->len_buff){//  significa que não pode carregar as imagens, devido ao buffer chegar ao fim.
00380                                 if(i == s->len_buff + 4) break; //todos os dados vão estar no proximo pacote.
00381                                 flag_buff_temp = i - s->len_buff; //máximo é três mínimo é 1.
00382                                 n_buff = s->buff[i - 3] & 0xff; //nro de pixels repetidos.
00383                                 if(n_buff == 0xfa){ break_geral = 1; break; }//break total...................................................
00384                                 if(flag_buff_temp == 3){        //significa que tem mais dois no buffer.
00385                                         buff_temp[0] = s->buff[i-2];
00386                                         buff_temp[1] = s->buff[i-1];
00387                                 }
00388                                 else buff_temp[0] = s->buff[i-1];       //então é apenas um pacote.
00389                         }
00390                 }//total do pacote vindo da internet.
00391 
00392         }//total_pixel
00393 
00394         //carrega o estado do protocolo.
00395         s->state = (s->mf==1) ?  ST_WAIT_RECV : ST_FINISHED_RECV;
00396 
00397         //configura flag_sendu para 0, significa que pacote terminou de receber.
00398         if(break_geral == 1) flag_sendu = 0;
00399 
00400 }
00401 
00402 
00403 
00409 void envia_msg(struct sftd_state *s){
00410         int i;
00411         char a[20];
00412         struct txtinfo stxt;
00413 
00414         DEBUG_ENTER;
00415 
00416         //limpa display
00417         WriteSpiCommand(0x2b);  // PASET Linha inicial e final
00418         WriteSpiData(0);
00419         WriteSpiData(131);
00420         WriteSpiCommand(0x2a);  // CASET Coluna inicial e final
00421         WriteSpiData(0);
00422         WriteSpiData(131);
00423         WriteSpiCommand(0x2c);  // Write Memory
00424 
00425         for(i=0; i < 26136;){
00426                 WriteSpiData(0xff); i++;
00427                 WriteSpiData(0xff); i++;
00428                 WriteSpiData(0xff); i++;
00429         }
00430 
00431 
00432         //Carrega ponteiro do display para o inicio dele.
00433         WriteSpiCommand(0x2b);  // PASET Linha inicial e final
00434         WriteSpiData(0);
00435         WriteSpiData(131);
00436         WriteSpiCommand(0x2a);  // CASET Coluna inicial e final
00437         WriteSpiData(0);
00438         WriteSpiData(131);
00439         WriteSpiCommand(0x2c);  // Write Memory
00440 
00441         //mensagem inicial
00442         stxt.corfundo = 0xff0;  /* Fundo amarelo */
00443         stxt.corfrente = 0x4700;        /* Texto vermelho */
00444         stxt.linha = 5;
00445         stxt.coluna = 2;
00446         txtattrib(&stxt);
00447 
00448         DEBUG_ENTER;
00449 
00450         lcdgr_puts(" TCC - MULT UIP "); // Escreve no display grafico
00451 
00452         //escreve mensagem no display.
00453         stxt.corfundo = 0xff0;  /* Fundo amarelo */
00454         stxt.corfrente = 0x007; /* Texto azul */
00455         stxt.linha = 30;
00456         stxt.coluna = 1;
00457         txtattrib(&stxt);
00458 
00459         lcdgr_puts(s->buff);
00460 
00461         s->state = (s->mf==1) ?  ST_WAIT_RECV : ST_FINISHED_RECV;
00462 
00463         DEBUG_EXIT;
00464 
00465 }
00466 
00467