altos: Fetch/store only 8 bits for pyro state values
authorKeith Packard <keithp@keithp.com>
Tue, 3 Jun 2014 05:05:11 +0000 (22:05 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 3 Jun 2014 05:05:11 +0000 (22:05 -0700)
These fields are uint8_t, not int16_t. Fetching and storing 16 bits is
a bad idea.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao_pyro.c
src/kernel/ao_pyro.h

index 56758fa448d4844ce50d6c1ac2491dcef17875c4..0ee7fbee711feb45edde9a681897acf44271a4ad 100644 (file)
@@ -403,7 +403,10 @@ ao_pyro_show(void)
                        if (ao_pyro_values[v].offset != NO_VALUE) {
                                int16_t value;
 
-                               value = *((int16_t *) ((char *) pyro + ao_pyro_values[v].offset));
+                               if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE)
+                                       value = *((uint8_t *) ((char *) pyro + ao_pyro_values[v].offset));
+                               else
+                                       value = *((int16_t *) ((char *) pyro + ao_pyro_values[v].offset));
                                printf ("%6d ", value);
                        } else {
                                printf ("       ");
@@ -467,7 +470,10 @@ ao_pyro_set(void)
                        ao_cmd_decimal();
                        if (ao_cmd_status != ao_cmd_success)
                                return;
-                       *((int16_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
+                       if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE)
+                               *((uint8_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
+                       else
+                               *((int16_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
                }
        }
        _ao_config_edit_start();
index 34c990789cb9067130c479d61a741e4018bf8de4..b37aaeb1707554559265ccee59ad0a5c3fee9e91 100644 (file)
@@ -65,6 +65,8 @@ struct ao_pyro {
        uint8_t                 fired;
 };
 
+#define AO_PYRO_8_BIT_VALUE    (ao_pyro_state_less|ao_pyro_state_greater_or_equal)
+
 extern uint8_t ao_pyro_wakeup;
 
 extern uint16_t        ao_pyro_fired;