/** * Eine einfache Tcl-Erweiterung um auf die parralele Schnittstelle * unter Unix zu Schreiben. Die Erweiterung benötigt Root-Rechte, * sie benutzt inb and outb auf Port 888. * */ #include #include #include #include /* Vorwärtsreferenz */ int parcon_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]); /* * Initialisiert die Erweiterung und überprüft die Rechte */ int Parcon_Init(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8.1", 0) == 0L) { return TCL_ERROR; } #endif /* Kann die parallel Schnittstelle geöffnet werden ? */ if( ioperm(888,1,1) ) { /* Fehlermeldung erzeugen */ Tcl_Obj *retval = Tcl_NewStringObj( "Parallele Schnittstelle kann nicht geöffnet werden.", -1); Tcl_AppendStringsToObj( retval, "\nBitte als Root benutzen", (char*) NULL ); Tcl_SetObjResult( interp, retval); return TCL_ERROR; } /* Kommando erzeugen */ Tcl_CreateObjCommand(interp, "parcon", parcon_Cmd, NULL, NULL); return TCL_OK; } /** * Das Kommando selber */ int parcon_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { /** entweder kein Argument oder eines */ if ( objc > 2 ) { Tcl_WrongNumArgs( interp, 1, objv, "?bitmap?" ); return TCL_ERROR; } /* Eingabe überprüfen und Status setzen*/ if ( objc == 2 ) { // Länge prüfen if ( Tcl_GetCharLength( objv[1]) != 8 ) { Tcl_Obj *retval = Tcl_NewStringObj( "Falsche Eingabe, benötige 8bit ( \"00101010\" )", -1); Tcl_SetObjResult( interp, retval); return TCL_ERROR; } /* fiese Bitshifterei */ char* bitmap = Tcl_GetString( objv[1] ); int wert=0, i; for ( i= 0; i < 8; i++) { if ( strncmp("1", bitmap, 1) == 0 ) { wert |= 1<<(7-i); } else { wert &= ~(1<<(7-i)); } bitmap++; } //printf("werte %i\n", wert); /* Parallelport setzen*/ outb(wert,888); } /* Parallelport auslesen */ unsigned char bitmap = inb(888); /* .. und Ergebniss formatieren */ Tcl_Obj *result = Tcl_NewStringObj("", -1); int i; for ( i=7; i>=0; i-- ) { Tcl_AppendStringsToObj( result, ( bitmap & (1<