IvoSilva

[RCOM] Projecto

Oct 28th, 2014
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 21.65 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <signal.h>
  7. #include <termios.h>
  8. #include <sys/stat.h>
  9. #include <sys/types.h>
  10. #include <sys/ioctl.h>
  11.  
  12. // Variáveis de configuração
  13.  
  14. #define BAUDRATE B38400
  15. #define MODEMDEVICE "/dev/ttyS"
  16. #define RECEIVER 0
  17. #define TRANSMITTER 1
  18. #define alarm_timeout 3
  19. #define numTransmissions 2
  20. #define filename "pinguim.gif"
  21. #define packetsize 100
  22.  
  23. // Variáveis de mensagem
  24.  
  25. #define F 0x7e
  26. #define A 0x03
  27. #define S 0x03
  28. #define U 0x07
  29.  
  30. #define I0 0x00
  31. #define I1 0x40
  32.  
  33. #define RR0 0x05
  34. #define RR1 0x85
  35.  
  36. #define REJ0 0x01
  37. #define REJ1 0x81
  38.  
  39. #define DISC 0x0B
  40.  
  41.  
  42. // Variáveis globais
  43.  
  44. int time_flag, counter = 0;
  45. struct termios oldtio;
  46.  
  47. typedef struct
  48. {
  49.     long int filesize;
  50.     char *filepath;
  51.     char *filedata;
  52. } imageFile;
  53.  
  54. imageFile ficheiro_de_imagem;
  55.  
  56. typedef struct
  57. {
  58.     int dataSeq, packetSize;
  59.     char tramaSeq;
  60. } dataConnection;
  61.  
  62. dataConnection dataHandler;
  63.  
  64. // Funções
  65.  
  66. void atende()
  67. {
  68.     time_flag = 1;
  69.     counter++;
  70. }
  71.  
  72. void printBar (char symbol)
  73. {
  74.     int i;
  75.     struct winsize w;
  76.  
  77.     ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  78.  
  79.     for (i = 0; i < w.ws_col; i++)
  80.         printf ("%c", symbol);
  81. }
  82.  
  83. void printm (char *string, int adjust)
  84. {
  85.     int i;
  86.     struct winsize w;
  87.  
  88.     ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  89.  
  90.     for (i = 0; i < (w.ws_col / 2) - (strlen(string) / 2) + adjust ; i++)
  91.         printf (" ");
  92.    
  93.     printf ("%s", string);
  94. }
  95.  
  96. void create_information (char *buffer, int *buffer_size, char c, char *data, int data_size, char BCC2)
  97. {
  98.     int i;
  99.  
  100.     *buffer_size = data_size + 6;
  101.  
  102.     printm ("Data:", 0);
  103.     printf ("\n");
  104.     for (i = 0; i < data_size; i++)
  105.         printf ("%x |", data[i]);
  106.     printf ("\n");
  107.  
  108.     buffer[0] = F;
  109.     buffer[1] = A;
  110.     buffer[2] = c;
  111.     buffer[3] = buffer[1] ^ buffer[2];
  112.  
  113.     for (i = 0; i < data_size; i++)
  114.         buffer[i + 4] = data[i];
  115.  
  116.     if (BCC2 != NULL)
  117.     {
  118.         buffer[data_size + 4] = BCC2;
  119.         buffer[data_size + 5] = F;
  120.     }
  121.     else
  122.     {
  123.         buffer[data_size + 4] = F;
  124.         *buffer_size--;
  125.     }
  126.  
  127.     printm ("Information:", 0);
  128.     printf ("\n");
  129.     for (i = 0; i < *buffer_size; i++)
  130.         printf ("%x |", buffer[i]);
  131.     printf ("\n");
  132. }
  133.  
  134. unsigned char create_control_packet (char *buffer, int *buffer_size , int c, char *file_name, int filesize)
  135. {
  136.     int i;
  137.     unsigned char BCC2;
  138.  
  139.     *buffer_size = strlen(file_name) + 6;
  140.  
  141.     buffer[0] = (char) c;
  142.  
  143.     buffer[1] = (char) 0;
  144.     buffer[2] = (char) sizeof ((char) filesize);
  145.     buffer[3] = (char) filesize;
  146.  
  147.     buffer[4] = (char) 1;
  148.     buffer[5] = (char) sizeof (file_name);
  149.     for (i = 0; i < strlen(file_name); i++)
  150.         buffer[i + 6] = (char) file_name[i];
  151.  
  152.     BCC2 = buffer[0];
  153.     for (i = 1; i < strlen(file_name) + 6; i++)
  154.         BCC2 ^= buffer[i];
  155.  
  156.     return BCC2;
  157. }
  158.  
  159. unsigned char create_data_packet (char* buffer, int* buffer_size, int n, char *file_name, int filesize)
  160. {
  161.     char BCC2;
  162.     int i, L2 = (int) (packetsize * 8 / 256), L1 = (int) (packetsize * 8) - L2 * 256;
  163.  
  164.     *buffer_size = strlen(file_name) + 4;
  165.  
  166.     buffer[0] = (char) 1;
  167.     buffer[1] = (char) n;  
  168.  
  169.     buffer[2] = (char) L2;
  170.     buffer[3]= (char) L1;
  171.  
  172.     for(i = 0; i < strlen(file_name); i++)
  173.         buffer[4+i]=file_name[i];
  174.  
  175.     BCC2 = buffer[0];
  176.     for (i = 1; i < strlen(file_name) + 4; i++)
  177.         BCC2 ^= buffer[i];
  178.  
  179.     return BCC2;
  180. }
  181.  
  182. int menu ()
  183. {
  184.     int op = 0;
  185.  
  186.     system ("clear");
  187.     printBar ('*');
  188.     printm ("Programa iniciado!", 0);
  189.     printf ("\n\n\n");
  190.     printm ("Menu (escolher função do programa):", 0);
  191.     printf ("\n");
  192.     printm ("1. Emissor (llwrite).", 0);
  193.     printf ("\n");
  194.     printm ("2. Receptor (llread).", 0);
  195.     printf ("\n");
  196.     printm ("3. Sair.", 0);
  197.     printf ("\n\n");
  198.     printm ("Opcao: ", 0);
  199.     scanf ("%d", &op);
  200.  
  201.     return op;
  202. }
  203.  
  204. void sair ()
  205. {
  206.     system ("clear");
  207.  
  208.     printBar ('*');
  209.     printm ("Programa a encerrar...", 0);
  210.     printf ("\n");
  211.     printBar ('*');
  212.     sleep (1);
  213. }
  214.  
  215. char read_control_packet (int fd, char BCC2)
  216. {  
  217.     char bit_received, auxFile[30], received_message[255];
  218.     int state=0, i, res, count = 0;
  219.  
  220.     while (state < 6)
  221.     {
  222.         res = read (fd, &bit_received, 1);
  223.         if(res == -1)
  224.             return NULL;
  225.  
  226.         switch (state)
  227.         {
  228.                 case 0:
  229.                     if (bit_received == 0)
  230.                     {
  231.                         received_message[count] = bit_received;
  232.                         state++;
  233.                         count++;
  234.                     }
  235.                     else
  236.                         return NULL;
  237.                     break;
  238.  
  239.                 case 1:
  240.                     received_message[count] = bit_received;
  241.                     state++;
  242.                     count++;
  243.                     break;
  244.  
  245.                 case 2:
  246.                     auxFile[0] = bit_received;
  247.                     received_message[count++] = bit_received;
  248.                     for(i = 1; i < received_message[state--]; i++, count++)
  249.                     {
  250.                         res = read (fd, &bit_received, 1);
  251.                         if(res == -1)
  252.                             return NULL;
  253.  
  254.                         auxFile[i] = bit_received;
  255.                         received_message[count] = bit_received;
  256.                     }
  257.  
  258.                     ficheiro_de_imagem.filesize = (int) auxFile; // Isto tem de ser no llread() caso a mensagem esteja correcta.
  259.  
  260.                     state++;
  261.                     count++;
  262.                     break;
  263.  
  264.                 case 3:
  265.                     if (bit_received == 1)
  266.                     {
  267.                         received_message[count] = bit_received;
  268.                         state++;
  269.                         count++;
  270.                     }
  271.                     else
  272.                         return NULL;
  273.                     break;
  274.                    
  275.                 case 4:
  276.                     received_message[count] = bit_received;
  277.                     state++;
  278.                     count++;
  279.                     break;
  280.  
  281.                 case 5:
  282.                     auxFile[0] = bit_received;
  283.                     received_message[count++] = bit_received;
  284.                     for(i = 1; i < received_message[state--]; i++, count++)
  285.                     {
  286.                         res = read (fd, &bit_received, 1);
  287.                         if(res == -1)
  288.                             return NULL;
  289.  
  290.                         auxFile[i] = bit_received;
  291.                         received_message[count] = bit_received;
  292.                     }
  293.  
  294.                     // Isto tem de ser no llread() caso a mensagem esteja correcta.
  295.                     ficheiro_de_imagem.filepath = (long int) malloc (received_message[state--]);
  296.                     for (i = 0; i < received_message[state--]; i++)
  297.                         ficheiro_de_imagem.filepath[i] = auxFile[i];
  298.  
  299.                     state++;
  300.                     count++;
  301.                     break;
  302.  
  303.                 default:
  304.                     break;
  305.         }
  306.     }
  307.  
  308.     for (i = 0; i < count; i++)
  309.         BCC2 ^= received_message[i];
  310.  
  311.     return BCC2;
  312. }
  313.  
  314. char read_data_packet (int fd, char BCC2, char *data)
  315. {
  316.     int i, count = 0, state = 0, res;
  317.     char received_message[255], bit_received, auxFile[255];
  318.  
  319.     while (state < 4)
  320.     {
  321.         res = read (fd, &bit_received, 1);
  322.         if(res == -1)
  323.             return NULL;
  324.  
  325.         switch (state)
  326.         {
  327.             case 0:
  328.                 received_message[count] = bit_received;
  329.                 dataHandler.dataSeq = (int) bit_received;
  330.                 state++;
  331.                 count++;
  332.                 break;
  333.            
  334.             case 1:
  335.                 received_message[count] = bit_received;
  336.                 state++;
  337.                 count++;
  338.                 break;
  339.  
  340.             case 2:
  341.                 received_message[count] = bit_received;
  342.                 dataHandler.packetSize = (int) (256 * (int) received_message[count - 1] + (int) received_message[count]);
  343.                 state++;
  344.                 count++;
  345.                 break;
  346.  
  347.             case 3:
  348.                 auxFile[0] = bit_received;
  349.                 received_message[count++] = bit_received;
  350.                 for(i = 1; i < dataHandler.packetSize; i++, count++)
  351.                 {
  352.                     res = read (fd, &bit_received, 1);
  353.                     if(res == -1)
  354.                         return NULL;
  355.  
  356.                     auxFile[i] = bit_received;
  357.                     received_message[count] = bit_received;
  358.                 }
  359.  
  360.                 /*ficheiro_de_imagem->filedata = (char *) malloc (sizeof(char) * dataHandler->packetSize);
  361.                 for (i = 0; i < received_message[state--]; i++)
  362.                     ficheiro_de_imagem->filedata[i] = auxFile[i];*/
  363.  
  364.                 state++;
  365.                 count++;
  366.                 break;
  367.         }
  368.     }
  369.     for (i = 0; i < count; i++)
  370.         BCC2 ^= received_message[i];
  371.  
  372.     data = (char *) malloc (sizeof(char) * dataHandler.packetSize);
  373.     for(i = 0; i < dataHandler.packetSize; i++)
  374.         data[i] = auxFile[i];
  375.  
  376.     return BCC2;
  377. }
  378.  
  379. void main (int argc, char** argv)
  380. {
  381.     int op = 0, fd, filesize;
  382.     char *buffer = NULL;
  383.  
  384.     while (op != 3)
  385.     {
  386.         op = menu();
  387.         switch (op)
  388.         {
  389.             case 1:
  390.                 fd = llopen (0, TRANSMITTER);
  391.                 if (fd != -1)
  392.                 {
  393.                     //filesize = myWrite (buffer);
  394.                     llwrite(fd, buffer, filesize);
  395.                 }
  396.                 break;
  397.             case 2:
  398.                 fd = llopen (0, RECEIVER);
  399.                 llread(fd, buffer);
  400.                 //saveToFile(buffer);
  401.                 break;
  402.             case 3:
  403.                 llclose (fd);
  404.                 sair();
  405.                 break;
  406.             default:
  407.                 break;
  408.         }
  409.     }  
  410. }
  411.  
  412. int llopen (int porta, int flag)
  413. {
  414.     /* -----    Variáveis  ----- */
  415.  
  416.     unsigned char send_message[5], receive_message[5], bit_received;
  417.     char buffer[1], gate[10] = MODEMDEVICE;
  418.     int vtime, fd, res[2], return_value, i;
  419.     unsigned int msg_sent = 0, state;
  420.     struct termios newtio;
  421.  
  422.     /* -----    Código     ----- */
  423.  
  424.     sprintf (buffer, "%d", porta);
  425.     strcat (gate, buffer);
  426.  
  427.     system ("clear");
  428.  
  429.     printBar ('*');
  430.     printm ("Função \"llopen(", -7);
  431.     printf ("%d, %d)\" iniciada!\n", porta, flag);
  432.  
  433.     if (flag == TRANSMITTER)
  434.     {
  435.         send_message[0] = F;
  436.         send_message[1] = A;
  437.         send_message[2] = S;
  438.         send_message[3] = send_message[1] ^ send_message[2];
  439.         send_message[4] = F;
  440.  
  441.         vtime = 3;
  442.  
  443.         fd = open(gate, O_RDWR | O_NOCTTY | O_NONBLOCK);
  444.     }
  445.     else if (flag == RECEIVER)
  446.     {
  447.         send_message[0] = F;
  448.         send_message[1] = A;
  449.         send_message[2] = U;
  450.         send_message[3] = send_message[1] ^ send_message[2];
  451.         send_message[4] = F;
  452.  
  453.         vtime = 0;
  454.  
  455.         fd = open(gate, O_RDWR | O_NOCTTY);
  456.     }
  457.     else
  458.         return -1;
  459.  
  460.     if (fd < 0)
  461.             return -1;
  462.  
  463.     // Teste ao apontador para o Pipe.
  464.  
  465.     if (tcgetattr (fd, &oldtio) == -1)
  466.     {
  467.         perror ("tcgetattr");
  468.         return -1;
  469.     }
  470.  
  471.     // Configuração da ligação.
  472.  
  473.     bzero(&newtio, sizeof(newtio));
  474.     newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  475.     newtio.c_iflag = IGNPAR;
  476.     newtio.c_oflag = 0;
  477.  
  478.     /* set input mode (non-canonical, no echo,...) */
  479.     newtio.c_lflag = 0;
  480.  
  481.     newtio.c_cc[VTIME]    = vtime;   /* inter-character timer unused */
  482.     newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 chars received */
  483.  
  484.     /* VTIME e VMIN devem ser alterados de forma a proteger com um temporizador a leitura do(s) próximo(s) caracter(es) */
  485.  
  486.     tcflush(fd, TCIOFLUSH);
  487.     if (tcsetattr (fd, TCSANOW, &newtio) == -1)
  488.     {
  489.         perror ("tcsetattr");
  490.         return -1;
  491.     }
  492.  
  493.     (void) signal(SIGALRM, atende);
  494.  
  495.     if (flag == TRANSMITTER)
  496.     {
  497.         for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions && msg_sent != 1;)
  498.         {
  499.             if (time_flag)
  500.             {
  501.                 alarm (alarm_timeout);
  502.                 time_flag = 0;
  503.            
  504.                 printm ("A enviar SETUP: tentativa #", -1);
  505.                 printf ("%d\n", counter + 1);
  506.  
  507.                 res[0] = write (fd, send_message, 5);
  508.  
  509.                 while (state < 5)
  510.                 {
  511.                     res[1] = read (fd, &bit_received, 1);
  512.                     if(res[1] == -1)
  513.                         break;
  514.  
  515.                     switch (state)
  516.                     {
  517.                         case 0:
  518.                           if (bit_received == F)
  519.                           {
  520.                             receive_message[state]=bit_received;
  521.                             state++;
  522.                           }
  523.                           break;
  524.  
  525.                         case 1:
  526.                           if (bit_received == A)
  527.                           {
  528.                             receive_message[state]=bit_received;
  529.                             state++;
  530.                           }
  531.                           else if (bit_received != A && bit_received !=F)
  532.                             state--;
  533.                           break;
  534.                  
  535.                         case 2:
  536.                           if (bit_received == U)
  537.                           {
  538.                             receive_message[state]=bit_received;
  539.                             state++;
  540.                           }
  541.                           else if (bit_received == F)
  542.                             state--;
  543.                           else
  544.                             state = 0;
  545.                           break;
  546.  
  547.                         case 3:
  548.                           if (bit_received == (A^U))
  549.                           {
  550.                             receive_message[state]=bit_received;
  551.                             state++;
  552.                           }
  553.                           else
  554.                             state = 0;
  555.                           break;
  556.  
  557.                         case 4:
  558.                           if (bit_received == F)
  559.                           {
  560.                             receive_message[state]=bit_received;
  561.                             state++;
  562.                             msg_sent = 1;
  563.                           }
  564.                           else
  565.                             state = 0;
  566.                           break;
  567.  
  568.                         default:
  569.                             break;
  570.                     }
  571.                 }
  572.             }
  573.         }
  574.  
  575.         if (msg_sent == 0)
  576.         {
  577.             printm ("Mensagem não enviada (não recebeu UA).", +3);
  578.             printf ("\n");
  579.             return_value = -1;
  580.         }
  581.         else
  582.         {
  583.             printm ("Mensagem enviada (recebeu UA).", 0);
  584.             printf ("\n");
  585.             printm ("Mensagem UA:", 0);
  586.             printf ("\n");
  587.             printm (" ", -5);
  588.             for(i = 0; i < state; i++)
  589.                 printf("%x", receive_message[i]);
  590.             printf ("\n");
  591.             return_value = fd;
  592.         }
  593.     }
  594.     else if (flag == RECEIVER)
  595.     {
  596.         state = 0;
  597.         while (state < 5)
  598.         {
  599.             res[1] = read (fd, &bit_received, 1);
  600.  
  601.             switch (state)
  602.             {
  603.                     case 0:
  604.                             if (bit_received == F)
  605.                             {
  606.                                     receive_message[state] = bit_received;
  607.                                     state++;
  608.                             }
  609.                             break;
  610.                     case 1:
  611.                             if (bit_received == A)
  612.                             {
  613.                                     receive_message[state] = bit_received;
  614.                                     state++;
  615.                             }
  616.                             else if (bit_received != F && bit_received != A)
  617.                                     state--;
  618.                             break;
  619.                     case 2:
  620.                             if (bit_received == S)
  621.                             {
  622.                                     receive_message[state] = bit_received;
  623.                                     state++;
  624.                             }
  625.                             else if (bit_received == F)
  626.                                     state--;
  627.                             else
  628.                                     state = 0;
  629.                             break;
  630.                     case 3:
  631.                             if (bit_received == (A ^ S))
  632.                             {
  633.                                     receive_message[state] = bit_received;
  634.                                     state++;
  635.                             }
  636.                             else if (bit_received == F)
  637.                                     state = 1;
  638.                             else
  639.                                     state = 0;
  640.                             break;
  641.                     case 4:
  642.                             if (bit_received == F)
  643.                             {
  644.                                     receive_message[state] = bit_received;
  645.                                     state++;
  646.                                     msg_sent = 1;
  647.                             }
  648.                             else
  649.                                     state = 0;
  650.                             break;
  651.                     default:
  652.                         break;
  653.             }
  654.         }
  655.        
  656.         if (msg_sent == 0)
  657.         {
  658.             printm ("Mensagem não enviada (não recebeu SETUP).", +3);
  659.             printf ("\n");
  660.             return_value = -1;
  661.         }
  662.         else
  663.         {
  664.             printm ("Mensagem enviada (recebeu SETUP).", 0);
  665.             printf ("\n");
  666.             printm ("Mensagem SETUP:", 0);
  667.             printf ("\n");
  668.             printm (" ", -5);
  669.             for(i = 0; i < state; i++)
  670.                 printf("%x", receive_message[i]);
  671.             printf ("\n");
  672.  
  673.             res[0] = write(fd, send_message, 5);
  674.             /*if (!res[0])
  675.                 printf("Mensagem (UA) não enviada.\n");
  676.             else
  677.                 printf("%d bytes (UA) enviados.\n", res[0]);*/
  678.  
  679.             return_value = fd;
  680.         }
  681.     }
  682.  
  683.     printf ("\n\n");
  684.     printm ("Função \"llopen(", -7);
  685.     printf ("%d, %d)\" a fechar!\n", porta, flag);
  686.     printm ("Clique numa tecla para voltar ao menu.", 0);
  687.     printf ("\n");
  688.     printBar ('*');
  689.     getchar();
  690.     getchar();
  691.  
  692.     return return_value;
  693. }
  694.  
  695. int llwrite (int fd, char * buffer, int length)
  696. {
  697.     char *cntrl_message, *data_message, *message, *message_received, bit_received;
  698.     unsigned char BCC2;
  699.     int file_found = 1, i, cntrl_size, message_size, msg_error = 0, state, res, buffer_size;
  700.     FILE *pImg;
  701.  
  702.     while (file_found)
  703.     {
  704.         system ("clear");
  705.         printBar ('*');
  706.         printm ("Nome do ficheiro a usar: pinguim.gif", 0);
  707.         printf ("\n");
  708.         printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  709.         printf ("\n\n\n");
  710.  
  711.         pImg = fopen (filename, "r");
  712.         if (pImg == NULL)
  713.         {
  714.             printm ("Ficheiro não encontrado.", 0);
  715.             printf ("\n");
  716.             printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  717.             printf ("\n");
  718.             printm ("Clique <Enter> para voltar a tentar.", 0);
  719.             getchar ();
  720.         }
  721.         else
  722.         {
  723.             file_found = 0;
  724.             printm ("Ficheiro encontrado.", 0);
  725.             printf ("\n");
  726.             printm ("Clique <Enter> para continuar.", 0);
  727.             getchar ();
  728.         }
  729.     }
  730.  
  731.     // Leitura do conteúdo da imagem para variável "buffer"
  732.     fseek (pImg, 0, SEEK_END);
  733.     length = ftell (pImg);
  734.     fseek (pImg, 0, SEEK_SET);
  735.  
  736.     buffer = (char *) malloc (sizeof(char) * length);
  737.  
  738.     for (i = 0; i < length; i++)
  739.         buffer[i] = getc(pImg);
  740.  
  741.     fclose (pImg);
  742.     // Leitura do conteúdo da imagem para variável "buffer"
  743.  
  744.     // Primeira mensagem a enviar: Pacote de controlo (start)
  745.     cntrl_message = (char *) malloc (sizeof(char) * (strlen(filename) + 6));
  746.     BCC2 = create_control_packet (cntrl_message, &cntrl_size, 2, filename, length);
  747.    
  748.     message = (char *) malloc (sizeof(char) * (cntrl_size + 6));
  749.     create_information (message, &message_size, I0, cntrl_message, cntrl_size, BCC2);
  750.  
  751.     // Primeira mensagem a enviar: Pacote de controlo (start)
  752.  
  753.     // Leitura de verificação
  754.     for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions;)
  755.     {
  756.         if (time_flag)
  757.         {
  758.             alarm (alarm_timeout);
  759.             time_flag = 0;
  760.  
  761.             write (fd, message, message_size); // envio do pacote de controlo
  762.            
  763.             while (state < 6 || denied != 1)
  764.             {
  765.                 res = read (fd, &bit_received, 1);
  766.                 if(res == -1)
  767.                     break;
  768.  
  769.                 switch (state)
  770.                 {
  771.                     case 0:
  772.                         if (bit_received == F)
  773.                             state++;
  774.                         else
  775.                             denied = 1;
  776.  
  777.                         break;
  778.  
  779.                     case 1:
  780.                         if (bit_received == A)
  781.                             state++;
  782.                         else
  783.                             denied = 1;
  784.  
  785.                         break;
  786.  
  787.                     case 2:
  788.                         auxCntrl = bit_received;
  789.                         state++;
  790.                         break;
  791.  
  792.                     case 3:
  793.                         if (bit_received == auxCntrl ^ A)
  794.                             state++;
  795.                         else
  796.                             denied = 1;
  797.  
  798.                         break;
  799.  
  800.                     case 4:
  801.                         if (bit_received == F)
  802.                             state++;
  803.                         else
  804.                             denied = 1;
  805.  
  806.                         break;
  807.  
  808.                     case 5: // verifcar RRs, REJs e DISC
  809.                         if (auxCntrl == RR1 && dataHandler.tramaSeq == I0)
  810.                         {
  811.                             dataHandler.tramaSeq = I1;
  812.                             // create_new (message);
  813.                         }
  814.  
  815.                 }
  816.             }
  817.         }
  818.     }  
  819.     // Leitura de verificação
  820.  
  821.     return length;
  822. }
  823.  
  824. /* ----- llread -----
  825. argumentos
  826.     fd: identificador da ligação de dados
  827.     buffer: array de caracteres recebidos
  828. retorno
  829.     comprimento do array (número de caracteres lidos)
  830.     valor negativo em caso de erro
  831. */
  832. int llread (int fd, char *buffer)
  833. {
  834.     char bit_received, *data, BCC2, auxCntrl;
  835.     int msg_wanted = 0, state = 0, res, final = 0;
  836.  
  837.     dataHandler.tramaSeq = I0;
  838.  
  839.     /* while (auxCntrl != DISC) */
  840.     msg[0] = F;
  841.     while (bit_received != F)
  842.     {
  843.         read (fd, &bit_received, 1);
  844.         msg[i++] = bit_received;
  845.     }
  846.  
  847.     while (state < 8)
  848.     {
  849.         /*res = read (fd, &bit_received, 1);
  850.         if(res == -1)
  851.             return NULL;*/
  852.  
  853.         switch (state)
  854.         {
  855.                 case 0:
  856.                     if (bit_received == F)
  857.                         state++;
  858.  
  859.                     break;
  860.  
  861.                 case 1:
  862.                     if (bit_received == A)
  863.                         state++;
  864.                     else
  865.                         state = 0;
  866.  
  867.                     break;
  868.  
  869.                 case 2:
  870.                     if (bit_received == dataHandler.tramaSeq)
  871.                     {
  872.                         msg_wanted = 1;
  873.                         state++;
  874.                     }
  875.  
  876.                     break;
  877.  
  878.                 case 3:
  879.                     if (bit_received == A ^ dataHandler.tramaSeq)
  880.                         state++;
  881.                     else
  882.                         state = 0;
  883.  
  884.                     break;
  885.  
  886.                 case 4:
  887.                     if (bit_received == 1)
  888.                     {
  889.                         BCC2 = read_data_packet (fd, bit_received, data);
  890.                         state++;
  891.                     }
  892.                     else if (bit_received == 2)
  893.                     {
  894.                         BCC2 = read_control_packet (fd, bit_received);
  895.                         state++;
  896.                     }
  897.                     else if (bit_received == 3)
  898.                     {
  899.                         BCC2 = read_control_packet (fd, bit_received);
  900.                         state++;
  901.                         final = 1;
  902.                     }
  903.                     else
  904.                         state = 0;
  905.  
  906.                     break;
  907.  
  908.                 case 5:
  909.                     if (bit_received == BCC2)
  910.                         state++;
  911.                     else
  912.                         state = 0;
  913.  
  914.                     break;
  915.  
  916.                 case 6:
  917.                     if (bit_received == F)
  918.                         state++;
  919.                     else
  920.                         state = 0;
  921.  
  922.                     break;
  923.  
  924.                 case 7:
  925.                     if (msg_wanted && final == 0)
  926.                     {
  927.                         if (dataHandler.tramaSeq == I0)
  928.                         {
  929.                             dataHandler.tramaSeq = I1;
  930.                             auxCntrl = RR1;
  931.                         }
  932.                         else if (dataHandler.tramaSeq == I1)
  933.                         {
  934.                             dataHandler.tramaSeq = I0;
  935.                             auxCntrl = RR0;
  936.                         }
  937.                         // concatenar data ou guardar filepath e filesize
  938.                     }
  939.                     else if (msg_wanted && final == 1)
  940.                     {
  941.                         auxCntrl = DISC;
  942.                     }
  943.                     else if (!msg_wanted)
  944.                     {
  945.                         if (dataHandler.tramaSeq == I0)
  946.                             auxCntrl = REJ0;
  947.                         else if (dataHandler.tramaSeq == I1)
  948.                             auxCntrl = REJ1;
  949.                     }
  950.  
  951.                     buffer = (char *) malloc (sizeof(char) * 5);
  952.                     create_information (buffer, 5, auxCntrl, NULL, 0, NULL);
  953.                     write (fd, buffer, 5);
  954.  
  955.                 default:
  956.                     break;
  957.  
  958.         }
  959.     }
  960.     /* --- */
  961.  
  962.     // Criação do ficheiro com data
  963. }
  964.  
  965.  
  966. int llclose (int fd)
  967. {
  968.     if (tcgetattr (fd, &oldtio) == -1)
  969.     {
  970.         perror ("tcgetattr");
  971.         return -1;
  972.     }
  973.  
  974.     close (fd);
  975.  
  976.     return 0;
  977. }
Advertisement
Add Comment
Please, Sign In to add comment