altos: Sanity check barometer before going to pad mode
[fw/altos] / src / core / ao_stdio.c
index 18fa913e5a57126f55524ca87f541e3877e3985a..977d74b1800bdafc2cc24be64bcc99331f608ed1 100644 (file)
  * Basic I/O functions to support SDCC stdio package
  */
 
-#ifdef SERIAL_STDIN_PORT
-#define USE_SERIAL_STDIN 1
-#else
-#define USE_SERIAL_STDIN 0
+#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)
 
@@ -60,13 +96,15 @@ 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;
+       int8_t stdio;
 
+       ao_arch_block_interrupts();
+       stdio = ao_cur_stdio;
        for (;;) {
-               c = ao_stdios[stdio].pollchar();
+               c = ao_stdios[stdio]._pollchar();
                if (c != AO_READ_AGAIN)
                        break;
                if (++stdio == ao_num_stdios)
@@ -75,6 +113,7 @@ getchar(void) __reentrant __critical
                        ao_sleep(&ao_stdin_ready);
        }
        ao_cur_stdio = stdio;
+       ao_arch_release_interrupts();
        return c;
 }
 
@@ -85,13 +124,13 @@ ao_echo(void)
 }
 
 int8_t
-ao_add_stdio(char (*pollchar)(void),
+ao_add_stdio(int (*_pollchar)(void),
             void (*putchar)(char),
             void (*flush)(void)) __reentrant
 {
        if (ao_num_stdios == AO_NUM_STDIOS)
                ao_panic(AO_PANIC_STDIO);
-       ao_stdios[ao_num_stdios].pollchar = pollchar;
+       ao_stdios[ao_num_stdios]._pollchar = _pollchar;
        ao_stdios[ao_num_stdios].putchar = putchar;
        ao_stdios[ao_num_stdios].flush = flush;
        ao_stdios[ao_num_stdios].echo = 1;