/**
* 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;
}
}
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) {
else post retrySend();
}
-#ifdef _H_msp430hardware_h
- int putchar(int c) __attribute__((noinline)) @C() @spontaneous() {
-#endif
#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 putchar(int c) __attribute__((noinline)) @C() @spontaneous() {
+#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();
}