интерфейс с событиями и командами - не может сигнализировать о событии

Мне было трудно сигнализировать о событии в nesC. Кто-нибудь может помочь? (EDIT: я пропустил компоненты MainC в приведенном ниже коде).

Я определил простой интерфейс:

interface MyInterface {
    command uint8_t action();
    event void actionDone();
}

Он имеет одно действие и одно событие.

Более того, у меня есть один компонент, который предоставляет MyInterface:

configuration MyComponentC {
    provides interface MyInterface[uint8_t id];
}
implementation {
    components MyComponentM;
    MyInterface = MyComponentM.MyInterface;
}


module MyComponentM {
    provides interface MyInterface[uint8_t id];
}
implementation {
    command uint8_t MyInterface.action[uint8_t id]() {...}
    ...
    event void bar() {
        signal MyInterface.actionDone[foo]();
    }
}

Панель событий из совершенно другого интерфейса. В этом случае я хочу сигнализировать о событии actionDone с помощью id == foo.

У меня также есть «основной» компонент:

configuration MyAppC {
}
implementation {
    components MyC as App;
    components MyComponentC as MC;
    App.MyInterface -> MC.MyInterface[unique("Hello")];
}

module MyC {
    uses interface MyInterface;
}
implementation {
    event void MyInterface.actionDone() {...}
}

Но при компиляции получаю ошибку:

MyInterface.actionDone not connected

Где я сделал ошибку? Как правильно соединить компоненты?


person Grzes    schedule 11.03.2013    source источник


Ответы (1)


Не уверен, что это причина, но в своем приложении попробуйте обратиться к MyC через псевдоним, т.е. вместо

MyC.MyInterface -> MS.MyInterface[unique("Hello")];

пытаться

App.MyInterface -> MS.MyInterface[unique("Hello")];

[ОБНОВИТЬ]

Как объясняется в этой ссылке, поскольку вы с использованием параметризованного интерфейса и что нет гарантии, что все 256 экземпляров будут подключены к чему-то, что вам нужно, чтобы обеспечить реализацию по умолчанию в модуле MyComponentM

default event MyInterface.actionDone[foo]() {
    return;
}
person IvanR    schedule 11.03.2013
comment
это моя ошибка, должно быть (и в моем реальном коде есть!) App вместо MyC. Но это не причина... - person Grzes; 12.03.2013
comment
Я думаю, тогда это также должно быть -> MC.MyInterface... - person IvanR; 12.03.2013
comment
Хорошо, еще раз это моя вина. Это должен быть MC вместо MS. Здесь могут быть и другие небольшие ошибки, которые я допустил при перепечатывании кода. Но это не причина ошибки MyInterface.actionDone not connected. Это не ошибка синтаксического анализа или неопределенные символы, а нечто более «глубокое». Проблема где-то в интерфейсах и разводке компонентов, но не знаю где. - person Grzes; 12.03.2013