mr_ipc

Bibliothek

Librarymr_ipc
Projektlibs/mr_ipc

Benutzung

Jedes Programm kann nach Einfügen der folgenden Include-Anweisung auf die Definitionen der Bibliothek zugreifen:

#include 

Dazu muß das Include Verzeichnis der lokalen Libraries dem Compiler mit der folgenden Anweisung bekannt gemacht werden:

-I$(INCLUDE_PATH)
mit einer geeigneten Definition von $INCLUDE_PATH

In der Linker Anweisung muß die Library mit der folgenen Anweisung mit gelinkt werden:

-lmr_ipc

Dazu muß das Lib Verzeichnis der lokalen Libraries dem Linker mit der folgenden Anweisung bekannt gemacht werden:

-L$(LIB_PATH)
mit einer geeigneten Definition von $LIB_PATH

Beschreibung

Die Bibliothek mr_ipc faßt Datentypen und Funktionen zusammen, die für die Kommunikation der Clients mit der drehscheibe nötig sind. Dies umfaßt zum einen den Datentyp, der zwischen den Programmen übertragen wird, als auch Funktionen, um eine Verbbindung zu dem Server zu öffnen und Daten zu übertragen. Der Name leitet sich von Inter Process Communication ab.

Definitionen

Konstanten

Konstanten für Error Codes der Sende- und Empfangsfunktionen

#define MR_IPC_RCV_ERROR  -1
#define MR_IPC_RCV_CLOSED 0
#define MR_IPC_RCV_OK     1

Objectnamen für JSON Kommandos

#define MR_IPC_JSON_OBJECT_CMD "cmd"
#define MR_IPC_JSON_OBJECT_ADDR      "addr"
#define MR_IPC_JSON_OBJECT_DIRECTION "direction"
#define MR_IPC_JSON_OBJECT_SPEED     "speed"

Parameter für das JSON Object "cmd"

#define MR_IPC_JSON_CMD_NULL       "null"
#define MR_IPC_JSON_CMD_LOCOMOTIVE "locomotive"

Datentypen

MrIpcCmdType Dies ist der Datentyp, der zwischen Clients und drehscheibe übertragen wird.

Rendered enthält das JSON Komamndo nachdem es mit der JSON lib erzeugt wurde. Der Speicher wird durch das Rendern angelegt und muß selbst freiggeben werden, wenn die Struktur nicht merh benötigt wird. Die kann durch Aufurf der Funktion MrIpcClear() geschehen. Wurde die Struktur dynamisch mit MrIpcCreate() erzeugt, so übernimmt MrIpcDestroy das Freigeben.

DirectionType legt die Werte für die Fahrtrichtung fest.
ForwardWert für Vorwärts
BackwardWert für Rückwärts
MrIpcCommandValue Returnwerte für MrIpcCmdGetCmd()
MrIpcCmdNullLeeres Kommando (auch Rückgabe bei Fehler)
MrIpcCmdLocomotiveKommando zum Steuern einer Lokomotive

Makros

MrIpcClose(socket) Dieses Makro schließt den Socket zur drehscheibe. Das Makro dient eher dazu, eine Symetrie bei den Funktionen herzustellen. MrIpcConnect() öffnet die Verbindung und MrIpcClose schließt sie wieder.

Funktionen

MrIpcCmdType *MrIpcCreate(void); Diese Funktion erzeugt eine MrIpcCmdType Struktur. Da im Wesentlichen ein Aufruf von malloc() dahinter steckt, kann die Struktur auch statisch angelgt werden. Wir die Struktur sehr oft benötigt und erzeugt, empfiehlt es sich sowieso, die Struktur nicht über einen malloc() Aufruf anzulegen, sondern einfach als AUTO-Variable einer Funktion zu deklarieren:
void MyFunc(void)
{  MrIpcCmdType Command;
void MrIpcDestroy(MrIpcCmdType *Data); Diese Funktion gibt eine dynamisch angelegte MrIpcCmdType Struktur wieder frei.
void MrIpcInit(MrIpcCmdType *Data); Diese Funktion initialisiert eine MrIpcCmdType Struktur. Wird die Struktur als AUTO-Variable angelegt, muß sie mit dieser Funktion initialisiert werden, damit sie definierte Werte enthält!
void MyFunc(void)
{  MrIpcCmdType Command;

   MrIpcInit(&Command);
void MrIpcClear(MrIpcCmdType *Data); Diese Funktion räumt eine MrIpcCmdType Struktur nach der Benutzung wieder auf und muß als letztes aufgerufen werden, wenn die Struktur als AUTO-Variable angelegt wurde.
void MyFunc(void)
{  MrIpcCmdType Command;

   MrIpcInit(&Command);
...
   MrIpcClear(&Command);
}
int MrIpcConnect(char *IpAddr, int Port); Diese Funktion stellt eine Verbindung eines Clients zu dem Server drehscheibe her.
char *IpAddrIP Adresse des Servers
int PortPort, auf dem der Server lauscht
RETURNWERT:Socket der neuen Verbindung, <0 im Fehlerfall
int MrIpcStartServer(char *IpAddr, int Port); Diese Funktion startet die Netzwerkverbindung, über den der Server drehscheibe eine eingehende Verbindung bekommen kann.
char *IpAddrIP Adresse, auf der dr Server auf Verbindungen wartet
int PortPort, auf der der Server auf Verbindungen wartet
RETURNWERT:Socket des Servers, <0 im Fehlerfall
int MrIpcAccept(int ServerSock); Diese Funktion akzeptiert eine neue Verbindung eines Clients zu dem Server drehscheibe.
int ServerSockSocket, auf dem der Server auf neue Verbindungen wartet
RETURNWERT:Socket des Datenverbindung zum Client, <0 im Fehlerfall
int MrIpcSend(int socket, MrIpcCmdType *Data); Diese Funktion versendet ein Datenpaket MrIpcCmdType
int socketSocket, über den die Daten verschickt werden sollen
MrIpcCmdType *Data);Zu versendende Daten
RETURNWERT:MR_IPC_RCV_ERROR, MR_IPC_RCV_CLOSED oder MR_IPC_RCV_OK
int MrIpcRecv(int socket, MrIpcCmdType *Data); Diese Funktion empfängt ein Datenpaket MrIpcCmdType
int socketSocket, über den die Daten empfangen werden sollen
MrIpcCmdType *Data);Zeiger auf Speicher, wohin die empfangenen Daten gelesen werden sollen
RETURNWERT:MR_IPC_RCV_ERROR, MR_IPC_RCV_CLOSED oder MR_IPC_RCV_OK
void MrIpcCmdSetNull(MrIpcCmdType *Data); Diese Funktion codiert ein leeres Kommando.
void MrIpcCmdSetLocomotive(MrIpcCmdType *Data, unsigned Addr, DirectionType Direction, unsigned Speed); Diese Funktion kodiert einen Befehl zum Steuern einer Lokomotive.
MrIpcCmdType *DataZeiger auf die Kommando Struktur
unsigned AddrAdresse der Lokomotive
DirectionType DirectionFahrtrichtung
unsigned SpeedGeschwindigkeit
int MrIpcCmdGetCmd(MrIpcCmdType *Data); Diese Funktion liefert das empfangene Kommando
RETURNWERT:Kommando wie MR_IPC_CMD_NULL, ...
void MrIpcCmdGetLocomotive(MrIpcCmdType *Data, unsigned *Addr, DirectionType *Direction, unsigned *Speed); Diese Funktion dekodiert (liefert die Parameter) einen Befehls zum Steuern einer Lokomotive.
MrIpcCmdType *DataZeiger auf die Kommando Struktur
unsigned *AddrZeiger für Adresse der Lokomotive
DirectionType *DirectionZeiger für Fahrtrichtung
unsigned *SpeedZeiger für Geschwindigkeit