altos: fix functions calling pollchar to use 'int' to hold the value
[fw/altos] / src / core / ao_stdio.c
index c0138a30dbd730bc26bcea06b38fe872ce8650e2..1748dfe8d940ecc550ff41911db01b0259291ec9 100644 (file)
  * Basic I/O functions to support SDCC stdio package
  */
 
+#ifndef USE_SERIAL_0_STDIN
+#define USE_SERIAL_0_STDIN     0
+#endif
+#ifndef USE_SERIAL_1_STDIN
+#define USE_SERIAL_1_STDIN     0
+#endif
+#ifndef USE_SERIAL_2_STDIN
+#define USE_SERIAL_2_STDIN     0
+#endif
+#ifndef USE_SERIAL_3_STDIN
+#define USE_SERIAL_3_STDIN     0
+#endif
+#ifndef USE_SERIAL_4_STDIN
+#define USE_SERIAL_4_STDIN     0
+#endif
+#ifndef USE_SERIAL_5_STDIN
+#define USE_SERIAL_5_STDIN     0
+#endif
+#ifndef USE_SERIAL_6_STDIN
+#define USE_SERIAL_6_STDIN     0
+#endif
+#ifndef USE_SERIAL_7_STDIN
+#define USE_SERIAL_7_STDIN     0
+#endif
+#ifndef USE_SERIAL_8_STDIN
+#define USE_SERIAL_8_STDIN     0
+#endif
+#ifndef USE_SERIAL_9_STDIN
+#define USE_SERIAL_9_STDIN     0
+#endif
+
+#define USE_SERIAL_STDIN (USE_SERIAL_0_STDIN + \
+                         USE_SERIAL_1_STDIN +  \
+                         USE_SERIAL_2_STDIN +  \
+                         USE_SERIAL_3_STDIN +  \
+                         USE_SERIAL_4_STDIN +  \
+                         USE_SERIAL_5_STDIN +  \
+                         USE_SERIAL_6_STDIN +  \
+                         USE_SERIAL_7_STDIN +  \
+                         USE_SERIAL_8_STDIN +  \
+                         USE_SERIAL_9_STDIN)
+
 #define AO_NUM_STDIOS  (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN)
 
 __xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS];
@@ -30,6 +72,15 @@ __pdata int8_t ao_num_stdios;
 void
 putchar(char c)
 {
+#if LOW_LEVEL_DEBUG
+       if (!ao_cur_task) {
+               extern void ao_debug_out(char c);
+               if (c == '\n')
+                       ao_debug_out('\r');
+               ao_debug_out(c);
+               return;
+       }
+#endif
        if (c == '\n')
                (*ao_stdios[ao_cur_stdio].putchar)('\r');
        (*ao_stdios[ao_cur_stdio].putchar)(c);
@@ -45,21 +96,23 @@ flush(void)
 __xdata uint8_t ao_stdin_ready;
 
 char
-getchar(void) __reentrant __critical
+getchar(void) __reentrant
 {
-       char c;
-       int8_t stdio = ao_cur_stdio;
+       int c;
+       ao_arch_critical(
+               int8_t stdio = ao_cur_stdio;
 
-       for (;;) {
-               c = ao_stdios[stdio].pollchar();
-               if (c != AO_READ_AGAIN)
-                       break;
-               if (++stdio == ao_num_stdios)
-                       stdio = 0;
-               if (stdio == ao_cur_stdio)
-                       ao_sleep(&ao_stdin_ready);
-       }
-       ao_cur_stdio = stdio;
+               for (;;) {
+                       c = ao_stdios[stdio].pollchar();
+                       if (c != AO_READ_AGAIN)
+                               break;
+                       if (++stdio == ao_num_stdios)
+                               stdio = 0;
+                       if (stdio == ao_cur_stdio)
+                               ao_sleep(&ao_stdin_ready);
+               }
+               ao_cur_stdio = stdio;
+               );
        return c;
 }
 
@@ -70,7 +123,7 @@ ao_echo(void)
 }
 
 int8_t
-ao_add_stdio(char (*pollchar)(void),
+ao_add_stdio(int (*pollchar)(void),
             void (*putchar)(char),
             void (*flush)(void)) __reentrant
 {