Interfészek
Egy interfész függvények egy halmaza. Ezek a függvények vagy parancsok (command), vagy események (event).
A parancsok olyan függvények, amelyeket általában egy magasabb szinten lévő komponens hív meg és egy alacsonyabb szinten lévő hajt végre, mintha egy utasítás lenne.
Az események ezzel ellentétben egy alacsonyabb szinten lévő komponensben hívódik meg és egy magasabb szinten lévő komponens „kezeli le”, mintha egy jelzés lenne felfelé.
Ezért a parancsokon keresztül a vezérlés fentről lefelé a hardver irányába tart, az eseményeken keresztül pedig pont fordítva.
Az interfészek lényegében egy kétirányú csatornaként működnek az interfészt szolgáltató (megvalósító) (provider) és az interfészt felhasználó (user) komponens között.
A parancsokat az interfész szolgáltatónak, az eseményeket pedig az interfész felhasználónak kell megvalósítania.
Egy interfész típus definícióját a következő nyelvtani szabályok szerint kell leírni:
nesC-file:
includes-listopt interface
. . .
interface:
interface identifier { declaration-list }
storage-class-specifier: also one of
command event
Az első szabály azt mondja ki, hogy egy interfész típus definícióját egy külön nesC fájlba kell tenni.
Lássunk egy egyszerű példát, ami definiálja a SendMsg interfész típust:
interface SendMsg {
command result_t send(uint16_t address, uint8_t length, TOS_MsgPtr msg);
event result_t sendDone(TOS_MsgPtr msg, result_t success);
}
Minden interfész típusnak illetve komponensnek a neve benne lesz a komponens és interfész típus névtérben (component and interface type namespace).
Ezeknek az azonosítóknak globális hatókörük lesz, azaz a program minden fájljából láthatóak lesznek.
Emiatt van, hogy nem lehet két interfész típusnak vagy komponensnek ugyanaz a neve.
Az előzőek szerint a SendMsg interfészt megvalósító komponensnek implementálnia kell a send parancsot, a felhasználó komponenseknek pedig a sendDone eseményt.