![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
lalallaa
main.cpp@0:4a3d5d86258c, 2017-10-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |