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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 93 - (hide 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 hedin 91 #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 hedin 93 #include "tcp.h"
12 hedin 91
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 hedin 93 /*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 hedin 91 void main(void)
126     {
127     // Tick to blink SYSTEM led.
128     static TICK t = 0;
129 hedin 93 TCP_SOCKET usock1;
130 hedin 91 NODE_INFO rnode;
131 hedin 93 char sock_state = 0;
132 hedin 91 char is_resolved = 0;
133 hedin 93 char has_arp = 0;
134 hedin 91
135 hedin 93 TICK tick;
136     TICK lastTick;
137     TICK diffTicks;
138 hedin 91
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 hedin 93 WriteTcpStatus( TCB[usock1].smState );
245    
246 hedin 91 if (DHCPIsBound())
247     {
248     RA3 =0;
249 hedin 93 if (has_arp == 0)
250 hedin 91 {
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 hedin 93 has_arp = 1;
263 hedin 91 }
264     }
265 hedin 93
266 hedin 91 }
267     }
268    
269 hedin 93 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 hedin 91 }
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 hedin 92
520    

  ViewVC Help
Powered by ViewVC 1.1.20