Switch from GPLv2 to GPLv2+
[fw/altos] / src / kernel / ao_pyro.c
index 154edad5f0f7e4436361644d52705efa941e3c0f..c9920ab335cd681369ad8e78e893f8b1bd49b021 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -375,9 +376,7 @@ ao_pyro(void)
                ao_sleep(&ao_flight_state);
 
        for (;;) {
-               ao_alarm(AO_MS_TO_TICKS(100));
-               ao_sleep(&ao_pyro_wakeup);
-               ao_clear_alarm();
+               ao_sleep_for(&ao_pyro_wakeup, AO_MS_TO_TICKS(100));
                if (ao_flight_state >= ao_flight_landed)
                        break;
                any_waiting = ao_pyro_check();
@@ -499,13 +498,26 @@ ao_pyro_set(void)
                }
                pyro_tmp.flags |= ao_pyro_values[v].flag;
                if (ao_pyro_values[v].offset != NO_VALUE) {
+                       uint8_t negative = 0;
+                       ao_cmd_white();
+                       if (ao_cmd_lex_c == '-') {
+                               negative = 1;
+                               ao_cmd_lex();
+                       }
                        ao_cmd_decimal();
                        if (ao_cmd_status != ao_cmd_success)
                                return;
-                       if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE)
+                       if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE) {
+                               if (negative) {
+                                       ao_cmd_status = ao_cmd_syntax_error;
+                                       return;
+                               }
                                *((uint8_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
-                       else
+                       } else {
+                               if (negative)
+                                       ao_cmd_lex_i = -ao_cmd_lex_i;
                                *((int16_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
+                       }
                }
        }
        _ao_config_edit_start();