logo search
Литература_1 / photon_old

Добавление обработчика ввода

Чтобы зарегистрировать обработчик ввода, вызовите при инициализации приложения функцию PtAppAddInput(). Её синтаксис дан ниже; более подробно информацию см. в "Справочнике библиотечных функций Photon'а".

PtInputId_t *PtAppAddInput(

PtAppContext_t app_context,

pid_t pid,

PtInputCallbackProc_t input_func,

void *data );

Аргументами функции являются:

app_context

Адрес контекста приложения, структуры типа PtAppContext_t, управляющей всеми данными, связанными с приложением. Обычно Вы в этом аргументе передаёте NULL, так что используется контекст по умолчанию

pid

Либо идентификатор процесса, с чьими сообщениями имеет дело этот обработчик, либо 0, если обработчик обрабатывает сообщения от всех процессов

input_func

Ваш обработчик ввода, имеющий тип PtInputCallbackProc_t. Подробности см. в "Справочнике библиотечных функций Photon'а"

data

Дополнительные данные, передаваемые обработчику ввода

Функция PtAppAddInput() возвращает указатель на идентификатор обработчика ввода, который понадобится Вам, если Вы захотите потом удалить этот обработчик ввода.

Прототип обработчика ввода имеет следующий вид:

int input_proc(void *data,

int rcvid,

void *msg,

size_t msglen);

аргументами его являются:

data

Указатель на какие-либо дополнительные данные, которые Вы хотите передать обработчику ввода.

rcvid

Идентификатор отправителя – процесса, пославшего сообщение.

msg

Указатель на отосланное сообщение.

msglen

Размер буфера сообщения. Если действительное сообщение больше буфера, загрузите оставшуюся часть сообщения вызовом MsgRead().

Вы можете также объявить обработчик ввода типа PtInputCallbackProcF_t, получив дополнительную выгоду от применения прототипа, проверяемого компилятором.

 Если Ваш обработчик ввода изменяет изображение, он должен вызвать функцию PtFlash(), чтобы изображение наверняка обновилось.

Обработчик ввода должен возвращать одно из следующих значений:

Pt_CONTINUE

Обработчик ввода не опознал сообщение. Если имеются другие обработчики ввода, прикреплённые к тому же идентификатору процесса, вызываются они. Если отсутствуют обработчики ввода, прикреплённые к этому конкретному идентификатору процесса, или если все обработчики ввода, прикреплённые к этому конкретному идентификатору процесса, вернули Pt_CONTINUE, библиотека ищет обработчики ввода, прикреплённые к нулевому идентификатору отправителя. Если все обработчики ввода вернули Pt_CONTINUE, библиотека отвечает сообщением с кодом ENOSYS.

Pt_END

Сообщение было опознано и обработано и обработчик ввода должен быть удалён из списка. Никакие другие обработчики ввода для данного сообщения не вызывались.

Pt_HALT

Сообщение было опознано и обработано, но обработчик ввода должен оставаться в списке. Никакие другие обработчики ввода для данного сообщения не вызывались.