lalallaa

Dependencies:   MMA8452 mbed

Committer:
EtienneB
Date:
Tue Oct 03 01:13:51 2017 +0000
Revision:
0:4a3d5d86258c
Child:
1:6738a65b699f
Version de validation du code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EtienneB 0:4a3d5d86258c 1 /*
EtienneB 0:4a3d5d86258c 2 BEAE3011
EtienneB 0:4a3d5d86258c 3 PERV2807
EtienneB 0:4a3d5d86258c 4
EtienneB 0:4a3d5d86258c 5 Noeuds Capteur Version 2
EtienneB 0:4a3d5d86258c 6 - Accelerometre
EtienneB 0:4a3d5d86258c 7 - Bouton poussoir
EtienneB 0:4a3d5d86258c 8
EtienneB 0:4a3d5d86258c 9 TO DO
EtienneB 0:4a3d5d86258c 10 - Architecture logicielle qui permet reconfiguration facile
EtienneB 0:4a3d5d86258c 11 - Utiliser pointeur de fonction pour la lecture et appeler les differentes fonctions a travers un tableau de fonctions
EtienneB 0:4a3d5d86258c 12 - Un fichier de configuration qui doit contenir les parametres de l'appli https://os.mbed.com/cookbook/ConfigFile
EtienneB 0:4a3d5d86258c 13 -> Identifiant reseau PAN
EtienneB 0:4a3d5d86258c 14 -> Periode de lecture des capteurs (en secondes)
EtienneB 0:4a3d5d86258c 15 - Simplifier la configuration de noeuds
EtienneB 0:4a3d5d86258c 16 -> Adresse 64 bits doivent etre decouvertes dynamiquement
EtienneB 0:4a3d5d86258c 17
EtienneB 0:4a3d5d86258c 18 - Ajouter une led qui allume 1 seconde lorsquune erreur est detectee
EtienneB 0:4a3d5d86258c 19 - Communication doit etre BIDIRECTIONNELLE
EtienneB 0:4a3d5d86258c 20 -> Faire allumer une led du noeud capteur par une commande du coordo. en utilisant une commande de configuration a distance (Remote AT Cmds)
EtienneB 0:4a3d5d86258c 21 -> Clignote a une frequence de 1Hz et seulement controlee par coordo.
EtienneB 0:4a3d5d86258c 22 */
EtienneB 0:4a3d5d86258c 23
EtienneB 0:4a3d5d86258c 24 #include "mbed.h"
EtienneB 0:4a3d5d86258c 25 #include "xbee_command.h"
EtienneB 0:4a3d5d86258c 26 #include "MMA8452.h"
EtienneB 0:4a3d5d86258c 27
EtienneB 0:4a3d5d86258c 28
EtienneB 0:4a3d5d86258c 29 Serial pc(USBTX, USBRX); // Initialiser le porte serie du PC
EtienneB 0:4a3d5d86258c 30 DigitalOut resetXBEE(p8); // Initialiser P8 comme broche de sortie numerique
EtienneB 0:4a3d5d86258c 31 Serial serialXBEE(p13, p14);// Initialiser le port de comm serie des broches p13 p14
EtienneB 0:4a3d5d86258c 32 DigitalIn button(p7); // Initialiser le bouton (capteur contact seche)
EtienneB 0:4a3d5d86258c 33 MMA8452 acc(p9, p10, 10000); // Initialiser l'accelerometre
EtienneB 0:4a3d5d86258c 34 LocalFileSystem local("local"); // Pour lecture fichier de configuration
EtienneB 0:4a3d5d86258c 35
EtienneB 0:4a3d5d86258c 36 // LED LPC1768
EtienneB 0:4a3d5d86258c 37 DigitalOut led1(LED1);
EtienneB 0:4a3d5d86258c 38 DigitalOut led2(LED2);
EtienneB 0:4a3d5d86258c 39 DigitalOut led3(LED3);
EtienneB 0:4a3d5d86258c 40 DigitalOut led4(LED4);
EtienneB 0:4a3d5d86258c 41
EtienneB 0:4a3d5d86258c 42 // Fonctions de lecture des capteurs
EtienneB 0:4a3d5d86258c 43 uint16_t read_button();
EtienneB 0:4a3d5d86258c 44 uint16_t read_acc_x();
EtienneB 0:4a3d5d86258c 45 uint16_t read_acc_y();
EtienneB 0:4a3d5d86258c 46 uint16_t read_acc_z();
EtienneB 0:4a3d5d86258c 47 void read_capteurs(int frequence, uint16_t* capteurs_value);
EtienneB 0:4a3d5d86258c 48
EtienneB 0:4a3d5d86258c 49 // Fonction de lecture du fichier de configuration
EtienneB 0:4a3d5d86258c 50 void read_config_file(uint16_t *config_variables);
EtienneB 0:4a3d5d86258c 51
EtienneB 0:4a3d5d86258c 52 // Tableau de fonction pour lecture des capteurs
EtienneB 0:4a3d5d86258c 53 uint16_t (*p_fonction[4])();
EtienneB 0:4a3d5d86258c 54
EtienneB 0:4a3d5d86258c 55 //Template frame
EtienneB 0:4a3d5d86258c 56 uint8_t at_cmd_frame[255];
EtienneB 0:4a3d5d86258c 57 uint8_t remote_command_request_frame[255];
EtienneB 0:4a3d5d86258c 58 uint8_t tx_request_frame[255];
EtienneB 0:4a3d5d86258c 59 uint64_t parameter_value;
EtienneB 0:4a3d5d86258c 60 uint8_t at_cmd;
EtienneB 0:4a3d5d86258c 61 uint8_t message_recu[255];
EtienneB 0:4a3d5d86258c 62
EtienneB 0:4a3d5d86258c 63 uint8_t get_MSB(uint16_t info);
EtienneB 0:4a3d5d86258c 64 uint8_t get_LSB(uint16_t info);
EtienneB 0:4a3d5d86258c 65
EtienneB 0:4a3d5d86258c 66 uint8_t mac_adresse[8];
EtienneB 0:4a3d5d86258c 67
EtienneB 0:4a3d5d86258c 68 int main() {
EtienneB 0:4a3d5d86258c 69 uint16_t button_state = 0;
EtienneB 0:4a3d5d86258c 70 uint8_t lsb_button_state = 0;
EtienneB 0:4a3d5d86258c 71 uint16_t acc_x = 0;
EtienneB 0:4a3d5d86258c 72 uint8_t msb1_acc_x = 0;
EtienneB 0:4a3d5d86258c 73 uint8_t msb2_acc_x = 0;
EtienneB 0:4a3d5d86258c 74 uint8_t msb3_acc_x = 0;
EtienneB 0:4a3d5d86258c 75 uint8_t msb4_acc_x = 0;
EtienneB 0:4a3d5d86258c 76 uint8_t lsb1_acc_x = 0;
EtienneB 0:4a3d5d86258c 77 uint8_t lsb2_acc_x = 0;
EtienneB 0:4a3d5d86258c 78 uint8_t lsb3_acc_x = 0;
EtienneB 0:4a3d5d86258c 79 uint8_t lsb4_acc_x = 0;
EtienneB 0:4a3d5d86258c 80 uint16_t acc_y = 0;
EtienneB 0:4a3d5d86258c 81 uint16_t acc_z = 0;
EtienneB 0:4a3d5d86258c 82 uint16_t capteurs_value[] = {button_state, acc_x, acc_y, acc_z};
EtienneB 0:4a3d5d86258c 83 uint8_t frame_length = 0;
EtienneB 0:4a3d5d86258c 84 uint16_t* config_values[] = {&PAN_ID, &FREQ_LECTURE_CAPTEURS}; // Tableau de pointeur pour variables de configurations
EtienneB 0:4a3d5d86258c 85
EtienneB 0:4a3d5d86258c 86 read_config_file(*config_values); // Lecture du fichier de configuration
EtienneB 0:4a3d5d86258c 87 xbee_init(PAN_ID); // Init xbee avec pan ID provenant du fichier de configuration
EtienneB 0:4a3d5d86258c 88
EtienneB 0:4a3d5d86258c 89 frame_length = build_remote_cmd_request_frame(FRAME_ID01, PAN_ID, AT_CMD_ID, remote_command_request_frame);
EtienneB 0:4a3d5d86258c 90 send_frame_2xbee(remote_command_request_frame, frame_length);
EtienneB 0:4a3d5d86258c 91 wait_ms(400);
EtienneB 0:4a3d5d86258c 92
EtienneB 0:4a3d5d86258c 93 receive_Xbee(message_recu);
EtienneB 0:4a3d5d86258c 94 message_received(message_recu);
EtienneB 0:4a3d5d86258c 95
EtienneB 0:4a3d5d86258c 96 pc.printf("MAC = ");
EtienneB 0:4a3d5d86258c 97 for(uint8_t i = 0; i < 8; i++){
EtienneB 0:4a3d5d86258c 98 pc.printf("%02X ", mac_adresse[i]);
EtienneB 0:4a3d5d86258c 99 }
EtienneB 0:4a3d5d86258c 100 pc.printf("%\r\n");
EtienneB 0:4a3d5d86258c 101
EtienneB 0:4a3d5d86258c 102 while(1) {
EtienneB 0:4a3d5d86258c 103 read_capteurs(FREQ_LECTURE_CAPTEURS, capteurs_value);
EtienneB 0:4a3d5d86258c 104
EtienneB 0:4a3d5d86258c 105 if((capteurs_value[0] & 0x0001 == 0x0001)){
EtienneB 0:4a3d5d86258c 106 lsb_button_state = 0x31;
EtienneB 0:4a3d5d86258c 107 }
EtienneB 0:4a3d5d86258c 108 else{
EtienneB 0:4a3d5d86258c 109 lsb_button_state = 0x30;
EtienneB 0:4a3d5d86258c 110 }
EtienneB 0:4a3d5d86258c 111
EtienneB 0:4a3d5d86258c 112 for(uint8_t a; a < 16; a++){
EtienneB 0:4a3d5d86258c 113
EtienneB 0:4a3d5d86258c 114 }
EtienneB 0:4a3d5d86258c 115
EtienneB 0:4a3d5d86258c 116 msb1_acc_x = 0x31;
EtienneB 0:4a3d5d86258c 117 msb2_acc_x = 0x32;
EtienneB 0:4a3d5d86258c 118 msb3_acc_x = 0x33;
EtienneB 0:4a3d5d86258c 119 msb4_acc_x = 0x34;
EtienneB 0:4a3d5d86258c 120 lsb1_acc_x = 0x35;
EtienneB 0:4a3d5d86258c 121 lsb2_acc_x = 0x36;
EtienneB 0:4a3d5d86258c 122 lsb3_acc_x = 0x37;
EtienneB 0:4a3d5d86258c 123 lsb4_acc_x = 0x38;
EtienneB 0:4a3d5d86258c 124
EtienneB 0:4a3d5d86258c 125
EtienneB 0:4a3d5d86258c 126
EtienneB 0:4a3d5d86258c 127 uint8_t data[] = {'B', '=', lsb_button_state,
EtienneB 0:4a3d5d86258c 128 0x09,
EtienneB 0:4a3d5d86258c 129 'X', '=', msb1_acc_x, msb2_acc_x, msb3_acc_x, msb4_acc_x};
EtienneB 0:4a3d5d86258c 130
EtienneB 0:4a3d5d86258c 131 frame_length = build_tx_request_frame(mac_adresse, PAN_ID, tx_request_frame, data, sizeof(data));
EtienneB 0:4a3d5d86258c 132 send_frame_2xbee(tx_request_frame, frame_length);
EtienneB 0:4a3d5d86258c 133 //receive_Xbee(message_recu);
EtienneB 0:4a3d5d86258c 134
EtienneB 0:4a3d5d86258c 135 }
EtienneB 0:4a3d5d86258c 136 }
EtienneB 0:4a3d5d86258c 137
EtienneB 0:4a3d5d86258c 138 bool message_received(uint8_t* message_recu){
EtienneB 0:4a3d5d86258c 139 uint8_t frame_id = message_recu[3];
EtienneB 0:4a3d5d86258c 140 //pc.printf("\n\r frame id = %02X\r\n", frame_id);
EtienneB 0:4a3d5d86258c 141 switch(frame_id){
EtienneB 0:4a3d5d86258c 142 case RMT_CMD_RSPNS:
EtienneB 0:4a3d5d86258c 143 for(uint8_t i = 0; i < 8; i++){
EtienneB 0:4a3d5d86258c 144 mac_adresse[i] = message_recu[5 + i];
EtienneB 0:4a3d5d86258c 145 }
EtienneB 0:4a3d5d86258c 146 }
EtienneB 0:4a3d5d86258c 147 return true;
EtienneB 0:4a3d5d86258c 148 }
EtienneB 0:4a3d5d86258c 149
EtienneB 0:4a3d5d86258c 150 bool xbee_init(uint16_t pan_id){
EtienneB 0:4a3d5d86258c 151 uint8_t MSB_pan_id = get_MSB(PAN_ID);
EtienneB 0:4a3d5d86258c 152 uint8_t LSB_pan_id = get_LSB(PAN_ID);
EtienneB 0:4a3d5d86258c 153
EtienneB 0:4a3d5d86258c 154 uint8_t enter_at_cmd_mode[] = {'+', '+', '+'};
EtienneB 0:4a3d5d86258c 155 uint8_t data_pan_id[] = {MSB_pan_id, LSB_pan_id};
EtienneB 0:4a3d5d86258c 156
EtienneB 0:4a3d5d86258c 157 uint8_t frame_length = 0;
EtienneB 0:4a3d5d86258c 158
EtienneB 0:4a3d5d86258c 159 // Mettre a 0 la broche RESET pour 400ms
EtienneB 0:4a3d5d86258c 160 resetXBEE = 0; wait_ms(400);
EtienneB 0:4a3d5d86258c 161 resetXBEE = 1;
EtienneB 0:4a3d5d86258c 162
EtienneB 0:4a3d5d86258c 163 // +++
EtienneB 0:4a3d5d86258c 164 send_frame_2xbee(enter_at_cmd_mode, sizeof(enter_at_cmd_mode));
EtienneB 0:4a3d5d86258c 165 wait_ms(400);
EtienneB 0:4a3d5d86258c 166
EtienneB 0:4a3d5d86258c 167 receive_Xbee(message_recu);
EtienneB 0:4a3d5d86258c 168 // ID = 9600
EtienneB 0:4a3d5d86258c 169 frame_length = build_AT_cmd_frame(FRAME_ID01, AT_CMD_ID, data_pan_id, sizeof(data_pan_id), at_cmd_frame);
EtienneB 0:4a3d5d86258c 170 send_frame_2xbee(at_cmd_frame, frame_length);
EtienneB 0:4a3d5d86258c 171 wait_ms(30);
EtienneB 0:4a3d5d86258c 172
EtienneB 0:4a3d5d86258c 173 receive_Xbee(message_recu);
EtienneB 0:4a3d5d86258c 174 // WR
EtienneB 0:4a3d5d86258c 175 frame_length = build_AT_cmd_frame(FRAME_ID01, AT_CMD_WR, NULL, 0, at_cmd_frame);
EtienneB 0:4a3d5d86258c 176 send_frame_2xbee(at_cmd_frame, frame_length);
EtienneB 0:4a3d5d86258c 177 wait_ms(30);
EtienneB 0:4a3d5d86258c 178
EtienneB 0:4a3d5d86258c 179 receive_Xbee(message_recu);
EtienneB 0:4a3d5d86258c 180
EtienneB 0:4a3d5d86258c 181 // AC
EtienneB 0:4a3d5d86258c 182 frame_length = build_AT_cmd_frame(FRAME_ID01, AT_CMD_AC, NULL, 0, at_cmd_frame);
EtienneB 0:4a3d5d86258c 183 send_frame_2xbee(at_cmd_frame, frame_length);
EtienneB 0:4a3d5d86258c 184 wait_ms(30);
EtienneB 0:4a3d5d86258c 185
EtienneB 0:4a3d5d86258c 186 receive_Xbee(message_recu);
EtienneB 0:4a3d5d86258c 187
EtienneB 0:4a3d5d86258c 188 return true;
EtienneB 0:4a3d5d86258c 189 }
EtienneB 0:4a3d5d86258c 190
EtienneB 0:4a3d5d86258c 191 bool send_frame_2xbee(uint8_t* frame, uint8_t frame_length){
EtienneB 0:4a3d5d86258c 192 for(uint8_t i = 0; i < frame_length; i++){
EtienneB 0:4a3d5d86258c 193 led2 = !led2;
EtienneB 0:4a3d5d86258c 194 serialXBEE.putc(frame[i]);
EtienneB 0:4a3d5d86258c 195 pc.printf("%02X ", frame[i]);
EtienneB 0:4a3d5d86258c 196 wait_ms(50);
EtienneB 0:4a3d5d86258c 197 }
EtienneB 0:4a3d5d86258c 198 pc.printf("%\r\n");
EtienneB 0:4a3d5d86258c 199 return true;
EtienneB 0:4a3d5d86258c 200
EtienneB 0:4a3d5d86258c 201 }
EtienneB 0:4a3d5d86258c 202
EtienneB 0:4a3d5d86258c 203 uint8_t receive_Xbee(uint8_t* message_recu){
EtienneB 0:4a3d5d86258c 204 uint8_t caratere_recu;
EtienneB 0:4a3d5d86258c 205 uint8_t message_length = 0;
EtienneB 0:4a3d5d86258c 206
EtienneB 0:4a3d5d86258c 207 while(serialXBEE.readable() == 0){
EtienneB 0:4a3d5d86258c 208 //pc.printf(" ");
EtienneB 0:4a3d5d86258c 209 }
EtienneB 0:4a3d5d86258c 210
EtienneB 0:4a3d5d86258c 211 while(serialXBEE.readable() == 1){
EtienneB 0:4a3d5d86258c 212 //pc.printf("%d %d \r\n", serialXBEE.readable(), pc.readable());
EtienneB 0:4a3d5d86258c 213 led1 = !led1;
EtienneB 0:4a3d5d86258c 214 caratere_recu = serialXBEE.getc(); pc.printf("%02X ", caratere_recu);// ST
EtienneB 0:4a3d5d86258c 215 message_recu[message_length] = caratere_recu;
EtienneB 0:4a3d5d86258c 216 message_length++;
EtienneB 0:4a3d5d86258c 217 wait_ms(50);
EtienneB 0:4a3d5d86258c 218 }
EtienneB 0:4a3d5d86258c 219
EtienneB 0:4a3d5d86258c 220 pc.printf("\r\n");
EtienneB 0:4a3d5d86258c 221 return message_length;
EtienneB 0:4a3d5d86258c 222 }
EtienneB 0:4a3d5d86258c 223
EtienneB 0:4a3d5d86258c 224 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){
EtienneB 0:4a3d5d86258c 225 uint8_t at_cmd_char1 = get_MSB(p_AT_cmd);
EtienneB 0:4a3d5d86258c 226 uint8_t at_cmd_char2 = get_LSB(p_AT_cmd);
EtienneB 0:4a3d5d86258c 227 uint8_t checksum = 0;
EtienneB 0:4a3d5d86258c 228 uint8_t frame_index = 0;
EtienneB 0:4a3d5d86258c 229
EtienneB 0:4a3d5d86258c 230 uint16_t length = p_value_length + 0x04;
EtienneB 0:4a3d5d86258c 231 uint8_t MSB = get_MSB(length);
EtienneB 0:4a3d5d86258c 232 uint8_t LSB = get_LSB(length);
EtienneB 0:4a3d5d86258c 233 // (optional)
EtienneB 0:4a3d5d86258c 234 // {ST, MSB, LSB, 0x08, frameID, AT_cmd_1, AT_cmd_2, p_value, checksum}
EtienneB 0:4a3d5d86258c 235
EtienneB 0:4a3d5d86258c 236 p_at_cmd_frame[0] = START;
EtienneB 0:4a3d5d86258c 237 p_at_cmd_frame[1] = MSB;
EtienneB 0:4a3d5d86258c 238 p_at_cmd_frame[2] = LSB;
EtienneB 0:4a3d5d86258c 239 p_at_cmd_frame[3] = AT_CMD;
EtienneB 0:4a3d5d86258c 240 p_at_cmd_frame[4] = frame_id;
EtienneB 0:4a3d5d86258c 241 p_at_cmd_frame[5] = at_cmd_char1;
EtienneB 0:4a3d5d86258c 242 p_at_cmd_frame[6] = at_cmd_char2;
EtienneB 0:4a3d5d86258c 243
EtienneB 0:4a3d5d86258c 244 if(p_value_length != 0){
EtienneB 0:4a3d5d86258c 245 for(frame_index = 7; frame_index < p_value_length + 7; frame_index++){
EtienneB 0:4a3d5d86258c 246 p_at_cmd_frame[frame_index] = p_value[frame_index - 7];
EtienneB 0:4a3d5d86258c 247 }
EtienneB 0:4a3d5d86258c 248 }
EtienneB 0:4a3d5d86258c 249
EtienneB 0:4a3d5d86258c 250 // Calculate checksum
EtienneB 0:4a3d5d86258c 251 for(frame_index = 3; frame_index < 7 + p_value_length; frame_index++){
EtienneB 0:4a3d5d86258c 252 checksum += p_at_cmd_frame[frame_index];
EtienneB 0:4a3d5d86258c 253 //pc.printf(" checksum = %02X \r\n", checksum);
EtienneB 0:4a3d5d86258c 254 }
EtienneB 0:4a3d5d86258c 255
EtienneB 0:4a3d5d86258c 256 checksum = 0xFF - checksum;
EtienneB 0:4a3d5d86258c 257
EtienneB 0:4a3d5d86258c 258 p_at_cmd_frame[frame_index] = checksum; // checksum
EtienneB 0:4a3d5d86258c 259
EtienneB 0:4a3d5d86258c 260 return frame_index + 1;
EtienneB 0:4a3d5d86258c 261 }
EtienneB 0:4a3d5d86258c 262
EtienneB 0:4a3d5d86258c 263 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){
EtienneB 0:4a3d5d86258c 264 uint64_t mask_mac_id = 0x00000000000000FF;
EtienneB 0:4a3d5d86258c 265
EtienneB 0:4a3d5d86258c 266
EtienneB 0:4a3d5d86258c 267 p_pan_id = 0xFFFE;
EtienneB 0:4a3d5d86258c 268 uint8_t mac_bit_shift = 56;
EtienneB 0:4a3d5d86258c 269 uint8_t frame_index = 0;
EtienneB 0:4a3d5d86258c 270 uint16_t checksum = 0x0000;
EtienneB 0:4a3d5d86258c 271
EtienneB 0:4a3d5d86258c 272 uint16_t length = 15;
EtienneB 0:4a3d5d86258c 273 uint8_t MSB = get_MSB(length);
EtienneB 0:4a3d5d86258c 274 uint8_t LSB = get_LSB(length);
EtienneB 0:4a3d5d86258c 275
EtienneB 0:4a3d5d86258c 276 uint8_t at_cmd_char1 = get_MSB(p_AT_cmd);
EtienneB 0:4a3d5d86258c 277 uint8_t at_cmd_char2 = get_LSB(p_AT_cmd);
EtienneB 0:4a3d5d86258c 278
EtienneB 0:4a3d5d86258c 279 uint64_t mac_address = 0x00000000; // broadcast
EtienneB 0:4a3d5d86258c 280
EtienneB 0:4a3d5d86258c 281 p_remote_cmd_request_frame[0] = START; // ST
EtienneB 0:4a3d5d86258c 282 p_remote_cmd_request_frame[1] = MSB; // MSB
EtienneB 0:4a3d5d86258c 283 p_remote_cmd_request_frame[2] = LSB; // LSB
EtienneB 0:4a3d5d86258c 284 p_remote_cmd_request_frame[3] = RMT_AT_RQST; // frame type 0x10
EtienneB 0:4a3d5d86258c 285 p_remote_cmd_request_frame[4] = p_frame_id; // frame id
EtienneB 0:4a3d5d86258c 286 // 64b destination address 5 a 12
EtienneB 0:4a3d5d86258c 287 for(frame_index = 5; frame_index < 5 + 8; frame_index++){
EtienneB 0:4a3d5d86258c 288 p_remote_cmd_request_frame[frame_index] = (mac_address >> mac_bit_shift) & mask_mac_id;
EtienneB 0:4a3d5d86258c 289 mac_bit_shift = mac_bit_shift - 8;
EtienneB 0:4a3d5d86258c 290 }
EtienneB 0:4a3d5d86258c 291 // 16b destination network address 13 et 14
EtienneB 0:4a3d5d86258c 292 p_remote_cmd_request_frame[13] = (p_pan_id >> 8) & 0x00FF; // MSB pan_id
EtienneB 0:4a3d5d86258c 293 p_remote_cmd_request_frame[14] = p_pan_id & 0x00FF; // LSB_pan_id
EtienneB 0:4a3d5d86258c 294
EtienneB 0:4a3d5d86258c 295 p_remote_cmd_request_frame[15] = 0x02; // Remote Command Option
EtienneB 0:4a3d5d86258c 296
EtienneB 0:4a3d5d86258c 297 p_remote_cmd_request_frame[16] = at_cmd_char1; // AT Command char1
EtienneB 0:4a3d5d86258c 298 p_remote_cmd_request_frame[17] = at_cmd_char2; // At Command char2
EtienneB 0:4a3d5d86258c 299
EtienneB 0:4a3d5d86258c 300 // Calculate checksum
EtienneB 0:4a3d5d86258c 301 for(frame_index = 3; frame_index < 18; frame_index++){
EtienneB 0:4a3d5d86258c 302 checksum += p_remote_cmd_request_frame[frame_index];
EtienneB 0:4a3d5d86258c 303 //pc.printf(" checksum = %02X \r\n", checksum);
EtienneB 0:4a3d5d86258c 304 }
EtienneB 0:4a3d5d86258c 305
EtienneB 0:4a3d5d86258c 306 checksum = 0xFF - checksum;
EtienneB 0:4a3d5d86258c 307
EtienneB 0:4a3d5d86258c 308 p_remote_cmd_request_frame[frame_index] = checksum; // checksum
EtienneB 0:4a3d5d86258c 309
EtienneB 0:4a3d5d86258c 310 return frame_index + 1;
EtienneB 0:4a3d5d86258c 311 }
EtienneB 0:4a3d5d86258c 312
EtienneB 0:4a3d5d86258c 313 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}
EtienneB 0:4a3d5d86258c 314 uint64_t mask_mac_id = 0x00000000000000FF;
EtienneB 0:4a3d5d86258c 315
EtienneB 0:4a3d5d86258c 316 uint8_t mac_bit_shift = 56;
EtienneB 0:4a3d5d86258c 317 uint8_t frame_index = 0;
EtienneB 0:4a3d5d86258c 318 uint16_t checksum = 0x0000;
EtienneB 0:4a3d5d86258c 319
EtienneB 0:4a3d5d86258c 320 uint16_t length = data_length + 14;
EtienneB 0:4a3d5d86258c 321 uint8_t MSB = get_MSB(length);
EtienneB 0:4a3d5d86258c 322 uint8_t LSB = get_LSB(length);
EtienneB 0:4a3d5d86258c 323
EtienneB 0:4a3d5d86258c 324 p_tx_request_frame[0] = START; // ST
EtienneB 0:4a3d5d86258c 325 p_tx_request_frame[1] = MSB; // MSB
EtienneB 0:4a3d5d86258c 326 p_tx_request_frame[2] = LSB; // LSB
EtienneB 0:4a3d5d86258c 327 p_tx_request_frame[3] = TX_REQUEST; // frame type 0x10
EtienneB 0:4a3d5d86258c 328 p_tx_request_frame[4] = FRAME_ID01; // frame id
EtienneB 0:4a3d5d86258c 329 // 64b destination address 5 a 12
EtienneB 0:4a3d5d86258c 330 for(frame_index = 5; frame_index < 5 + 8; frame_index++){
EtienneB 0:4a3d5d86258c 331 p_tx_request_frame[frame_index] = p_mac_address[frame_index - 5];
EtienneB 0:4a3d5d86258c 332 }
EtienneB 0:4a3d5d86258c 333 /*
EtienneB 0:4a3d5d86258c 334 for(frame_index = 5; frame_index < 5 + 8; frame_index++){
EtienneB 0:4a3d5d86258c 335 p_tx_request_frame[frame_index] = (p_mac_address >> mac_bit_shift) & mask_mac_id;
EtienneB 0:4a3d5d86258c 336 mac_bit_shift = mac_bit_shift - 8;
EtienneB 0:4a3d5d86258c 337 }
EtienneB 0:4a3d5d86258c 338 */
EtienneB 0:4a3d5d86258c 339 // 16b destination network address 13 et 14
EtienneB 0:4a3d5d86258c 340 p_tx_request_frame[13] = (p_pan_id >> 8) & 0x00FF; // MSB pan_id
EtienneB 0:4a3d5d86258c 341 p_tx_request_frame[14] = p_pan_id & 0x00FF; // LSB_pan_id
EtienneB 0:4a3d5d86258c 342
EtienneB 0:4a3d5d86258c 343 p_tx_request_frame[15] = 0x00; // broadcast radius
EtienneB 0:4a3d5d86258c 344 p_tx_request_frame[16] = 0x00; // option
EtienneB 0:4a3d5d86258c 345
EtienneB 0:4a3d5d86258c 346 // RF data
EtienneB 0:4a3d5d86258c 347 for(frame_index = 17; frame_index < 17 + data_length; frame_index++){
EtienneB 0:4a3d5d86258c 348 p_tx_request_frame[frame_index] = data[frame_index - 17];
EtienneB 0:4a3d5d86258c 349 }
EtienneB 0:4a3d5d86258c 350 // Calculate checksum
EtienneB 0:4a3d5d86258c 351 for(frame_index = 3; frame_index < 17 + data_length; frame_index++){
EtienneB 0:4a3d5d86258c 352 checksum += p_tx_request_frame[frame_index];
EtienneB 0:4a3d5d86258c 353 //pc.printf(" checksum = %02X \r\n", checksum);
EtienneB 0:4a3d5d86258c 354 }
EtienneB 0:4a3d5d86258c 355
EtienneB 0:4a3d5d86258c 356 checksum = 0xFF - checksum;
EtienneB 0:4a3d5d86258c 357
EtienneB 0:4a3d5d86258c 358 p_tx_request_frame[frame_index] = checksum; // checksum
EtienneB 0:4a3d5d86258c 359
EtienneB 0:4a3d5d86258c 360 return frame_index + 1;
EtienneB 0:4a3d5d86258c 361 }
EtienneB 0:4a3d5d86258c 362
EtienneB 0:4a3d5d86258c 363 uint8_t get_MSB(uint16_t info){
EtienneB 0:4a3d5d86258c 364 uint8_t MSB = (info >> 8) & 0x00FF;
EtienneB 0:4a3d5d86258c 365
EtienneB 0:4a3d5d86258c 366 return MSB;
EtienneB 0:4a3d5d86258c 367 }
EtienneB 0:4a3d5d86258c 368
EtienneB 0:4a3d5d86258c 369 uint8_t get_LSB(uint16_t info){
EtienneB 0:4a3d5d86258c 370 uint8_t LSB = info & 0x00FF;
EtienneB 0:4a3d5d86258c 371
EtienneB 0:4a3d5d86258c 372 return LSB;
EtienneB 0:4a3d5d86258c 373 }
EtienneB 0:4a3d5d86258c 374 // Lecture du contact seche (bouton)
EtienneB 0:4a3d5d86258c 375 uint16_t read_button(){
EtienneB 0:4a3d5d86258c 376 if(button){
EtienneB 0:4a3d5d86258c 377 return 1;
EtienneB 0:4a3d5d86258c 378 }
EtienneB 0:4a3d5d86258c 379 else{
EtienneB 0:4a3d5d86258c 380 return 0;
EtienneB 0:4a3d5d86258c 381 }
EtienneB 0:4a3d5d86258c 382 }
EtienneB 0:4a3d5d86258c 383 // Lecture acceleration grav. en x
EtienneB 0:4a3d5d86258c 384 uint16_t read_acc_x(){
EtienneB 0:4a3d5d86258c 385 int x;
EtienneB 0:4a3d5d86258c 386 acc.readXCount(&x);
EtienneB 0:4a3d5d86258c 387 return (uint16_t)x;
EtienneB 0:4a3d5d86258c 388 }
EtienneB 0:4a3d5d86258c 389 // Lecture acceleration grav. en y
EtienneB 0:4a3d5d86258c 390 uint16_t read_acc_y(){
EtienneB 0:4a3d5d86258c 391 int y;
EtienneB 0:4a3d5d86258c 392 acc.readYCount(&y);
EtienneB 0:4a3d5d86258c 393 return (uint16_t)y;
EtienneB 0:4a3d5d86258c 394 }
EtienneB 0:4a3d5d86258c 395 // Lecture acceleration grav. en z
EtienneB 0:4a3d5d86258c 396 uint16_t read_acc_z(){
EtienneB 0:4a3d5d86258c 397 int z;
EtienneB 0:4a3d5d86258c 398 acc.readZCount(&z);
EtienneB 0:4a3d5d86258c 399 return (uint16_t)z;
EtienneB 0:4a3d5d86258c 400 }
EtienneB 0:4a3d5d86258c 401 // Lecture de tout les capteurs
EtienneB 0:4a3d5d86258c 402 void read_capteurs(int frequence, uint16_t* capteurs_value){
EtienneB 0:4a3d5d86258c 403 p_fonction[0] = &read_button;
EtienneB 0:4a3d5d86258c 404 p_fonction[1] = &read_acc_x;
EtienneB 0:4a3d5d86258c 405 p_fonction[2] = &read_acc_y;
EtienneB 0:4a3d5d86258c 406 p_fonction[3] = &read_acc_z;
EtienneB 0:4a3d5d86258c 407
EtienneB 0:4a3d5d86258c 408 capteurs_value[0] = (*p_fonction[0])(); // bouton
EtienneB 0:4a3d5d86258c 409 capteurs_value[1] = (*p_fonction[1])(); // x
EtienneB 0:4a3d5d86258c 410 capteurs_value[2] = (*p_fonction[2])(); // y
EtienneB 0:4a3d5d86258c 411 capteurs_value[3] = (*p_fonction[3])(); // z
EtienneB 0:4a3d5d86258c 412
EtienneB 0:4a3d5d86258c 413 wait(frequence);
EtienneB 0:4a3d5d86258c 414 }
EtienneB 0:4a3d5d86258c 415 void read_config_file(uint16_t *config_variables){
EtienneB 0:4a3d5d86258c 416 char ch;
EtienneB 0:4a3d5d86258c 417 char valeur[10];
EtienneB 0:4a3d5d86258c 418 uint8_t len = 0;
EtienneB 0:4a3d5d86258c 419 uint8_t cpt_variable = 0;
EtienneB 0:4a3d5d86258c 420
EtienneB 0:4a3d5d86258c 421 FILE *fp = fopen("/local/config.txt", "r");
EtienneB 0:4a3d5d86258c 422
EtienneB 0:4a3d5d86258c 423 while(!feof(fp)){
EtienneB 0:4a3d5d86258c 424 ch=fgetc(fp);
EtienneB 0:4a3d5d86258c 425
EtienneB 0:4a3d5d86258c 426 if((((ch >= '0') & (ch <= '9'))) | (ch == '\n')){
EtienneB 0:4a3d5d86258c 427 //pc.printf("%c", ch);
EtienneB 0:4a3d5d86258c 428 valeur[len] = ch;
EtienneB 0:4a3d5d86258c 429 len++;
EtienneB 0:4a3d5d86258c 430 if(ch == '\n'){
EtienneB 0:4a3d5d86258c 431 config_variables[cpt_variable] = atoi(valeur);
EtienneB 0:4a3d5d86258c 432 cpt_variable++;
EtienneB 0:4a3d5d86258c 433 for(int i = 0; i < 10; i++){
EtienneB 0:4a3d5d86258c 434 valeur[i] = NULL;
EtienneB 0:4a3d5d86258c 435 }
EtienneB 0:4a3d5d86258c 436 len = 0;
EtienneB 0:4a3d5d86258c 437 }
EtienneB 0:4a3d5d86258c 438 }
EtienneB 0:4a3d5d86258c 439 }
EtienneB 0:4a3d5d86258c 440 fclose(fp);
EtienneB 0:4a3d5d86258c 441 }