#include "aci_all.h"

#include <ctype.h>
#include <string.h>

#include "aci_cmh.h"
#include "ati_cmd.h"
#include "aci_cmd.h"
#include "aci_io.h"
#include "aci_cmd.h"
#include "l4_tim.h"
#include "line_edit.h"
#include "aci_lst.h"

#include "pcm.h"
#include "audio.h"
#include "aci.h"
#include "rx.h"
#include "pwr.h"
#include "l4_tim.h"

#ifdef GPRS
#ifdef DTI
#include "dti.h"
#include "dti_conn_mng.h"
#include "dti_cntrl_mng.h"
#endif /* DTI */
#include "gaci.h"
#include "gaci_cmh.h"
#include "gaci_cmd.h"
#endif  /* GPRS */

#include "aci_mem.h"
#include "aci_prs.h"

#include "ati_int.h"

#ifndef _SIMULATION_
#include "ffs\ffs.h"
#endif

#ifdef FF_ATI_BAT

#include "typedefs.h"
#include "gdd.h"
#include "bat.h"

#include "ati_bat.h"

#endif /*FF_ATI_BAT*/

#include "audio\audio_api.h"
#include "abb.h"
#include "..\drivers\drv_app\power\power.h"

#ifdef GPRS
#include "p_mph.h"
#include "p_mphc.h"
#include "..\alr\alr_gprs.h"
#endif
#include "p_tb.h"
#include "..\alr\alr.h"

/*
 * PURPOSE : @SC command (Set IMEI)
 */

GLOBAL T_ATI_RSLT atAtSC (char *cl, UBYTE srcId)
{
    char dummy[8]; // to generate the exact same code
    char tmp[28]={0};
    char t1[12]={0};
    char imei[9]={0};
    char *p;
    char *p1;
    int j;
    unsigned int n1;
    unsigned int i;
    unsigned int n;

    TRACE_FUNCTION("atAtSC");

    cl = parse(cl, "s", (LONG)19, tmp);
    if(strlen(tmp) < 15)
      return (ATI_FAIL);

    // decode

    for(i = 0, p = tmp; i < 15; i++, p++)
    {
      j = *p;
      if(isdigit(j))
        j -= '0';
      else if(j >= 'A' && j <= 'F')
        j -= ('A' - 10);
      else if(j >= 'a' && j <= 'f')
        j -= ('a' - 10);
      else
        return (ATI_FAIL);
      n = j;
      *p = n ^ 5;

      n = *(volatile char*)p; // to generate the exact same code
      *p = n + '0';
    }

    // first number

    strncpy(t1, tmp, 7);
    t1[7] = 0;
    n1 = atoi(t1);

    // second number

    strncpy(t1, tmp + 7, 8);
    t1[8] = 0;
    n = atoi(t1);

    // checksum

    strcpy(t1, tmp + 15);
    i = atoi(t1);

    j = (n1 + n) % 1973;
    if(j != i)
      return (ATI_FAIL);

    // make real IMEI

    p1 = tmp;
    p = imei;
    for(i = 0; i < 8; i++)
    {
      j = (p1[1] << 4);
      j += p1[0] & 0x0F;
      *p = j;
      p++;
      p1 += 2;
    }

    ffs_file_write("/pcm/IMEI/", imei, 9, 1);
    if(pcm_WriteFile((UBYTE*)"IMEI", 8, (UBYTE*)imei) != 0)
      return (ATI_FAIL);

    return (ATI_CMPL);
}
