Receiver code

Dependencies:   mbed

Committer:
vinbel93
Date:
Thu Feb 18 13:22:31 2016 +0000
Revision:
0:f8873e0badb2
Receiver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vinbel93 0:f8873e0badb2 1 #include "mbed.h"
vinbel93 0:f8873e0badb2 2 #include "Sensors.h"
vinbel93 0:f8873e0badb2 3 #include "Receiver.h"
vinbel93 0:f8873e0badb2 4 #include "Xbee.h"
vinbel93 0:f8873e0badb2 5
vinbel93 0:f8873e0badb2 6 // FileSystem (pour lire fichier de config)
vinbel93 0:f8873e0badb2 7 LocalFileSystem local("local");
vinbel93 0:f8873e0badb2 8
vinbel93 0:f8873e0badb2 9 // Entrées-sorties
vinbel93 0:f8873e0badb2 10 DigitalOut reset(p8);
vinbel93 0:f8873e0badb2 11 Serial xbee(p13, p14);
vinbel93 0:f8873e0badb2 12 Serial pc(USBTX, USBRX);
vinbel93 0:f8873e0badb2 13
vinbel93 0:f8873e0badb2 14 // Paramètres du fichier de config
vinbel93 0:f8873e0badb2 15 const int paramCount = 2;
vinbel93 0:f8873e0badb2 16 Parameter params[paramCount];
vinbel93 0:f8873e0badb2 17
vinbel93 0:f8873e0badb2 18 // Tableau de fonctions pour la lecture des capteurs
vinbel93 0:f8873e0badb2 19 const int sensorsCount = 2;
vinbel93 0:f8873e0badb2 20 void (*readSensorsTable[sensorsCount]) (char*) = {&readButton, &readAccelero};
vinbel93 0:f8873e0badb2 21
vinbel93 0:f8873e0badb2 22 // Fonction de lecture du fichier de config
vinbel93 0:f8873e0badb2 23 void readConfig()
vinbel93 0:f8873e0badb2 24 {
vinbel93 0:f8873e0badb2 25 FILE *file = fopen("/local/receiver.cfg", "r");
vinbel93 0:f8873e0badb2 26 char* token;
vinbel93 0:f8873e0badb2 27 char* delimiter = "=";
vinbel93 0:f8873e0badb2 28
vinbel93 0:f8873e0badb2 29 params[PAN_ID] = (Parameter) {.name = "PAN_ID", .base = 16};
vinbel93 0:f8873e0badb2 30 params[PERIOD] = (Parameter) {.name = "Period", .base = 10};
vinbel93 0:f8873e0badb2 31
vinbel93 0:f8873e0badb2 32 if (file != NULL)
vinbel93 0:f8873e0badb2 33 {
vinbel93 0:f8873e0badb2 34 char line[128];
vinbel93 0:f8873e0badb2 35
vinbel93 0:f8873e0badb2 36 // Lire ligne par ligne
vinbel93 0:f8873e0badb2 37 while (fgets(line, sizeof(line), file) != NULL)
vinbel93 0:f8873e0badb2 38 {
vinbel93 0:f8873e0badb2 39 // token = nom du paramètre
vinbel93 0:f8873e0badb2 40 token = strtok(line, delimiter);
vinbel93 0:f8873e0badb2 41 for (int i = 0; i < paramCount; i++)
vinbel93 0:f8873e0badb2 42 {
vinbel93 0:f8873e0badb2 43 if (strcmp(token, params[i].name) == 0)
vinbel93 0:f8873e0badb2 44 {
vinbel93 0:f8873e0badb2 45 // configValue = valeur du paramètre
vinbel93 0:f8873e0badb2 46 char* configValue = strtok(NULL, delimiter);
vinbel93 0:f8873e0badb2 47 // conversion en entier 64 bit
vinbel93 0:f8873e0badb2 48 params[i].value = strtoll(configValue, NULL, params[i].base);
vinbel93 0:f8873e0badb2 49 }
vinbel93 0:f8873e0badb2 50 }
vinbel93 0:f8873e0badb2 51 }
vinbel93 0:f8873e0badb2 52
vinbel93 0:f8873e0badb2 53 fclose(file);
vinbel93 0:f8873e0badb2 54 }
vinbel93 0:f8873e0badb2 55 }
vinbel93 0:f8873e0badb2 56
vinbel93 0:f8873e0badb2 57 // Fonction de lecture des capteurs
vinbel93 0:f8873e0badb2 58 void readSensors(char sensorInfo[])
vinbel93 0:f8873e0badb2 59 {
vinbel93 0:f8873e0badb2 60 char sensorId = sensorInfo[0];
vinbel93 0:f8873e0badb2 61 readSensorsTable[sensorId] (sensorInfo);
vinbel93 0:f8873e0badb2 62 }
vinbel93 0:f8873e0badb2 63
vinbel93 0:f8873e0badb2 64 // Fonction pour combiner deux buffers en un
vinbel93 0:f8873e0badb2 65 int mergeBuffers(char* buffer1, int size1, char* buffer2, int size2, char* result)
vinbel93 0:f8873e0badb2 66 {
vinbel93 0:f8873e0badb2 67 memcpy(result, buffer1, size1);
vinbel93 0:f8873e0badb2 68 memcpy(result + size1, buffer2, size2);
vinbel93 0:f8873e0badb2 69
vinbel93 0:f8873e0badb2 70 return size1 + size2;
vinbel93 0:f8873e0badb2 71 }
vinbel93 0:f8873e0badb2 72
vinbel93 0:f8873e0badb2 73 // Fonction principale
vinbel93 0:f8873e0badb2 74 int main()
vinbel93 0:f8873e0badb2 75 {
vinbel93 0:f8873e0badb2 76 // Réinitialisation du Xbee
vinbel93 0:f8873e0badb2 77 reset = 0;
vinbel93 0:f8873e0badb2 78 wait(0.4);
vinbel93 0:f8873e0badb2 79 reset = 1;
vinbel93 0:f8873e0badb2 80 wait(1);
vinbel93 0:f8873e0badb2 81
vinbel93 0:f8873e0badb2 82 // Vidage du buffer de lecture du Xbee
vinbel93 0:f8873e0badb2 83 while (xbee.readable())
vinbel93 0:f8873e0badb2 84 {
vinbel93 0:f8873e0badb2 85 char dump = xbee.getc();
vinbel93 0:f8873e0badb2 86 }
vinbel93 0:f8873e0badb2 87
vinbel93 0:f8873e0badb2 88 // Lire la config et assigner le PAN ID
vinbel93 0:f8873e0badb2 89 readConfig();
vinbel93 0:f8873e0badb2 90 setPanId(&xbee, params[PAN_ID].value);
vinbel93 0:f8873e0badb2 91
vinbel93 0:f8873e0badb2 92 // Buffers pour les données des capteurs
vinbel93 0:f8873e0badb2 93 char buttonBuffer[2];
vinbel93 0:f8873e0badb2 94 char acceleroBuffer[3];
vinbel93 0:f8873e0badb2 95 buttonBuffer[0] = 0; // Numéro du capteur
vinbel93 0:f8873e0badb2 96 acceleroBuffer[0] = 1; // Numéro du capteur
vinbel93 0:f8873e0badb2 97
vinbel93 0:f8873e0badb2 98 while (true)
vinbel93 0:f8873e0badb2 99 {
vinbel93 0:f8873e0badb2 100 // Lire les capteurs
vinbel93 0:f8873e0badb2 101 readSensors(buttonBuffer);
vinbel93 0:f8873e0badb2 102 readSensors(acceleroBuffer);
vinbel93 0:f8873e0badb2 103
vinbel93 0:f8873e0badb2 104 // Envoi des données au coordinateur
vinbel93 0:f8873e0badb2 105 char transmitBuffer[3]; // Taille du buffer est 2 + 1
vinbel93 0:f8873e0badb2 106 int size = mergeBuffers(buttonBuffer + 1, 1, acceleroBuffer + 1, 2, transmitBuffer);
vinbel93 0:f8873e0badb2 107 transmitRequest(&xbee, transmitBuffer, size);
vinbel93 0:f8873e0badb2 108
vinbel93 0:f8873e0badb2 109 // Attente configurable
vinbel93 0:f8873e0badb2 110 wait_ms(params[PERIOD].value);
vinbel93 0:f8873e0badb2 111 }
vinbel93 0:f8873e0badb2 112 }