fork download
  1. const char *expected_sender_name = "+261384696720";
  2. unsigned char etat_sms = 0; // 0 = rien, 1 = pub en attente, 2 = message utile affiché
  3.  
  4. void UART1_Read_ASCII_Filtered() {
  5. unsigned char i = 0;
  6. unsigned int silence = 0;
  7. char header_buffer[150];
  8. char message_buffer[200];
  9. char sender_info[64];
  10. char *p;
  11. unsigned char j;
  12.  
  13. for (j = 0; j < 64; j++) sender_info[j] = 0;
  14. UART1_Flush();
  15.  
  16. // Lecture entête
  17. i = 0; silence = 0;
  18. while (i < 149) {
  19. if (UART1_Data_Ready()) {
  20. char c = UART1_Read();
  21. header_buffer[i++] = c;
  22. if (c == '\n') break;
  23. silence = 0;
  24. } else {
  25. silence++;
  26. if (silence > 10000) break;
  27. }
  28. }
  29. header_buffer[i] = '\0';
  30.  
  31. // Vérifier si SMS
  32. if (my_strstr(header_buffer, "+CMT:")) {
  33. // Extraire expéditeur
  34. p = my_strstr(header_buffer, "+CMT:");
  35. if (p) {
  36. while (*p && *p != '"') p++;
  37. if (*p == '"') {
  38. p++;
  39. i = 0;
  40. while (*p && *p != '"' && i < sizeof(sender_info) - 1) {
  41. sender_info[i++] = *p++;
  42. }
  43. sender_info[i] = '\0';
  44. }
  45. }
  46.  
  47. // Vérifier expéditeur
  48. if (my_strstr(sender_info, expected_sender_name) == NULL) {
  49. return; // pas le bon numéro → on ignore
  50. }
  51.  
  52. // Lire contenu SMS
  53. i = 0; silence = 0;
  54. while (i < sizeof(message_buffer) - 1) {
  55. if (UART1_Data_Ready()) {
  56. char c = UART1_Read();
  57. if (c == 26) break;
  58. message_buffer[i++] = c;
  59. silence = 0;
  60. } else {
  61. silence++;
  62. if (silence > 8000) break;
  63. }
  64. }
  65. message_buffer[i] = '\0';
  66. clean_string(message_buffer);
  67.  
  68. // -------- Cas 2/2 reçu --------
  69. if (my_strstr(message_buffer, "2/2")) {
  70. if (etat_sms == 0) {
  71. // On affiche brièvement le 2/2
  72. LCD_I2C_Command(0x01);
  73. LCD_I2C_Out(1,1,"Pub MVola...");
  74. LCD_I2C_Out(2,1,"Ignore...");
  75. __delay_ms(500);
  76. etat_sms = 1; // marquer qu'on attend un 1/2
  77. }
  78. return;
  79. }
  80.  
  81. // -------- Cas 1/2 reçu --------
  82. if (my_strstr(message_buffer, "1/2")) {
  83. if (etat_sms == 2) return; // déjà affiché, ignorer autres
  84. // Extraction infos
  85. char montant[20] = "";
  86. char nom[40] = "";
  87. char date[30] = "";
  88. char solde[20] = "";
  89.  
  90. // Montant
  91. p = my_strstr(message_buffer, "1/2 ");
  92. if (p) {
  93. p += 4;
  94. char *q = my_strstr(p, " Ar recu de");
  95. if (q) { my_strncpy(montant, p, q - p); }
  96. }
  97.  
  98. // Nom
  99. p = my_strstr(message_buffer, "recu de ");
  100. if (p) {
  101. p += 8;
  102. char *q = my_strstr(p, " le ");
  103. if (q) { my_strncpy(nom, p, q - p); }
  104. }
  105.  
  106. // Date
  107. p = my_strstr(message_buffer, " le ");
  108. if (p) {
  109. p += 4;
  110. char *q = my_strstr(p, ". Raison");
  111. if (q) { my_strncpy(date, p, q - p); }
  112. }
  113.  
  114. // Solde
  115. p = my_strstr(message_buffer, "Solde : ");
  116. if (p) {
  117. p += 8;
  118. char *q = my_strstr(p, " Ar");
  119. if (q) { my_strncpy(solde, p, q - p); }
  120. }
  121.  
  122. // Affichage sur LCD
  123. LCD_I2C_Command(0x01);
  124. LCD_I2C_Out(1, 1, "Recu:");
  125. LCD_I2C_Out(1, 7, montant);
  126.  
  127. LCD_I2C_Out(2, 1, "Nom:");
  128. LCD_I2C_Out(2, 6, nom);
  129.  
  130. LCD_I2C_Out(3, 1, "Date:");
  131. LCD_I2C_Out(3, 7, date);
  132.  
  133. LCD_I2C_Out(4, 1, "Solde:");
  134. LCD_I2C_Out(4, 8, solde);
  135.  
  136. __delay_ms(7000);
  137. etat_sms = 2; // terminé
  138. }
  139. }
  140. }
  141.  
Success #stdin #stdout 0.03s 26100KB
stdin
Standard input is empty
stdout
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é
        }
    }
}