Simplify and tidy the handling of page buffer selection on the readout path.

This commit is contained in:
px4dev
2013-01-26 14:25:22 -08:00
parent 4ab490bd50
commit 11796e27f2
+46 -16
View File
@@ -370,10 +370,17 @@ registers_set_one(uint8_t page, uint8_t offset, uint16_t value)
return 0; return 0;
} }
uint8_t last_page;
uint8_t last_offset;
int int
registers_get(uint8_t page, uint8_t offset, uint16_t **values, unsigned *num_values) registers_get(uint8_t page, uint8_t offset, uint16_t **values, unsigned *num_values)
{ {
#define SELECT_PAGE(_page_name) { *values = (uint16_t *)_page_name; *num_values = sizeof(_page_name) / sizeof(_page_name[0]); } #define SELECT_PAGE(_page_name) \
do { \
*values = &_page_name[0]; \
*num_values = sizeof(_page_name) / sizeof(_page_name[0]); \
} while(0)
switch (page) { switch (page) {
@@ -448,35 +455,58 @@ registers_get(uint8_t page, uint8_t offset, uint16_t **values, unsigned *num_val
/* /*
* Pages that are just a straight read of the register state. * Pages that are just a straight read of the register state.
*/ */
#define COPY_PAGE(_page_name, _page) case _page_name: SELECT_PAGE(_page); break
/* status pages */ /* status pages */
COPY_PAGE(PX4IO_PAGE_CONFIG, r_page_config); case PX4IO_PAGE_CONFIG:
COPY_PAGE(PX4IO_PAGE_ACTUATORS, r_page_actuators); SELECT_PAGE(r_page_config);
COPY_PAGE(PX4IO_PAGE_SERVOS, r_page_servos); break;
COPY_PAGE(PX4IO_PAGE_RAW_RC_INPUT, r_page_raw_rc_input); case PX4IO_PAGE_ACTUATORS:
COPY_PAGE(PX4IO_PAGE_RC_INPUT, r_page_rc_input); SELECT_PAGE(r_page_actuators);
break;
case PX4IO_PAGE_SERVOS:
SELECT_PAGE(r_page_servos);
break;
case PX4IO_PAGE_RAW_RC_INPUT:
SELECT_PAGE(r_page_raw_rc_input);
break;
case PX4IO_PAGE_RC_INPUT:
SELECT_PAGE(r_page_rc_input);
break;
/* readback of input pages */ /* readback of input pages */
COPY_PAGE(PX4IO_PAGE_SETUP, r_page_setup); case PX4IO_PAGE_SETUP:
COPY_PAGE(PX4IO_PAGE_CONTROLS, r_page_controls); SELECT_PAGE(r_page_setup);
COPY_PAGE(PX4IO_PAGE_RC_CONFIG, r_page_rc_input_config); break;
COPY_PAGE(PX4IO_PAGE_DIRECT_PWM, r_page_servos); case PX4IO_PAGE_CONTROLS:
COPY_PAGE(PX4IO_PAGE_FAILSAFE_PWM, r_page_servo_failsafe); SELECT_PAGE(r_page_controls);
break;
case PX4IO_PAGE_RC_CONFIG:
SELECT_PAGE(r_page_rc_input_config);
break;
case PX4IO_PAGE_DIRECT_PWM:
SELECT_PAGE(r_page_servos);
break;
case PX4IO_PAGE_FAILSAFE_PWM:
SELECT_PAGE(r_page_servo_failsafe);
break;
default: default:
return -1; return -1;
} }
#undef SELECT_PAGE #undef SELECT_PAGE
#undef COPY_PAGE
/* if the offset is beyond the end of the page, we have no data */ last_page = page;
if (*num_values <= offset) last_offset = offset;
/* if the offset is at or beyond the end of the page, we have no data */
if (offset >= *num_values)
return -1; return -1;
/* adjust value count and pointer for the page offset */ /* correct the data pointer and count for the offset */
*num_values -= offset;
*values += offset; *values += offset;
*num_values -= offset;
return 0; return 0;
} }