/[H8]/trunk/PIC/Demo trimmet/TFTPcDemo.c
ViewVC logotype

Contents of /trunk/PIC/Demo trimmet/TFTPcDemo.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 93 - (show annotations) (download)
Wed May 16 15:46:08 2007 UTC (17 years ago) by hedin
File MIME type: text/plain
File size: 12149 byte(s)
fixed tcp
1 #define THIS_IS_STACK_APPLICATION
2
3 #include "stacktsk.h"
4 #include "dhcp.h"
5 #include "xlcd.h"
6 #include "tick.h"
7 #include "delay.h"
8 #include "udp.h"
9 #include "arp.h"
10 #include "arptsk.h"
11 #include "tcp.h"
12
13
14 // All TFTP command statuts display will be done on first line of LCD.
15 #define TFTP_COMMAND_DISPLAY_LINE 0
16
17 // Result will be displayed at y = 15.
18 #define TFTP_COMMAND_RESULT_POSITION 15
19
20
21 #define STARTUP_MSG "G1_Build_0x00"
22
23 ROM char StartupMsg[] = STARTUP_MSG;
24
25 #if defined(STACK_USE_DHCP) || defined(STACK_USE_IP_GLEANING)
26 ROM char DHCPMsg[] = "DHCP/Gleaning...";
27 #endif
28
29 ROM char SetupMsg[] = "Board Setup...";
30
31 // 1234567890123456
32 ROM char blankLCDLine[] = " ";
33
34 /*
35 * This is used by other stack elements.
36 * Main application must define this and initialize it with
37 * proper values.
38 */
39 APP_CONFIG AppConfig;
40
41
42 BYTE myDHCPBindCount = 0;
43 #if defined(STACK_USE_DHCP)
44 extern BYTE DHCPBindCount;
45 #else
46 /*
47 * If DHCP is not enabled, force DHCP update.
48 */
49 BYTE DHCPBindCount = 1;
50 #endif
51
52 /*
53 * Set configuration fuses for HITECH compiler.
54 * For MCC18 compiler, separately linked config.asm file
55 * will set the correct fuses.
56 */
57 #if defined(HITECH_C18)
58 __CONFIG(1, UNPROTECT & HS);
59 __CONFIG(2, PWRTEN & BORDIS & WDTDIS);
60 #endif
61
62
63 /*
64 * Private helper functions.
65 * These may or may not be present in all applications.
66 */
67 static void InitAppConfig(void);
68 static void InitializeBoard(void);
69 static void DisplayIPValue(IP_ADDR *IPVal, BOOL bToLCD);
70 static void SetConfig(void);
71
72 /*void network_send_hello( unsigned char termid )
73 {
74 if (DHCPIsBound())
75 {
76 RA3 =0;
77 if (sock_open == 0)
78 {
79 if (ARPIsTxReady())
80 {
81 if (is_resolved == 0)
82 {
83 ARPResolve( &rnode.IPAddr);
84 is_resolved = 1;
85 }
86 else
87 {
88 if (ARPIsResolved( &rnode.IPAddr, &rnode.MACAddr))
89 //if (MyArp( &rnode))
90 {
91 usock1=UDPOpen(2000,&rnode,3000); // socket to send UDP
92 sock_open=1;
93 }
94 }
95 }
96 }
97
98 if (UDPIsPutReady(usock1) && datagrams_to_send>0)
99 {
100 UDPPut( rnode.MACAddr.v[0] );
101 UDPPut( rnode.MACAddr.v[1] );
102 UDPPut( rnode.MACAddr.v[2] );
103 UDPPut( rnode.MACAddr.v[3] );
104 UDPPut( rnode.MACAddr.v[4] );
105 UDPPut( rnode.MACAddr.v[5] );
106 UDPPut('D');
107 UDPPut('a');
108 UDPPut('w');
109 UDPPut(0);
110 UDPFlush();
111 datagrams_to_send--;
112 }
113 }
114 }
115 */
116
117 void WriteTcpStatus(char status)
118 {
119 XLCDGoto(0,0);
120 status += 'a';
121 XLCDPut(status);
122
123 }
124
125 void main(void)
126 {
127 // Tick to blink SYSTEM led.
128 static TICK t = 0;
129 TCP_SOCKET usock1;
130 NODE_INFO rnode;
131 char sock_state = 0;
132 char is_resolved = 0;
133 char has_arp = 0;
134
135 TICK tick;
136 TICK lastTick;
137 TICK diffTicks;
138
139 /*
140 * Initialize any application specific hardware.
141 */
142 InitializeBoard();
143
144 /*
145 * Initialize all stack related components.
146 * Following steps must be performed for all applications using
147 * PICmicro TCP/IP Stack.
148 */
149 TickInit();
150
151 /*
152 * Initialize Stack and application related NV variables.
153 */
154 InitAppConfig();
155
156 StackInit();
157
158 #if defined(STACK_USE_DHCP) || defined(STACK_USE_IP_GLEANING)
159 if ( AppConfig.Flags.bIsDHCPEnabled )
160 {
161 XLCDGoto(1, 0);
162 XLCDPutROMString(DHCPMsg);
163 }
164 else
165 {
166 /*
167 * Force IP address display update.
168 */
169 myDHCPBindCount = 1;
170 #if defined(STACK_USE_DHCP)
171 DHCPDisable();
172 #endif
173 }
174 #endif
175
176
177 /*
178 * Once all items are initialized, go into infinite loop and let
179 * stack items execute their tasks.
180 * If application needs to perform its own task, it should be
181 * done at the end of while loop.
182 * Note that this is a "co-operative mult-tasking" mechanism
183 * where every task performs its tasks (whether all in one shot
184 * or part of it) and returns so that other tasks can do their
185 * job.
186 * If a task needs very long time to do its job, it must broken
187 * down into smaller pieces so that other tasks can have CPU time.
188 */
189
190
191 // Defines the IP add. on the server machine
192 rnode.IPAddr.v[0] = 192;
193 rnode.IPAddr.v[1] = 168;
194 rnode.IPAddr.v[2] = 1;
195 rnode.IPAddr.v[3] = 20;
196 /*rnode.MACAddr.v[0] = 0x00;
197 rnode.MACAddr.v[1] = 0x16;
198 rnode.MACAddr.v[2] = 0x76;
199 rnode.MACAddr.v[3] = 0x9F;
200 rnode.MACAddr.v[4] = 0xFE;
201 rnode.MACAddr.v[5] = 0xDA;*/
202
203
204
205
206 while(1)
207 {
208 /*
209 * Blink SYSTEM LED every second.
210 */
211 if ( TickGetDiff(TickGet(), t) >= TICK_SECOND/2 )
212 {
213 t = TickGet();
214 LATA4 ^= 1;
215 }
216
217 /*
218 * This task performs normal stack task including checking
219 * for incoming packet, type of packet and calling
220 * appropriate stack entity to process it.
221 */
222 StackTask();
223
224 /*
225 * For DHCP information, display how many times we have renewed the IP
226 * configuration since last reset.
227 */
228
229 if ( DHCPBindCount != myDHCPBindCount )
230 {
231 DisplayIPValue(&AppConfig.MyIPAddr, TRUE);
232 myDHCPBindCount = DHCPBindCount;
233
234 if ( AppConfig.Flags.bIsDHCPEnabled )
235 {
236 XLCDGoto(1, 14);
237 if ( myDHCPBindCount < 0x0a )
238 XLCDPut(myDHCPBindCount + '0');
239 else
240 XLCDPut(myDHCPBindCount + 'A');
241 }
242 }
243
244 WriteTcpStatus( TCB[usock1].smState );
245
246 if (DHCPIsBound())
247 {
248 RA3 =0;
249 if (has_arp == 0)
250 {
251 if (ARPIsTxReady())
252 {
253 if (is_resolved == 0)
254 {
255 ARPResolve( &rnode.IPAddr);
256 is_resolved = 1;
257 }
258 else
259 {
260 if (ARPIsResolved( &rnode.IPAddr, &rnode.MACAddr))
261 {
262 has_arp = 1;
263 }
264 }
265
266 }
267 }
268
269 if (has_arp == 1)
270 {
271 if (sock_state == 0)
272 {
273 usock1=TCPConnect(&rnode,3000);
274 sock_state = 1;
275 }
276 if (sock_state ==1 && TCPIsConnected(usock1) && TCPIsPutReady(usock1))
277 {
278 TCPPut(usock1,'D');
279 TCPPut(usock1,'a');
280 TCPPut(usock1,'w');
281 TCPPut(usock1,0);
282 TCPFlush(usock1);
283 sock_state = 2;
284 }
285
286 if (sock_state == 2 && TCPIsPutReady(usock1))
287 {
288 TCPDisconnect(usock1);
289 lastTick = TickGet();
290 sock_state =3;
291 }
292 tick = TickGet();
293 diffTicks = TickGetDiff(tick, lastTick);
294
295 if ( sock_state == 3 && diffTicks > ((TICK)TICK_SECOND * (TICK)2) )
296 sock_state = 0;
297
298 }
299 }
300 }
301 }
302
303 #if defined(MCHP_C18)
304 #pragma interrupt HighISR save=section(".tmpdata")
305 void HighISR(void)
306 #elif defined(HITECH_C18)
307 #if defined(STACK_USE_SLIP)
308 extern void MACISR(void);
309 #endif
310 void interrupt HighISR(void)
311 #endif
312 {
313 TickUpdate();
314 /*
315 #if defined(STACK_USE_SLIP)
316 MACISR();
317 #endif
318 */
319 }
320
321 #if defined(MCHP_C18)
322 #pragma code highVector=0x08
323 void HighVector (void)
324 {
325 _asm goto HighISR _endasm
326 }
327 #pragma code /* return to default code section */
328 #endif
329
330 static void DisplayIPValue(IP_ADDR *IPVal, BOOL bToLCD)
331 {
332 char IPDigit[8];
333
334 if ( bToLCD )
335 {
336 /*
337 * Erase second line.
338 */
339 XLCDGoto(1, 0);
340 XLCDPutROMString(blankLCDLine);
341
342 }
343
344 /*
345 * Rewrite the second line.
346 */
347 XLCDGoto(1, 0);
348
349 itoa(IPVal->v[0], IPDigit);
350 if ( bToLCD )
351 {
352 XLCDPutString(IPDigit);
353 XLCDPut('.');
354 }
355
356 itoa(IPVal->v[1], IPDigit);
357 if ( bToLCD )
358 {
359 XLCDPutString(IPDigit);
360 XLCDPut('.');
361 }
362
363 itoa(IPVal->v[2], IPDigit);
364 if ( bToLCD )
365 {
366 XLCDPutString(IPDigit);
367 XLCDPut('.');
368 }
369
370 itoa(IPVal->v[3], IPDigit);
371 if ( bToLCD )
372 XLCDPutString(IPDigit);
373 }
374
375 /*********************************************************************
376 * Function: void InitializeBoard(void)
377 *
378 * PreCondition: None
379 *
380 * Input: None
381 *
382 * Output: None
383 *
384 * Side Effects: None
385 *
386 * Overview: Initialize board specific hardware.
387 *
388 * Note: None
389 ********************************************************************/
390 static void InitializeBoard(void)
391 {
392 /*
393 * Setup for PORTA.RA0 as analog input while rests
394 * as digital i/o lines.
395 */
396 ADCON1 = 0b10001110; // RA0 as analog input, Right justified
397 TRISA = 0x03;
398
399 /*
400 * LCD is enabled using RA5.
401 */
402 PORTA_RA5 = 0; // Disable LCD.
403
404 /*
405 * Turn off the LED's.
406 */
407 LATA2 = 1;
408 LATA3 = 1;
409
410 /*
411 * External data EEPROM needs pull-ups, so enable internal
412 * pull-ups.
413 */
414 INTCON2_RBPU = 0;
415
416 XLCDInit();
417 XLCDGoto(0, 0);
418 XLCDPutROMString(StartupMsg);
419
420 T0CON = 0;
421 INTCON_GIEH = 1;
422 INTCON_GIEL = 1;
423
424 }
425
426 /*********************************************************************
427 * Function: void InitAppConfig(void)
428 *
429 * PreCondition: MPFSInit() is already called.
430 *
431 * Input: None
432 *
433 * Output: Write/Read non-volatile config variables.
434 *
435 * Side Effects: None
436 *
437 * Overview: None
438 *
439 * Note: None
440 ********************************************************************/
441 static void InitAppConfig(void)
442 {
443 /*
444 * Load default configuration into RAM.
445 */
446 AppConfig.MyIPAddr.v[0] = MY_DEFAULT_IP_ADDR_BYTE1;
447 AppConfig.MyIPAddr.v[1] = MY_DEFAULT_IP_ADDR_BYTE2;
448 AppConfig.MyIPAddr.v[2] = MY_DEFAULT_IP_ADDR_BYTE3;
449 AppConfig.MyIPAddr.v[3] = MY_DEFAULT_IP_ADDR_BYTE4;
450
451 AppConfig.MyMask.v[0] = MY_DEFAULT_MASK_BYTE1;
452 AppConfig.MyMask.v[1] = MY_DEFAULT_MASK_BYTE2;
453 AppConfig.MyMask.v[2] = MY_DEFAULT_MASK_BYTE3;
454 AppConfig.MyMask.v[3] = MY_DEFAULT_MASK_BYTE4;
455
456 AppConfig.MyGateway.v[0] = MY_DEFAULT_GATE_BYTE1;
457 AppConfig.MyGateway.v[1] = MY_DEFAULT_GATE_BYTE2;
458 AppConfig.MyGateway.v[2] = MY_DEFAULT_GATE_BYTE3;
459 AppConfig.MyGateway.v[3] = MY_DEFAULT_GATE_BYTE4;
460
461 AppConfig.MyMACAddr.v[0] = MY_DEFAULT_MAC_BYTE1;
462 AppConfig.MyMACAddr.v[1] = MY_DEFAULT_MAC_BYTE2;
463 AppConfig.MyMACAddr.v[2] = MY_DEFAULT_MAC_BYTE3;
464 AppConfig.MyMACAddr.v[3] = MY_DEFAULT_MAC_BYTE4;
465 AppConfig.MyMACAddr.v[4] = MY_DEFAULT_MAC_BYTE5;
466 AppConfig.MyMACAddr.v[5] = MY_DEFAULT_MAC_BYTE6;
467
468 #if defined(STACK_USE_DHCP)
469 AppConfig.Flags.bIsDHCPEnabled = TRUE;
470 #else
471 AppConfig.Flags.bIsDHCPEnabled = FALSE;
472 #endif
473 }
474
475 BOOL StringToIPAddress(char *str, IP_ADDR *buffer)
476 {
477 BYTE v;
478 char *temp;
479 BYTE byteIndex;
480
481 temp = str;
482 byteIndex = 0;
483
484 while( v = *str )
485 {
486 if ( v == '.' )
487 {
488 *str++ = '\0';
489 buffer->v[byteIndex++] = atoi(temp);
490 temp = str;
491 }
492 else if ( v < '0' || v > '9' )
493 return FALSE;
494
495 str++;
496 }
497
498 buffer->v[byteIndex] = atoi(temp);
499
500 return (byteIndex == 3);
501 }
502
503
504 void XLCDDelay15ms(void)
505 {
506 DelayMs(15);
507 }
508 void XLCDDelay4ms(void)
509 {
510 DelayMs(4);
511 }
512
513 void XLCDDelay100us(void)
514 {
515 INTCON_GIEH = 0;
516 Delay10us(1);
517 INTCON_GIEH = 1;
518 }
519
520

  ViewVC Help
Powered by ViewVC 1.1.20