-
Notifications
You must be signed in to change notification settings - Fork 0
/
MS-JT.c
276 lines (198 loc) · 10.3 KB
/
MS-JT.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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#include <c8051F040.h> // declaratii SFR
#include <wdt.h>
#include <osc.h>
#include <port.h>
#include <uart0.h>
#include <uart1.h>
#include <lcd.h>
#include <keyb.h>
#include <Protocol.h>
#include <UserIO.h>
nod retea[NR_NODURI]; // retea cu 5 noduri
unsigned char STARE_COM = 0; // starea initiala a FSA COM
unsigned char TIP_NOD = 0; // tip nod initial: Slave sau No JET
unsigned char STARE_IO = 0; // stare interfata IO - asteptare comenzi
unsigned char ADR_MASTER; // adresa nod master - numai MS
extern unsigned char AFISARE; // flag permitere afisare
//***********************************************************************************************************
void TxMesaj(unsigned char i); // transmisie mesaj destinat nodului i
unsigned char RxMesaj(unsigned char i); // primire mesaj de la nodul i
//***********************************************************************************************************
void main (void) {
unsigned char i, found; // variabile locale
WDT_Disable(); // dezactiveaza WDT
SYSCLK_Init(); // initializeaza si selecteaza oscilatorul ales in osc.h
UART1_Init(NINE_BIT, BAUDRATE_COM); // initilizare UART1 - port comunicatie (TxD la P1.0 si RxD la P1.1)
UART1_TxRxEN (1,1); // validare Tx si Rx UART1
PORT_Init (); // conecteaza perifericele la pini (UART0, UART1) si stabileste tipul pinilor
LCD_Init(); // 2 linii, display ON, cursor OFF, pozitia initiala (0,0)
KEYB_Init(); // initializare driver tastatura matriciala locala
UART0_Init(EIGHT_BIT, BAUDRATE_IO); // initializare UART0 - conectata la USB-UART (P0.0 si P0.1)
Timer0_Init(); // initializare Timer 0
EA = 1; // valideaza intreruperile
SFRPAGE = LEGACY_PAGE; // selecteaza pagina 0 SFR
for(i = 0; i < NR_NODURI; i++){ // initializare structuri de date
retea[i].full = 0; // initializeaza buffer gol pentru toate nodurile
retea[i].bufasc[0] = ':'; // pune primul caracter in buffer-ele ASCII ":"
}
Afisare_meniu(); // Afiseaza meniul de comenzi
while(1){ // bucla infinita
switch(STARE_COM){
case 0:
#if(PROTOCOL == MS) // nodul este slave, asteapta mesaj complet si corect de la master
switch(RxMesaj(ADR_NOD)){ // asteapta un mesaj de la master
case TMO: // anunta ca nodul curent devine master
// nodul curent devine master
// Afiseaza meniul de comenzi
// trece in starea 2
// primul slave va fi cel care urmeaza dupa noul master
break;
case ROK: break; // a primit un mesaj de la master, il afiseaza si trebuie sa raspunda
case POK: STARE_COM = 1; break;
case CAN: break; // afiseaza eroare Mesaj incomplet
case TIP: break; // afiseaza eroare Tip mesaj necunoscut
case ESC: break; // afiseaza Eroare SC
default: break; // afiseaza cod eroare necunoscut, asteapta 1 sec
}
break;
#endif
#if(PROTOCOL == JT) // nodul nu detine jetonul, asteapta un mesaj util sau jetonul
switch(RxMesaj(ADR_NOD)){ // asteapta jetonul de la master
case TMO:
// anunta ca nodul a regenerat jetonul
// nodul curent detine jetonul
// Daca e permisa afisarea, afiseaza meniul de comenzi
// trece in starea 1
break;
case ROK: break; // a primit un mesaj USER_MES, il afiseaza
case JOK: // a primit un jetonul
Delay(WAIT/2); // asteapta WAIT/2 ms
// adresa HW dest este adr_hw_src
// adresa HW src este ADR_NOD
// tip mesaj = JET_MES
// transmite mesajul JET_MES din bufferul ADR_NOD
// nodul curent detine jetonul
if(AFISARE) // Daca e permisa afisarea, afiseaza meniul de comenzi
// trece in starea 1
break; // nodul detine jetonul, poate trece sa transmita un mesaj de date
case CAN: break; // afiseaza eroare Mesaj incomplet
case CAN_adresa_hw_src: break; // afiseaza eroare Mesaj incomplet (adresa_hw_src)
case CAN_tipmes: break; // afiseaza eroare Mesaj incomplet (tip mesaj)
case CAN_sc: break; // afiseaza eroare Mesaj incomplet (sc)
case TIP: break; // afiseaza eroare Tip mesaj necunoscut
case ESC: break; // afiseaza Eroare SC
default: break; // afiseaza cod eroare necunoscut, apoi asteapta 1 sec
}
break;
#endif
case 1:
#if(PROTOCOL == MS) // nodul este slave, transmite mesaj catre master
// cauta sa gaseasca un mesaj util de transmis
// daca gaseste un nod i
// pune adresa HW dest este ADR_MASTER
// transmite mesajul catre nodul i
// daca nu gaseste, construieste un mesaj in bufferul ADR_MASTER
// adresa HW dest este ADR_MASTER
// adresa HW src este ADR_NOD
// tip mesaj = POLL_MES
// transmite mesajul din bufferul ADR_MASTER
// trece in starea 0, sa astepte un nou mesaj de la master
break;
#endif
#if(PROTOCOL == JT) // nodul detine jetonul, poate transmite un mesaj USER_MES
// cauta sa gaseasca un mesaj util de transmis
// daca gaseste un mesaj de transmis catre nodul i
// adresa HW dest este dest
// transmite mesajul catre nodul i
// asteapta procesarea mesajului la destinatie (WAIT/2 msec)
// va incerca sa transmita jetonul nodului urmator
// trece in starea 2, sa transmita jetonul urmatorului nod
#endif
break;
case 2: // tratare stare 2 si comutare stare
#if(PROTOCOL == MS) // nodul este master, tratare stare 2 si comutare stare
// selecteaza urmatorul slave (incrementeaza i)
// adresa HW dest este i
// daca in bufferul i se afla un mesaj util, il transmite
// altfel, construieste un mesaj de interogare in bufferul i
// adresa HW src este ADR_NOD
// tip mesaj = POLL_MES
// transmite mesajul din bufferul i
// trece in starea 3, sa astepte raspunsul de la slave-ul i
#endif
#if(PROTOCOL == JT) // nodul transmite jetonul urmatorului nod
// selecteaza urmatorul slave (incrementeaza i)
Delay(WAIT/2); // asteapta WAIT/2 sec
// adresa HW dest este i
// adresa HW src este ADR_NOD
// tip mesaj = JET_MES
// transmite mesajul din bufferul i
// trece in starea 3, sa astepte confirmarea de la nodul i ca jetonul a fost primit
#endif
break;
case 3:
#if(PROTOCOL == MS) // nodul este master, asteapta mesaj de la slave
// nodul este slave, asteapta mesaj de la master
switch(RxMesaj(i)){ // asteapta un raspuns de la slave i
case TMO: // afiseaza eroare Timeout nod i
break;
case ROK: break; // a primit un mesaj, il afiseaza
case POK: break;
case ERI: break; // afiseaza Eroare incadrare
case ERA: break; // afiseaza Eroare adresa
case TIP: break; // afiseaza Tip mesaj necunoscut
case OVR: break; // afiseaza Eroare suprapunere
case ESC: break; // afiseaza Eroare SC
case CAN: break; // afiseaza mesaj incomplet
case TEST: break; // afiseaza Eroare TEST
default: break; // afiseaza Eroare necunoscuta, apoi asteapta 1000ms
}
// revine in starea 2 (a primit sau nu un raspuns de la slave, trece la urmatorul slave)
#endif
#if(PROTOCOL == JT)
switch(RxMesaj(ADR_NOD)){ // asteapta un raspuns de la nod i
case TMO: Error("\n\rTimeout nod "); // afiseaza eroare Timeout nod i
// revine in starea 2 (nu a primit raspuns)
break;
case JOK: // a primit confirmarea transferului jetonului, revine in starea 0
// nodul nu mai detine jetonul
// daca afisarea e permisa, afiseaza meniul
break;
case ERI: // afiseaza Eroare incadrare
// revine in starea 0
// nodul nu mai detine jetonul
// afiseaza meniul
break;
case ERA: // afiseaza Eroare adresa
// revine in starea 0
// nodul nu mai detine jetonul
// afiseaza meniul
break;
case CAN: // afiseaza Mesaj incomplet
// revine in starea 0
// nodul nu mai detine jetonul
// afiseaza meniul
break;
case TIP: // afiseaza Tip mesaj necunoscut
// revine in starea 0
// nodul nu mai detine jetonul
// afiseaza meniul
break;
case ESC: // afiseaza Eroare SC
// revine in starea 0
// nodul nu mai detine jetonul
// afiseaza meniul
break;
default: // afiseaza Eroare necunoscuta
// asteapta 1000 ms
// revine in starea 0
// nodul nu mai detine jetonul
// afiseaza meniul
break;
}
#endif
break;
}
UserIO(); // apel functie interfata
}
}