lalallaa

Dependencies:   MMA8452 mbed

Revision:
0:4a3d5d86258c
Child:
1:6738a65b699f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Oct 03 01:13:51 2017 +0000
@@ -0,0 +1,441 @@
+/*
+BEAE3011
+PERV2807    
+
+Noeuds Capteur Version 2
+    - Accelerometre
+    - Bouton poussoir
+    
+TO DO
+    - Architecture logicielle qui permet reconfiguration facile
+    - Utiliser pointeur de fonction pour la lecture et appeler les differentes fonctions a travers un tableau de fonctions
+    - Un fichier de configuration qui doit contenir les parametres de l'appli   https://os.mbed.com/cookbook/ConfigFile
+        -> Identifiant reseau PAN
+        -> Periode de lecture des capteurs (en secondes)
+    - Simplifier la configuration de noeuds
+        -> Adresse 64 bits doivent etre decouvertes dynamiquement
+        
+    - Ajouter une led qui allume 1 seconde lorsquune erreur est detectee  
+    - Communication doit etre BIDIRECTIONNELLE
+        -> Faire allumer une led du noeud capteur par une commande du coordo. en utilisant une commande de configuration a distance (Remote AT Cmds)
+        -> Clignote a une frequence de 1Hz et seulement controlee par coordo.
+*/
+
+#include "mbed.h"
+#include "xbee_command.h"
+#include "MMA8452.h"
+
+
+Serial          pc(USBTX, USBRX);    // Initialiser le porte serie du PC
+DigitalOut      resetXBEE(p8);       // Initialiser P8 comme broche de sortie numerique
+Serial          serialXBEE(p13, p14);// Initialiser le port de comm serie des broches p13 p14
+DigitalIn       button(p7);          // Initialiser le bouton (capteur contact seche)
+MMA8452         acc(p9, p10, 10000); // Initialiser l'accelerometre
+LocalFileSystem local("local");      // Pour lecture fichier de configuration
+
+// LED LPC1768
+DigitalOut led1(LED1); 
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+// Fonctions de lecture des capteurs
+uint16_t read_button(); 
+uint16_t read_acc_x();
+uint16_t read_acc_y();
+uint16_t read_acc_z();
+void     read_capteurs(int frequence, uint16_t* capteurs_value);
+
+// Fonction de lecture du fichier de configuration
+void read_config_file(uint16_t *config_variables); 
+
+// Tableau de fonction pour lecture des capteurs
+uint16_t (*p_fonction[4])();    
+
+//Template frame
+uint8_t  at_cmd_frame[255];
+uint8_t  remote_command_request_frame[255];
+uint8_t  tx_request_frame[255];
+uint64_t parameter_value;
+uint8_t  at_cmd;
+uint8_t  message_recu[255];
+
+uint8_t get_MSB(uint16_t info);
+uint8_t get_LSB(uint16_t info);
+
+uint8_t mac_adresse[8];
+
+int main() {
+    uint16_t  button_state      = 0;
+    uint8_t   lsb_button_state = 0;
+    uint16_t  acc_x             = 0; 
+    uint8_t   msb1_acc_x        = 0; 
+    uint8_t   msb2_acc_x        = 0; 
+    uint8_t   msb3_acc_x        = 0; 
+    uint8_t   msb4_acc_x        = 0; 
+    uint8_t   lsb1_acc_x        = 0; 
+    uint8_t   lsb2_acc_x        = 0; 
+    uint8_t   lsb3_acc_x        = 0; 
+    uint8_t   lsb4_acc_x        = 0; 
+    uint16_t  acc_y            = 0; 
+    uint16_t  acc_z            = 0; 
+    uint16_t  capteurs_value[] = {button_state, acc_x, acc_y, acc_z};
+    uint8_t   frame_length = 0;
+    uint16_t* config_values[]  = {&PAN_ID, &FREQ_LECTURE_CAPTEURS}; // Tableau de pointeur pour variables de configurations
+    
+    read_config_file(*config_values);   // Lecture du fichier de configuration  
+    xbee_init(PAN_ID);                  // Init xbee avec pan ID provenant du fichier de configuration
+    
+    frame_length = build_remote_cmd_request_frame(FRAME_ID01, PAN_ID, AT_CMD_ID, remote_command_request_frame);
+    send_frame_2xbee(remote_command_request_frame, frame_length);
+    wait_ms(400);
+    
+    receive_Xbee(message_recu);
+    message_received(message_recu);
+    
+    pc.printf("MAC = ");
+    for(uint8_t i = 0; i < 8; i++){
+        pc.printf("%02X ", mac_adresse[i]);
+    }
+    pc.printf("%\r\n"); 
+    
+    while(1) {     
+        read_capteurs(FREQ_LECTURE_CAPTEURS, capteurs_value);
+        
+        if((capteurs_value[0] & 0x0001 == 0x0001)){
+            lsb_button_state = 0x31;
+        }
+        else{
+            lsb_button_state = 0x30;    
+        }
+        
+        for(uint8_t a; a < 16; a++){
+                
+        }
+        
+        msb1_acc_x = 0x31;
+        msb2_acc_x = 0x32;
+        msb3_acc_x = 0x33;
+        msb4_acc_x = 0x34;
+        lsb1_acc_x = 0x35;
+        lsb2_acc_x = 0x36;
+        lsb3_acc_x = 0x37;
+        lsb4_acc_x = 0x38;
+        
+        
+        
+        uint8_t data[] = {'B', '=', lsb_button_state,
+                          0x09,
+                          'X', '=', msb1_acc_x, msb2_acc_x, msb3_acc_x, msb4_acc_x};
+        
+        frame_length = build_tx_request_frame(mac_adresse, PAN_ID, tx_request_frame, data, sizeof(data));
+        send_frame_2xbee(tx_request_frame, frame_length);
+        //receive_Xbee(message_recu);
+        
+    } 
+}
+
+bool message_received(uint8_t* message_recu){
+    uint8_t frame_id = message_recu[3];
+    //pc.printf("\n\r frame id = %02X\r\n", frame_id);
+    switch(frame_id){
+        case RMT_CMD_RSPNS:
+            for(uint8_t i = 0; i < 8; i++){
+                mac_adresse[i] = message_recu[5 + i];  
+            } 
+    }
+    return true;
+}
+
+bool xbee_init(uint16_t pan_id){      
+    uint8_t MSB_pan_id = get_MSB(PAN_ID);
+    uint8_t LSB_pan_id = get_LSB(PAN_ID);
+    
+    uint8_t enter_at_cmd_mode[] = {'+', '+', '+'};
+    uint8_t data_pan_id[]   = {MSB_pan_id, LSB_pan_id};
+    
+    uint8_t frame_length = 0;
+    
+    // Mettre a 0 la broche RESET pour 400ms
+    resetXBEE = 0; wait_ms(400);
+    resetXBEE = 1;     
+    
+    // +++
+    send_frame_2xbee(enter_at_cmd_mode, sizeof(enter_at_cmd_mode)); 
+    wait_ms(400);
+    
+    receive_Xbee(message_recu);
+    // ID = 9600
+    frame_length = build_AT_cmd_frame(FRAME_ID01, AT_CMD_ID, data_pan_id, sizeof(data_pan_id), at_cmd_frame);
+    send_frame_2xbee(at_cmd_frame, frame_length);
+    wait_ms(30);
+
+    receive_Xbee(message_recu);
+    // WR
+    frame_length = build_AT_cmd_frame(FRAME_ID01, AT_CMD_WR, NULL, 0, at_cmd_frame);
+    send_frame_2xbee(at_cmd_frame, frame_length);
+    wait_ms(30);
+
+    receive_Xbee(message_recu);
+    
+    // AC
+    frame_length = build_AT_cmd_frame(FRAME_ID01, AT_CMD_AC, NULL, 0, at_cmd_frame);
+    send_frame_2xbee(at_cmd_frame, frame_length);
+    wait_ms(30);
+    
+    receive_Xbee(message_recu);    
+    
+    return true;
+}
+
+bool send_frame_2xbee(uint8_t* frame, uint8_t frame_length){
+    for(uint8_t i = 0; i < frame_length; i++){
+        led2 = !led2;
+        serialXBEE.putc(frame[i]); 
+        pc.printf("%02X ", frame[i]);
+        wait_ms(50);
+    }
+    pc.printf("%\r\n"); 
+    return true;
+ 
+}
+
+uint8_t receive_Xbee(uint8_t* message_recu){
+    uint8_t caratere_recu;
+    uint8_t message_length = 0;
+    
+    while(serialXBEE.readable() == 0){
+        //pc.printf(" ");
+    }
+
+    while(serialXBEE.readable() == 1){
+        //pc.printf("%d %d \r\n", serialXBEE.readable(), pc.readable());
+        led1 = !led1;  
+        caratere_recu = serialXBEE.getc();  pc.printf("%02X ", caratere_recu);// ST 
+        message_recu[message_length] = caratere_recu;
+        message_length++;
+        wait_ms(50);
+    }
+    
+    pc.printf("\r\n"); 
+    return message_length;
+}
+
+uint8_t build_AT_cmd_frame(uint8_t frame_id, uint16_t p_AT_cmd, uint8_t* p_value, uint8_t p_value_length, uint8_t* p_at_cmd_frame){  
+    uint8_t at_cmd_char1 = get_MSB(p_AT_cmd);
+    uint8_t at_cmd_char2 = get_LSB(p_AT_cmd);
+    uint8_t checksum     = 0; 
+    uint8_t frame_index  = 0;
+    
+    uint16_t length = p_value_length + 0x04;
+    uint8_t  MSB    = get_MSB(length);
+    uint8_t  LSB    = get_LSB(length);
+    //                                                                                       (optional)
+    //                {ST,    MSB,    LSB,    0x08,    frameID,   AT_cmd_1,     AT_cmd_2,     p_value,  checksum}
+    
+    p_at_cmd_frame[0] = START;
+    p_at_cmd_frame[1] = MSB;
+    p_at_cmd_frame[2] = LSB;
+    p_at_cmd_frame[3] = AT_CMD;
+    p_at_cmd_frame[4] = frame_id;
+    p_at_cmd_frame[5] = at_cmd_char1;
+    p_at_cmd_frame[6] = at_cmd_char2;
+    
+    if(p_value_length != 0){
+        for(frame_index = 7; frame_index < p_value_length + 7; frame_index++){
+            p_at_cmd_frame[frame_index] = p_value[frame_index - 7];
+        }
+    }
+    
+    // Calculate checksum
+    for(frame_index = 3; frame_index < 7 + p_value_length; frame_index++){
+        checksum += p_at_cmd_frame[frame_index]; 
+        //pc.printf(" checksum = %02X \r\n", checksum);   
+    }
+
+    checksum = 0xFF - checksum;
+    
+    p_at_cmd_frame[frame_index] = checksum; // checksum
+    
+    return frame_index + 1;
+}
+
+uint8_t build_remote_cmd_request_frame(uint8_t p_frame_id,  uint16_t p_pan_id, uint16_t p_AT_cmd, uint8_t* p_remote_cmd_request_frame){  
+    uint64_t mask_mac_id = 0x00000000000000FF;
+    
+    
+    p_pan_id = 0xFFFE;
+    uint8_t  mac_bit_shift = 56;
+    uint8_t  frame_index   = 0;
+    uint16_t checksum      = 0x0000;
+    
+    uint16_t length = 15;
+    uint8_t MSB = get_MSB(length);
+    uint8_t LSB = get_LSB(length);
+
+    uint8_t at_cmd_char1 = get_MSB(p_AT_cmd);
+    uint8_t at_cmd_char2 = get_LSB(p_AT_cmd);
+    
+    uint64_t mac_address = 0x00000000;     // broadcast
+    
+    p_remote_cmd_request_frame[0] = START;         // ST
+    p_remote_cmd_request_frame[1] = MSB;           // MSB
+    p_remote_cmd_request_frame[2] = LSB;           // LSB
+    p_remote_cmd_request_frame[3] = RMT_AT_RQST;    // frame type 0x10
+    p_remote_cmd_request_frame[4] = p_frame_id;    // frame id
+    // 64b destination address 5 a 12
+    for(frame_index = 5; frame_index < 5 + 8; frame_index++){       
+        p_remote_cmd_request_frame[frame_index]  = (mac_address >> mac_bit_shift) & mask_mac_id;
+        mac_bit_shift = mac_bit_shift - 8;
+    }
+    // 16b destination network address 13 et 14
+    p_remote_cmd_request_frame[13] = (p_pan_id >> 8) & 0x00FF;    // MSB pan_id 
+    p_remote_cmd_request_frame[14] = p_pan_id & 0x00FF;   // LSB_pan_id 
+    
+    p_remote_cmd_request_frame[15] = 0x02;  // Remote Command Option
+    
+    p_remote_cmd_request_frame[16] = at_cmd_char1;  // AT Command char1
+    p_remote_cmd_request_frame[17] = at_cmd_char2;  // At Command char2
+    
+    // Calculate checksum
+    for(frame_index = 3; frame_index < 18; frame_index++){
+        checksum += p_remote_cmd_request_frame[frame_index]; 
+        //pc.printf(" checksum = %02X \r\n", checksum);   
+    }
+    
+    checksum = 0xFF - checksum;
+    
+    p_remote_cmd_request_frame[frame_index] = checksum; // checksum
+    
+    return frame_index + 1;
+}
+
+uint8_t build_tx_request_frame(uint8_t* p_mac_address, uint16_t p_pan_id, uint8_t* p_tx_request_frame, uint8_t *data, uint8_t data_length){ //{ST, MSB, LSB, 0x08, frameID, AT_cmd_1, AT_cmd_2, parameter_value (optional), checksum}   
+    uint64_t mask_mac_id = 0x00000000000000FF;
+    
+    uint8_t  mac_bit_shift = 56;
+    uint8_t  frame_index   = 0;
+    uint16_t checksum      = 0x0000;
+    
+    uint16_t length = data_length + 14;
+    uint8_t MSB = get_MSB(length);
+    uint8_t LSB = get_LSB(length);
+    
+    p_tx_request_frame[0] = START;         // ST
+    p_tx_request_frame[1] = MSB;           // MSB
+    p_tx_request_frame[2] = LSB;           // LSB
+    p_tx_request_frame[3] = TX_REQUEST;    // frame type 0x10
+    p_tx_request_frame[4] = FRAME_ID01;    // frame id
+    // 64b destination address 5 a 12
+    for(frame_index = 5; frame_index < 5 + 8; frame_index++){       
+        p_tx_request_frame[frame_index]  = p_mac_address[frame_index - 5];
+    }    
+    /*
+    for(frame_index = 5; frame_index < 5 + 8; frame_index++){       
+        p_tx_request_frame[frame_index]  = (p_mac_address >> mac_bit_shift) & mask_mac_id;
+        mac_bit_shift = mac_bit_shift - 8;
+    }
+    */
+    // 16b destination network address 13 et 14
+    p_tx_request_frame[13] = (p_pan_id >> 8) & 0x00FF;    // MSB pan_id 
+    p_tx_request_frame[14] = p_pan_id & 0x00FF;   // LSB_pan_id 
+    
+    p_tx_request_frame[15] = 0x00;  // broadcast radius
+    p_tx_request_frame[16] = 0x00;  // option
+    
+    // RF data
+    for(frame_index = 17; frame_index < 17 + data_length; frame_index++){       
+        p_tx_request_frame[frame_index]  = data[frame_index - 17];
+    } 
+    // Calculate checksum
+    for(frame_index = 3; frame_index < 17 + data_length; frame_index++){
+        checksum += p_tx_request_frame[frame_index]; 
+        //pc.printf(" checksum = %02X \r\n", checksum);   
+    }
+    
+    checksum = 0xFF - checksum;
+    
+    p_tx_request_frame[frame_index] = checksum; // checksum
+    
+    return frame_index + 1;
+}
+
+uint8_t get_MSB(uint16_t info){
+    uint8_t MSB = (info >> 8) & 0x00FF;    
+    
+    return MSB;
+}
+
+uint8_t get_LSB(uint16_t info){
+    uint8_t LSB =  info & 0x00FF;
+    
+    return LSB;
+}
+// Lecture du contact seche (bouton)
+uint16_t read_button(){
+    if(button){
+        return 1;    
+    }
+    else{
+        return 0;
+    }
+}
+// Lecture acceleration grav. en x
+uint16_t read_acc_x(){
+    int x;
+    acc.readXCount(&x);
+    return (uint16_t)x;
+}
+// Lecture acceleration grav. en y
+uint16_t read_acc_y(){
+    int y;
+    acc.readYCount(&y);
+    return (uint16_t)y;
+}
+// Lecture acceleration grav. en z
+uint16_t read_acc_z(){
+    int z;
+    acc.readZCount(&z);
+    return (uint16_t)z;
+}
+// Lecture de tout les capteurs
+void read_capteurs(int frequence, uint16_t* capteurs_value){    
+    p_fonction[0] = &read_button;
+    p_fonction[1] = &read_acc_x; 
+    p_fonction[2] = &read_acc_y; 
+    p_fonction[3] = &read_acc_z; 
+    
+    capteurs_value[0] = (*p_fonction[0])(); // bouton
+    capteurs_value[1] = (*p_fonction[1])(); // x
+    capteurs_value[2] = (*p_fonction[2])(); // y
+    capteurs_value[3] = (*p_fonction[3])(); // z
+    
+    wait(frequence);
+}
+void read_config_file(uint16_t *config_variables){    
+    char    ch;
+    char    valeur[10];
+    uint8_t len          = 0;
+    uint8_t cpt_variable = 0;
+    
+    FILE *fp = fopen("/local/config.txt", "r");  
+    
+    while(!feof(fp)){
+        ch=fgetc(fp);
+
+        if((((ch >= '0') & (ch <= '9'))) | (ch == '\n')){
+            //pc.printf("%c", ch);
+            valeur[len] = ch;
+            len++;
+            if(ch == '\n'){
+                config_variables[cpt_variable] = atoi(valeur);
+                cpt_variable++;
+                for(int i = 0; i < 10; i++){
+                    valeur[i] = NULL;    
+                }
+                len  = 0;   
+            }
+        }
+    }
+    fclose(fp);
+}
\ No newline at end of file