Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages | Examples

pos.c

Example of SMS handling and SIM Toolkit location information.
/*
 * Copyright (C) 2003 BLADOX, s.r.o.  All rights reserved.
 * 
 * This file is part of an example program for Turbo. This example
 * program may be used, distributed and modified without limitation.
 *
 */

#include <config.h>
#include <turbo/turbo.h>

#include <stdlib.h>
#include <string.h>

u8 PROGMEM t_Position_mime[] = "pos";

void pos_q_sms (u8 * s)
{
  u8 *tmp, *res;
  u8 *t = NULL;
  u16 j;
  u8 i;
  u8 *_tp = terminal_profile ();
  u8 *q;
  u8 *ln;
  u16 seq;

  dbsp (">pos_q_sms\n");

  tmp = NULL;

  t = msisdncpy (tpdu_seek (s, T_SMS_AA), MSISDN_SMS, MEM_R);
  tmp = malloc (139);
  q = create_head_a (tmp, s);

  // compose all loc info sms
  *q = 0;
  if (_tp)
  {
    if (_tp[0] >= 4 && _tp[4] & 64)
      *q |= 1;                  // B4_7 LOC_NFO
    if (_tp[0] >= 4 && _tp[4] & 128)
      *q |= 2;                  // B4_8 NMR
    if (_tp[0] >= 8 && _tp[8] & 4)
      *q |= 4;                  // B8_3 DATE
    if (_tp[0] >= 9 && _tp[9] & 4)
      *q |= 8;                  // B9_3 BCCH
    if (_tp[0] >= 9 && _tp[9] & 8)
      *q |= 16;                 // B9_4 LANG
    if (_tp[0] >= 9 && _tp[9] & 16)
      *q |= 32;                 // B9_5 TA
  }
  q++;
  ln = q;
  q++;
  // provide_local_info
  // T_LOCATION_INFO
  // 12.19 len=0x07+2
  res = provide_local_info ();
  j = get_tag (res, T_LOCATION_INFO);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  // ?provide_imei?
  // T_IMEI
  // 19.20 len=0x08+2
  res = provide_imei ();
  j = get_tag (res, T_IMEI);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  // provide_nmr
  // T_NMR
  // 19.22 len=0x10+2
  // provide_bcch & term_profile
  // T_BCCH_CHANNEL_LIST
  // 12.29 + 1 term_prof
  res = provide_nmr ();
  j = get_tag (res, T_NMR);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  j = get_tag (res, T_BCCH_CHANNEL_LIST);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  // provide_date
  // T_DATE
  // 12.39 len=0x07+2
  res = provide_date ();
  j = get_tag (res, T_DATE);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  // provide_language
  // T_LANGUAGE
  // 12.45 len=0x02+2
  res = provide_language ();
  j = get_tag (res, T_LANGUAGE);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  // provide_ta
  // T_TIMING_ADVANCE
  // l2.46 len=0x02+2
  res = provide_ta ();
  j = get_tag (res, T_TIMING_ADVANCE);
  if (j != 0)
  {
    memcpy (q, res + j, res[j + 1] + 2);
    q += res[j + 1] + 2;
  }

  *ln = q - ln;
  res =
    send_sms (tmp, q - tmp, t, MSISDN_SMS, tsms_dcs (), tsms_pid (), NULL,
              NULL);

  free (tmp);
  free (t);

  dbsp ("<pos_q_sms\n");
}

u8 PROGMEM t_s1[] = "T: ";
u8 PROGMEM t_s2[] = "LOCINFO: ";
u8 PROGMEM t_s3[] = "IMEI: ";
u8 PROGMEM t_s4[] = "NMR: ";
u8 PROGMEM t_s5[] = "BCCH: ";
u8 PROGMEM t_s6[] = "DATE: ";
u8 PROGMEM t_s7[] = "LANG: ";
u8 PROGMEM t_s8[] = "TA: ";

void pos_a_sms (u8 * s)
{
  u8 *t = skip_head (s);
  u8 *buf = malloc (200);
  u8 *res;
  u8 *r = buf;
  u8 j;
  u8 i, l;

  dbsp ("rec_pos_a_sms\n");

  r = sprints (r, t_s1);
  r = sprintch (r, *t);
  r = sprintc (r, '\n');
  res = t + 1;

  j = get_tag (res, T_LOCATION_INFO);
  if (j != 0)
  {
    r = sprints (r, t_s2);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  j = get_tag (res, T_IMEI);
  if (j != 0)
  {
    r = sprints (r, t_s3);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  j = get_tag (res, T_NMR);
  if (j != 0)
  {
    r = sprints (r, t_s4);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  j = get_tag (res, T_BCCH_CHANNEL_LIST);
  if (j != 0)
  {
    r = sprints (r, t_s5);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  j = get_tag (res, T_DATE);
  if (j != 0)
  {
    r = sprints (r, t_s6);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  j = get_tag (res, T_LANGUAGE);
  if (j != 0)
  {
    r = sprints (r, t_s7);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  j = get_tag (res, T_TIMING_ADVANCE);
  if (j != 0)
  {
    r = sprints (r, t_s8);
    l = res[j + 1];
    for (i = 0; i < l; i++)
      r = sprintch (r, res[j + 2 + i]);
    r = sprintc (r, '\n');
  }

  r = sprintc (r, '\0');
  display_text_raw (buf,
                    Q_DISPLAY_TEXT_HIGH_PRIORITY | Q_DISPLAY_TEXT_USER_CLEAR);
  free (buf);
}

void pos (void *data)
{
  u8 *tmp, *res;
  u8 *ms;
  u8 *q;
  u8 l, j, i;
  u8 alpha[ALPHA_LEN];

  tmp = NULL;
  ms = NULL;

  res = msisdn (alpha);
  if (res != ENULL && res != NULL)
  {
    ms = msisdncpy (res, MSISDN_ADN, MEM_R);
    tmp = malloc (20);
    q = create_head_q (tmp, t_Position_mime, ms, MSISDN_ADN);
    send_sms (tmp, q - tmp, ms, MSISDN_ADN, tsms_dcs (), tsms_pid (), NULL,
              NULL);
  }

  free (tmp);
  free (ms);
}

/* *INDENT-OFF* */

lc_char PROGMEM lc_Position[]={ 
        LC_EN("Locate")
        LC_CZ("Lokalizuj")
        LC_END
};

/* *INDENT-ON* */

void turbo_handler (u8 action, void *data)
{
  switch (action)
  {
    case ACTION_SMS_Q:
      stk_thread (pos_q_sms, data);
      break;
    case ACTION_SMS_A:
      stk_thread (pos_a_sms, data);
      break;
    case ACTION_APP_REGISTER:
      reg_sms_tag (locale (lc_Position), t_Position_mime, SMS_TYPE_QA);
      break;
    case ACTION_INSERT_MENU:
      insert_menu (locale (lc_Position));
      break;
    case ACTION_MENU_SELECTION:
      stk_thread (pos, data);
      break;
    default:
      break;
  }
}


Copyright © 2004-2006 BLADOX
Turbo version 1.2