Receiver code

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Receiver.cpp Source File

Receiver.cpp

00001 #include "mbed.h"
00002 #include "Sensors.h"
00003 #include "Receiver.h"
00004 #include "Xbee.h"
00005 
00006 // FileSystem (pour lire fichier de config)
00007 LocalFileSystem local("local");
00008 
00009 // Entrées-sorties
00010 DigitalOut reset(p8);
00011 Serial xbee(p13, p14);
00012 Serial pc(USBTX, USBRX);
00013 
00014 // Paramètres du fichier de config
00015 const int paramCount = 2;
00016 Parameter params[paramCount];
00017 
00018 // Tableau de fonctions pour la lecture des capteurs
00019 const int sensorsCount = 2;
00020 void (*readSensorsTable[sensorsCount]) (char*) = {&readButton, &readAccelero};
00021 
00022 // Fonction de lecture du fichier de config
00023 void readConfig()
00024 {
00025     FILE *file = fopen("/local/receiver.cfg", "r");
00026     char* token;
00027     char* delimiter = "=";
00028 
00029     params[PAN_ID] = (Parameter) {.name = "PAN_ID", .base = 16};
00030     params[PERIOD] = (Parameter) {.name = "Period", .base = 10};
00031 
00032     if (file != NULL)
00033     {
00034         char line[128];
00035         
00036         // Lire ligne par ligne
00037         while (fgets(line, sizeof(line), file) != NULL)
00038         {
00039             // token = nom du paramètre
00040             token = strtok(line, delimiter);
00041             for (int i = 0; i < paramCount; i++)
00042             {
00043                 if (strcmp(token, params[i].name) == 0)
00044                 {
00045                     // configValue = valeur du paramètre
00046                     char* configValue = strtok(NULL, delimiter);
00047                     // conversion en entier 64 bit
00048                     params[i].value = strtoll(configValue, NULL, params[i].base);
00049                 }
00050             }
00051         }
00052         
00053         fclose(file);
00054     }
00055 }
00056 
00057 // Fonction de lecture des capteurs
00058 void readSensors(char sensorInfo[])
00059 {
00060     char sensorId = sensorInfo[0];
00061     readSensorsTable[sensorId] (sensorInfo);
00062 }
00063 
00064 // Fonction pour combiner deux buffers en un
00065 int mergeBuffers(char* buffer1, int size1, char* buffer2, int size2, char* result)
00066 {
00067     memcpy(result, buffer1, size1);
00068     memcpy(result + size1, buffer2, size2);
00069     
00070     return size1 + size2;
00071 }
00072 
00073 // Fonction principale
00074 int main()
00075 {
00076     // Réinitialisation du Xbee
00077     reset = 0;
00078     wait(0.4);
00079     reset = 1;
00080     wait(1);
00081 
00082     // Vidage du buffer de lecture du Xbee
00083     while (xbee.readable())
00084     {
00085         char dump = xbee.getc();
00086     }
00087 
00088     // Lire la config et assigner le PAN ID
00089     readConfig();
00090     setPanId(&xbee, params[PAN_ID].value);
00091 
00092     // Buffers pour les données des capteurs
00093     char buttonBuffer[2];
00094     char acceleroBuffer[3];
00095     buttonBuffer[0] = 0;    // Numéro du capteur
00096     acceleroBuffer[0] = 1;  // Numéro du capteur
00097 
00098     while (true)
00099     {
00100         // Lire les capteurs
00101         readSensors(buttonBuffer);
00102         readSensors(acceleroBuffer);
00103 
00104         // Envoi des données au coordinateur
00105         char transmitBuffer[3];  // Taille du buffer est 2 + 1
00106         int size = mergeBuffers(buttonBuffer + 1, 1, acceleroBuffer + 1, 2, transmitBuffer);
00107         transmitRequest(&xbee, transmitBuffer, size);
00108         
00109         // Attente configurable
00110         wait_ms(params[PERIOD].value);
00111     }
00112 }