Переключатели управления функциональностью

Предыдущая  Содержание  Следующая V*D*V

В некоторых приложениях программист разрабатывает один основной вариант исполняемого кода для всех клиентов, но может захотеть получать оплату за некоторые дополнительные программные опции. Нежелательно создавать и тестировать копию программного обеспечения для каждой возможной комбинации (отключение или включение опций с использованием переключателей компиляции). Идеальным вариантом было бы создать и протестировать одну копию программного обеспечения для всех клиентов, а также включать или отключать доступ к элементам, которые не приобретены.

 

Если оборудование имеет энергонезависимую память, такую как небольшая EEPROM, может быть сохранено битовое поле с указанием, какие опции клиентом приобретены.

 

Когда клиент хочет добавить функцию, может быть отправлена новая EEPROM. Битовое поле в EEPROM сравнивается с битовым полем функции, добавленным в каждую структуру SELECTION, и если соответствующие биты установлены, вариант отображается:

 

typedef struct _selection

{

    .... // original structure

    int features_bitfield;

}SELECTION;

 

enum _feature_bits

{

    FEATURE_ATM_VIDEOPHONE=0,

    FEATURE_ATM_RENEW_LICENSE,

    FEATURE_ATM_ORDER_MOVIE

};

 

#define FEATURE_ALL 0

#define FEATURE_ATM_VIDEOPHONE_BIT (0x01 << FEATURE_ATM_VIDEOPHONE)

#define FEATURE_ATM_RENEW_LICENSE  (0x01 << FEATURE_ATM_RENEW_LICENSE)

#define FEATURE_ATM_ORDER_MOVIE    (0x01 << FEATURE_ATM_ORDER_MOVIE)

 

MENU menu[] =

{

    { MAIN_MENU, 6,

    {"Perform A Deposit",          goto_menu(), DEPOSIT,   FEATURE_ALL},

    {"Perform a Withdrawl",        goto_menu(), WITHDRAWL, FEATURE_ALL},

    {"Obtain a Balance Statement", goto_menu(), BALANCE,   FEATURE_ALL},

    {"Make A Video Phone Call",    goto_menu(), BALANCE,   FEATURE_ATM_VIDEOPHONE_BIT},

    {"Watch A Movie Right Here",   goto_menu(), BALANCE,   FEATURE_ATM_VIDEOPHONE_BIT},

    {"Quit", logout(), 0}

    },

 

    /* тут могут быть другие меню */

 

};

 

Наконец, как требование для отрисовки каждого выбора, в draw_menu() вставляется следующее условие:

 

if(!curr_menu->selection[selection_loop_ctr].feature_bitfield ||

    curr_menu->selection[selection_loop_ctr].feature_bitfield &

    eeprom.feature_bitfield)

{

    /* отрисовать выбранное */

}

 

Если программист использует подход с использованием функции hilite() для перемещения подсвеченного варианта, необходимо будет также посмотреть на переключатели вариантов, чтобы указать отображаемые подсказки для перехода в следующее и предыдущее меню.

Предыдущая  Содержание  Следующая