Код
typedef enum ui_led_mode_e
{
UI_LED_MODE_OFF,
UI_LED_MODE_ON,
UI_LED_MODE_TOGGLE,
UI_LED_MODE_FLSH_LONG,
UI_LED_MODE_FLSH_SHRT,
} ui_led_mode_t;
typedef void ( * ui_led_set_t )( ui_led_mode_t mode );
typedef struct ui_led_s
{
ui_led_set_t set;
size_t tick;
} ui_led_t;
typedef struct ui_s
{
ui_led_t led[ 2 ];
} ui_t;
{
UI_LED_MODE_OFF,
UI_LED_MODE_ON,
UI_LED_MODE_TOGGLE,
UI_LED_MODE_FLSH_LONG,
UI_LED_MODE_FLSH_SHRT,
} ui_led_mode_t;
typedef void ( * ui_led_set_t )( ui_led_mode_t mode );
typedef struct ui_led_s
{
ui_led_set_t set;
size_t tick;
} ui_led_t;
typedef struct ui_s
{
ui_led_t led[ 2 ];
} ui_t;
Использование:
Код
ui_t ui;
void main( void )
{
ui_init();
while( 1 )
{
ui.led[ 0 ].set( UI_LED_MODE_FLSH_SHRT );
delay_msec( 500 );
}
}
void main( void )
{
ui_init();
while( 1 )
{
ui.led[ 0 ].set( UI_LED_MODE_FLSH_SHRT );
delay_msec( 500 );
}
}
Проблема возникает при реализации ui_led_set(). А именно, как ui_led_set() узнать, откуда пришел вызов? Из ui.led[0].set() или из ui.led[1].set?
Тупое:
ui.led[ 0 ].set( 0, UI_LED_MODE_FLSH_SHRT );
ui.led[ 1 ].set( 1, UI_LED_MODE_FLSH_SHRT );
сколь очевидно, столь и не интересно, поскольку суть вопроса в аналоге self/this, а не передавать каждый раз извне. В голове крутится, как-то сыграть на том, что ui это глобальная/статическая переменная. Но как именно - не соображу.
Можно, конечно, добавить в структуру поле "n" и при инициализации, ручками, пронумеровать все стркутуры в массиве:
Код
typedef struct ui_led_s
{
size_t n;
ui_led_set_t set;
size_t tick;
} ui_led_t;
{
size_t n;
ui_led_set_t set;
size_t tick;
} ui_led_t;
Но может есть какой-то более элегантный способ?
Речь о чистых Сях. Варианты в духе "написать на плюсах" или "не париться" известны и не интересны - заранее привет от К.О.
