Advertisement
IvoSilva

[RCOM - Final] Receiver Functions

Oct 31st, 2014
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 28.82 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, position;
  50.     unsigned char *filepath;
  51.     unsigned char *filedata;
  52. } imageFile;
  53.  
  54. imageFile ficheiro_de_imagem;
  55.  
  56. typedef struct
  57. {
  58.     int dataSeq, packetSize;
  59.     unsigned 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 (unsigned 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 (unsigned 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. unsigned char * performStuffing(unsigned char *buffer, int length, int *destLength)
  97. {
  98.     unsigned char *stuffed = malloc(length * 2 * sizeof(unsigned char));  //  Worse case scenario!
  99.  
  100.     int i = 0, j = 0;
  101.  
  102.     for (; i < length; i++) {
  103.  
  104.         if (buffer[i] == 0x7e) {
  105.  
  106.             stuffed[j++] = 0x7d;
  107.             stuffed[j++] = 0x5e;
  108.  
  109.         } else if (buffer[i] == 0x7d) {
  110.  
  111.             stuffed[j++] = 0x7d;
  112.             stuffed[j++] = 0x5d;
  113.  
  114.         } else
  115.             stuffed[j++] = buffer[i];
  116.  
  117.     }
  118.  
  119.     (* destLength) = j;
  120.  
  121.     return stuffed;
  122. }
  123.  
  124. unsigned char * performDestuffing(unsigned char *buffer, int length, int *destLength)
  125. {
  126.     unsigned char *destuffed = malloc(length * sizeof(unsigned char));  //  Worse case scenario!
  127.    
  128.     int i = 0, j = 0;
  129.    
  130.     for (; i < length; i++, j++)
  131.     {
  132.        
  133.         if (buffer[i] == 0x7d)
  134.         {
  135.            
  136.             if (buffer[i + 1] == 0x5e)
  137.             {
  138.                
  139.                 destuffed[j] = 0x7e;
  140.                
  141.                 i++;
  142.                
  143.             }
  144.             else if (buffer[i + 1] == 0x5d) {
  145.                
  146.                 destuffed[j] = 0x7d;
  147.                
  148.                 i++;
  149.                
  150.             } else
  151.                 destuffed[j] = 0x7d;
  152.                
  153.         } else
  154.             destuffed[j] = buffer[i];
  155.        
  156.     }
  157.    
  158.     (* destLength) = j;
  159.    
  160.     return destuffed;
  161. }
  162.  
  163. unsigned char *getDataSeq (unsigned char *total_buffer, int total_size, int seq, int *new_size)
  164. {
  165.     int i, j, start;
  166.     unsigned char *buffer;
  167.  
  168.     if ((seq + 1) * packetsize > ficheiro_de_imagem.filesize)
  169.         *new_size = ficheiro_de_imagem.filesize - seq * packetsize;
  170.     else
  171.         *new_size = (seq + 1) * packetsize;
  172.  
  173.     buffer = (unsigned char *) malloc (sizeof(unsigned char) * packetsize);
  174.  
  175.     if (seq == 0)
  176.         start = 0;
  177.     else
  178.         start = seq * packetsize - 1;
  179.  
  180.     for (j = 0, i = start; i < *new_size; i++, j++)
  181.         buffer[j] = total_buffer[i];
  182.  
  183.     return buffer;
  184. }
  185.  
  186. void create_information (unsigned char *buffer, int *buffer_size, unsigned char c, unsigned char *data, int data_size, unsigned char BCC2)
  187. {
  188.     int i;
  189.  
  190.     *buffer_size = data_size + 6;
  191.  
  192.     /*printm ("Data:", 0);
  193.     printf ("\n");
  194.     for (i = 0; i < data_size; i++)
  195.         printf ("%x |", data[i]);
  196.     printf ("\n");*/
  197.  
  198.     buffer[0] = F;
  199.     buffer[1] = A;
  200.     buffer[2] = c;
  201.     buffer[3] = buffer[1] ^ buffer[2];
  202.  
  203.     for (i = 0; i < data_size; i++)
  204.         buffer[i + 4] = data[i];
  205.  
  206.     if (BCC2 != NULL)
  207.     {
  208.         buffer[data_size + 4] = BCC2;
  209.         buffer[data_size + 5] = F;
  210.     }
  211.     else
  212.     {
  213.         buffer[data_size + 4] = F;
  214.         *buffer_size--;
  215.     }
  216.  
  217.     buffer = performStuffing(buffer, buffer_size, &buffer_size);
  218.  
  219.     /*printm ("Information:", 0);
  220.     printf ("\n");
  221.     for (i = 0; i < *buffer_size; i++)
  222.         printf ("%x |", buffer[i]);
  223.     printf ("\n");*/
  224. }
  225.  
  226. unsigned char create_control_packet (unsigned char *buffer, int *buffer_size , int c, unsigned char *file_name, int filesize)
  227. {
  228.     int i;
  229.     unsigned char BCC2;
  230.  
  231.     *buffer_size = strlen(file_name) + 6;
  232.  
  233.     buffer[0] = (unsigned char) c;
  234.  
  235.     buffer[1] = (unsigned char) 0;
  236.     buffer[2] = (unsigned char) sizeof ((unsigned char) filesize);
  237.     buffer[3] = (unsigned char) filesize;
  238.  
  239.     buffer[4] = (unsigned char) 1;
  240.     buffer[5] = (unsigned char) sizeof (file_name);
  241.     for (i = 0; i < strlen(file_name); i++)
  242.         buffer[i + 6] = (unsigned char) file_name[i];
  243.  
  244.     BCC2 = buffer[0];
  245.     for (i = 1; i < strlen(file_name) + 6; i++)
  246.         BCC2 ^= buffer[i];
  247.  
  248.     return BCC2;
  249. }
  250.  
  251. // BCC2 = create_data_packet (Nova mensagem, tamanho, N, data, tamanho da data)
  252. unsigned char create_data_packet (unsigned char *buffer, int *buffer_size, int n, unsigned char *file_data, int datasize)
  253. {
  254.     unsigned char BCC2;
  255.     int i, L2 = (int) (packetsize * 8 / 256), L1 = (int) (packetsize * 8) - L2 * 256;
  256.  
  257.     *buffer_size = datasize + 4;
  258.  
  259.     buffer[0] = (unsigned char) 1;
  260.     buffer[1] = (unsigned char) n; 
  261.  
  262.     buffer[2] = (unsigned char) L2;
  263.     buffer[3]= (unsigned char) L1;
  264.  
  265.     for(i = 0; i < datasize; i++)
  266.         buffer[4+i] = file_data[i];
  267.  
  268.     BCC2 = buffer[0];
  269.     for (i = 1; i < *buffer_size; i++)
  270.         BCC2 ^= buffer[i];
  271.  
  272.     return BCC2;
  273. }
  274.  
  275. int menu ()
  276. {
  277.     int op = 0;
  278.  
  279.     system ("clear");
  280.     printBar ('*');
  281.     printm ("Programa iniciado!", 0);
  282.     printf ("\n\n\n");
  283.     printm ("Menu (escolher função do programa):", 0);
  284.     printf ("\n");
  285.     printm ("1. Emissor (llwrite).", 0);
  286.     printf ("\n");
  287.     printm ("2. Receptor (llread).", 0);
  288.     printf ("\n");
  289.     printm ("3. Sair.", 0);
  290.     printf ("\n\n");
  291.     printm ("Opcao: ", 0);
  292.     scanf ("%d", &op);
  293.  
  294.     return op;
  295. }
  296.  
  297. void sair ()
  298. {
  299.     system ("clear");
  300.  
  301.     printBar ('*');
  302.     printm ("Programa a encerrar...", 0);
  303.     printf ("\n");
  304.     printBar ('*');
  305.     sleep (1);
  306. }
  307.  
  308. unsigned char read_control_packet (unsigned char *msg, long int start, unsigned char BCC2, unsigned char *auxFilepath, int *auxFilepathsize, int *auxFilesize, int *size_of_packet)
  309. {  
  310.     unsigned char bit_received, auxFile[30];
  311.     unsigned char received_message[255];
  312.     int state = 0, i, res, count = 0, ind;
  313.  
  314.     while (state < 6)
  315.     {
  316.         /*res = read (fd, &bit_received, 1);
  317.         if(res == -1)
  318.             return NULL;*/
  319.  
  320.         //printf ("State: %d\nMessage: %x\n", state, msg[start + count]);
  321.         switch (state)
  322.         {
  323.                 case 0: // T1
  324.                     if (msg[start] == 0)
  325.                     {
  326.                         received_message[count] = msg[start + count];
  327.                         state++;
  328.                         count++;
  329.                     }
  330.                     else
  331.                         return NULL;
  332.                     break;
  333.  
  334.                 case 1: // L1
  335.                     received_message[count] = msg[start + count];
  336.                     state++;
  337.                     count++;
  338.                     break;
  339.  
  340.                 case 2: // V1
  341.                     ind = (int) received_message[count - 1];
  342.                     for(i = 0; i < ind; i++, count++)
  343.                     {
  344.                         auxFile[i] = msg[start + count];
  345.                         received_message[count] = msg[start + count];
  346.                     }
  347.  
  348.                     *auxFilesize = (int) msg[start + count];
  349.  
  350.                     state++;
  351.                     break;
  352.  
  353.                 case 3: // T2
  354.                     if (msg[start + count] == 1)
  355.                     {
  356.                         received_message[count] = msg[start + count];
  357.                         state++;
  358.                         count++;
  359.                     }
  360.                     else
  361.                         return NULL;
  362.                     break;
  363.                    
  364.                 case 4: // L2
  365.                     received_message[count] = msg[start + count];
  366.                     state++;
  367.                     count++;
  368.                     break;
  369.  
  370.                 case 5: // V2
  371.                     ind = (int) received_message[count - 1];
  372.  
  373.                     auxFilepath = (char *) malloc (sizeof(char) * (ind + 1));
  374.  
  375.                     printf ("IND: %d\n", ind);
  376.                     for(i = 0; i < ind; i++, count++)
  377.                     {
  378.                         auxFilepath[i] = msg[start + count];
  379.                         received_message[count] = msg[start + count];
  380.                     }
  381.                     *auxFilepathsize = ind + 1;
  382.                     printf ("auxFilepath = %s\n", auxFilepath); // aqui está coorecto
  383.                     //auxFilepath[*auxFilepathsize] = '\0';
  384.  
  385.                     state++;
  386.                     count++;
  387.                     break;
  388.  
  389.                 default:
  390.                     break;
  391.         }
  392.     }
  393.  
  394.     for (i = 0; i < count; i++)
  395.         BCC2 ^= received_message[i];
  396.  
  397.     printf ("Count: %d\n", count);
  398.     for (i = 0; i < count; i++)
  399.         printf ("MSG: %x\n", received_message[i]);
  400.  
  401.     *size_of_packet = count;
  402.  
  403.     return BCC2;
  404. }
  405.  
  406. unsigned char read_data_packet (int fd, unsigned char BCC2, unsigned char *data)
  407. {
  408.     int i, count = 0, state = 0, res;
  409.     unsigned char received_message[255], bit_received, auxFile[255];
  410.  
  411.     printf ("read_data_packet\n");
  412.  
  413.     while (state < 4)
  414.     {
  415.         res = read (fd, &bit_received, 1);
  416.         if(res == -1)
  417.             return NULL;
  418.  
  419.         switch (state)
  420.         {
  421.             case 0:
  422.                 received_message[count] = bit_received;
  423.                 dataHandler.dataSeq = (int) bit_received;
  424.                 state++;
  425.                 count++;
  426.                 break;
  427.            
  428.             case 1:
  429.                 received_message[count] = bit_received;
  430.                 state++;
  431.                 count++;
  432.                 break;
  433.  
  434.             case 2:
  435.                 received_message[count] = bit_received;
  436.                 dataHandler.packetSize = (int) (256 * (int) received_message[count - 1] + (int) received_message[count]);
  437.                 state++;
  438.                 count++;
  439.                 break;
  440.  
  441.             case 3:
  442.                 auxFile[0] = bit_received;
  443.                 received_message[count++] = bit_received;
  444.                 for(i = 1; i < dataHandler.packetSize; i++, count++)
  445.                 {
  446.                     res = read (fd, &bit_received, 1);
  447.                     if(res == -1)
  448.                         return NULL;
  449.  
  450.                     auxFile[i] = bit_received;
  451.                     received_message[count] = bit_received;
  452.                 }
  453.  
  454.                 state++;
  455.                 count++;
  456.                 break;
  457.         }
  458.     }
  459.     for (i = 0; i < count; i++)
  460.         BCC2 ^= received_message[i];
  461.  
  462.     data = (unsigned char *) malloc (sizeof(unsigned char) * dataHandler.packetSize);
  463.     for(i = 0; i < dataHandler.packetSize; i++)
  464.     {
  465.         data[i] = auxFile[i];
  466.         printf ("Data[%d]: %x\n", i, data[i]);
  467.     }
  468.  
  469.     return BCC2;
  470. }
  471.  
  472. void main (int argc, unsigned char** argv)
  473. {
  474.     int op = 0, fd, filesize;
  475.     unsigned char *buffer = NULL;
  476.  
  477.     while (op != 3)
  478.     {
  479.         op = menu();
  480.         switch (op)
  481.         {
  482.             case 1:
  483.                 fd = llopen (0, TRANSMITTER);
  484.                 if (fd != -1)
  485.                 {
  486.                     //filesize = myWrite (buffer);
  487.                     llwrite(fd, buffer, filesize);
  488.                 }
  489.                 break;
  490.             case 2:
  491.                 fd = llopen (0, RECEIVER);
  492.                 printf ("fd %d\n", fd);
  493.                 llread(fd, buffer);
  494.                 //saveToFile(buffer);
  495.                 break;
  496.             case 3:
  497.                 llclose (fd);
  498.                 sair();
  499.                 break;
  500.             default:
  501.                 break;
  502.         }
  503.     }  
  504. }
  505.  
  506. int llopen (int porta, int flag)
  507. {
  508.     /* -----    Variáveis  ----- */
  509.  
  510.     unsigned char send_message[5], receive_message[5], bit_received;
  511.     unsigned char buffer[1], gate[10] = MODEMDEVICE;
  512.     int vtime, fd, res[2], return_value, i;
  513.     unsigned int msg_sent = 0, state;
  514.     struct termios newtio;
  515.  
  516.     /* -----    Código     ----- */
  517.  
  518.     sprintf (buffer, "%d", porta);
  519.     strcat (gate, buffer);
  520.  
  521.     system ("clear");
  522.  
  523.     printBar ('*');
  524.     printm ("Função \"llopen(", -7);
  525.     printf ("%d, %d)\" iniciada!\n", porta, flag);
  526.  
  527.     if (flag == TRANSMITTER)
  528.     {
  529.         send_message[0] = F;
  530.         send_message[1] = A;
  531.         send_message[2] = S;
  532.         send_message[3] = send_message[1] ^ send_message[2];
  533.         send_message[4] = F;
  534.  
  535.         vtime = 3;
  536.  
  537.         fd = open(gate, O_RDWR | O_NOCTTY);
  538.     }
  539.     else if (flag == RECEIVER)
  540.     {
  541.         send_message[0] = F;
  542.         send_message[1] = A;
  543.         send_message[2] = U;
  544.         send_message[3] = send_message[1] ^ send_message[2];
  545.         send_message[4] = F;
  546.  
  547.         vtime = 0;
  548.  
  549.         fd = open(gate, O_RDWR | O_NOCTTY);
  550.     }
  551.     else
  552.         return -1;
  553.  
  554.     if (fd < 0)
  555.             return -1;
  556.  
  557.     // Teste ao apontador para o Pipe.
  558.  
  559.     if (tcgetattr (fd, &oldtio) == -1)
  560.     {
  561.         perror ("tcgetattr");
  562.         return -1;
  563.     }
  564.  
  565.     // Configuração da ligação.
  566.  
  567.     bzero(&newtio, sizeof(newtio));
  568.     newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  569.     newtio.c_iflag = IGNPAR;
  570.     newtio.c_oflag = 0;
  571.  
  572.     /* set input mode (non-canonical, no echo,...) */
  573.     newtio.c_lflag = 0;
  574.  
  575.     newtio.c_cc[VTIME]    = vtime;   /* inter-unsigned character timer unused */
  576.     newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 unsigned chars received */
  577.  
  578.     /* VTIME e VMIN devem ser alterados de forma a proteger com um temporizador a leitura do(s) próximo(s) caracter(es) */
  579.  
  580.     tcflush(fd, TCIOFLUSH);
  581.     if (tcsetattr (fd, TCSANOW, &newtio) == -1)
  582.     {
  583.         perror ("tcsetattr");
  584.         return -1;
  585.     }
  586.  
  587.     (void) signal(SIGALRM, atende);
  588.  
  589.     if (flag == TRANSMITTER)
  590.     {
  591.         for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions && msg_sent != 1;)
  592.         {
  593.             if (time_flag)
  594.             {
  595.                 printm ("A enviar SETUP: tentativa #", -1);
  596.                 printf ("%d\n", counter + 1);
  597.  
  598.                 res[0] = write (fd, send_message, 5);
  599.  
  600.                 alarm (alarm_timeout);
  601.                 time_flag = 0;
  602.  
  603.                 while (state < 5)
  604.                 {
  605.                     res[1] = read (fd, &bit_received, 1);
  606.                     if(res[1] == -1)
  607.                         break;
  608.  
  609.                     switch (state)
  610.                     {
  611.                         case 0:
  612.                           if (bit_received == F)
  613.                           {
  614.                             receive_message[state]=bit_received;
  615.                             state++;
  616.                           }
  617.                           break;
  618.  
  619.                         case 1:
  620.                           if (bit_received == A)
  621.                           {
  622.                             receive_message[state]=bit_received;
  623.                             state++;
  624.                           }
  625.                           else if (bit_received != A && bit_received !=F)
  626.                             state--;
  627.                           break;
  628.                  
  629.                         case 2:
  630.                           if (bit_received == U)
  631.                           {
  632.                             receive_message[state]=bit_received;
  633.                             state++;
  634.                           }
  635.                           else if (bit_received == F)
  636.                             state--;
  637.                           else
  638.                             state = 0;
  639.                           break;
  640.  
  641.                         case 3:
  642.                           if (bit_received == (A^U))
  643.                           {
  644.                             receive_message[state]=bit_received;
  645.                             state++;
  646.                           }
  647.                           else
  648.                             state = 0;
  649.                           break;
  650.  
  651.                         case 4:
  652.                           if (bit_received == F)
  653.                           {
  654.                             receive_message[state]=bit_received;
  655.                             state++;
  656.                             msg_sent = 1;
  657.                           }
  658.                           else
  659.                             state = 0;
  660.                           break;
  661.  
  662.                         default:
  663.                             break;
  664.                     }
  665.                 }
  666.             }
  667.         }
  668.  
  669.         if (msg_sent == 0)
  670.         {
  671.             printm ("Mensagem não enviada (não recebeu UA).", +3);
  672.             printf ("\n");
  673.             return_value = -1;
  674.         }
  675.         else
  676.         {
  677.             printm ("Mensagem enviada (recebeu UA).", 0);
  678.             printf ("\n");
  679.             printm ("Mensagem UA:", 0);
  680.             printf ("\n");
  681.             printm (" ", -5);
  682.             for(i = 0; i < state; i++)
  683.                 printf("%x", receive_message[i]);
  684.             printf ("\n");
  685.             return_value = fd;
  686.         }
  687.     }
  688.     else if (flag == RECEIVER)
  689.     {
  690.         state = 0;
  691.         while (state < 5)
  692.         {
  693.             res[1] = read (fd, &bit_received, 1);
  694.  
  695.             switch (state)
  696.             {
  697.                     case 0:
  698.                             if (bit_received == F)
  699.                             {
  700.                                     receive_message[state] = bit_received;
  701.                                     state++;
  702.                             }
  703.                             break;
  704.                     case 1:
  705.                             if (bit_received == A)
  706.                             {
  707.                                     receive_message[state] = bit_received;
  708.                                     state++;
  709.                             }
  710.                             else if (bit_received != F && bit_received != A)
  711.                                     state--;
  712.                             break;
  713.                     case 2:
  714.                             if (bit_received == S)
  715.                             {
  716.                                     receive_message[state] = bit_received;
  717.                                     state++;
  718.                             }
  719.                             else if (bit_received == F)
  720.                                     state--;
  721.                             else
  722.                                     state = 0;
  723.                             break;
  724.                     case 3:
  725.                             if (bit_received == (A ^ S))
  726.                             {
  727.                                     receive_message[state] = bit_received;
  728.                                     state++;
  729.                             }
  730.                             else if (bit_received == F)
  731.                                     state = 1;
  732.                             else
  733.                                     state = 0;
  734.                             break;
  735.                     case 4:
  736.                             if (bit_received == F)
  737.                             {
  738.                                     receive_message[state] = bit_received;
  739.                                     state++;
  740.                                     msg_sent = 1;
  741.                             }
  742.                             else
  743.                                     state = 0;
  744.                             break;
  745.                     default:
  746.                         break;
  747.             }
  748.         }
  749.        
  750.         if (msg_sent == 0)
  751.         {
  752.             printm ("Mensagem não enviada (não recebeu SETUP).", +3);
  753.             printf ("\n");
  754.             return_value = -1;
  755.         }
  756.         else
  757.         {
  758.             printm ("Mensagem enviada (recebeu SETUP).", 0);
  759.             printf ("\n");
  760.             printm ("Mensagem SETUP:", 0);
  761.             printf ("\n");
  762.             printm (" ", -5);
  763.             for(i = 0; i < state; i++)
  764.                 printf("%x", receive_message[i]);
  765.             printf ("\n");
  766.  
  767.             res[0] = write(fd, send_message, 5);
  768.             if (!res[0])
  769.                 printf("Mensagem (UA) não enviada.\n");
  770.             else
  771.                 printf("%d bytes (UA) enviados.\n", res[0]);
  772.  
  773.             return_value = fd;
  774.         }
  775.     }
  776.  
  777.     printf ("\n\n");
  778.     printm ("Função \"llopen(", -7);
  779.     printf ("%d, %d)\" a feunsigned char!\n", porta, flag);
  780.     printm ("Clique numa tecla para voltar ao menu.", 0);
  781.     printf ("\n");
  782.     printf ("FD: ");
  783.     printf ("%d\n", return_value);
  784.     printBar ('*');
  785.  
  786.     return return_value;
  787. }
  788.  
  789. int llwrite (int fd, unsigned char * buffer, int length)
  790. {
  791.     unsigned char *cntrl_message, *new_message, *data_message, *message, *message_received, bit_received, auxCntrl;
  792.     unsigned char BCC2;
  793.     int file_found = 1, i, j, cntrl_size, message_size, msg_error = 0, state, res, buffer_size, denied = 0, new_message_size;
  794.     FILE *pImg;
  795.  
  796.     while (file_found)
  797.     {
  798.         system ("clear");
  799.         printBar ('*');
  800.         printm ("Nome do ficheiro a usar: pinguim.gif", 0);
  801.         printf ("\n");
  802.         printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  803.         printf ("\n\n\n");
  804.  
  805.         pImg = fopen (filename, "r");
  806.         if (pImg == NULL)
  807.         {
  808.             printm ("Ficheiro não encontrado.", 0);
  809.             printf ("\n");
  810.             printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  811.             printf ("\n");
  812.             printm ("Clique <Enter> para voltar a tentar.", 0);
  813.             getchar ();
  814.         }
  815.         else
  816.         {
  817.             file_found = 0;
  818.             printm ("Ficheiro encontrado.", 0);
  819.             printf ("\n");
  820.             printm ("Clique <Enter> para continuar.", 0);
  821.             getchar ();
  822.         }
  823.     }
  824.  
  825.     // Leitura do conteúdo da imagem para variável "buffer"
  826.     fseek (pImg, 0, SEEK_END);
  827.     length = ftell (pImg);
  828.     fseek (pImg, 0, SEEK_SET);
  829.  
  830.     buffer = (unsigned char *) malloc (sizeof(unsigned char) * length);
  831.  
  832.     for (i = 0; i < length; i++)
  833.         buffer[i] = getc(pImg);
  834.  
  835.     fclose (pImg);
  836.     // Leitura do conteúdo da imagem para variável "buffer"
  837.  
  838.     // Primeira mensagem a enviar: Pacote de controlo (start)
  839.     cntrl_message = (unsigned char *) malloc (sizeof(unsigned char) * (strlen(filename) + 6));
  840.     BCC2 = create_control_packet (cntrl_message, &cntrl_size, 2, filename, length);
  841.    
  842.     message = (unsigned char *) malloc (sizeof(unsigned char) * (cntrl_size + 6));
  843.     create_information (message, &message_size, I0, cntrl_message, cntrl_size, BCC2);
  844.  
  845.     dataHandler.dataSeq = 0;
  846.     // Primeira mensagem a enviar: Pacote de controlo (start)
  847.  
  848.     // Leitura de verificação
  849.     for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions;)
  850.     {
  851.         if (time_flag)
  852.         {
  853.             alarm (alarm_timeout);
  854.             time_flag = 0;
  855.  
  856.             res = write (fd, message, message_size); // envio do pacote de controlo
  857.             if (res != -1)
  858.                 denied = 0;
  859.            
  860.             while (state < 6 || denied != 1)
  861.             {
  862.                 res = read (fd, &bit_received, 1);
  863.                 if(res == -1)
  864.                     break;
  865.  
  866.                 switch (state)
  867.                 {
  868.                     case 0:
  869.                         if (bit_received == F)
  870.                             state++;
  871.                         else
  872.                             denied = 1;
  873.  
  874.                         break;
  875.  
  876.                     case 1:
  877.                         if (bit_received == A)
  878.                             state++;
  879.                         else
  880.                             denied = 1;
  881.  
  882.                         break;
  883.  
  884.                     case 2:
  885.                         auxCntrl = bit_received;
  886.                         state++;
  887.                         break;
  888.  
  889.                     case 3:
  890.                         if (bit_received == auxCntrl ^ A)
  891.                             state++;
  892.                         else
  893.                             denied = 1;
  894.  
  895.                         break;
  896.  
  897.                     case 4:
  898.                         if (bit_received == F)
  899.                             state++;
  900.                         else
  901.                             denied = 1;
  902.  
  903.                         break;
  904.  
  905.                     case 5://verificar rej, rr, disc
  906.                         counter = 0;
  907.                         if (auxCntrl == RR1 && dataHandler.tramaSeq == I0)
  908.                         {
  909.                             dataHandler.tramaSeq = I1;
  910.                             dataHandler.dataSeq++;
  911.  
  912.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq, &new_message_size);
  913.  
  914.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq, data_message, new_message_size);
  915.  
  916.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  917.                            
  918.                         }
  919.                         else if(auxCntrl == RR1 && dataHandler.tramaSeq == I1)
  920.                         {
  921.                             denied = 1;
  922.                             break;
  923.                         }
  924.                         else if(auxCntrl == RR0 && dataHandler.tramaSeq == I0)
  925.                         {
  926.                             denied = 1;
  927.                             break;
  928.                         }
  929.                         else if(auxCntrl == RR0 && dataHandler.tramaSeq == I1)
  930.                         {
  931.                             dataHandler.tramaSeq = I0;
  932.                             dataHandler.dataSeq++;
  933.                            
  934.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq, &new_message_size);
  935.  
  936.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq, data_message, new_message_size);
  937.  
  938.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  939.                         }
  940.                         else if(auxCntrl == REJ0 && dataHandler.tramaSeq == I0)
  941.                         {
  942.                             denied = 1;
  943.                             break;
  944.                         }
  945.                         else if(auxCntrl == REJ0 && dataHandler.tramaSeq == I1)
  946.                         {
  947.                             dataHandler.tramaSeq = I0;
  948.                            
  949.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq - 1, &new_message_size);
  950.  
  951.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq - 1, data_message, new_message_size);
  952.  
  953.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  954.                         }
  955.                         else if(auxCntrl == REJ1 && dataHandler.tramaSeq == I0)
  956.                         {
  957.                             dataHandler.tramaSeq = I1;
  958.  
  959.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq - 1, &new_message_size);
  960.  
  961.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq - 1, data_message, new_message_size);
  962.  
  963.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  964.                         }
  965.                         else if(auxCntrl == REJ1 && dataHandler.tramaSeq == I1)
  966.                         {
  967.                             denied = 1;
  968.                             break;
  969.                         }
  970.                         else if(auxCntrl == DISC)
  971.                         {
  972.                             // --
  973.                         }
  974.                         break;
  975.                 }
  976.             }
  977.         }
  978.     }  
  979.     // Leitura de verificação
  980.  
  981.     return length;
  982. }
  983.  
  984. /* ----- llread -----
  985. argumentos
  986.     fd: identificador da ligação de dados
  987.     buffer: array de caracteres recebidos
  988. retorno
  989.     comprimento do array (número de caracteres lidos)
  990.     valor negativo em caso de erro
  991. */
  992. int llread (int fd, unsigned char *buffer)
  993. {
  994.     unsigned char bit_received, *auxFilepath, BCC2, auxCntrl = I0, msg[255], *destuffedmsg, auxmsg[255], *data;
  995.     int msg_wanted = 0, state = 0, res, final = 0, i, j, denied = 1, auxFilesize, auxDatasize, auxFilepathsize, buffer_size, size_of_packet;
  996.  
  997.     ficheiro_de_imagem.position = 0;
  998.     dataHandler.tramaSeq = I0;
  999.  
  1000.     printf ("LLREAD!\n");
  1001.  
  1002.     printf ("auxCntrl: %x\n", auxCntrl);
  1003.     while (auxCntrl != DISC)
  1004.     {
  1005.         i = 0;
  1006.         state = 0;
  1007.  
  1008.         res = read (fd, &bit_received, 1);
  1009.         if (bit_received == F)
  1010.         {
  1011.             auxmsg[i] = F;
  1012.             do
  1013.             {
  1014.                 read (fd, &bit_received, 1);
  1015.                 auxmsg[i++] = bit_received;
  1016.             }
  1017.             while (bit_received != F);
  1018.  
  1019.             auxmsg[i++] = bit_received;
  1020.             denied = 0;
  1021.  
  1022.             destuffedmsg = performDestuffing (auxmsg, i, &i);
  1023.             msg[0] = F;
  1024.             for (j = 1; j < i; j++)
  1025.                 msg[j] = destuffedmsg[j - 1];
  1026.             msg[j] = F;
  1027.             i = j;
  1028.             for (j = 0; j < i; j++)
  1029.                 printf ("msg[%d]: %x\n", j, msg[j]);
  1030.             printf ("\n");
  1031.         }
  1032.  
  1033.         while (state < 8 && denied == 0)
  1034.         {
  1035.             printf ("msg[state = %d]: %x\n", state, msg[state]);
  1036.             switch (state)
  1037.             {
  1038.                     case 0:
  1039.                         if (msg[state] == F)
  1040.                             state++;
  1041.                         else
  1042.                             denied = 1;
  1043.  
  1044.                         break;
  1045.  
  1046.                     case 1:
  1047.                         if (msg[state] == A)
  1048.                             state++;
  1049.                         else
  1050.                             denied = 1;
  1051.  
  1052.                         break;
  1053.  
  1054.                     case 2:
  1055.                         if (msg[state] == dataHandler.tramaSeq)
  1056.                             msg_wanted = 1;
  1057.  
  1058.                         state++;
  1059.  
  1060.                         break;
  1061.  
  1062.                     case 3:
  1063.                         if (msg[state] == A ^ msg[state - 1])
  1064.                             state++;
  1065.                         else
  1066.                             denied = 1;
  1067.  
  1068.                         break;
  1069.  
  1070.                     case 4:
  1071.                         if (msg[state] == 1)
  1072.                         {
  1073.                             printf ("DATA\n");
  1074.                             BCC2 = read_data_packet (fd, msg[state], data);
  1075.                             state++;
  1076.                         }
  1077.                         else if (msg[state] == 2)
  1078.                         {
  1079.                             printf ("START\n");
  1080.                             BCC2 = read_control_packet (msg, state + 1, msg[state], auxFilepath, &auxFilepathsize, &auxFilesize, &size_of_packet);
  1081.                             printf ("BCC2*: %x\n", BCC2);
  1082.                             state++;
  1083.                             //auxFilepath[auxFilepathsize] = '\0';
  1084.                             printf ("auxFilepathsize: %d\nauxFilesize: %d\nauxFilepath: %s\n", auxFilepathsize, auxFilesize, auxFilepath);
  1085.                             /*for (j = 0; j < auxFilepathsize; j++)
  1086.                                 printf ("auxFile[%d]: %x - %c\n", j, auxFilepath[j], auxFilepath[j]);*/
  1087.                             //auxFilepath[auxFilepathsize] = '\0';
  1088.                         }
  1089.                         else if (msg[state] == 3)
  1090.                         {
  1091.                             printf ("END\n");
  1092.                             BCC2 = read_control_packet (msg, state + 1, msg[state], auxFilepath, &auxFilepathsize, &auxFilesize, &size_of_packet);
  1093.                             state++;
  1094.                             final = 1;
  1095.                         }
  1096.                         else
  1097.                             denied = 1;
  1098.  
  1099.                         break;
  1100.  
  1101.                     case 5:
  1102.                         printf ("BCC2 Recebido: %x\n", msg[state + size_of_packet - 1]);
  1103.                         printf ("BCC2 Calculado: %x\n", BCC2);
  1104.                         if (msg[state + size_of_packet - 1] == BCC2)
  1105.                             state++;
  1106.                         else
  1107.                             denied = 1;
  1108.  
  1109.                         break;
  1110.  
  1111.                     case 6:
  1112.                         if (msg[state + size_of_packet - 1] == F)
  1113.                             state++;
  1114.                         else
  1115.                             denied = 1;
  1116.  
  1117.                         break;
  1118.  
  1119.                     case 7:
  1120.                         if (msg_wanted && final == 0)
  1121.                         {
  1122.                             printf ("Message wanted.\n");
  1123.                             if (dataHandler.tramaSeq == I0)
  1124.                             {
  1125.                                 dataHandler.tramaSeq = I1;
  1126.                                 auxCntrl = RR1;
  1127.                             }
  1128.                             else if (dataHandler.tramaSeq == I1)
  1129.                             {
  1130.                                 dataHandler.tramaSeq = I0;
  1131.                                 auxCntrl = RR0;
  1132.                             }
  1133.  
  1134.                             // concatenar data ou guardar filepath e filesize
  1135.  
  1136.                             if (msg[4] == 1) // Concatenar data
  1137.                             {
  1138.                                 for (j = 0; j < auxDatasize; j++, ficheiro_de_imagem.position++)
  1139.                                     ficheiro_de_imagem.filedata[ficheiro_de_imagem.position] = data[j];
  1140.                             }
  1141.                             else if (msg[4] == 2 || msg[4] == 3)
  1142.                             {
  1143.                                 //auxFilepath[auxFilepathsize] = '\0';
  1144.  
  1145.                                 ficheiro_de_imagem.filepath = (unsigned char *) malloc (sizeof(unsigned char) * auxFilepathsize + 1);
  1146.  
  1147.                                 for (j = 0; j < auxFilepathsize; j++)
  1148.                                     ficheiro_de_imagem.filepath[j] = auxFilepath[j];
  1149.  
  1150.                                 printf ("ficheiro_de_imagem.filepath: %s\n", ficheiro_de_imagem.filepath);
  1151.  
  1152.                                 ficheiro_de_imagem.filesize = dataHandler.packetSize;
  1153.  
  1154.                                 ficheiro_de_imagem.filedata = (unsigned char *) malloc (sizeof(unsigned char) * ficheiro_de_imagem.filesize);
  1155.                             }
  1156.  
  1157.                         }
  1158.                         else if (msg_wanted && final == 1)
  1159.                         {
  1160.                             auxCntrl = DISC;
  1161.                         }
  1162.                         else if (!msg_wanted)
  1163.                         {
  1164.                             if (dataHandler.tramaSeq == I0)
  1165.                                 auxCntrl = REJ0;
  1166.                             else if (dataHandler.tramaSeq == I1)
  1167.                                 auxCntrl = REJ1;
  1168.                         }
  1169.  
  1170.                         state++;
  1171.  
  1172.                         buffer = (unsigned char *) malloc (sizeof(unsigned char) * 5);
  1173.                         create_information (buffer, &buffer_size, auxCntrl, NULL, 0, NULL);
  1174.                         write (fd, buffer, buffer_size);
  1175.  
  1176.                     default:
  1177.                         break;
  1178.  
  1179.             }
  1180.         }
  1181.     }
  1182.     /* --- */
  1183.  
  1184.     // Criação do ficheiro com data
  1185.     for (j = 0; j < ficheiro_de_imagem.filesize; j++)
  1186.         printf ("Byte[%d]: %x\n", j, ficheiro_de_imagem.filedata[j]);
  1187. }
  1188.  
  1189.  
  1190. int llclose (int fd)
  1191. {
  1192.     if (tcgetattr (fd, &oldtio) == -1)
  1193.     {
  1194.         perror ("tcgetattr");
  1195.         return -1;
  1196.     }
  1197.  
  1198.     close (fd);
  1199.  
  1200.     return 0;
  1201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement