Eddie_1337

CSC_Pr_RxMesaj

Apr 14th, 2022 (edited)
781
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.23 KB | None | 0 0
  1. #include <c8051F040.h>  // declaratii SFR
  2. #include <uart1.h>
  3. #include <Protocol.h>
  4. #include <UserIO.h>
  5.  
  6. extern nod retea[];                     // reteaua Master-Slave, cu 5 noduri
  7.  
  8. extern unsigned char STARE_NOD;     // starea initiala a nodului curent
  9. extern unsigned char TIP_NOD;           // tip nod
  10. extern unsigned char ADR_MASTER;    // adresa nodului master
  11.  
  12. extern unsigned char timeout;       // variabila globala care indica expirare timp de asteptare eveniment
  13. //***********************************************************************************************************
  14. unsigned char RxMesaj(unsigned char i);             // primire mesaj de la nodul i
  15. unsigned char ascii2bin(unsigned char *ptr);                    // functie de conversie 2 caractere ASCII HEX in binar
  16.  
  17. //***********************************************************************************************************
  18. unsigned char RxMesaj(unsigned char i){                 // receptie mesaj                                                              
  19.     unsigned char j, ch, sc, adresa_hw_dest, adresa_hw_src, screc, src, dest, lng, tipmes, *ptr;
  20.     if (ADR_NOD == MASTER)      // Daca nodul este master...
  21.     {
  22.         ch = UART1_Getch_TMO(1000);     // M: asteapta cu timeout primul caracter al raspunsului de la slave
  23.         if (timeout)
  24.         {
  25.             return TMO;             // M: timeout, terminare receptie
  26.         }
  27.         else
  28.         {
  29.             retea[i].full = 0;  // M: raspunsul de la slave vine, considera ca mesajul anterior a fost transmis cu succes  
  30.             if (ch != ADR_NOD)
  31.             {
  32.                 do
  33.                     ch = UART1_Getch_TMO(5);                        // M: ignora restul mesajului
  34.                 while (!timeout);
  35.                 return ERA;
  36.             }
  37.             else
  38.             {
  39.                 screc = ADR_NOD;
  40.                 adresa_hw_src = UART1_Getch_TMO(5);
  41.                
  42.                 if (timeout)
  43.                     return CAN;
  44.                 screc ^= adresa_hw_src;
  45.                
  46.                 if (ADR_NOD == SLAVE)
  47.                     ADR_MASTER = adresa_hw_src;
  48.  
  49.                 tipmes = UART1_Getch_TMO(5);
  50.                
  51.                 if (timeout)
  52.                     return CAN;
  53.                
  54.                 if (tipmes >= 2) {
  55.                     do
  56.                         ch = UART1_Getch_TMO(5);                        // M: ignora restul mesajului
  57.                     while (!timeout);
  58.                     return TIP;
  59.                 }
  60.  
  61.                 screc ^= tipmes;
  62.  
  63.                 if (tipmes == USER_MES) {
  64.                     src = UART1_Getch_TMO(5);
  65.                
  66.                     if (timeout)
  67.                         return CAN;
  68.                     screc ^= src;
  69.                     dest = UART1_Getch_TMO(5);
  70.  
  71.                     if (timeout)
  72.                         return CAN;
  73.                     screc ^= dest;
  74.  
  75.                     if (ADR_NOD == MASTER) {
  76.                         if (retea[dest].full == 1) {
  77.                             do
  78.                                 ch = UART1_Getch_TMO(5);                        // M: ignora restul mesajului
  79.                             while (!timeout);    
  80.                             return OVR;      
  81.                         }                
  82.                     }
  83.  
  84.                     lng = UART1_Getch_TMO(5);
  85.  
  86.                     if (timeout)
  87.                         return CAN;
  88.  
  89.                     screc ^= lng;
  90.  
  91.                     if (ADR_NOD == MASTER){
  92.                         retea[dest].bufbin.adresa_hw_src = adresa_hw_src;
  93.                         retea[dest].bufbin.tipmes = tipmes;
  94.                         retea[dest].bufbin.src = src;
  95.                         retea[dest].bufbin.dest = dest;
  96.                         retea[dest].bufbin.lng = lng ;
  97.  
  98.                         lng = UART1_Getch_TMO(5);
  99.  
  100.                         if (timeout)
  101.                             return CAN;
  102.  
  103.                         screc ^= lng;
  104.  
  105.                         sc = UART1_Getch_TMO(5);
  106.  
  107.                         if (timeout)
  108.                             return CAN;
  109.                        
  110.                         if (sc == screc) {
  111.                             retea[dest].full = 1;
  112.                             return ROK;
  113.                         }
  114.                         else
  115.                             return ESC;
  116.                     }
  117.                     else{
  118.                         retea[ADR_NOD].bufbin.src = src;
  119.                         retea[ADR_NOD].bufbin.lng = lng;
  120.  
  121.                         lng = UART1_Getch_TMO(5);
  122.  
  123.                         if (timeout)
  124.                             return CAN;
  125.  
  126.                         screc ^= lng;
  127.  
  128.                         sc = UART1_Getch_TMO(5);
  129.  
  130.                         if (timeout)
  131.                             return CAN;
  132.                        
  133.                         if (sc == screc){
  134.                             retea[ADR_NOD].full = 1;
  135.                             return ROK;
  136.                         }
  137.                         else
  138.                             return ESC;
  139.                     }
  140.                 }
  141.                 else{
  142.                     sc = UART1_Getch_TMO(5);
  143.                     if (timeout)
  144.                         return CAN;
  145.                    
  146.                     if (sc == screc)
  147.                         return ROK;
  148.                     else
  149.                         return ESC;
  150.                 }
  151.             }                          
  152.         }
  153.     }
  154.     else
  155.     {
  156.         do {
  157.             do
  158.                 ch = UART1_Getch_TMO(5);                        // M: ignora restul mesajului
  159.             while (!timeout);
  160.            
  161.             ch = UART1_Getch_TMO(2000 + ADR_NOD * 1000);
  162.            
  163.             if (timeout)
  164.                 return TMO;
  165.                
  166.         }
  167.         while (ch != ADR_NOD);
  168.         screc = ADR_NOD;
  169.         adresa_hw_src = UART1_Getch_TMO(5);
  170.        
  171.         if (timeout)
  172.             return CAN;
  173.         screc ^= adresa_hw_src;
  174.        
  175.         if (ADR_NOD == SLAVE)
  176.             ADR_MASTER = adresa_hw_src;
  177.  
  178.         tipmes = UART1_Getch_TMO(5);
  179.        
  180.         if (timeout)
  181.             return CAN;
  182.        
  183.         if (tipmes >= 2) {
  184.             do
  185.                 ch = UART1_Getch_TMO(5);                        // M: ignora restul mesajului
  186.             while (!timeout);
  187.             return TIP;
  188.         }
  189.  
  190.         screc ^= tipmes;
  191.  
  192.         if (tipmes == USER_MES) {
  193.             src = UART1_Getch_TMO(5);
  194.        
  195.             if (timeout)
  196.                 return CAN;
  197.             screc ^= src;
  198.             dest = UART1_Getch_TMO(5);
  199.  
  200.             if (timeout)
  201.                 return CAN;
  202.             screc ^= dest;
  203.  
  204.             if (ADR_NOD == MASTER) {
  205.                 if (retea[dest].full == 1) {
  206.                     do
  207.                         ch = UART1_Getch_TMO(5);                        // M: ignora restul mesajului
  208.                     while (!timeout);    
  209.                     return OVR;      
  210.                 }                
  211.             }
  212.  
  213.             lng = UART1_Getch_TMO(5);
  214.  
  215.             if (timeout)
  216.                 return CAN;
  217.  
  218.             screc ^= lng;
  219.  
  220.             if (ADR_NOD == MASTER){
  221.                 retea[dest].bufbin.adresa_hw_src = adresa_hw_src;
  222.                 retea[dest].bufbin.tipmes = tipmes;
  223.                 retea[dest].bufbin.src = src;
  224.                 retea[dest].bufbin.dest = dest;
  225.                 retea[dest].bufbin.lng = lng ;
  226.  
  227.                 lng = UART1_Getch_TMO(5);
  228.  
  229.                 if (timeout)
  230.                     return CAN;
  231.  
  232.                 screc ^= lng;
  233.  
  234.                 sc = UART1_Getch_TMO(5);
  235.  
  236.                 if (timeout)
  237.                     return CAN;
  238.                
  239.                 if (sc == screc) {
  240.                     retea[dest].full = 1;
  241.                     return ROK;
  242.                 }
  243.                 else
  244.                     return ESC;
  245.             }
  246.             else{
  247.                 retea[ADR_NOD].bufbin.src = src;
  248.                 retea[ADR_NOD].bufbin.lng = lng;
  249.  
  250.                 lng = UART1_Getch_TMO(5);
  251.  
  252.                 if (timeout)
  253.                     return CAN;
  254.  
  255.                 screc ^= lng;
  256.  
  257.                 sc = UART1_Getch_TMO(5);
  258.  
  259.                 if (timeout)
  260.                     return CAN;
  261.                
  262.                 if (sc == screc){
  263.                     retea[ADR_NOD].full = 1;
  264.                     return ROK;
  265.                 }
  266.                 else
  267.                     return ESC;
  268.             }
  269.         }
  270.         else{
  271.             sc = UART1_Getch_TMO(5);
  272.             if (timeout)
  273.                 return CAN;
  274.            
  275.             if (sc == screc)
  276.                 return ROK;
  277.             else
  278.                 return ESC;
  279.         }
  280.     }                                                                        
  281. }                                                          
  282.  
  283.  
  284. //***********************************************************************************************************
  285. unsigned char ascii2bin(unsigned char *ptr){            // converteste doua caractere ASCII HEX de la adresa ptr
  286.     unsigned char bin;
  287.    
  288.     if(*ptr > '9') bin = (*ptr++ - 'A' + 10) << 4;  // contributia primului caracter daca este litera
  289.     else bin = (*ptr++ - '0') << 4;                                 // contributia primului caracter daca este cifra
  290.     if(*ptr > '9') bin  += (*ptr++ - 'A' + 10);         // contributia celui de-al doilea caracter daca este litera
  291.     else bin += (*ptr++ - '0');                                         // contributia celui de-al doilea caracter daca este cifra
  292.     return bin;
  293. }
  294.  
  295.  
  296.  
Add Comment
Please, Sign In to add comment