...aber ich verstehe unter API auch ein Application Programming Interface, also eine Beschreibung einer Funktionsbibliothek und seiner Header-Dateien.
Eine GUI, also ein Graphical User Interface wirst du wollen.
Serielle Schnittstelle und PNP - kann ich mir nicht vorstellen...du bekommst vielleicht ueber PNP die Schnittstelle konfiguriert, aber sicherlich keine Pheripheriegeraete die du dann an die Schnittstelle anschliesst - und das ist der Knackpunkt an diesem Programmiervorhaben.
Was meiner Ansicht nach zu implementieren waere, waere ein Daemon (ein im Hintergrund arbeitendes Programm) der prueft ob etwas angeschlossen wird. Das kannst du machen in dem du sequentiell (also in Zeitintervallen) pruefst ob ein Geraet auf ein Kommando reagiert, oder indem du wartest ob ein Geraet eine Verbindung aufbauen will - mit udev geht da wohl so direkt nichts; hilft dir hoechstens deinen serielles Device-File, in der regel /dev/ttyS{0..4} umzubennennen, was aber keinen Sinn macht hier.
Du musst also dein Programm so auslegen das es sich nach dem Start in den Hintergrund setzt, das Console-Device wieder freigibt, z.B. so:
Code:
/* damonize */
data.pid = fork ();
if ( data.pid == -1 ) {
printf ( "Failed to fork." );
exit ( 1 ); }
/* free tty */
if ( data.pid != 0 ) exit ( 0 );
/* get session leader */
setsid ();
/* furthor code following */
...und dann kuckst ob was angeschlossen wird...muesste irgendwo hier in deinem Prog geschehen...
Code:
/*Standared Eingabe anpassen*/
...und dann machst du deine GUI-Interaktion, wie Fenster oeffnen, Eingabe holen, Eingabe senden, Reply lesen, ...usw. .
Schwieriger koennte werden es hinzubekommen das dein Programm immer Zugriff auf den X-Server bekommnt, weil sich der gegen fremden Zugriff per authentifizierung schuetzt, wenn er ordentlich aufgesetzt ist - da kann ich nicht weiterhelfen, waere selbst an der Loesung interessiert.
Das Porgramm von init aus zu starten ist dann das naechste/letzte.
Dazu musst du ein init-Skript schreiben das du dann in das entsprechende Runlevel-rc-Directory verlinkst, mit entsprechender Prioritaet. Keine all zu grosse Herausforderung. Bei mir (Debian) ist z.B. in /etc/init.d/skeleton ein Beispiel das zu kopieren waere und etwas angepasst werden koennte.
Die einfachste Weisse waere aber in etwa so:
Code:
#!/bin/sh
case $1 in
start) <path_to_binary>/<binary_name>;;
esac
...das in /etc/init.d ablegen, und dann z.B. (Runlevel 3 muesste default sein) mit 'ln -s /etc/init.d/<scriptname> /etc/rc3.d/90_<scriptname>' verlinken. 90 ist hier ein "ungefaehrlicher" Wert, da er recht spaet zum Zuge kommt - entscheidend fuer dich wird sein das udev vorher laeuft, wegen dem Device-File das du ja oeffnen moechtest.