sftd_ok.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 
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 ax[5];
00116         char ax1[5], id[5];
00117         int i;
00118 
00119         sprintf(estado,"Estado: %d\n", s->state);
00120         DEBUG_SFT(estado);
00121 
00122         dataptr = (char *)uip_appdata;
00123 
00124         //significa que é um comando sem seguranca e o primeiro pacote com o cabecalho ja foi tratado.
00125         if(flag_sendu>0){
00126                 DEBUG_SFT("FLAG_SENDU");
00127                 s->len_buff = strlen(dataptr);
00128                 if (s->len_buff == 0){
00129                         flag_sendu = 0;
00130                         return 0;
00131                 }
00132                 s->nr_pkt = flag_sendu++;
00133                 strcpy(s->buff,dataptr);
00134                 carrega_imgu(s);
00135                 s->state = ST_RECVU;
00136                 return 0;
00137         }
00138 
00139         //para ser um protocolo tem que ser maior que 8. é o header do protocolo. E nao pode ser continuacao do protocolo sendu.
00140         if(strlen(dataptr)>5 && (flag_sendu==0)){
00141 
00142                 //pega o tipo de comando.
00143                 strncpy(ax, dataptr, 2);
00144                 s->cmd = atoi(ax);
00145                 sprintf(estado, "\ncmd: %d\t", s->cmd);
00146                 DEBUG_SFT(estado);
00147 //              printf(estado);
00148 
00149                 //tamanho do pacote
00150                 ax[0] = dataptr[2]; ax[1] = dataptr[3]; ax[2] = dataptr[4]; ax[3] = dataptr[5];
00151                 s->len_buff = atoi(ax);
00152                 sprintf(estado, "len: %d\t", s->len_buff);
00153                 DEBUG_SFT(estado);
00154 //              printf(estado);
00155 
00156                 //se tem mais fragmentos da mesma mensagem.
00157                 s->mf = atoi(dataptr[6]);
00158                 sprintf(estado, "MF: %d\t", s->mf);
00159                 DEBUG_SFT(estado);
00160 //              printf(estado);
00161 
00162                 //pega o nro do pacote.
00163                 ax1[0] = dataptr[7]; ax1[1] = dataptr[8];
00164                 s->nr_pkt = atoi(ax1);
00165                 sprintf(estado, "NRO PKT: %d\t", s->nr_pkt);
00166                 DEBUG_SFT(estado);
00167 //              printf(estado);
00168                 if(s->nr_pkt==0) printf("");
00169 
00170 //              fflush(stdout);
00171                 for(i=0; i<s->len_buff;i++) s->buff[i] = dataptr[i + 9];
00172 
00173                 switch (s->cmd){
00174 
00175                         //comando que recebe uma imagem.
00176                         case CMD_RECV:
00177                                 s->state = ST_RECV;
00178                                 carrega_img(s);
00179                                 break;
00180 
00181                         case CMD_STOP:
00182                                 s->state = ST_STOP;
00183                                 info_host_stop(s);
00184                                 break;
00185                         case CMD_RECV_X:
00186                                 s->state = ST_RECV;
00187                                 carrega_img_old(s);
00188                                 break;
00189                         case CMD_RECVU:
00190                                 s->state = ST_RECVU;
00191                                 flag_sendu = 1;
00192                                 carrega_img(s);
00193                         default:
00194                                 info_host_error(s);
00195                                 break;
00196 
00197                 }
00198 
00199                 //maquina de estados do protocolo.
00200                 switch(s->state){
00201                         case ST_WAIT_RECV:
00202                                 info_host_wait(s);
00203                                 break;
00204 
00205                         case ST_FINISHED_RECV:
00206                                 uart_puts("\nSFT enviou uma imagem para o display.");
00207                         default: break;
00208 
00209                 }
00210 
00211                 if((FIO4PIN & (1<<8))==0){
00212                         //DEBUG_ENTER;
00213                         printf("\nfim do envio de imagens.\n");
00214                         s->state = ST_STOP;
00215                         for(i=0; i < 26136;){
00216                                 WriteSpiData(0xff); i++;
00217                                 WriteSpiData(0xff); i++;
00218                                 WriteSpiData(0xff); i++;
00219                         }
00220                         info_host_stop(s);
00221                 }
00222         }
00223 
00224         return 0;
00225 }
00226 
00232 void info_host_wait(struct sftd_state *s){
00233         char bf[100];
00234         int len;
00235 
00236         //copia comando de resposta.
00237         sprintf(bf, "%02d", CMD_RECV_ANS);
00238         //strncpy(s->data_send, bf, 2);
00239 
00240         //tamamnho da resposta do comando.
00241         strncat(bf, "0002", 4);
00242 
00243         //more fragments == 0.
00244         strncat(bf, "0",1);
00245 
00246         //nro do pacote
00247         strncat(bf, "00",2);
00248 
00249         //mensagem
00250         strncat(bf, "ok", 2);
00251 
00252         //id
00253 //      strncat(bf, "%03d", s->id);
00254 //      len  = 14;
00255         len  = 11;
00256         uip_send(bf, len);
00257 }
00258 
00264 void info_host_error(struct sftd_state *s){
00265         char bf[100];
00266         int len;
00267 
00268         //copia comando de resposta.
00269         sprintf(bf, "%02d", CMD_ERROR);
00270         //strncpy(s->data_send, bf, 2);
00271 
00272         //tamamnho da resposta do comando.
00273         strncat(bf, "0002", 4);
00274 
00275         //more fragments == 0.
00276         strncat(bf, "0",1);
00277 
00278         //nro do pacote
00279         strncat(bf, "00",2);
00280 
00281         //mensagem
00282         strncat(bf, "xx", 2);
00283 
00284         //id
00285 //      strncat(bf, "%03d", s->id);
00286 //      len  = 14;
00287         len  = 11;
00288         uip_send(bf, len);
00289 }
00290 
00291 
00292 
00293 
00299 void info_host_stop(struct sftd_state *s){
00300         char bf[100];
00301         int len;
00302 
00303         //copia comando de resposta.
00304         sprintf(bf, "%02d", CMD_STOP);
00305         //strncpy(s->data_send, bf, 2);
00306 
00307         //tamamnho da resposta do comando.
00308         strncat(bf, "0002", 4);
00309 
00310         //more fragments == 0.
00311         strncat(bf, "0",1);
00312 
00313         //nro do pacote
00314         strncat(bf, "00",2);
00315 
00316         //mensagem
00317         strncat(bf, "ok", 2);
00318 
00319         //id
00320 //      strncat(bf, "%03d", s->id);
00321 //      len  = 14;
00322         len  = 11;
00323         uip_send(bf, len);
00324 }
00325 
00332 void carrega_img_old(struct sftd_state *s){
00333         int i;
00334         char a[20];
00335 
00336         DEBUG_ENTER;
00337 
00338         if(s->nr_pkt == 0){
00339                 //Carrega ponteiro do display para o inicio dele.
00340                 WriteSpiCommand(0x2b);  // PASET Linha inicial e final
00341                 WriteSpiData(0);
00342                 WriteSpiData(131);
00343                 WriteSpiCommand(0x2a);  // CASET Coluna inicial e final
00344                 WriteSpiData(0);
00345                 WriteSpiData(131);
00346                 WriteSpiCommand(0x2c);  // Write Memory
00347 
00348         }
00349 
00350         for(i=0;i < s->len_buff; i++){
00351                 //como o LPC2378 possui pouca memória o byte recebido é enviado direto para o display.
00352                 //printf("%x ",s->buff[i]);
00353                 WriteSpiData(s->buff[i]);
00354         }
00355 
00356         //carrega o estado do protocolo.
00357         s->state = (s->mf==1) ?  ST_WAIT_RECV : ST_FINISHED_RECV;
00358 
00359 }
00360 
00369 void carrega_img(struct sftd_state *s){
00370         int i;
00371         char a[20];
00372 
00373         DEBUG_ENTER;
00374         if(s->nr_pkt == 0){
00375                 //Carrega ponteiro do display para o inicio dele.
00376                 WriteSpiCommand(0x2b);  // PASET Linha inicial e final
00377                 WriteSpiData(0);
00378                 WriteSpiData(131);
00379                 WriteSpiCommand(0x2a);  // CASET Coluna inicial e final
00380                 WriteSpiData(0);
00381                 WriteSpiData(131);
00382                 WriteSpiCommand(0x2c);  // Write Memory
00383 
00384                 contImg = 0;    //contador da imagem é inicializado.
00385                 for(i=0;i<TAM_BUFF_TEMP;i++) buff_temp[i]=0;//zera o buffer de dados temporarios para caracteres repetidos.
00386                 flag_buff_temp = 0;
00387                 n_buff = 0;
00388                 break_geral = 0;
00389         }
00390 
00391         if(contImg < TOTAL_PIXEL && break_geral==0){    //atualmente total_pixel é 26136.
00392                 for(i=0;i<s->len_buff;){//é limitado em relação ao tamanho do buffer do arquivo.
00393                         if(contImg >= TOTAL_PIXEL) break;       //ja completou o lcd.
00394 
00395                         if(flag_buff_temp > 0){ //significa que tem pixel repetidos.
00396                                 while(n_buff--){        //grava três pixels
00397                                         if(flag_buff_temp == 3){ //significa que dois pixels é dobuffer anterior.
00398                                                 WriteSpiData(buff_temp[0]);     // R1G1
00399                                                 WriteSpiData(buff_temp[1]);     // B1R2
00400                                                 WriteSpiData(s->buff[i]);       // G2B2
00401                                                 contImg+=3;
00402                                         }
00403                                         else{   //um é do buffer antigo.
00404                                                 WriteSpiData(buff_temp[0]);     // R1G1
00405                                                 WriteSpiData(s->buff[i]);       // B1R2
00406                                                 WriteSpiData(s->buff[i+1]);     // G2B2
00407                                                 contImg+=3;
00408                                         }
00409                                 }
00410                                 i = flag_buff_temp -1;  //quantidade de pacotes utilizados do buffer que chegou.
00411                                 if(flag_buff_temp!=1) flag_buff_temp = 0; //se for1 é igual a n_buff...
00412                         }//flag 1
00413 
00414                         //n_buff só é alterado caso o ultimo dado do pacote anterior não tenha sido ele mesmo.
00415                         if(flag_buff_temp ==1) flag_buff_temp = 0;      //n_buff fica com o valor do ultimo pacote.
00416                         else n_buff = s->buff[i] & 0xff; //nro de pixels repetidos.
00417                         if(n_buff == 0xfa) { break_geral = 1; break; }//break total...................................................
00418                         while(n_buff--){        //grava três pixel
00419                                 WriteSpiData(s->buff[i+1]);     // R1G1
00420                                 WriteSpiData(s->buff[i+2]);     // B1R2
00421                                 WriteSpiData(s->buff[i+3]);     // G2B2
00422                                 contImg+=3;
00423                         }
00424                         i +=4;//contador do buffer do pacote.
00425 
00426                         if(i > s->len_buff){//  significa que não pode carregar as imagens, devido ao buffer chegar ao fim.
00427                                 if(i == s->len_buff + 4) break; //todos os dados vão estar no proximo pacote.
00428                                 flag_buff_temp = i - s->len_buff; //máximo é três mínimo é 1.
00429                                 n_buff = s->buff[i - 3] & 0xff; //nro de pixels repetidos.
00430                                 if(n_buff == 0xfa){ break_geral = 1; break; }//break total...................................................
00431                                 if(flag_buff_temp == 3){        //significa que tem mais dois no buffer.
00432                                         buff_temp[0] = s->buff[i-2];
00433                                         buff_temp[1] = s->buff[i-1];
00434                                 }
00435                                 else buff_temp[0] = s->buff[i-1];       //então é apenas um pacote.
00436                         }
00437                 }//total do pacote vindo da internet.
00438 
00439         }//total_pixel
00440 
00441         //carrega o estado do protocolo.
00442         s->state = (s->mf==1) ?  ST_WAIT_RECV : ST_FINISHED_RECV;
00443 
00444         //configura flag_sendu para 0, significa que pacote terminou de receber.
00445         if(break_geral == 1) flag_sendu = 0;
00446 
00447 }
00448 
00449 
00450 
00459 void carrega_imgu(struct sftd_state *s){
00460         int i;
00461         char a[20];
00462 
00463         DEBUG_ENTER;
00464 
00465         if(contImg < TOTAL_PIXEL && break_geral==0){    //atualmente total_pixel é 26136.
00466                 for(i=0;i<s->len_buff;){//é limitado em relação ao tamanho do buffer do arquivo.
00467                         if(contImg >= TOTAL_PIXEL) break;       //ja completou o lcd.
00468 
00469                         if(flag_buff_temp > 0){ //significa que tem pixel repetidos.
00470                                 while(n_buff--){        //grava três pixels
00471                                         if(flag_buff_temp == 3){ //significa que dois pixels é dobuffer anterior.
00472                                                 WriteSpiData(buff_temp[0]);     // R1G1
00473                                                 WriteSpiData(buff_temp[1]);     // B1R2
00474                                                 WriteSpiData(s->buff[i]);       // G2B2
00475                                                 contImg+=3;
00476                                         }
00477                                         else{   //um é do buffer antigo.
00478                                                 WriteSpiData(buff_temp[0]);     // R1G1
00479                                                 WriteSpiData(s->buff[i]);       // B1R2
00480                                                 WriteSpiData(s->buff[i+1]);     // G2B2
00481                                                 contImg+=3;
00482                                         }
00483                                 }
00484                                 i = flag_buff_temp -1;  //quantidade de pacotes utilizados do buffer que chegou.
00485                                 if(flag_buff_temp!=1) flag_buff_temp = 0; //se for1 é igual a n_buff...
00486                         }//flag 1
00487 
00488                         //n_buff só é alterado caso o ultimo dado do pacote anterior não tenha sido ele mesmo.
00489                         if(flag_buff_temp ==1) flag_buff_temp = 0;      //n_buff fica com o valor do ultimo pacote.
00490                         else n_buff = s->buff[i] & 0xff; //nro de pixels repetidos.
00491                         if(n_buff == 0xfa) { break_geral = 1; break; }//break total...................................................
00492                         while(n_buff--){        //grava três pixel
00493                                 WriteSpiData(s->buff[i+1]);     // R1G1
00494                                 WriteSpiData(s->buff[i+2]);     // B1R2
00495                                 WriteSpiData(s->buff[i+3]);     // G2B2
00496                                 contImg+=3;
00497                         }
00498                         i +=4;//contador do buffer do pacote.
00499 
00500                         if(i > s->len_buff){//  significa que não pode carregar as imagens, devido ao buffer chegar ao fim.
00501                                 if(i == s->len_buff + 4) break; //todos os dados vão estar no proximo pacote.
00502                                 flag_buff_temp = i - s->len_buff; //máximo é três mínimo é 1.
00503                                 n_buff = s->buff[i - 3] & 0xff; //nro de pixels repetidos.
00504                                 if(n_buff == 0xfa){ break_geral = 1; break; }//break total...................................................
00505                                 if(flag_buff_temp == 3){        //significa que tem mais dois no buffer.
00506                                         buff_temp[0] = s->buff[i-2];
00507                                         buff_temp[1] = s->buff[i-1];
00508                                 }
00509                                 else buff_temp[0] = s->buff[i-1];       //então é apenas um pacote.
00510                         }
00511                 }//total do pacote vindo da internet.
00512 
00513         }//total_pixel
00514         else flag_sendu = 0;
00515 
00516 
00517         //configura flag_sendu para 0, significa que pacote terminou de receber.
00518         if(break_geral == 1) flag_sendu = 0;
00519 
00520 }
00521 
00522