Цитата(adnega @ Jul 4 2015, 08:13)

Что должна делать set()?
На всяк.случ. повторюсь, управление светодиодом взято в качестве примера. Аналогично работает, скажем, опрос кнопок. Но по-большому счету, в любом проекте полно других структур.
Код
void SysTick_Handler( void )
{
....
app.event.ui_key = ui_key_systick_hook( &ui.key );
app.event.ui_led = ui_led_systick_hook( &ui.led );
....
}
Так выглядит hook:
Код
bool ui_led_systick_hook( ui_led_t * p )
{
bool resp = false;
if( p->tick > 0 )
{
if( --(p->tick) == 0 )
{
ui_led_toggle();
resp = true;
}
}
return( resp );
}
Ну и, собственно, сам метод:
Код
void ui_led_set( ui_led_t * p,
const ui_led_mode_t mode )
{
switch( mode )
{
case UI_LED_MODE_OFF:
bsp_led_set( false );
break;
case UI_LED_MODE_ON:
bsp_led_set( true );
break;
case UI_LED_MODE_TOGGLE:
ui_led_toggle();
break;
case UI_LED_MODE_FLSH_LONG:
if( p->tick == 0 )
{
ui_led_toggle();
}
p->tick = UI_LED_FLSH_LONG_TCKS;
break;
case UI_LED_MODE_FLSH_SHRT:
if( p->tick == 0 )
{
ui_led_toggle();
}
p->tick = UI_LED_FLSH_SHRT_TCKS;
break;
default:
break;
}
}
Хочу избавиться от передачи в функцию аргумента
ui_led_t * p. Вместо этого, получать его локально, в зависимости от того, откуда пришел вызов функции. Т.е. вместо существующего сейчас:
Код
ui_led_set( &ui.led0, UI_LED_MODE_FLSH_SHRT );
ui_led_set( &ui.led[0], UI_LED_MODE_FLSH_SHRT );
вызывать, как написал в первом посте:
Код
ui.led[ 0 ].set( UI_LED_MODE_FLSH_SHRT );
Но что-то мне подсказывает, что средствами языка, без хаков и извратов, сделать это не получится. Тогда, видимо, остается только вариант, описаный мною выше - добавить в структуру переменную
n. Ну либо совсем чернуха, в духе
ui_led_set_0(),
ui_led_set_1()...