WORD GSM_SendSmsToData(far GSM * _Gsm)

WORD GSM_SendSmsToData(far GSM * _Gsm)
{
 WORD i, k, IndexDCID;
 WORD m, n;
 BYTE	system_tel_set;
 WORD IndexDataMessage;
 char temp;
 char *p;
 BYTE PN[21];
 if(Packet.ValidateDataReceive)	return ERR_GSM_SendSmsToData_PACKET;
 system_tel_set = 0;
 if(strlen((const char*)Sms.RxBuff[0].Message) == 0){
  Packet.Receiver.byte.HB = DCID[0][0];
  Packet.Receiver.byte.LB = DCID[0][1];
//		Packet.Command.Val = 0;
//		API_CmdAnswer(&Packet, ERR_GSM_SendSmsToData_FORMAT);
  return ERR_GSM_SendSmsToData_FORMAT;
 }
 for(IndexDCID=0; IndexDCID<MAX_DCID; IndexDCID++){
  if((IndexAddressElement[IndexDCID][1] & 0x0f) == PHYSICAL_LAYER_GSM_SMS){
   if(!strcmp((const char*)Sms.RxBuff[0].Tel, TableAddressSMS[IndexAddressElement[IndexDCID][0]].TelNumber)){
    Packet.Sender.byte.HB = DCID[IndexDCID][0];
    Packet.Sender.byte.LB = DCID[IndexDCID][1];
    break;
   }
  }
 }
 for(IndexDataMessage=0; IndexDataMessage<strlen((const char*)Sms.RxBuff[0].Message); IndexDataMessage++){
  if(Sms.RxBuff[0].Message[IndexDataMessage] == '='){
   IndexDataMessage++;
   VERSION_GetPN(PN);
   for(m=0; m<21; m++){
    if(PN[m] == '-') break;
   }
   if(m > 8) break;
   PN[0] = PN[m+8];
   PN[1] = PN[m+9];
   PN[2] = PN[m+10];
   PN[3] = PN[m+11];
   PN[4] = 0;
   break;
  }
  if(Sms.RxBuff[0].Message[IndexDataMessage] == ':'){
   IndexDataMessage++;
   break;
  }
 }
 for(m = 0; m < IndexDataMessage; m++){
  if(Sms.RxBuff[0].Message[m] >= 97 && Sms.RxBuff[0].Message[m] <= 122)	Sms.RxBuff[0].Message[m] = Sms.RxBuff[0].Message[m] - 0x20;
 }
 if(Sms.RxBuff[0].Message[IndexDataMessage - 1] == ':' || Sms.RxBuff[0].Message[IndexDataMessage - 1] == '='){
  for(m = IndexDataMessage; m < strlen((const char*)Sms.RxBuff[0].Message); m++){
   if(Sms.RxBuff[0].Message[m] == 0x0a){
    for(n = m; n < strlen((const char*)Sms.RxBuff[0].Message); n++){
     Sms.RxBuff[0].Message[n] = Sms.RxBuff[0].Message[n+1];
    }
   }
  }
 }
 if(!strcmp((const char*)(Sms.RxBuff[0].Message + IndexDataMessage + 2), PN)){
  system_tel_set = 1;
  Sms.RxBuff[0].Message[IndexDataMessage + 2] = 0;
  temp = Sms.RxBuff[0].Message[IndexDataMessage] - 0x30 - 1;
  for(m=0; m<strlen((const char*)Sms.RxBuff[0].Tel); m++)	Sms.RxBuff[0].Message[IndexDataMessage + 2 + m] = Sms.RxBuff[0].Tel[m];
  Sms.RxBuff[0].Message[IndexDataMessage + 2 + strlen((const char*)Sms.RxBuff[0].Tel)] = 0;
  for(i=0; i<MAX_DCID; i++){
   if((IndexAddressElement[i][1] & 0x0f) == PHYSICAL_LAYER_GSM_SMS){
    if(IndexAddressElement[i][0] == temp){
     Packet.Sender.byte.HB = DCID[i][0];
     Packet.Sender.byte.LB = DCID[i][1];
     break;
    }
   }
  }
  if(IndexDCID == MAX_DCID)	IndexDCID = temp;
 }
 else if(IndexDCID == MAX_DCID)	 return ERR_GSM_SendSmsToData_TEL;
 temp = Sms.RxBuff[0].Message[IndexDataMessage];
 Sms.RxBuff[0].Message[IndexDataMessage] = 0;
 for(i=0; i<NUM_COMMANDS_SMS; i++){
  if(!strcmp((const char*)Sms.RxBuff[0].Message, TableCommandsSMS[i].Text)) break;
 }
 if(i == NUM_COMMANDS_SMS){
  Packet.Receiver.byte.HB = DCID[0][0];
  Packet.Receiver.byte.LB = DCID[0][1];
  API_CmdAnswer(&Packet, ERR_GSM_SendSmsToData_NO_COMMAND);
  return ERR_GSM_SendSmsToData_NO_COMMAND;
 }
 if(!GSM_AccessRights(IndexAddressElement[IndexDCID][0], TableCommandsSMS[i].Command) && !system_tel_set){
  Packet.Receiver.byte.HB = DCID[0][0];
  Packet.Receiver.byte.LB = DCID[0][1];
  API_CmdAnswer(&Packet, ERR_GSM_SendSmsToData_ACCESS);
  return ERR_GSM_SendSmsToData_ACCESS;
 }
 Packet.Command.Val = TableCommandsSMS[i].Command;
 for(k=0; k<MAX_DCID; k++){
  if((IndexAddressElement[k][1] & 0x0f) == PHYSICAL_LAYER_THIS){
   if(IndexAddressElement[k][2] == TableCommandsSMS[i].Element){
    Packet.Receiver.byte.HB = DCID[k][0];
    Packet.Receiver.byte.LB = DCID[k][1];	
    break;
   }
  }
 }
 if(k == MAX_DCID){
  Packet.Receiver.byte.HB = DCID[0][0];
  Packet.Receiver.byte.LB = DCID[0][1];
  API_CmdAnswer(&Packet, ERR_GSM_SendSmsToData_ELEMENT);
  return ERR_GSM_SendSmsToData_ELEMENT;
 }
 Sms.RxBuff[0].Message[IndexDataMessage] = temp;
 if(Sms.RxBuff[0].Message[IndexDataMessage] != 0){
  if(k = GSM_ParseSmsCommand(&Packet, IndexDataMessage, Sms.RxBuff[0].Message) != ERR_OK){
   Packet.Receiver.byte.HB = DCID[0][0];
   Packet.Receiver.byte.LB = DCID[0][1];
   API_CmdAnswer(&Packet, k);
   return k;
  }
 }
 else Packet.DataLength.Val = 0;
 Packet.ValidateDataReceive = TRUE;
 return	ERR_OK;

}