diff --git a/conf/modules/gsm.xml b/conf/modules/gsm.xml index 536867f43d..339cba24a1 100644 --- a/conf/modules/gsm.xml +++ b/conf/modules/gsm.xml @@ -4,8 +4,8 @@
- - + + diff --git a/sw/airborne/modules/gsm/gsm.c b/sw/airborne/modules/gsm/gsm.c index bb25ea8385..b4bc28b31b 100644 --- a/sw/airborne/modules/gsm/gsm.c +++ b/sw/airborne/modules/gsm/gsm.c @@ -24,6 +24,32 @@ /* http://www.telit.com/en/products/gsm-gprs.php?p_ac=show&p=12#downloads + +Init: + Out: ATE0 + In: OK + Out: AT+CMGF=1 + In: OK + Out: AT+CNMI=1,1,0,0,0 + In: OK + Out : AT+CPMS=\"SM\" + In: +CPMS: + +Reporting: + Out: AT+CSQ + In: +CSQ: , + In: OK + Out: AT+CMGS=\"GCS_NUMBER\" + In: > + Out: gps_utm_east, gps_utm_north, gps_course, gps_alt, gps_gspeed, gps_climb, vsupply, estimator_flight_time, rssi CTRLZ + +Receiving: + In: +CMTI: ..., + Out: AT+CMGR= + In: +CMGR ... + In: B42 (or S42 3.14) + Out: AT+CMGD= + In: OK */ #include @@ -34,6 +60,14 @@ http://www.telit.com/en/products/gsm-gprs.php?p_ac=show&p=12#downloads #include "gsm.h" #include "uart.h" #include "std.h" +#ifdef USE_USB_SERIAL +#include "usb_serial.h" +#endif +#ifndef DOWNLINK_DEVICE +#define DOWNLINK_DEVICE DOWNLINK_AP_DEVICE +#endif +#include "uart.h" +#include "downlink.h" #include "ap_downlink.h" #include "gps.h" #include "autopilot.h" @@ -89,6 +123,7 @@ static char data_to_send[DATA_MAXLEN]; #define STATUS_IDLE 9 #define STATUS_WAITING_PROMPT 10 #define STATUS_DELETE_SMS 11 +#define STATUS_POWERON 12 static uint8_t gsm_status = STATUS_NONE; @@ -116,11 +151,17 @@ static char* indexn(char*, char, uint8_t); /*****************************************************************************/ void gsm_init(void) { - gsm_buf_idx = 0; - gsm_line_received = false; - - Send_AT(); - gsm_status = STATUS_SEND_AT; + if (gsm_status == STATUS_NONE) { /* First call */ + LED_ON(GSM_ONOFF_LED); + gsm_status = STATUS_POWERON; + } else { /* Second call */ + gsm_buf_idx = 0; + gsm_line_received = false; + + Send_AT(); + gsm_status = STATUS_SEND_AT; + gsm_gsm_init_status = FALSE; + } } @@ -130,9 +171,11 @@ void gsm_event(void) { } if (gsm_line_received) { + DOWNLINK_SEND_DEBUG_GSM_RECEIVE(DefaultChannel, gsm_buf_len, gsm_buf); gsm_got_line(); gsm_line_received = false; } else if (prompt_received) { + DOWNLINK_SEND_DEBUG_GSM_RECEIVE(DefaultChannel, 1, ">"); gsm_got_prompt(); prompt_received = false; } @@ -149,13 +192,10 @@ static void gsm_got_line(void) } else if (gsm_status == STATUS_IDLE && strncmp(CMTI, gsm_buf, strlen(CMTI)) == 0) { /* A SMS is available */ - /***/printf("CMTI: %s\n", gsm_buf); /* Extracting the index of the message */ char * first_comma = indexn(gsm_buf, ',',MAXLEN_CMTI_ANSWER); - /***/printf("CMTI: com=%d\n", first_comma - gsm_buf); if (first_comma) { index_msg = atoi(first_comma+1); - /***/printf("CMTI: index=%d\n", index_msg); request_for_msg(); gsm_status = STATUS_REQUESTING_MESSAGE; } @@ -198,6 +238,7 @@ static void gsm_got_line(void) case STATUS_SEND_CPMS : gsm_answer = false; gsm_status = STATUS_IDLE; + gsm_gsm_send_report_status = MODULES_START; /** Start reporting */ break; case STATUS_DELETE_SMS : @@ -312,7 +353,7 @@ static void parse_msg_header(void) // Periodic message, first step (called every 60s) void gsm_send_report() { - /***/printf("send_report: %d\n", gsm_status); + gsm_status = STATUS_IDLE; if(gsm_status == STATUS_IDLE) { // Checking the network coverage Send_CSQ(); @@ -331,7 +372,7 @@ void gsm_send_report_continue(void) // Donnee GPS :ne sont pas envoyes gps_mode, gps_itow, gps_utm_zone, gps_nb_ovrn // Donnees batterie (seuls vsupply et estimator_flight_time sont envoyes) // concatenation de toutes les infos en un seul message à transmettre - sprintf(data_to_send, "%d %d %d %d %d %d %d %d %d", gps_utm_east, gps_utm_north, gps_course, gps_alt, gps_gspeed, gps_climb, vsupply, estimator_flight_time, rssi); + sprintf(data_to_send, "%ld %ld %d %ld %d %d %d %d %d", gps_utm_east, gps_utm_north, gps_course, gps_alt, gps_gspeed, gps_climb, vsupply, estimator_flight_time, rssi); // send the number and wait for the prompt char buf[32]; @@ -347,7 +388,7 @@ static void Send_AT(void) strcpy(expected_ack, "OK"); waiting_for_reply = true; - Send("AT"); + Send("ATE0"); } static void Send_CMGF(void) @@ -359,7 +400,8 @@ static void Send_CMGF(void) static void Send_CSQ(void) { - strcpy(expected_ack, "+CSQ:"); + /***** FIXME ****** strcpy(expected_ack, "+CSQ:"); ****/ + strcpy(expected_ack, "OK"); waiting_for_reply = true; Send("AT+CSQ"); } @@ -380,7 +422,6 @@ static void Send_CPMS(void) static void gsm_parse(uint8_t c) { - /*** fprintf(stderr, "gsm_parse:%c\n", c); ***/ switch(c) { case GSM_CR: gsm_buf[gsm_buf_idx] = '\0'; @@ -391,6 +432,8 @@ static void gsm_parse(uint8_t c) { case '>': prompt_received = true; break; + case '\n': + break; default: if (gsm_buf_idx < GSM_MAX_PAYLOAD) { gsm_buf[gsm_buf_idx] = c; @@ -409,6 +452,8 @@ static void Send(const char string[]) while(string[i]) GSMTransmit(string[i++]); GSMTransmit(GSM_CR); + + DOWNLINK_SEND_DEBUG_GSM_SEND(DefaultChannel, i, string); } /* Returns a pointer to the first occurrence of the character c in the firtn