]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/printf/PrintfP.nc
Updated to use generic printf functionality if none provided easily by their native...
[tinyos-2.x.git] / tos / lib / printf / PrintfP.nc
index 78595a8db9f19189352fdad01fa28be6717729d6..b620e5e416f6a8b06caff9ade78afc9bb130ce7e 100644 (file)
 /**
  * This is the PrintfP component.  It provides the printf service for printing
  * data over the serial interface using the standard c-style printf command.  
- * It must be started via the SplitControl interface it provides.  Data
- * printed using printf are buffered and only sent over the serial line after
- * making a call to PrintfFlush.flush().  This buffer has a maximum size of 
- * 250 bytes at present.  After calling start on this component, printf
- * statements can be made anywhere throughout your code, so long as you include
- * the "printf.h" header file in every file you wish to use it.  Standard
- * practice is to start the printf service in the main application, and set up 
- * a timer to periodically flush the printf buffer (500ms should do).  In future
- * versions, user defined buffer sizes as well as well as automatic flushing at 
- * user defined intervals will be supported.  
+ * Data printed using printf are buffered and only sent over the serial line after
+ * the buffer is half full or an explicit call to printfflush() is made.  This 
+ * buffer has a maximum size of 250 bytes at present.  This component is wired
+ * to a shadowed MainC component so that printf statements can be made anywhere 
+ * throughout your code, so long as you include the "printf.h" header file in 
+ * every file you wish to use it.  Take a look at the printf tutorial (lesson 15)
+ * for more details.
  *
  * The printf service is currently only available for msp430 based motes 
- * (i.e. telos, eyes) and atmega128 based motes (i.e. mica2, micaz).  On the
- * atmega platforms, avr-libc version 1.4 or above mus tbe used.
- * 
+ * (i.e. telos, eyes) and atmega128x based motes (i.e. mica2, micaz, iris).  On the
+ * atmega platforms, avr-libc version 1.4 or above must be used.
  */
  
 /**
 
 #ifdef _H_atmega128hardware_H
 static int uart_putchar(char c, FILE *stream);
-static FILE atm128_stdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
+static FILE atm128_stdout = 
+       FDEV_SETUP_STREAM(TCAST(int (*)(char c, FILE *stream), uart_putchar), 
+       NULL, _FDEV_SETUP_WRITE);
 #endif
 
-module PrintfP {
+module PrintfP @safe() {
   provides {
     interface Boot;
   }
@@ -113,11 +111,13 @@ implementation {
   }
 
   event void SerialControl.startDone(error_t error) {
+    if (state == S_STOPPED) {
 #ifdef _H_atmega128hardware_H
-    stdout = &atm128_stdout;
+      stdout = &atm128_stdout;
 #endif
-    atomic state = S_STARTED;
-    signal Boot.booted();
+      atomic state = S_STARTED;
+      signal Boot.booted();
+    }
   }
 
   event void SerialControl.stopDone(error_t error) {
@@ -163,11 +163,18 @@ implementation {
   
 #ifdef _H_msp430hardware_h
   int putchar(int c) __attribute__((noinline)) @C() @spontaneous() {
-#endif
+#else
 #ifdef _H_atmega128hardware_H
   int uart_putchar(char c, FILE *stream) __attribute__((noinline)) @C() @spontaneous() {
+#else
+#ifdef __M16C62PHARDWARE_H__
+  int lowlevel_putc(int c) __attribute__((noinline)) @C() @spontaneous() {
+#else
+  int lowlevel_putc(int c) __attribute__((noinline)) @C() @spontaneous() {
+#endif
+#endif
 #endif
-    if((state == S_STARTED) && (call Queue.size() >= 5*sizeof(printf_msg_t))) {
+    if((state == S_STARTED) && (call Queue.size() >= ((PRINTF_BUFFER_SIZE)/2))) {
       state = S_FLUSHING;
       sendNext();
     }