1 | /**************************************************************************//**
|
2 | * \file netzwerk.c
|
3 | *
|
4 | * \author Tobias Mueller
|
5 | * \date 13.11.2012
|
6 | * \version 0.1
|
7 | *
|
8 | * \brief Routinen zum Verwenden des Funknetzwerks
|
9 | * \details -
|
10 | ******************************************************************************/
|
11 |
|
12 | /** H E A D E R D A T E I E N ***********************************************/
|
13 | #include "netzwerk.h"
|
14 | #include "eusart.h"
|
15 | #include "XBEE.h"
|
16 | #include "delay.h"
|
17 | #include "definitions.h"
|
18 | #include "lcd-routines.h"
|
19 |
|
20 | /** S Y M B O L I S C H E K O N S T A N T E N *******************************/
|
21 |
|
22 | /** G L O B A L E V A R I A B L E N *****************************************/
|
23 | volatile unsigned char lampen_modus = 0; //0=Normal, 1=Synchronisation, 2=Wartungsmodus
|
24 |
|
25 | #pragma code
|
26 | /** F U N K T I O N S D E K L A R A T I O N E N *****************************/
|
27 |
|
28 | /**************************************************************************//**
|
29 | * \brief Sendet eine Nachricht an eine benachbarte Lampe
|
30 | * \details -
|
31 | * \param[in] unsigned char ziel Adresse des XBEE-Moduls/ der benachbaten Lampe
|
32 | * \param[in] unsigned char kommando Kommando_ID zur Interpraetation der Daten
|
33 | * \param[in] unsigned char* daten Daten die gesendet werden sollen
|
34 | * \param[in] unsigned char daten_laenge Anzahl der Datenbytes
|
35 | * \param[out] unsigned char 0=Erfolg, 1=kein XBEE-AKN, 2=CCA Fehler,
|
36 | * \n 4=Timeout XBEE-AKN, 5=Timeout Lampen-AKN, 6=Daten zu groß
|
37 | ******************************************************************************/
|
38 | unsigned char Transmit( unsigned char ziel, unsigned char kommando_id,
|
39 | unsigned char nachricht_id, unsigned char *daten, unsigned char daten_laenge)
|
40 | {
|
41 | unsigned char i;
|
42 | unsigned char nachricht[MAX_NACHRICHTEN_LAENGE+3];
|
43 |
|
44 | //Zu viele Daten ?
|
45 | if(daten_laenge >= MAX_NACHRICHTEN_LAENGE )
|
46 | {
|
47 | return 6; //Fehler
|
48 | }
|
49 |
|
50 | //AKN-Narchiten verwerfen
|
51 | xbee_akn_complete = 0;
|
52 | lampen_akn_complete = 0;
|
53 |
|
54 | //zusammenstellen der Nachricht
|
55 | nachricht[0] = kommando_id;
|
56 | nachricht[1] = nachricht_id;
|
57 | nachricht[2] = daten_laenge;
|
58 |
|
59 | for(i = 0; i < daten_laenge; i++)
|
60 | {
|
61 | nachricht[i+3] = daten[i];
|
62 | }
|
63 | //Nachricht senden
|
64 | XBEE_TX(ziel, 0x01, nachricht, (daten_laenge + 3) );
|
65 |
|
66 | //Auf AKN von XBEE-Modul warten (max. 500ms )
|
67 | for(i = 0; (xbee_akn_complete != 1) && (i<50); i++)
|
68 | {
|
69 | _delay_ms(10);
|
70 | }
|
71 | //AKN von XBEE-Modul empfangen?
|
72 | if( xbee_akn_complete == 1)
|
73 | {
|
74 | INTCONbits.GIEH = 0; //Alle Interupts AUS
|
75 |
|
76 | //A C H T U N G : Ueberprüfung auf die richtige Frame ID fehlt
|
77 | //-> es wird immer nur eine Nachricht nach der anderen gesendet!
|
78 |
|
79 | xbee_akn_complete = 0; //AKN wurde verarbeitet
|
80 | i = xbee_akn; //xbee_akn zwischenspeichern -> Interrupts EIN
|
81 |
|
82 | INTCONbits.GIEH = 1; //Alle Interupts wieder Ein
|
83 | //AKN erfoglreich?
|
84 | if(i > 0)
|
85 | {
|
86 | return i; //Fehler bei der Datenuebertragung zw. XBEE-Modulen
|
87 | }
|
88 | }
|
89 | //Nach 500ms keine XBEE-AKN-Nachricht empfangen -> Fehler!
|
90 | else
|
91 | {
|
92 | return 4;
|
93 | }
|
94 |
|
95 | //Auf Bestaetigungsnachricht warten (max. 500ms)
|
96 | for(i = 0; (lampen_akn_complete != 1) && (i<50); i++)
|
97 | {
|
98 | _delay_ms(10);
|
99 | }
|
100 |
|
101 | //Bestaetigungsnachricht empfangen?
|
102 | if( lampen_akn_complete == 1)
|
103 | {
|
104 | INTCONbits.GIEH = 0; //Alle Interupts AUS
|
105 |
|
106 | //A C H T U N G : Ueberprüfung auf die richtige Nachrichten ID fehlt
|
107 | //-> es wird immer nur eine Nachricht nach der anderen gesendet!
|
108 |
|
109 | lampen_akn_complete = 0; //AKN wurde verarbeitet
|
110 | i = lampen_akn; //lampen_akn zwischenspeichern -> Interrupts EIN
|
111 |
|
112 | INTCONbits.GIEH = 1; //Alle Interupts wieder Ein
|
113 |
|
114 | return i;
|
115 | }
|
116 | //Nach 500ms keine Bestaetigungsnachricht empfangen -> Fehler
|
117 | else
|
118 | {
|
119 | return 5;
|
120 | }
|
121 |
|
122 |
|
123 | }
|
124 |
|
125 | /**************************************************************************//**
|
126 | * \brief Verarbeiten und weiterleiten der empfangenen Nachrichten
|
127 | * \details -
|
128 | ******************************************************************************/
|
129 | void Process(void)
|
130 | {
|
131 | unsigned char i; //Zaehlvariable
|
132 |
|
133 | unsigned char nachricht[MAX_NACHRICHTEN_LAENGE+2];
|
134 | unsigned char temp_daten[MAX_NACHRICHTEN_LAENGE];
|
135 |
|
136 | if(API_fifo.read != API_fifo.write) //Nachricht empfangen?
|
137 | {
|
138 | BufferOut(nachricht);
|
139 | }
|
140 | else //keine Nachricht im FIFO
|
141 | {
|
142 | return;
|
143 | }
|
144 |
|
145 | //Nachricht an eigenen Lampe adressiert!
|
146 | if( (nachricht[LAMPEN_ZIEL_ADRESSE] == LAMPEN_ADRESSE) || (nachricht[LAMPEN_ZIEL_ADRESSE] == LAMPEN_BROADCAST) )
|
147 | {
|
148 | //Broadcast -> Nachricht weiterleiten
|
149 | if(nachricht[LAMPEN_ZIEL_ADRESSE] == LAMPEN_BROADCAST)
|
150 | {
|
151 | //Kommt Nachricht von Vorgaenger -> an Nachfolger weiterleiten
|
152 | if(nachricht[LAMPEN_QUELL_ADRESSE] < LAMPEN_ADRESSE )
|
153 | {
|
154 | //kein Nachfolger? -> Nachricht nicht weiterleiten
|
155 | if(ADRESSE_NACHFOLGER != 0x00)
|
156 | {
|
157 | //Nachricht zusammenstellen
|
158 | for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
|
159 | {
|
160 | temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
|
161 | }
|
162 |
|
163 | //Nachricht weiterleiten (max. 5 Versuche!)
|
164 | i = 0;
|
165 | while( (i < 5) && ( Transmit(ADRESSE_NACHFOLGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
|
166 | {
|
167 | _delay_ms(10);
|
168 | i++;
|
169 | }
|
170 | }
|
171 | }
|
172 | //Kommt Nachricht von Nachfolger -> an Vorgaenger weiterleiten
|
173 | if(nachricht[LAMPEN_QUELL_ADRESSE] > LAMPEN_ADRESSE )
|
174 | {
|
175 | //kein Vorgaenger? -> Nachricht nicht weiterleiten
|
176 | if(ADRESSE_VORGAENGER != 0x00)
|
177 | {
|
178 | //Nachricht zusammenstellen
|
179 | for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
|
180 | {
|
181 | temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
|
182 | }
|
183 |
|
184 | //Nachricht weiterleiten (max. 5 Versuche!)
|
185 | i = 0;
|
186 | while( (i < 5) && ( Transmit(ADRESSE_VORGAENGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
|
187 | {
|
188 | _delay_ms(10);
|
189 | i++;
|
190 | }
|
191 | }
|
192 | }
|
193 | }
|
194 |
|
195 | //Nachricht verarbeiten
|
196 | switch(nachricht[KOMMANDO_ID])
|
197 | {
|
198 | case BELEUCHTUNG:
|
199 | if(nachricht[BELEUCHTUNGSSTAERKE] == 0xFF)
|
200 | {
|
201 | LED_LATCH |= (1<<LED4); //Licht Ein
|
202 | }
|
203 | else if(nachricht[BELEUCHTUNGSSTAERKE] == 0x00)
|
204 | {
|
205 | LED_LATCH &= ~(1<<LED4); //Licht Aus
|
206 | }
|
207 | break;
|
208 |
|
209 | case ANFRAGE_BETRIEBSSTATUS:
|
210 | break;
|
211 |
|
212 | case ANTWORT_BETRIEBSSTATUS:
|
213 | break;
|
214 |
|
215 | case SYNC_MODE_BETRETEN:
|
216 |
|
217 | //Synchronisations-Modus betreten!
|
218 | lampen_modus = MODUS_SYNC;
|
219 |
|
220 | //letzte Lampe im Netzwerk? -> Bestaetigung an Absender senden!
|
221 | if(ADRESSE_NACHFOLGER == 0x00)
|
222 | {
|
223 | temp_daten[0] = nachricht[LAMPEN_QUELL_ADRESSE]; //Ziel = Absender der Broadcast nachricht
|
224 | temp_daten[1] = LAMPEN_ADRESSE; //Absender = Eigene Adresse
|
225 |
|
226 | i = 0;
|
227 | while( (i < 5) && ( Transmit(nachricht[ADRESSE_VORGAENGER], AKN_SYNC_MODE, 0x01, temp_daten, 0x02 ) ) )
|
228 | {
|
229 | _delay_ms(10);
|
230 | i++;
|
231 | }
|
232 | }
|
233 |
|
234 | break;
|
235 |
|
236 | case AKN_SYNC_MODE:
|
237 |
|
238 | lcd_clear();
|
239 | lcd_string("AKN_SYNC");
|
240 | lcd_setcursor(0,2);
|
241 | lcd_string("Done!");
|
242 |
|
243 | break;
|
244 |
|
245 | case SYNC_NACHRICHT:
|
246 | break;
|
247 |
|
248 | case SYNC_MODE_BEENDET:
|
249 |
|
250 | //Normalen-Modus betreten!
|
251 | lampen_modus = MODUS_NORMAL;
|
252 |
|
253 | break;
|
254 |
|
255 | default:
|
256 | break;
|
257 | }
|
258 |
|
259 | return;
|
260 | }
|
261 | //Nachricht an Nachfolger weiterleiten
|
262 | else if(nachricht[LAMPEN_ZIEL_ADRESSE] > LAMPEN_ADRESSE)
|
263 | {
|
264 | //kein Nachfolger? -> Nachricht verwerfen
|
265 | if(ADRESSE_NACHFOLGER == 0x00)
|
266 | {
|
267 | return;
|
268 | }
|
269 |
|
270 | //Nachricht zusammenstellen
|
271 | for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
|
272 | {
|
273 | temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
|
274 | }
|
275 |
|
276 | //Nachricht weiterleiten (max. 5 Versuche!)
|
277 | i = 0;
|
278 | while( (i < 5) && ( Transmit(ADRESSE_NACHFOLGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
|
279 | {
|
280 | _delay_ms(10);
|
281 | i++;
|
282 | }
|
283 |
|
284 | return;
|
285 | }
|
286 | //Nachricht an Vorgaenger weiterleiten
|
287 | else if(nachricht[LAMPEN_ZIEL_ADRESSE] < LAMPEN_ADRESSE)
|
288 | {
|
289 | //kein Vorgaenger? -> Nachricht verwerfen
|
290 | if(ADRESSE_VORGAENGER == 0x00)
|
291 | {
|
292 | return;
|
293 | }
|
294 |
|
295 | //Nachricht zusammenstellen
|
296 | for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
|
297 | {
|
298 | temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
|
299 | }
|
300 |
|
301 | //Nachricht weiterleiten (max. 5 Versuche!)
|
302 | i = 0;
|
303 | while( (i < 5) && ( Transmit(ADRESSE_VORGAENGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
|
304 | {
|
305 | _delay_ms(10);
|
306 | i++;
|
307 | }
|
308 |
|
309 | return;
|
310 | }
|
311 | }
|