/[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 96 - (show annotations) (download)
Tue May 22 06:41:06 2007 UTC (17 years ago) by hedin
File MIME type: text/plain
File size: 11543 byte(s)
network_send_hello(termid) is working:D
1 #define THIS_IS_STACK_APPLICATION
2
3 #include "stacktsk.h"
4 #include "dhcp.h"
5 #include "tick.h"
6 #include "delay.h"
7 #include "udp.h"
8 #include "arp.h"
9 #include "arptsk.h"
10 #include "tcp.h"
11
12 bit bIsDhcpUp = 0;
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 SetConfig(void);
70
71 /*****************************
72 Enummerations
73 ****************************/
74 typedef enum _NetworkState
75 {
76 off,
77 DhcpIsBound,
78 ArpIsTxReady,
79 ArpIsResolved,
80 SockOpening,
81 SockOpen,
82 TcpReadyToSend,
83 TcpSend,
84 SockClosing,
85 SockClosed
86 } NetworkState;
87
88 /*****************************
89 GLOBAL INIT
90 ****************************/
91 NODE_INFO rnode;
92 NetworkState state;
93 TCP_SOCKET tsock1;
94
95
96 /*****************************
97 network funktions
98 ****************************/
99 int net_INT = 13, i;
100 char *net_CHAR = "1234567890123";
101
102
103 void network_init(void)
104 {
105 state = off;
106 }
107 char network_send_hello( unsigned char termid )
108 {
109 char error = 0;
110 char gotArp = 0;
111 static char isBound = 0;
112
113 if ( DHCPIsBound() && isBound == 0 ){
114 state = DhcpIsBound;
115 isBound = 1;
116 }
117
118 switch (state)
119 {
120 case DhcpIsBound:
121 if ( ARPIsTxReady() && gotArp == 0 )
122 state = ArpIsTxReady;
123 else
124 state = ArpIsResolved;
125 return 0;
126
127 case ArpIsTxReady:
128 ARPResolve(&rnode.IPAddr);
129 gotArp = 1;
130 state = ArpIsResolved;
131 return 0;
132
133 case ArpIsResolved:
134 if (ARPIsResolved(&rnode.IPAddr, &rnode.MACAddr) ){
135 state = SockOpening;
136 return 0;
137 }
138 else{
139 state = ArpIsResolved;
140 return 2; // no arp resolved
141 }
142
143 case SockOpening:
144 tsock1 = TCPConnect (&rnode, 3000);
145 state = SockOpen;
146 return 0;
147
148 case SockOpen:
149 if ( TCPIsConnected(tsock1) && TCPIsPutReady(tsock1) )
150 state = TcpSend;
151 return 0;
152
153 case TcpSend:
154 for (i = net_INT; i >= 0; i--)
155 {
156 TCPPut(tsock1, termid );
157 }
158 TCPFlush(tsock1);
159 state = TcpReadyToSend;
160 return 0;
161 }
162 return 1;
163 }
164 /*
165 void network_send_hello( unsigned char termid )
166 {
167 if (DHCPIsBound())
168 {
169 RA3 = 0;
170 if (sock_open == 0)
171 {
172 if (ARPIsTxReady())
173 {
174 ARPResolve( &rnode.IPAddr);
175 is_resolved = 1;
176 }
177 else
178 {
179 if (ARPIsResolved( &rnode.IPAddr, &rnode.MACAddr))
180 //if (MyArp( &rnode))
181 {
182 usock1=UDPOpen(2000,&rnode,3000); // socket to send UDP
183 sock_open=1;
184 }
185 }
186 }
187 }
188
189 if (UDPIsPutReady(usock1) && datagrams_to_send>0)
190 {
191 UDPPut( rnode.MACAddr.v[0] );
192 UDPPut( rnode.MACAddr.v[1] );
193 UDPPut( rnode.MACAddr.v[2] );
194 UDPPut( rnode.MACAddr.v[3] );
195 UDPPut( rnode.MACAddr.v[4] );
196 UDPPut( rnode.MACAddr.v[5] );
197 UDPPut('D');
198 UDPPut('a');
199 UDPPut('w');
200 UDPPut(0);
201 UDPFlush();
202 datagrams_to_send--;
203 }
204 }
205 }
206 */
207
208 void main(void)
209 {
210 // Tick to blink SYSTEM led.
211 static TICK t = 0;
212 TCP_SOCKET usock1;
213 char sock_state = 0;
214 char is_resolved = 0;
215 char has_arp = 0;
216 char a;
217
218 TICK tick;
219 TICK lastTick;
220 TICK diffTicks;
221
222 /*
223 * Initialize any application specific hardware.
224 */
225 InitializeBoard();
226
227 /*
228 * Initialize all stack related components.
229 * Following steps must be performed for all applications using
230 * PICmicro TCP/IP Stack.
231 */
232 TickInit();
233
234 /*
235 * Initialize Stack and application related NV variables.
236 */
237 InitAppConfig();
238
239 StackInit();
240
241 network_init();
242
243
244
245 /*
246 * Once all items are initialized, go into infinite loop and let
247 * stack items execute their tasks.
248 * If application needs to perform its own task, it should be
249 * done at the end of while loop.
250 * Note that this is a "co-operative mult-tasking" mechanism
251 * where every task performs its tasks (whether all in one shot
252 * or part of it) and returns so that other tasks can do their
253 * job.
254 * If a task needs very long time to do its job, it must broken
255 * down into smaller pieces so that other tasks can have CPU time.
256 */
257
258
259 // Defines the IP add. on the server machine
260 rnode.IPAddr.v[0] = 192;
261 rnode.IPAddr.v[1] = 168;
262 rnode.IPAddr.v[2] = 1;
263 rnode.IPAddr.v[3] = 20;
264
265 while(1)
266 {
267 /*
268 * Blink SYSTEM LED every second.
269 */
270 if ( TickGetDiff(TickGet(), t) >= TICK_SECOND/2 )
271 {
272 t = TickGet();
273 LATA4 ^= 1;
274 }
275
276 /*
277 * This task performs normal stack task including checking
278 * for incoming packet, type of packet and calling
279 * appropriate stack entity to process it.
280 */
281 StackTask();
282
283 /*
284 * For DHCP information, display how many times we have renewed the IP
285 * configuration since last reset.
286 */
287
288 a = network_send_hello( 1 );
289 /* if (DHCPIsBound())
290 {
291 RA3 =0;
292 if (has_arp == 0)
293 {
294 if (ARPIsTxReady())
295 {
296 if (is_resolved == 0)
297 {
298 ARPResolve( &rnode.IPAddr);
299 is_resolved = 1;
300 }
301 else
302 {
303 if (ARPIsResolved( &rnode.IPAddr, &rnode.MACAddr))
304 {
305 has_arp = 1;
306 }
307 }
308
309 }
310 }
311
312 if (has_arp == 1)
313 {
314 if (sock_state == 0)
315 {
316 usock1=TCPConnect(&rnode,3000);
317 sock_state = 1;
318 }
319 /* if (sock_state ==1 && TCPIsConnected(usock1) && TCPIsPutReady(usock1))
320 {
321 TCPPut(usock1,'D');
322 TCPPut(usock1,'a');
323 TCPPut(usock1,'w');
324 TCPPut(usock1,0);
325 TCPFlush(usock1);
326 sock_state = 2;
327 }
328
329 if (sock_state == 2 && TCPIsPutReady(usock1))
330 {
331 TCPDisconnect(usock1);
332 lastTick = TickGet();
333 sock_state =3;
334 }
335 tick = TickGet();
336 diffTicks = TickGetDiff(tick, lastTick);
337
338 if ( sock_state == 3 && diffTicks > ((TICK)TICK_SECOND * (TICK)2) )
339 sock_state = 0;
340
341 }
342 } */
343 }
344 }
345
346 #if defined(MCHP_C18)
347 #pragma interrupt HighISR save=section(".tmpdata")
348 void HighISR(void)
349 #elif defined(HITECH_C18)
350 #if defined(STACK_USE_SLIP)
351 extern void MACISR(void);
352 #endif
353 void interrupt HighISR(void)
354 #endif
355 {
356 TickUpdate();
357 /*
358 #if defined(STACK_USE_SLIP)
359 MACISR();
360 #endif
361 */
362 }
363
364 #if defined(MCHP_C18)
365 #pragma code highVector=0x08
366 void HighVector (void)
367 {
368 _asm goto HighISR _endasm
369 }
370 #pragma code /* return to default code section */
371 #endif
372
373 /*********************************************************************
374 * Function: void InitializeBoard(void)
375 *
376 * PreCondition: None
377 *
378 * Input: None
379 *
380 * Output: None
381 *
382 * Side Effects: None
383 *
384 * Overview: Initialize board specific hardware.
385 *
386 * Note: None
387 ********************************************************************/
388 static void InitializeBoard(void)
389 {
390 /*
391 * Setup for PORTA.RA0 as analog input while rests
392 * as digital i/o lines.
393 */
394 ADCON1 = 0b10001110; // RA0 as analog input, Right justified
395 TRISA = 0x03;
396
397 /*
398 * LCD is enabled using RA5.
399 */
400 // PORTA_RA5 = 0; // Disable LCD.
401
402 /*
403 * Turn off the LED's.
404 */
405 LATA2 = 1;
406 LATA3 = 1;
407
408 /*
409 * External data EEPROM needs pull-ups, so enable internal
410 * pull-ups.
411 */
412 INTCON2_RBPU = 0;
413
414 T0CON = 0;
415 INTCON_GIEH = 1;
416 INTCON_GIEL = 1;
417
418 }
419
420 /*********************************************************************
421 * Function: void InitAppConfig(void)
422 *
423 * PreCondition: MPFSInit() is already called.
424 *
425 * Input: None
426 *
427 * Output: Write/Read non-volatile config variables.
428 *
429 * Side Effects: None
430 *
431 * Overview: None
432 *
433 * Note: None
434 ********************************************************************/
435 static void InitAppConfig(void)
436 {
437 /*
438 * Load default configuration into RAM.
439 */
440 AppConfig.MyIPAddr.v[0] = MY_DEFAULT_IP_ADDR_BYTE1;
441 AppConfig.MyIPAddr.v[1] = MY_DEFAULT_IP_ADDR_BYTE2;
442 AppConfig.MyIPAddr.v[2] = MY_DEFAULT_IP_ADDR_BYTE3;
443 AppConfig.MyIPAddr.v[3] = MY_DEFAULT_IP_ADDR_BYTE4;
444
445 AppConfig.MyMask.v[0] = MY_DEFAULT_MASK_BYTE1;
446 AppConfig.MyMask.v[1] = MY_DEFAULT_MASK_BYTE2;
447 AppConfig.MyMask.v[2] = MY_DEFAULT_MASK_BYTE3;
448 AppConfig.MyMask.v[3] = MY_DEFAULT_MASK_BYTE4;
449
450 AppConfig.MyGateway.v[0] = MY_DEFAULT_GATE_BYTE1;
451 AppConfig.MyGateway.v[1] = MY_DEFAULT_GATE_BYTE2;
452 AppConfig.MyGateway.v[2] = MY_DEFAULT_GATE_BYTE3;
453 AppConfig.MyGateway.v[3] = MY_DEFAULT_GATE_BYTE4;
454
455 AppConfig.MyMACAddr.v[0] = MY_DEFAULT_MAC_BYTE1;
456 AppConfig.MyMACAddr.v[1] = MY_DEFAULT_MAC_BYTE2;
457 AppConfig.MyMACAddr.v[2] = MY_DEFAULT_MAC_BYTE3;
458 AppConfig.MyMACAddr.v[3] = MY_DEFAULT_MAC_BYTE4;
459 AppConfig.MyMACAddr.v[4] = MY_DEFAULT_MAC_BYTE5;
460 AppConfig.MyMACAddr.v[5] = MY_DEFAULT_MAC_BYTE6;
461
462 #if defined(STACK_USE_DHCP)
463 AppConfig.Flags.bIsDHCPEnabled = TRUE;
464 #else
465 AppConfig.Flags.bIsDHCPEnabled = FALSE;
466 #endif
467 }
468
469 BOOL StringToIPAddress(char *str, IP_ADDR *buffer)
470 {
471 BYTE v;
472 char *temp;
473 BYTE byteIndex;
474
475 temp = str;
476 byteIndex = 0;
477
478 while( v = *str )
479 {
480 if ( v == '.' )
481 {
482 *str++ = '\0';
483 buffer->v[byteIndex++] = atoi(temp);
484 temp = str;
485 }
486 else if ( v < '0' || v > '9' )
487 return FALSE;
488
489 str++;
490 }
491
492 buffer->v[byteIndex] = atoi(temp);
493
494 return (byteIndex == 3);
495 }
496

  ViewVC Help
Powered by ViewVC 1.1.20