
/*
 *  read GSM Operators
 *
 *  Peter M. Dambier  2002-09-28
 */


#include <stdio.h>
#include "gsmdev.h"


/*
 * find next token; terminate (0) this token
 */

char *nextoken( pbuf )
   unsigned char *pbuf;
{
   if( *pbuf == 0 )
      return( pbuf );

   while( *pbuf != '\r' )
      pbuf++;

   *pbuf = 0;
   pbuf++;

   while( (*pbuf == '\n') || (*pbuf == '\r') )
      pbuf++;

   return( pbuf );
}


/*
 * get result
 */
 
int result( cmd, answer, buffer )
   char *cmd, *answer, buffer[];
{
   char *ucmd, *uresult, *ucode;
 
   com_exch( cmd, buffer, 8192 );
 
   ucmd    = buffer;
   uresult = nextoken( ucmd );
   ucode   = nextoken( uresult );
   nextoken( ucode );
 
   sprintf( answer, uresult );
 
   if( strcmp( ucode, "OK" ) == 0 )
      return( 0 );
 
   if( strcmp( uresult, "OK" ) == 0 )
      return( 0 );
 
   printf( ">>> (%s) (%s) (%s) <<<\n", ucmd, uresult, ucode );
 
   return( 1 );
}


/*
 * time stamp
 */

show_time( fd, txt )
   int fd;
   char *txt;
{
   char buffer[40];

   clock_get( buffer );
   fprintf( fd, "# %s %s\n", txt, buffer );
}


/*
 * gsm time >>> cp/m
 */
 
date2cpm( date )
   char date[];
{
  char year[3], month[3], day[3],
       hour[3], min[3], sec[3];
 
  year[0]  = date[8];   year[1]  = date[9];    year[2]  = 0;
  month[0] = date[11];  month[1] = date[12];   month[2] = 0;
  day[0]   = date[14];  day[1]   = date[15];   day[2]   = 0;
 
  hour[0]  = date[17];  hour[1]  = date[18];   hour[2]  = 0;
  min[0]   = date[20];  min[1]   = date[21];   min[2]   = 0;
  sec[0]   = date[23];  sec[1]   = date[24];   sec[2]   = 0;
 
  sprintf( date, "%s/%s/%s,%s:%s:%s",
     month, day, year,  hour, min, sec );
}


/*
 * identify hand held
 */
 
identify( brand, model, version, imei, imsi, gsmdate, battery )
   char *brand, *model, *version, *imei, *imsi, *gsmdate, *battery;
{
   char buffer[8192];
   int code;
 
   code = 0;
 
   result( "AT\r", buffer, buffer );
   result( "AT\r", buffer, buffer );
 
   code |= result( "AT+CGMI\r",  brand,   buffer );
   code |= result( "AT+CGMM\r",  model,   buffer );
   code |= result( "AT+CGMR\r",  version, buffer );
   code |= result( "AT+CGSN\r",  imei,    buffer );
   code |= result( "AT+CIMI\r",  imsi,    buffer );
   code |= result( "AT+CCLK?\r", gsmdate, buffer );
   code |= result( "AT+CBC\r",   battery, buffer );
 
   result( "AT\r", buffer, buffer );
 
   if( code == 0 )
      return( 0 );
 
   printf( "Error: reading handheld identification.\n" );
 
   return( 1 );
}


/*
 * dump all
 */

dump_all( fd )
   int fd;
{
   char *here, *next;
   char buffer[31000];


   /* read network info */

   com_exch( "AT+COPN\r", buffer, 31000 );

   here = buffer;

   while( *here != 0 )
   {
      next = nextoken( here );

      if( *here == '+' )
      {
         fprintf( fd, "%s\n", here +7 );
         printf( "%s\n", here +7 );
      }

      here = next;
   }
}


/*
 *  * * *
 */

main( argc, argv )
    int argc;
    char *argv[];
{
    char gsmdate[30], ubuf[256], buffer[ 40 ];
    char imsi[30], imei[30], battery[30];
    char brand[30], model[30], version[30];
    char par1[30], par2[30], par3[30], buffer[256];
    int port, opfile, inifile;


    /* get parameters */

    port = 0;
    opfile = 0;

    inifile = fopen( "GSM.INI", "r" );
    
    if( inifile == 0 )
    {
       printf( "Error: Could not open (GSM.INI).\n" );
       exit( 1 );
    }   

    while( fgets( buffer, 256, inifile ) != 0 )
    {
       if( buffer[0] == '#' )
          continue;

       sscanf( buffer, "%s %s %s", par1, par2, par3 );

       if( strcmp( "=", par2 ) != 0 )
          continue;

       if( strcmp( "GSMPORT", par1 ) == 0 )
          port = atoi( par3 );

       if( strcmp( "OPERATORS", par1 ) == 0 )
          opfile = fopen( par3, "w" );
    }

    fclose( inifile );

    if( port == 0 )
    {
       printf( "Error: GSMPORT = 0\n" );
       fclose( opfile );
       exit( 1 );
    }

    if( opfile == 0 )
    {
       printf( "Error: OPERATORS = 0\n" );
       exit( 1 );
    }


    /* read handheld, dump */

    com_init( port );
    show_time( opfile, "Begin  GSM read operators at" );

    if( identify( brand, model, version, imei, imsi, gsmdate, battery ) == 0 )
    {
       printf( "Hardware: %s %s %s   %s\n", brand, model, version, battery );
       printf( "IMEI/IMSI: %s %s\n", imei, imsi );

       clock_get( buffer );
       date2cpm( gsmdate );
       printf( "CP/M clock: %s   GSM clock: %s\n", buffer, gsmdate);

       fprintf( opfile, "# Hardware: %s %s %s\n", brand, model, version );
       fprintf( opfile, "# IMEI/IMSI: %s %s\n", imei, imsi );
       
       dump_all( opfile );
    }

    show_time( opfile, "Finish GSM read operators at" );
    com_stop();
    fclose( opfile );
}


