CarApp
Notificaciones a celulares al detectar la alarma del auto activada.
 Todo Estructuras de Datos Archivos Funciones Variables Enumeraciones Valores de enumeraciones 'defines'
gsm.c
Ir a la documentación de este archivo.
1 //******************************************************************************
2 // Nombre: gsm.c
3 // Versión: 1.0
4 // Descripción: Módulo que maneja la comunicación del micro con el módem. En
5 // este módulo se implementan las máquinas de estados para realizar
6 // llamadas, enviar mensajes y configurar el modem. Además, se
7 // definen los celulares de notificación junto con las funciones
8 // necesarias para modificarlos y consultarlos. Define un proceso
9 // que filtra los comandos recibidos desde la Uart.
10 // Autores: Juan Martín Ortega, Ramiro Barrón, Andrea Cukerman
11 // IIE, Facultad de Ingeniería, UdelaR
12 // Uruguay
13 // Fecha: Junio 2012
14 //******************************************************************************
15 
27 #include "uart.h"
28 #include "gsm.h"
29 #include "shell.h"
30 #include "timer.h"
31 #include "car-app.h"
32 #include <string.h>
33 
34 /*
35  * Definición de Constantes Privadas
36  */
37 
43 
49 
55 
56 
57 /*
58  * Declaración de variables Privadas
59  */
60 
65 static char first_phone_number[15];
66 
71 static char second_phone_number[15];
72 
77 int estado;
78 
84 
90 
95 char msj_text[70];
96 
101 char recibed_info[70];
102 
107 char text_to_send[100];
108 
114 
115 
116 
121 extern buffer RXbuffer;
122 
123 
124 
131 void send_sms(char* phone_number, char* msj_text)
132  {
133  char AT_command[30] = "AT+CMGS=\""; // Prepara comando AT a enviar
134  strcpy(text_to_send, msj_text); // Copia el texto del mensaje para luego enviarlo
135  strcat(AT_command, phone_number); // Agrega el número de celular al comando AT
136  strcat(AT_command, "\"\r"); // Agrega caracter de retorno de linea para que el modem identifique el comando
137  estado = SEND_PHONE_NUMBER; // Define SEND_PHONE_NUMBER como estado de la máquina de estados continue_sending_sms()
138  set_eofl('>'); // Setea fin de linea
139  set_number_eofl(1); // Setea cantidad de fines de linea
140  set_sendingFlag(); // Setea bandera que indica que se está enviando un sms
141  cargarTXbuffer(AT_command); // Envia el comando AT por la UART al modem gsm
142  init_timeout(); // Inicia timer de timeout
143  }//end send_sms
144 
152  {
153  switch (estado) //
154  {
155  case SEND_PHONE_NUMBER: modem_response = strtok(RXbuffer.datos,"\r\n\x00"); //
156  if (!strcmp(modem_response, ">")) //
157  { //
158  strcat(text_to_send, "\x1A"); //
159  estado = SEND_TEXT; //
160  set_eofl('\n'); //
161  set_number_eofl(4); //
163  }
164  else
165  { //
166  set_eofl('\n'); //
167  set_number_eofl(3); //
168  reset_sendingFlag(); //
169  }
170  break;
171  case SEND_TEXT: modem_response = strtok(RXbuffer.datos,"\r\n"); //
172  modem_response = strtok (NULL, "\r\n"); //
173  modem_response = strtok (NULL, "\r\n"); //
174  if (!strcmp(modem_response, "OK")) //
175  { //
176  TBCCTL1 &= 0xEF; //
177  set_eofl('\n'); //
178  set_number_eofl(3); //
179  reset_sendingFlag(); //
180  }
181  else
182  { //
183  set_eofl('\n'); //
184  set_number_eofl(3); //
185  reset_sendingFlag(); //
186  }
187  break;
188  default: break; //
189  }
190  }
191 
197 void call()
198  {
199  switch(call_state) //
200  {
201  case DO_CALL: strcpy(text_to_send,"ATD+"); //
202  strcat(text_to_send,get_first_phone()); //
203  strcat(text_to_send,";\r"); //
204  set_eofl('\n'); //
205  set_number_eofl(4); //
206  set_calling(); //
207  call_state = WAIT_ANSWER ; //
209  break; //
210  case WAIT_ANSWER: modem_response = strtok(RXbuffer.datos,"\r\n"); //
211  modem_response = strtok (NULL, "\r\n"); //
212  if (!strcmp(modem_response, "BUSY") || !strcmp(modem_response, "NO CARRIER"))//
213  { //
214  set_eofl('\n'); //
215  set_number_eofl(3); //
216  reset_calling(); //
217  call_state = DO_CALL; //
218  init_control_timer(); //
219  }
220  else
221  { //
222  //ver que hacer si no llega el > esperado!!!!
223  }
224  break;
225  default: break;
226  }
227  }
228 
237  {
238  switch (estate_config_modem) //
239  {
240  case ATEO: set_eofl('\n'); //
241  set_number_eofl(2); //
243  cargarTXbuffer("ATE0\r"); //
244  break;
245  case CMGF: modem_response = strtok(RXbuffer.datos,"\r\n"); //
246  if(strcmp(modem_response, "OK")) //
247  { //
248  modem_response = strtok(NULL,"\r\n"); //
249  }
250  if(!strcmp(modem_response, "OK")) //
251  { //
252  cargarTXbuffer("AT+CMGF=1\r"); //
254  }
255  else
256  { //
257  //ver que hacer si no llega el > esperado!!!! //
258  }
259  break;
260  case CNMI: modem_response = strtok(RXbuffer.datos,"\r\n"); //
261  if(!strcmp(modem_response, "OK")) //
262  { //
263  cargarTXbuffer("AT+CNMI=1,2,0,0,0\r"); //
265  }
266  else
267  { //
268  //ver que hacer si no llega el > esperado!!!! //
269  }
270  break;
271  case CLIP: modem_response = strtok(RXbuffer.datos,"\r\n"); //
272  if(!strcmp(modem_response, "OK")) //
273  { //
274  cargarTXbuffer("AT+CLIP=0\r"); //
276  }
277  else
278  { //
279  //ver que hacer si no llega el > esperado!!!!
280  }
281  break;
282  case END_C: modem_response = strtok(RXbuffer.datos,"\r\n"); //
283  if(!strcmp(modem_response, "OK")) //
284  { //
286  set_eofl('\n'); //
287  set_number_eofl(3); //
289  }
290  else
291  { //
292  //ver que hacer si no llega el > esperado!!!!
293  }
294  break;
295  default: break;
296  }
297  }
298 
308  {
309  if(!strncmp(RXbuffer.datos, "\r\n+CMT:", 7))
310  {
311  char* sending_phone;
312  char* command;
313  sending_phone = strtok(RXbuffer.datos,"\"");
314  sending_phone = strtok (NULL, "\"");
315  command = strtok(NULL,"\r\n");
316  command = strtok (NULL, "\r\n");
317  strcpy(recibed_info, sending_phone);
318  strcat(recibed_info, " ");
319  strcat(recibed_info, command);
321  }
322  else if(get_sendingFlag())
323  {
325  }
326  else if(get_calling())
327  {
329  }
330  else if(get_flagConfigurando())
331  {
333  }
334  else
335  {
336  }
337 }
338 
344 void set_first_phone(char* cel)
345  {
346  strcpy(first_phone_number, "+598");
347  char cel_aux[15];
348  strcpy(cel_aux, cel);
349  int i = 0;
350  while( cel_aux[i]!= 0x00)
351  {
352  cel_aux[i-1] = cel_aux[i];
353  i++;
354  }
355  cel_aux[i-1] = 0x00;
356  strcat(first_phone_number, cel_aux);
357  }
358 
364 void set_second_phone(char* cel)
365  {
366  strcpy(second_phone_number, "+598");
367  char cel_aux[15];
368  strcpy(cel_aux, cel);
369  int i = 0;
370  while( cel_aux[i]!= 0x00)
371  {
372  cel_aux[i-1] = cel_aux[i];
373  i++;
374  }//end while
375  cel_aux[i-1] = 0x00;
376  strcat(second_phone_number, cel_aux);
377  }//end set_second_phone
378 
385  {
386  return first_phone_number; // Retorna celular primario
387  }//end get_first_phone
388 
389 
390 
397  {
398  return second_phone_number; // Retorna celular secundario
399  }//end get_second_phone
400