Переключатели управления функциональностью |
Предыдущая Содержание Следующая |
В некоторых приложениях программист разрабатывает один основной вариант исполняемого кода для всех клиентов, но может захотеть получать оплату за некоторые дополнительные программные опции. Нежелательно создавать и тестировать копию программного обеспечения для каждой возможной комбинации (отключение или включение опций с использованием переключателей компиляции). Идеальным вариантом было бы создать и протестировать одну копию программного обеспечения для всех клиентов, а также включать или отключать доступ к элементам, которые не приобретены.
Если оборудование имеет энергонезависимую память, такую как небольшая 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() для перемещения подсвеченного варианта, необходимо будет также посмотреть на переключатели вариантов, чтобы указать отображаемые подсказки для перехода в следующее и предыдущее меню. |
Предыдущая Содержание Следующая |