-
Notifications
You must be signed in to change notification settings - Fork 0
/
RxMesajV1.c
165 lines (98 loc) · 6.72 KB
/
RxMesajV1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <c8051F040.h> // declaratii SFR
#include <uart1.h>
#include <Protocol.h>
#include <UserIO.h>
extern nod retea[]; // reteaua Master-Slave, cu 5 noduri
extern unsigned char TIP_NOD; // tip nod
extern unsigned char ADR_MASTER; // adresa nodului master
extern unsigned char timeout; // variabila globala care indica expirare timp de asteptare eveniment
//***********************************************************************************************************
unsigned char RxMesaj(unsigned char i); // primire mesaj de la nodul i
unsigned char ascii2bin(unsigned char *ptr); // functie de conversie 2 caractere ASCII HEX in binar
//***********************************************************************************************************
unsigned char RxMesaj(unsigned char i){ // receptie mesaj
unsigned char j, ch, sc, adresa_hw_dest, adresa_hw_src, screc, src, dest, lng, tipmes, *ptr;
// Daca nodul este master (asteapta raspuns de la slave)
// sau a transmis jetonul si asteapta confirmarea preluarii acestuia - un mesaj JET_MES
// M: asteapta cu timeout primul caracter al raspunsului de la slave
// M: timeout, terminare receptie
// M: raspunsul de la slave vine, considera ca mesajul anterior a fost transmis cu succes
// M: daca primul caracter nu este ':'...
// M: ignora restul mesajului
// M: eroare de incadrare, terminare receptie
// M: initializare pointer in bufferul ASCII
// M: asteapta cu timeout primul caracter ASCII al adresei HW
// M: timeout, terminare receptie
// M: asteapta cu timeout al doilea caracter al adresei HW
// M: timeout, terminare receptie
// M: daca mesajul nu este pentru acest nod
// M: ignora restul mesajului
// M: adresa HW ASCII gresita, terminare receptie
// Daca nodul este slave sau daca nu are jetonul ...
// S: asteapta cu timeout primirea primului caracter al unui mesaj (de la master sau de la cel care are jetonul)
// (sau de la nodul care detine jetonul)
// S: timeout, terminare receptie, nodul va deveni master
// sau va anunta ca s-a pierdut jetonul si va regenera jetonul
// S: asteapta sincronizarea cu inceputul mesajului
// S: initializeaza pointerul in bufferul ASCII
// S: asteapta cu timeout primul caracter ASCII al adresei HW
// S: timeout, terminare receptie
// S: asteapta cu timeout al doilea caracter al adresei HW
// S: timeout, terminare receptie
// S: determina adresa HW destinatie
// S: iese doar cand mesajul era adresat acestui nod
// M+S: pune in bufasc restul mesajului ASCII HEX
// M+S: timeout, terminare receptie
// M+S: reinitializare pointer in bufferul ASCII
// M+S: initializeaza screc cu adresa HW dest
// M+S: determina adresa HW src
// M+S: aduna adresa HW src
// Slave actualizeaza adresa Master
// M+S: determina tipul mesajului
// M+S: cod functie eronat, terminare receptie
// M+S: ia in calcul in screc codul functiei
// M+S: Daca mesajul este USER_MES
// M+S: determina sursa mesajului
// M+S: ia in calcul in screc adresa src
// M+S: determina destinatia mesajului
// M+S: ia in calcul in screc adresa dest
// Daca nodul este master...
// M: bufferul destinatie este deja plin, terminare receptie
// M+S: determina lng
// M+S: ia in calcul in screc lungimea datelor
// Daca nodul este master...
// M: stocheaza in bufbin adresa HW src egala cu ADR_NOD
// M: stocheaza in bufbin tipul mesajului
// M: stocheaza in bufbin adresa nodului sursa al mesajului
// M: stocheaza in bufbin adresa nodului destinatie al mesajului
// M: stocheaza lng
// M: determina un octet de date
// M: ia in calcul in screc octetul de date
// M: determina suma de control
// M: pune sc in bufbin
// M: mesaj corect, marcare buffer plin
// M: eroare SC, terminare receptie
// Daca nodul este slave ...
// S: stocheaza la destsrc codul nodului sursa al mesajului
// S: stocheaza lng
// S: determina un octet de date
// S: ia in calcul in screc octetul de date
// S: determina suma de control
// S: mesaj corect, marcare buffer plin
// S: eroare SC, terminare receptie
// daca mesajul este POLL_MES sau JET_MES
// memoreaza adresa hw src pentru a sti de la cine a primit jetonul
// M+S: determina suma de control
// M+S: returneaza POK sau JOK, au aceeasi valoare
// M+S: eroare SC, terminare receptie
return TMO; // simuleaza asteptarea mesajului si iesirea cu timeout
}
//***********************************************************************************************************
unsigned char ascii2bin(unsigned char *ptr){ // converteste doua caractere ASCII HEX de la adresa ptr
unsigned char bin;
if(*ptr > '9') bin = (*ptr++ - 'A' + 10) << 4; // contributia primului caracter daca este litera
else bin = (*ptr++ - '0') << 4; // contributia primului caracter daca este cifra
if(*ptr > '9') bin += (*ptr++ - 'A' + 10); // contributia celui de-al doilea caracter daca este litera
else bin += (*ptr++ - '0'); // contributia celui de-al doilea caracter daca este cifra
return bin;
}