// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/serialio.cpp,v $
// $Revision: 1.3 $
// $Author: baum $
// $Date: 2001/12/06 13:26:51 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name:  $
// State assigned to revision
// $State: Exp $
//
//
// $Log: serialio.cpp,v $
// Revision 1.3  2001/12/06 13:26:51  baum
// -RZS vervollständigt letzter commit hatte Fehler :-)
//
// Revision 1.2  2001/11/29 15:18:10  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#include <tcl.h>
#include <stdio.h>
#include <string.h>

#define _SERIALIO_CPP
#include "serialio.h"

int        SioOK;
char       SioZeichen;
char       SioDevNr [64];

Tcl_Interp *SioInterp;

extern void dprintf (char* format, ...);

/* ----------------------------------------------------------------------------- */
/* - SioInit:                                                                  - */
/* - initialisiert die serielle Schnittstelle SioNr 1 bis 4 (COM1 bis COM4)    - */
/* - mit der SioBaudrate (38400, 19200, 9600, 4800, 2400, 1200, 600, 300), der - */
/* - SioWortldnge 5 bis 8, der SioParitaet 1=ungerade und 2=gerade, der Anzahl - */ 
/* - SioStoppbit (1 oder 2) und oeffnet die Schnittstelle.                     - */
/* - Der R|ckgabewert ist bei erfolgreicher Ausf|hrung 0, ansonsten kleiner 0  - */
/* ----------------------------------------------------------------------------- */

int SioInit (Tcl_Interp *interp,
             int SioNr,
             int SioBaudrate,
             int SioWortlaenge,
             int SioParitaet, 
             int SioStoppbit) {

  char paritaet;
  char buf [256];

  SioInterp = interp;

  if (SioNr > 0  && SioNr < 5) {
    switch (SioParitaet)
    {
        case 1  : paritaet='o'; break ;
        case 2  : paritaet='e'; break ;
        default : paritaet='n';
    }

    #ifdef __linux__
    sprintf (buf, "open /dev/ttyS%1i r+", SioNr-1);
    #else
    sprintf (buf, "open com%1i: r+", SioNr);
    #endif
    Tcl_Eval (SioInterp,buf);
    
    if (SioInterp->result[0] == 'f') {
      sprintf (SioDevNr,"%s",SioInterp->result);
      SioOK = 1;
      sprintf (buf,
               "fconfigure %s -mode %d,%c,%d,%d -translation cr -blocking false -buffering line -buffersize 4096",
               SioDevNr, SioBaudrate, paritaet,
               SioWortlaenge, SioStoppbit);

      Tcl_Eval (SioInterp,buf);
    }
    else {
      SioOK = 0;
      dprintf ("\nKonnte die Schnittstelle COM%i: nicht oeffnen!\n", SioNr);
      dprintf ("Schliessen Sie bitte alle Anwendungen, DOS-Fenster oder Shells, die auf diese Schnitt-\n");
      dprintf ("stelle zugreifen bzw. zugegriffen haben, oder ueberpuefen Sie die Einstellungen\n");
      dprintf ("in der <modell>.rzs  !\n\n");
    }
  }
  return SioOK;
}



/* -------------------------------------------------------------------------------- */
/* - SioExit:                                                                     - */
/* - Stellt den Ursprungszustand der Schnittstelle wieder her und schlie_t diese. - */
/* - Der R|ckgabewert ist bei erfolgreicher Ausf|hrung 0, ansonsten kleiner 0     - */
/* -------------------------------------------------------------------------------- */

int SioExit (void)
{  
  if (SioOK) {
    char buf [64];
    sprintf (buf, "close %s",SioDevNr);
    Tcl_Eval (SioInterp,buf);
  }
  return 0;
}


/* ----------------------------------------------------------------------------- */
/* - SioLesen:                                                                 - */
/* - Testet, ob von der seriellen Schnittstelle ein Zeichen empfangen wurde.   - */
/* - Wenn kein Zeichen angekommen ist, gibt die Funktion eine 0 zur|ck, an-    - */
/* - sonsten eine 1 und das Zeichen steht in der char-Variarbe "SioZeichen"    - */
/* ----------------------------------------------------------------------------- */
int SioLesen (void)
{
  char buf [128];
  if (SioOK) {
    sprintf (buf, "read %s 1", SioDevNr);
    Tcl_Eval (SioInterp,buf);

    if (strlen (SioInterp->result)) {
      SioZeichen = SioInterp->result[0];
	dprintf(" %c",SioZeichen);//miro
      return 1;
    }
    else return 0;
  }
  else return 0;
}


/* ----------------------------------------------------------------------------- */
/* - SioSchreiben:                                                             - */
/* - Schreibt einen Text, der im Parameter SioSchreibZeichen uebergeben wird    - */
/* - auf die serielle Schnittstelle. SioSchreibLaenge muss die Anzahl der Buch- - */
/* - staben enthalten, die uebertragen werden sollen.                           - */
/* ----------------------------------------------------------------------------- */

int SioSchreiben (char *SioSchreibZeichen, unsigned int /* SioSchreibLaenge */)
{   
  if (SioOK) {
    char buf [256];
    sprintf (buf, "puts %s {%s}", SioDevNr, SioSchreibZeichen);dprintf(" %c",SioSchreibZeichen);//miro
    Tcl_Eval (SioInterp,buf);
    
//    sprintf (buf, "flush %s", SioDevNr);
//    Tcl_Eval (SioInterp,buf);
  }
  return 0;
}
