
/*
 *  set GSM clock from cp/m
 *
 *  Peter M. Dambier  2002-09-27
 */


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


/*
 * dump answer
 */

dump( buffer )
   char buffer[];
{
   int cnt;
   char ubuf[256];

   for( cnt = 0; cnt < 248; cnt++ )
   {
      ubuf[cnt] = buffer[cnt];

      if( buffer[cnt] == '\r' )
          ubuf[cnt] = '.';

      if( buffer[cnt] == '\n' )
          ubuf[cnt] = '.';
   }

   ubuf[248] = 0;

   printf( ">>>%s<<<\n", ubuf );
}


/*
 * try command
 */

command( cmd, buffer )
   char *cmd, buffer[];
{
   com_exch( cmd, buffer, 8192 );
}


/*
 * 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 );
}


/*
 * identify hand held
 */

identify( brand, model, version, imei, imsi, gsmdate, cid, battery )
   char *brand, *model, *version, *imei, *imsi, *gsmdate, *cid, *battery;
{
   char buffer[8192];
   int code;

   code = 0;

   command( "AT\r" );
   command( "AT\r" );

   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^SCID\r",  cid,     buffer );
   code |= result( "AT+CCLK?\r", gsmdate, buffer );
   code |= result( "AT+CBC\r",   battery, buffer );

   command( "AT\r" );

   if( code == 0 )
      return( 0 );

   printf( "Error: reading handheld identification.\n" );

   return( 1 );
}


/*
 * 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 );
}


/*
 * cp/m time >>> gsm
 */

cpm2date( date )
   char date[];
{
  char year[3], month[3], day[3],
       hour[3], min[3], sec[3];

  year[0]  = date[6];   year[1]  = date[7];    year[2]  = 0;
  month[0] = date[0];   month[1] = date[1];    month[2] = 0;
  day[0]   = date[3];   day[1]   = date[4];    day[2]   = 0;

  hour[0]  = date[9];   hour[1]  = date[10];   hour[2]  = 0;
  min[0]   = date[12];  min[1]   = date[13];   min[2]   = 0;
  sec[0]   = date[15];  sec[1]   = date[16];   sec[2]   = 0;

  sprintf( date, "AT+CCLK=%s/%s/%s,%s:%s:%s\r",
     year, month, day,  hour, min, sec );
}


/*
 *  * * *
 */

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


    /* get parameters */

    port = 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 );
    }

    fclose( inifile );

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

    /* identify handheld */

    com_init( port );

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

       /* show clocks */

       clock_get( buffer );
       date2cpm( gsmdate );

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

       clock_set( gsmdate );
    }

    com_stop();
}


