const char *expected_sender_name = "+261384696720";
unsigned char etat_sms = 0; // 0 = rien, 1 = pub en attente, 2 = message utile affiché
void UART1_Read_ASCII_Filtered() {
unsigned char i = 0;
unsigned int silence = 0;
char header_buffer[150];
char message_buffer[200];
char sender_info[64];
char *p;
unsigned char j;
for (j = 0; j < 64; j++) sender_info[j] = 0;
UART1_Flush();
// Lecture entête
i = 0; silence = 0;
while (i < 149) {
if (UART1_Data_Ready()) {
char c = UART1_Read();
header_buffer[i++] = c;
if (c == '\n') break;
silence = 0;
} else {
silence++;
if (silence > 10000) break;
}
}
header_buffer[i] = '\0';
// Vérifier si SMS
if (my_strstr(header_buffer, "+CMT:")) {
// Extraire expéditeur
p = my_strstr(header_buffer, "+CMT:");
if (p) {
while (*p && *p != '"') p++;
if (*p == '"') {
p++;
i = 0;
while (*p
&& *p
!= '"' && i
< sizeof(sender_info
) - 1) { sender_info[i++] = *p++;
}
sender_info[i] = '\0';
}
}
// Vérifier expéditeur
if (my_strstr(sender_info, expected_sender_name) == NULL) {
return; // pas le bon numéro → on ignore
}
// Lire contenu SMS
i = 0; silence = 0;
while (i
< sizeof(message_buffer
) - 1) { if (UART1_Data_Ready()) {
char c = UART1_Read();
if (c == 26) break;
message_buffer[i++] = c;
silence = 0;
} else {
silence++;
if (silence > 8000) break;
}
}
message_buffer[i] = '\0';
clean_string(message_buffer);
// -------- Cas 2/2 reçu --------
if (my_strstr(message_buffer, "2/2")) {
if (etat_sms == 0) {
// On affiche brièvement le 2/2
LCD_I2C_Command(0x01);
LCD_I2C_Out(1,1,"Pub MVola...");
LCD_I2C_Out(2,1,"Ignore...");
__delay_ms(500);
etat_sms = 1; // marquer qu'on attend un 1/2
}
return;
}
// -------- Cas 1/2 reçu --------
if (my_strstr(message_buffer, "1/2")) {
if (etat_sms == 2) return; // déjà affiché, ignorer autres
// Extraction infos
char montant[20] = "";
char nom[40] = "";
char solde[20] = "";
// Montant
p = my_strstr(message_buffer, "1/2 ");
if (p) {
p += 4;
char *q = my_strstr(p, " Ar recu de");
if (q) { my_strncpy(montant, p, q - p); }
}
// Nom
p = my_strstr(message_buffer, "recu de ");
if (p) {
p += 8;
char *q = my_strstr(p, " le ");
if (q) { my_strncpy(nom, p, q - p); }
}
// Date
p = my_strstr(message_buffer, " le ");
if (p) {
p += 4;
char *q = my_strstr(p, ". Raison");
if (q
) { my_strncpy
(date, p
, q
- p
); } }
// Solde
p = my_strstr(message_buffer, "Solde : ");
if (p) {
p += 8;
char *q = my_strstr(p, " Ar");
if (q) { my_strncpy(solde, p, q - p); }
}
// Affichage sur LCD
LCD_I2C_Command(0x01);
LCD_I2C_Out(1, 1, "Recu:");
LCD_I2C_Out(1, 7, montant);
LCD_I2C_Out(2, 1, "Nom:");
LCD_I2C_Out(2, 6, nom);
LCD_I2C_Out(3, 1, "Date:");
LCD_I2C_Out(4, 1, "Solde:");
LCD_I2C_Out(4, 8, solde);
__delay_ms(7000);
etat_sms = 2; // terminé
}
}
}
Y29uc3QgY2hhciAqZXhwZWN0ZWRfc2VuZGVyX25hbWUgPSAiKzI2MTM4NDY5NjcyMCI7CnVuc2lnbmVkIGNoYXIgZXRhdF9zbXMgPSAwOyAgIC8vIDAgPSByaWVuLCAxID0gcHViIGVuIGF0dGVudGUsIDIgPSBtZXNzYWdlIHV0aWxlIGFmZmljaMOpCgp2b2lkIFVBUlQxX1JlYWRfQVNDSUlfRmlsdGVyZWQoKSB7CiAgICB1bnNpZ25lZCBjaGFyIGkgPSAwOwogICAgdW5zaWduZWQgaW50IHNpbGVuY2UgPSAwOwogICAgY2hhciBoZWFkZXJfYnVmZmVyWzE1MF07CiAgICBjaGFyIG1lc3NhZ2VfYnVmZmVyWzIwMF07CiAgICBjaGFyIHNlbmRlcl9pbmZvWzY0XTsKICAgIGNoYXIgKnA7CiAgICB1bnNpZ25lZCBjaGFyIGo7CiAgICAKICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSBzZW5kZXJfaW5mb1tqXSA9IDA7CiAgICBVQVJUMV9GbHVzaCgpOwoKICAgIC8vIExlY3R1cmUgZW50w6p0ZQogICAgaSA9IDA7IHNpbGVuY2UgPSAwOwogICAgd2hpbGUgKGkgPCAxNDkpIHsKICAgICAgICBpZiAoVUFSVDFfRGF0YV9SZWFkeSgpKSB7CiAgICAgICAgICAgIGNoYXIgYyA9IFVBUlQxX1JlYWQoKTsKICAgICAgICAgICAgaGVhZGVyX2J1ZmZlcltpKytdID0gYzsKICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgYnJlYWs7CiAgICAgICAgICAgIHNpbGVuY2UgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpbGVuY2UrKzsKICAgICAgICAgICAgaWYgKHNpbGVuY2UgPiAxMDAwMCkgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaGVhZGVyX2J1ZmZlcltpXSA9ICdcMCc7CgogICAgLy8gVsOpcmlmaWVyIHNpIFNNUwogICAgaWYgKG15X3N0cnN0cihoZWFkZXJfYnVmZmVyLCAiK0NNVDoiKSkgewogICAgICAgIC8vIEV4dHJhaXJlIGV4cMOpZGl0ZXVyCiAgICAgICAgcCA9IG15X3N0cnN0cihoZWFkZXJfYnVmZmVyLCAiK0NNVDoiKTsKICAgICAgICBpZiAocCkgewogICAgICAgICAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJyInKSBwKys7CiAgICAgICAgICAgIGlmICgqcCA9PSAnIicpIHsKICAgICAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgICAgIGkgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCpwICYmICpwICE9ICciJyAmJiBpIDwgc2l6ZW9mKHNlbmRlcl9pbmZvKSAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBzZW5kZXJfaW5mb1tpKytdID0gKnArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbmRlcl9pbmZvW2ldID0gJ1wwJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVsOpcmlmaWVyIGV4cMOpZGl0ZXVyCiAgICAgICAgaWYgKG15X3N0cnN0cihzZW5kZXJfaW5mbywgZXhwZWN0ZWRfc2VuZGVyX25hbWUpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuOyAvLyBwYXMgbGUgYm9uIG51bcOpcm8g4oaSIG9uIGlnbm9yZQogICAgICAgIH0KCiAgICAgICAgLy8gTGlyZSBjb250ZW51IFNNUwogICAgICAgIGkgPSAwOyBzaWxlbmNlID0gMDsKICAgICAgICB3aGlsZSAoaSA8IHNpemVvZihtZXNzYWdlX2J1ZmZlcikgLSAxKSB7CiAgICAgICAgICAgIGlmIChVQVJUMV9EYXRhX1JlYWR5KCkpIHsKICAgICAgICAgICAgICAgIGNoYXIgYyA9IFVBUlQxX1JlYWQoKTsKICAgICAgICAgICAgICAgIGlmIChjID09IDI2KSBicmVhazsKICAgICAgICAgICAgICAgIG1lc3NhZ2VfYnVmZmVyW2krK10gPSBjOwogICAgICAgICAgICAgICAgc2lsZW5jZSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzaWxlbmNlKys7CiAgICAgICAgICAgICAgICBpZiAoc2lsZW5jZSA+IDgwMDApIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG1lc3NhZ2VfYnVmZmVyW2ldID0gJ1wwJzsKICAgICAgICBjbGVhbl9zdHJpbmcobWVzc2FnZV9idWZmZXIpOwoKICAgICAgICAvLyAtLS0tLS0tLSBDYXMgMi8yIHJlw6d1IC0tLS0tLS0tCiAgICAgICAgaWYgKG15X3N0cnN0cihtZXNzYWdlX2J1ZmZlciwgIjIvMiIpKSB7CiAgICAgICAgICAgIGlmIChldGF0X3NtcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBPbiBhZmZpY2hlIGJyacOodmVtZW50IGxlIDIvMgogICAgICAgICAgICAgICAgTENEX0kyQ19Db21tYW5kKDB4MDEpOwogICAgICAgICAgICAgICAgTENEX0kyQ19PdXQoMSwxLCJQdWIgTVZvbGEuLi4iKTsKICAgICAgICAgICAgICAgIExDRF9JMkNfT3V0KDIsMSwiSWdub3JlLi4uIik7CiAgICAgICAgICAgICAgICBfX2RlbGF5X21zKDUwMCk7CiAgICAgICAgICAgICAgICBldGF0X3NtcyA9IDE7IC8vIG1hcnF1ZXIgcXUnb24gYXR0ZW5kIHVuIDEvMgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tLS0tIENhcyAxLzIgcmXDp3UgLS0tLS0tLS0KICAgICAgICBpZiAobXlfc3Ryc3RyKG1lc3NhZ2VfYnVmZmVyLCAiMS8yIikpIHsKICAgICAgICAgICAgaWYgKGV0YXRfc21zID09IDIpIHJldHVybjsgLy8gZMOpasOgIGFmZmljaMOpLCBpZ25vcmVyIGF1dHJlcwogICAgICAgICAgICAvLyBFeHRyYWN0aW9uIGluZm9zCiAgICAgICAgICAgIGNoYXIgbW9udGFudFsyMF0gPSAiIjsKICAgICAgICAgICAgY2hhciBub21bNDBdID0gIiI7CiAgICAgICAgICAgIGNoYXIgZGF0ZVszMF0gPSAiIjsKICAgICAgICAgICAgY2hhciBzb2xkZVsyMF0gPSAiIjsKCiAgICAgICAgICAgIC8vIE1vbnRhbnQKICAgICAgICAgICAgcCA9IG15X3N0cnN0cihtZXNzYWdlX2J1ZmZlciwgIjEvMiAiKTsKICAgICAgICAgICAgaWYgKHApIHsKICAgICAgICAgICAgICAgIHAgKz0gNDsKICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBteV9zdHJzdHIocCwgIiBBciByZWN1IGRlIik7CiAgICAgICAgICAgICAgICBpZiAocSkgeyBteV9zdHJuY3B5KG1vbnRhbnQsIHAsIHEgLSBwKTsgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOb20KICAgICAgICAgICAgcCA9IG15X3N0cnN0cihtZXNzYWdlX2J1ZmZlciwgInJlY3UgZGUgIik7CiAgICAgICAgICAgIGlmIChwKSB7CiAgICAgICAgICAgICAgICBwICs9IDg7CiAgICAgICAgICAgICAgICBjaGFyICpxID0gbXlfc3Ryc3RyKHAsICIgbGUgIik7CiAgICAgICAgICAgICAgICBpZiAocSkgeyBteV9zdHJuY3B5KG5vbSwgcCwgcSAtIHApOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERhdGUKICAgICAgICAgICAgcCA9IG15X3N0cnN0cihtZXNzYWdlX2J1ZmZlciwgIiBsZSAiKTsKICAgICAgICAgICAgaWYgKHApIHsKICAgICAgICAgICAgICAgIHAgKz0gNDsKICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBteV9zdHJzdHIocCwgIi4gUmFpc29uIik7CiAgICAgICAgICAgICAgICBpZiAocSkgeyBteV9zdHJuY3B5KGRhdGUsIHAsIHEgLSBwKTsgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTb2xkZQogICAgICAgICAgICBwID0gbXlfc3Ryc3RyKG1lc3NhZ2VfYnVmZmVyLCAiU29sZGUgOiAiKTsKICAgICAgICAgICAgaWYgKHApIHsKICAgICAgICAgICAgICAgIHAgKz0gODsKICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBteV9zdHJzdHIocCwgIiBBciIpOwogICAgICAgICAgICAgICAgaWYgKHEpIHsgbXlfc3RybmNweShzb2xkZSwgcCwgcSAtIHApOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFmZmljaGFnZSBzdXIgTENECiAgICAgICAgICAgIExDRF9JMkNfQ29tbWFuZCgweDAxKTsKICAgICAgICAgICAgTENEX0kyQ19PdXQoMSwgMSwgIlJlY3U6Iik7CiAgICAgICAgICAgIExDRF9JMkNfT3V0KDEsIDcsIG1vbnRhbnQpOwoKICAgICAgICAgICAgTENEX0kyQ19PdXQoMiwgMSwgIk5vbToiKTsKICAgICAgICAgICAgTENEX0kyQ19PdXQoMiwgNiwgbm9tKTsKCiAgICAgICAgICAgIExDRF9JMkNfT3V0KDMsIDEsICJEYXRlOiIpOwogICAgICAgICAgICBMQ0RfSTJDX091dCgzLCA3LCBkYXRlKTsKCiAgICAgICAgICAgIExDRF9JMkNfT3V0KDQsIDEsICJTb2xkZToiKTsKICAgICAgICAgICAgTENEX0kyQ19PdXQoNCwgOCwgc29sZGUpOwoKICAgICAgICAgICAgX19kZWxheV9tcyg3MDAwKTsKICAgICAgICAgICAgZXRhdF9zbXMgPSAyOyAvLyB0ZXJtaW7DqQogICAgICAgIH0KICAgIH0KfQo=
const char *expected_sender_name = "+261384696720";
unsigned char etat_sms = 0; // 0 = rien, 1 = pub en attente, 2 = message utile affiché
void UART1_Read_ASCII_Filtered() {
unsigned char i = 0;
unsigned int silence = 0;
char header_buffer[150];
char message_buffer[200];
char sender_info[64];
char *p;
unsigned char j;
for (j = 0; j < 64; j++) sender_info[j] = 0;
UART1_Flush();
// Lecture entête
i = 0; silence = 0;
while (i < 149) {
if (UART1_Data_Ready()) {
char c = UART1_Read();
header_buffer[i++] = c;
if (c == '\n') break;
silence = 0;
} else {
silence++;
if (silence > 10000) break;
}
}
header_buffer[i] = '\0';
// Vérifier si SMS
if (my_strstr(header_buffer, "+CMT:")) {
// Extraire expéditeur
p = my_strstr(header_buffer, "+CMT:");
if (p) {
while (*p && *p != '"') p++;
if (*p == '"') {
p++;
i = 0;
while (*p && *p != '"' && i < sizeof(sender_info) - 1) {
sender_info[i++] = *p++;
}
sender_info[i] = '\0';
}
}
// Vérifier expéditeur
if (my_strstr(sender_info, expected_sender_name) == NULL) {
return; // pas le bon numéro → on ignore
}
// Lire contenu SMS
i = 0; silence = 0;
while (i < sizeof(message_buffer) - 1) {
if (UART1_Data_Ready()) {
char c = UART1_Read();
if (c == 26) break;
message_buffer[i++] = c;
silence = 0;
} else {
silence++;
if (silence > 8000) break;
}
}
message_buffer[i] = '\0';
clean_string(message_buffer);
// -------- Cas 2/2 reçu --------
if (my_strstr(message_buffer, "2/2")) {
if (etat_sms == 0) {
// On affiche brièvement le 2/2
LCD_I2C_Command(0x01);
LCD_I2C_Out(1,1,"Pub MVola...");
LCD_I2C_Out(2,1,"Ignore...");
__delay_ms(500);
etat_sms = 1; // marquer qu'on attend un 1/2
}
return;
}
// -------- Cas 1/2 reçu --------
if (my_strstr(message_buffer, "1/2")) {
if (etat_sms == 2) return; // déjà affiché, ignorer autres
// Extraction infos
char montant[20] = "";
char nom[40] = "";
char date[30] = "";
char solde[20] = "";
// Montant
p = my_strstr(message_buffer, "1/2 ");
if (p) {
p += 4;
char *q = my_strstr(p, " Ar recu de");
if (q) { my_strncpy(montant, p, q - p); }
}
// Nom
p = my_strstr(message_buffer, "recu de ");
if (p) {
p += 8;
char *q = my_strstr(p, " le ");
if (q) { my_strncpy(nom, p, q - p); }
}
// Date
p = my_strstr(message_buffer, " le ");
if (p) {
p += 4;
char *q = my_strstr(p, ". Raison");
if (q) { my_strncpy(date, p, q - p); }
}
// Solde
p = my_strstr(message_buffer, "Solde : ");
if (p) {
p += 8;
char *q = my_strstr(p, " Ar");
if (q) { my_strncpy(solde, p, q - p); }
}
// Affichage sur LCD
LCD_I2C_Command(0x01);
LCD_I2C_Out(1, 1, "Recu:");
LCD_I2C_Out(1, 7, montant);
LCD_I2C_Out(2, 1, "Nom:");
LCD_I2C_Out(2, 6, nom);
LCD_I2C_Out(3, 1, "Date:");
LCD_I2C_Out(3, 7, date);
LCD_I2C_Out(4, 1, "Solde:");
LCD_I2C_Out(4, 8, solde);
__delay_ms(7000);
etat_sms = 2; // terminé
}
}
}