mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-28 09:58:23 +08:00
test in sim
This commit is contained in:
+74
-115
@@ -39,6 +39,7 @@ http://www.telit.com/en/products/gsm-gprs.php?p_ac=show&p=12#downloads
|
||||
#include "autopilot.h"
|
||||
#include "estimator.h"
|
||||
#include "common_nav.h"
|
||||
#include "settings.h"
|
||||
|
||||
#ifndef GSM_LINK
|
||||
#define GSM_LINK Uart3100
|
||||
@@ -60,18 +61,15 @@ http://www.telit.com/en/products/gsm-gprs.php?p_ac=show&p=12#downloads
|
||||
#define DATA_MAXLEN 128
|
||||
|
||||
#define CMTI "+CMTI:"
|
||||
#define MAXLEN_CMTI_ANSWER 32
|
||||
#define MAXLEN_SMS_CONTENT DATA_MAXLEN
|
||||
|
||||
static bool gsm_line_received;
|
||||
static bool prompt_received;
|
||||
static bool wait_data; /* Waiting for message content after header */
|
||||
static bool is_receiving; /* +CMTI has been received, true until contents has been parsed */
|
||||
static bool waiting_for_reply; /* An AT command has been sent and an answer is expected */
|
||||
static bool init_done;
|
||||
static bool waiting_prompt;
|
||||
static bool msg_sent;
|
||||
|
||||
static char msg_status[16];
|
||||
static char msg_date[32];
|
||||
// static char msg_status[16];
|
||||
// static char msg_date[32];
|
||||
|
||||
static char expected_ack[10];
|
||||
static char gsm_buf[GSM_MAX_PAYLOAD] __attribute__ ((aligned));
|
||||
@@ -87,9 +85,13 @@ static char data_to_send[DATA_MAXLEN];
|
||||
#define STATUS_SEND_CNMI 5
|
||||
#define STATUS_SEND_CPMS 6
|
||||
#define STATUS_RECEPTION_SMS2 7
|
||||
#define STATUS_WAITING_DATA 8
|
||||
#define STATUS_IDLE 9
|
||||
#define STATUS_WAITING_PROMPT 10
|
||||
#define STATUS_DELETE_SMS 11
|
||||
|
||||
static uint8_t gsm_status = STATUS_NONE;
|
||||
|
||||
static uint8_t nb_received_lines = 0;
|
||||
static uint8_t index_msg;
|
||||
|
||||
static void Send_AT(void);
|
||||
@@ -103,10 +105,10 @@ static void gsm_got_line(void);
|
||||
static void gsm_got_prompt(void);
|
||||
static void gsm_receive_content(void);
|
||||
static void request_for_msg(void);
|
||||
static void Extraction(char source[], char char_dbt, int nb_occurence1, int decalage1, char char_fin, int nb_occurence2, int decalage2, char destination[]);
|
||||
static void Send_CSQ(void);
|
||||
static void Send(const char string[]);
|
||||
static void parse_msg_header(void);
|
||||
static char* indexn(char*, char, uint8_t);
|
||||
|
||||
|
||||
|
||||
@@ -116,17 +118,16 @@ static void parse_msg_header(void);
|
||||
void gsm_init(void) {
|
||||
gsm_buf_idx = 0;
|
||||
gsm_line_received = false;
|
||||
init_done = false;
|
||||
waiting_prompt = false;
|
||||
msg_sent = true;
|
||||
|
||||
Send_AT();
|
||||
gsm_status = STATUS_SEND_AT;
|
||||
}
|
||||
|
||||
|
||||
void gsm_event(void) {
|
||||
if (GSMBuffer())
|
||||
if (GSMBuffer()) {
|
||||
ReadGSMBuffer();
|
||||
}
|
||||
|
||||
if (gsm_line_received) {
|
||||
gsm_got_line();
|
||||
@@ -141,17 +142,22 @@ void gsm_event(void) {
|
||||
// A line of length gsm_buf_len is available in the gsm_buf buffer
|
||||
static void gsm_got_line(void)
|
||||
{
|
||||
if (wait_data) { // Currently receiving a SMS
|
||||
if (gsm_status == STATUS_WAITING_DATA) { // Currently receiving a SMS
|
||||
gsm_receive_content();
|
||||
} else if ((strncmp(CMTI, gsm_buf, strlen(CMTI)) == 0)
|
||||
&& (!is_receiving)) { /* A SMS is available */
|
||||
|
||||
Suppr_SMS(index_msg);
|
||||
gsm_status = STATUS_DELETE_SMS;
|
||||
} 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 = index(gsm_buf, ',');
|
||||
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);
|
||||
is_receiving = true;
|
||||
/***/printf("CMTI: index=%d\n", index_msg);
|
||||
request_for_msg();
|
||||
gsm_status = STATUS_REQUESTING_MESSAGE;
|
||||
}
|
||||
} else if (waiting_for_reply) { // Other cases
|
||||
// Do we get what we were expecting
|
||||
@@ -163,31 +169,39 @@ static void gsm_got_line(void)
|
||||
switch(gsm_status) {
|
||||
case STATUS_CSQ :
|
||||
gsm_send_report_continue();
|
||||
gsm_status = STATUS_WAITING_PROMPT;
|
||||
break;
|
||||
|
||||
case STATUS_REQUESTING_MESSAGE:
|
||||
parse_msg_header();
|
||||
wait_data = true;
|
||||
gsm_status = STATUS_WAITING_DATA;
|
||||
break;
|
||||
|
||||
case STATUS_SEND_AT :
|
||||
gsm_answer = false;
|
||||
Send_CMGF();
|
||||
gsm_status = STATUS_SEND_CMGF;
|
||||
break;
|
||||
|
||||
case STATUS_SEND_CMGF :
|
||||
gsm_answer = false;
|
||||
Send_CNMI();
|
||||
gsm_status = STATUS_SEND_CNMI;
|
||||
break;
|
||||
|
||||
case STATUS_SEND_CNMI :
|
||||
gsm_answer = false;
|
||||
Send_CPMS();
|
||||
gsm_status = STATUS_SEND_CPMS;
|
||||
break;
|
||||
|
||||
case STATUS_SEND_CPMS :
|
||||
gsm_answer = false;
|
||||
init_done = true;
|
||||
gsm_status = STATUS_IDLE;
|
||||
break;
|
||||
|
||||
case STATUS_DELETE_SMS :
|
||||
gsm_status = STATUS_IDLE;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -204,11 +218,10 @@ static void gsm_got_line(void)
|
||||
// Receiving a SMS, first step: asking for a given message
|
||||
static void request_for_msg(void)
|
||||
{
|
||||
char demande_lecture_SMS[10];
|
||||
char demande_lecture_SMS[16];
|
||||
|
||||
strcpy(expected_ack, "+CMGR");
|
||||
sprintf(demande_lecture_SMS, "AT+CMGR=%d", index_msg);
|
||||
gsm_status = STATUS_REQUESTING_MESSAGE;
|
||||
waiting_for_reply = true;
|
||||
Send(demande_lecture_SMS);
|
||||
}
|
||||
@@ -221,38 +234,34 @@ static void request_for_msg(void)
|
||||
*/
|
||||
static void gsm_receive_content(void)
|
||||
{
|
||||
char instruction[15], index_block[2];
|
||||
|
||||
wait_data = false;
|
||||
|
||||
// ?????? sprintf(data_to_send, "%d %s %s %s %s", index_msg, flag, expediteur, dateheure, data_recue);
|
||||
// ?????? Send(data_to_send);
|
||||
|
||||
// Checking the number of the sender
|
||||
if (strncmp((char*)GCS_NUMBER, origin, strlen(GCS_NUMBER)) == 0) {
|
||||
if (true || strncmp((char*)GCS_NUMBER, origin, strlen(GCS_NUMBER)) == 0) {
|
||||
// Decoding the message ...
|
||||
|
||||
// Search for the instruction
|
||||
switch (gsm_buf[0]) {
|
||||
case 'B' :
|
||||
case 'B' : {
|
||||
uint8_t block_index = atoi(gsm_buf+1);
|
||||
if (block_index > 0) /* Warning: no way to go to the first block */
|
||||
nav_goto_block(block_index);
|
||||
break;
|
||||
|
||||
case 'S' :
|
||||
}
|
||||
case 'S' : {
|
||||
uint8_t var_index = atoi(gsm_buf+1);
|
||||
if (var_index > 0) {
|
||||
float value = atof(index(gsm_buf, ' ')+1);
|
||||
float value = atof(indexn(gsm_buf, ' ',MAXLEN_SMS_CONTENT)+1);
|
||||
DlSetting(var_index, value);
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
// Report an error ???
|
||||
break;
|
||||
}
|
||||
}
|
||||
Suppr_SMS(index_msg);
|
||||
|
||||
is_receiving = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -263,29 +272,22 @@ void Suppr_SMS(int index_)
|
||||
|
||||
sprintf(demande_suppression, "AT+CMGD=%d", index_);
|
||||
strcpy(expected_ack, "OK");
|
||||
waiting_for_reply = true;
|
||||
Send(demande_suppression);
|
||||
}
|
||||
|
||||
|
||||
// Sending a SMS, first step: send the number and wait for the prompt
|
||||
static void Send_Msg(void)
|
||||
{
|
||||
waiting_prompt = true;
|
||||
|
||||
Send("AT+CMGS=\"+33617802096\"\0");
|
||||
}
|
||||
|
||||
// We just have received a prompt ">" (we are sending a SMS)
|
||||
static void gsm_got_prompt(void)
|
||||
{
|
||||
if (waiting_prompt) { // We were waiting for a prompt
|
||||
if (gsm_status == STATUS_WAITING_PROMPT) { // We were waiting for a prompt
|
||||
char string[strlen(data_to_send) +3];
|
||||
|
||||
sprintf(string, "%s%c", data_to_send, CTRLZ);
|
||||
Send(string);
|
||||
}
|
||||
|
||||
waiting_prompt = false;
|
||||
gsm_status = STATUS_IDLE;
|
||||
}
|
||||
|
||||
/** Message header in gsm_bug
|
||||
@@ -296,10 +298,10 @@ static void parse_msg_header(void)
|
||||
/** Extraction(buffer2, '"', 1, 1, '"', 1, 0, msg_status); */
|
||||
|
||||
/* Extraction de l'expediteur*/
|
||||
Extraction(buffer2, '"', 2, 1, '"', 1, 0, origin);
|
||||
// Extraction(buffer2, '"', 2, 1, '"', 1, 0, origin);
|
||||
|
||||
/* Extraction de date heure*/
|
||||
Extraction(buffer2, '"', 4, 1, '"', 1, 0, msg_date);
|
||||
// Extraction(buffer2, '"', 4, 1, '"', 1, 0, msg_date);
|
||||
|
||||
//pb d'ecriture du flag => solution de fortune (pb si flag != rec unread)
|
||||
//??????? strncpy(flag, flag, 10);
|
||||
@@ -310,11 +312,11 @@ static void parse_msg_header(void)
|
||||
// Periodic message, first step (called every 60s)
|
||||
void gsm_send_report()
|
||||
{
|
||||
if(init_done && msg_sent) {
|
||||
msg_sent = false;
|
||||
|
||||
/***/printf("send_report: %d\n", gsm_status);
|
||||
if(gsm_status == STATUS_IDLE) {
|
||||
// Checking the network coverage
|
||||
Send_CSQ();
|
||||
gsm_status = STATUS_CSQ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,22 +324,19 @@ void gsm_send_report()
|
||||
// Sending a message, second step; we have asked for network quality
|
||||
void gsm_send_report_continue(void)
|
||||
{
|
||||
char qualite_signal_GSM[5];
|
||||
|
||||
//We got "+CSQ:" (and we expect "ok" on the second line ???)
|
||||
Extraction(gsm_buf, ':', 1, 2, '\r', 1, 0, qualite_signal_GSM);
|
||||
|
||||
qualite_signal_GSM[4] = '\0';
|
||||
//We got "+CSQ: <rssi>,<ber>" <rssi> and <ber> on 2 digits (cf 3.5.4.4.4)
|
||||
// and we expect "OK" on the second line
|
||||
uint8_t rssi = atoi(gsm_buf + strlen("+CSQ: "));
|
||||
|
||||
// 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, "%ld %ld %d %ld %d %d %d %d %s", gps_utm_east, gps_utm_north, gps_course, gps_alt, gps_gspeed, gps_climb, vsupply, estimator_flight_time, qualite_signal_GSM);
|
||||
|
||||
// Envoi du SMS
|
||||
Send_Msg();
|
||||
|
||||
msg_sent = true;
|
||||
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);
|
||||
|
||||
// send the number and wait for the prompt
|
||||
char buf[32];
|
||||
sprintf(buf, "AT+CMGS=\"%s\"", GCS_NUMBER);
|
||||
Send(buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -346,7 +345,6 @@ void gsm_send_report_continue(void)
|
||||
static void Send_AT(void)
|
||||
{
|
||||
strcpy(expected_ack, "OK");
|
||||
gsm_status = STATUS_SEND_AT;
|
||||
waiting_for_reply = true;
|
||||
|
||||
Send("AT");
|
||||
@@ -355,15 +353,13 @@ static void Send_AT(void)
|
||||
static void Send_CMGF(void)
|
||||
{
|
||||
strcpy(expected_ack, "OK");
|
||||
gsm_status = STATUS_SEND_CMGF;
|
||||
waiting_for_reply = true;
|
||||
Send("AT+CMGF=1");
|
||||
}
|
||||
|
||||
static void Send_CSQ(void)
|
||||
{
|
||||
strcpy(expected_ack, "OK");
|
||||
gsm_status = STATUS_CSQ;
|
||||
strcpy(expected_ack, "+CSQ:");
|
||||
waiting_for_reply = true;
|
||||
Send("AT+CSQ");
|
||||
}
|
||||
@@ -371,7 +367,6 @@ static void Send_CSQ(void)
|
||||
static void Send_CNMI(void)
|
||||
{
|
||||
strcpy(expected_ack, "OK");
|
||||
gsm_status = STATUS_SEND_CNMI;
|
||||
waiting_for_reply = true;
|
||||
Send("AT+CNMI=1,1,0,0,0");
|
||||
}
|
||||
@@ -379,37 +374,16 @@ static void Send_CNMI(void)
|
||||
static void Send_CPMS(void)
|
||||
{
|
||||
strcpy(expected_ack, "+CPMS:");
|
||||
gsm_status = STATUS_SEND_CPMS;
|
||||
waiting_for_reply = true;
|
||||
Send("AT+CPMS=\"SM\"");
|
||||
}
|
||||
|
||||
|
||||
static uint8_t indexn(const char* string, char c, int nb_occ)
|
||||
{
|
||||
uint8_t nb_trouve = 0, i = 0;
|
||||
|
||||
while(string[i] && nb_trouve < nb_occ) {
|
||||
if(string[i] == c) {
|
||||
nb_trouve++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if (nb_trouve == nb_occ)
|
||||
return i-1;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void gsm_parse(uint8_t c) {
|
||||
/*** fprintf(stderr, "gsm_parse:%c\n", c); ***/
|
||||
switch(c) {
|
||||
case '\n':
|
||||
/* ignore */
|
||||
break;
|
||||
case '\r':
|
||||
case GSM_CR:
|
||||
gsm_buf[gsm_buf_idx] = '\0';
|
||||
gsm_line_received = true;
|
||||
gsm_buf_len = gsm_buf_idx;
|
||||
gsm_buf_idx=0;
|
||||
@@ -433,31 +407,16 @@ static void Send(const char string[])
|
||||
int i = 0;
|
||||
|
||||
while(string[i])
|
||||
GSMTransmit(string[i]);
|
||||
GSMTransmit('\r');
|
||||
GSMTransmit(string[i++]);
|
||||
GSMTransmit(GSM_CR);
|
||||
}
|
||||
|
||||
static void Extraction(char source[], char char_dbt, int nb_occurence1, int decalage1, char char_fin, int nb_occurence2, int decalage2, char destination[])
|
||||
{
|
||||
int indice_debut, indice_fin, i, rch1, rch2;
|
||||
|
||||
rch1 = indexn(source, char_dbt, nb_occurence1);
|
||||
|
||||
if(rch1 == -1)
|
||||
strncpy(destination, "0", 1);
|
||||
else {
|
||||
indice_debut = rch1 + decalage1;
|
||||
for(i=0; i<strlen(source); i++)
|
||||
source[i] = source[i+indice_debut];
|
||||
|
||||
rch2 = indexn(source, char_fin, nb_occurence2);
|
||||
|
||||
if(rch2 == -1)
|
||||
strncpy(destination, "0", 1);
|
||||
else {
|
||||
indice_fin = rch2 + decalage2;
|
||||
strncpy(destination, source, indice_fin);
|
||||
destination[indice_fin] = '\0';
|
||||
}
|
||||
/* Returns a pointer to the first occurrence of the character c in the firtn
|
||||
n chars of string s. Return NULL if not found */
|
||||
static char* indexn(char* s, char c, uint8_t n) {
|
||||
while(n && (*s != c)) {
|
||||
n--;
|
||||
s++;
|
||||
}
|
||||
return (n ? s : NULL);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user