#include <exec/types.h>
#include <devices/serial.h>
#include <libraries/dos.h>

/****************************************************/
/* Programm liest ein Voice-File ein und spielt es  */
/* über den modem-eigenen Lautsprecher ab.          */
/* wird kein File-Name übergeben, so ist Default    */
/*           'ram:voice'                            */
/****************************************************/


struct IOExtSer *SerRequest;
struct MsgPort *MsgPort;
BPTR handle, fh;
char Data, buf[2048], *VBuf;

long VRead()
{
int i, n;

   SerRequest->IOSer.io_Data = (APTR)&Data;
   SerRequest->IOSer.io_Length = 1;
   SerRequest->IOSer.io_Command = CMD_READ;

   i = 0;
   do {
      DoIO(SerRequest);
      buf[i++] = Data;
   } while (Data != 10 && i != 2047);
   if (i == 2047) printf("\nBuffer-Überlauf\n");
   buf[i] = 0; n = i;

   printf("\nString: %s", buf);
   return(n);
}

void VWrite(buf)
char *buf;
{
int len=0;

   while(buf[len] != 0) len++;

   SerRequest->IOSer.io_Data = (APTR)buf;
   SerRequest->IOSer.io_Length = len;
   SerRequest->IOSer.io_Command = CMD_WRITE;
   DoIO(SerRequest);
}

char ETX[] = {16, 3, 13};

main(argc, argv)
int argc;
char *argv[];
{
int i, n;
long Len;

   handle = Output();
   if ((MsgPort = (struct MsgPort *)CreatePort(NULL, 0L)) == 0)
   {
      printf("kein Port\n");
      exit(0);
   }
   if ((SerRequest = (struct IOExtSer *)CreateExtIO(MsgPort,
                             sizeof(struct IOExtSer))) == 0)
   {
      printf("Kein Request\n");
      goto Port;
   }

   SerRequest->io_Baud = 19200;
   SerRequest->io_ReadLen = SerRequest->io_WriteLen = 8;
   SerRequest->io_StopBits = 1;
   SerRequest->io_SerFlags = SERF_7WIRE|SERF_SHARED;
   SerRequest->io_ExtFlags = 0;

   if (OpenDevice("serial.device", 0L, SerRequest, 0L))
   {
      printf("kein Device\n");
      goto Request;
   }

   if (argc <= 1)
      if ((fh = Open("ram:voice", MODE_OLDFILE)) == 0)
      {
         printf("Voice-File nicht gefunden !\n");
         goto End;
      }
   else
      if ((fh = Open(argv[1], MODE_OLDFILE)) == 0)
      {
         printf("Voice-File nicht gefunden !\n");
         goto End;
      }

   Seek(fh, 0, OFFSET_END);
   Len = Seek(fh, 0, OFFSET_BEGINING);

   if ((VBuf = (char *)AllocMem(Len, 0)) == 0)
   {
      printf("kein Speicher !\n");
      Close(fh);
      goto End;
   }
   Read(fh, VBuf, Len);  /* File in Buffer lesen */
   Close(fh);


/* Auf Voice-Modus schalten */

   VWrite("AT+FCLASS=8\r");
   printf("Init geschrieben\n");

   n = VRead();
   n = VRead();


/* CELP einschalten und Ausgabe auf eingebauten Lautsprecher */

   VWrite("AT+VSM=1+VLS=16\r");

   n = VRead();
   n = VRead();


/* Wiedergabe */

   VWrite("AT+VTX\r");

   n = VRead();
   n = VRead();

   printf("Schreibe nun Voice-Daten\n");

   SerRequest->IOSer.io_Data = (APTR)VBuf;
   SerRequest->IOSer.io_Length = Len;
   SerRequest->IOSer.io_Command = CMD_WRITE;
   DoIO(SerRequest);               /* Schreibe Voice-Daten */
   printf("fertig geschrieben\n");

   n = VRead();
   n = VRead();

   printf("schreibe Rückkehr-Kommando\n");
   VWrite("AT+VLS=0+FCLASS=0\r");

   n = VRead();
   n = VRead();

   SerRequest->IOSer.io_Command = SDCMD_QUERY;
   DoIO(SerRequest);
   printf("Status : %x\n", SerRequest->io_Status);

   FreeMem(VBuf, Len);
End:
   CloseDevice(SerRequest);
Request:
   DeleteExtIO(SerRequest);
Port:
   DeletePort(MsgPort);
   exit(0);
}
