Receiver code

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
vinbel93
Date:
Thu Feb 18 13:22:31 2016 +0000
Commit message:
Receiver

Changed in this revision

Receiver.cpp Show annotated file Show diff for this revision Revisions of this file
Receiver.h Show annotated file Show diff for this revision Revisions of this file
Sensors.cpp Show annotated file Show diff for this revision Revisions of this file
Sensors.h Show annotated file Show diff for this revision Revisions of this file
Xbee.cpp Show annotated file Show diff for this revision Revisions of this file
Xbee.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r f8873e0badb2 Receiver.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Receiver.cpp	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,112 @@
+#include "mbed.h"
+#include "Sensors.h"
+#include "Receiver.h"
+#include "Xbee.h"
+
+// FileSystem (pour lire fichier de config)
+LocalFileSystem local("local");
+
+// Entrées-sorties
+DigitalOut reset(p8);
+Serial xbee(p13, p14);
+Serial pc(USBTX, USBRX);
+
+// Paramètres du fichier de config
+const int paramCount = 2;
+Parameter params[paramCount];
+
+// Tableau de fonctions pour la lecture des capteurs
+const int sensorsCount = 2;
+void (*readSensorsTable[sensorsCount]) (char*) = {&readButton, &readAccelero};
+
+// Fonction de lecture du fichier de config
+void readConfig()
+{
+    FILE *file = fopen("/local/receiver.cfg", "r");
+    char* token;
+    char* delimiter = "=";
+
+    params[PAN_ID] = (Parameter) {.name = "PAN_ID", .base = 16};
+    params[PERIOD] = (Parameter) {.name = "Period", .base = 10};
+
+    if (file != NULL)
+    {
+        char line[128];
+        
+        // Lire ligne par ligne
+        while (fgets(line, sizeof(line), file) != NULL)
+        {
+            // token = nom du paramètre
+            token = strtok(line, delimiter);
+            for (int i = 0; i < paramCount; i++)
+            {
+                if (strcmp(token, params[i].name) == 0)
+                {
+                    // configValue = valeur du paramètre
+                    char* configValue = strtok(NULL, delimiter);
+                    // conversion en entier 64 bit
+                    params[i].value = strtoll(configValue, NULL, params[i].base);
+                }
+            }
+        }
+        
+        fclose(file);
+    }
+}
+
+// Fonction de lecture des capteurs
+void readSensors(char sensorInfo[])
+{
+    char sensorId = sensorInfo[0];
+    readSensorsTable[sensorId] (sensorInfo);
+}
+
+// Fonction pour combiner deux buffers en un
+int mergeBuffers(char* buffer1, int size1, char* buffer2, int size2, char* result)
+{
+    memcpy(result, buffer1, size1);
+    memcpy(result + size1, buffer2, size2);
+    
+    return size1 + size2;
+}
+
+// Fonction principale
+int main()
+{
+    // Réinitialisation du Xbee
+    reset = 0;
+    wait(0.4);
+    reset = 1;
+    wait(1);
+
+    // Vidage du buffer de lecture du Xbee
+    while (xbee.readable())
+    {
+        char dump = xbee.getc();
+    }
+
+    // Lire la config et assigner le PAN ID
+    readConfig();
+    setPanId(&xbee, params[PAN_ID].value);
+
+    // Buffers pour les données des capteurs
+    char buttonBuffer[2];
+    char acceleroBuffer[3];
+    buttonBuffer[0] = 0;    // Numéro du capteur
+    acceleroBuffer[0] = 1;  // Numéro du capteur
+
+    while (true)
+    {
+        // Lire les capteurs
+        readSensors(buttonBuffer);
+        readSensors(acceleroBuffer);
+
+        // Envoi des données au coordinateur
+        char transmitBuffer[3];  // Taille du buffer est 2 + 1
+        int size = mergeBuffers(buttonBuffer + 1, 1, acceleroBuffer + 1, 2, transmitBuffer);
+        transmitRequest(&xbee, transmitBuffer, size);
+        
+        // Attente configurable
+        wait_ms(params[PERIOD].value);
+    }
+}
diff -r 000000000000 -r f8873e0badb2 Receiver.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Receiver.h	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,16 @@
+#pragma once
+
+#define PAN_ID 0
+#define PERIOD 1
+
+// Structure des paramètres de config
+typedef struct
+{
+    char*              name;
+    unsigned long long value;
+    int                base;
+} Parameter;
+
+void readConfig();
+void readSensors(char sensorInfo[]);
+int mergeBuffers(char* buffer1, int size1, char* buffer2, int size2, char* result);
diff -r 000000000000 -r f8873e0badb2 Sensors.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sensors.cpp	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,43 @@
+#include "mbed.h"
+#include "Sensors.h"
+
+// Capteurs
+DigitalIn  button(p9);
+I2C accelero(p28, p27);
+
+// Fontion de lecture du bouton
+void readButton(char* buffer)
+{
+    buffer[1] = button;
+}
+
+// Fonction de lecture de l'accéléromètre
+void readAccelero(char* buffer)
+{
+    // Activation de l'accéléromètre
+    char data[2] = {CTRL_REG, 0x01};
+    accelero.write(ACC_ADDRESS, (char*) data, 2);
+    
+    // Lecture du registre de l'accélération en X
+    char result[2];
+    char reg[1] = {ACC_X_REG};
+    accelero.write(ACC_ADDRESS, (char*) reg, 1, true);
+    accelero.read(ACC_ADDRESS, (char*) result, 2);
+    short accX = convertToAcceleration(result[0], result[1]);
+
+    // Conversion des données sur 16 bits
+    buffer[1] = accX & 0x00FF;
+    buffer[2] = (accX & 0xFF00) >> 8;
+}
+
+// Fonction qui convertit la donnée retournée par l'accéléromètre en une valeur 16 bits
+short convertToAcceleration(char hi, char lo)
+{
+    short value = (lo >> 2) | (hi << 6);
+    if (value > UINT14_MAX/2)
+    {
+        value -= UINT14_MAX;
+    }
+ 
+    return value;
+}
diff -r 000000000000 -r f8873e0badb2 Sensors.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sensors.h	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,10 @@
+#pragma once
+
+#define ACC_ADDRESS              0x1D << 1
+#define ACC_X_REG                0x01
+#define CTRL_REG                 0x2A
+#define UINT14_MAX               0x4000
+
+void readButton(char* buffer);
+void readAccelero(char* buffer);
+short convertToAcceleration(char hi, char lo);
diff -r 000000000000 -r f8873e0badb2 Xbee.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Xbee.cpp	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,90 @@
+#include "mbed.h"
+#include "Xbee.h"
+
+// Fonction d'assignation du PAN ID
+void setPanId(Serial* xbee, long long panId)
+{
+    // Construction de la trame
+    const int frameLength = 16;
+    char frame[frameLength];
+    frame[0] = 0x7E; // Start delimiter
+    frame[1] = 0x00; // Length (MSB)
+    frame[2] = 0x0C; // Length (LSB)
+    frame[3] = 0x08; // AT Command
+    frame[4] = 0x00; // Frame ID
+    frame[5] = 'I';
+    frame[6] = 'D';
+    frame[7] = (panId >> 56) & 0xFF;
+    frame[8] = (panId >> 48) & 0xFF;
+    frame[9] = (panId >> 40) & 0xFF;
+    frame[10] = (panId >> 32) & 0xFF;
+    frame[11] = (panId >> 24) & 0xFF;
+    frame[12] = (panId >> 16) & 0xFF;
+    frame[13] = (panId >> 8) & 0xFF;
+    frame[14] = (panId >> 0) & 0xFF;
+    frame[15] = checksum(frame, 3, 15);
+
+    // Envoi sur le UART
+    if (xbee->writeable())
+    {
+        for (int i = 0; i < frameLength; i++)
+        {
+            xbee->putc(frame[i]);
+        }
+    }
+}
+
+// Envoi d'un message au coordinateur (Transmit Request)
+void transmitRequest(Serial* xbee, char* data, int size)
+{
+    // Construction de la trame
+    const int frameLength = 18 + size;
+    char frame[frameLength];
+    frame[0] = 0x7E; // Start delimiter
+    frame[1] = 0x00; // Length (MSB)
+    frame[2] = 0x0E + size; // Length (LSB)
+    frame[3] = 0x10; // AT Command
+    frame[4] = 0x01; // Frame ID
+    frame[5] = (MAC_ADDRESS_COORDINATOR >> 56) & 0xFF;
+    frame[6] = (MAC_ADDRESS_COORDINATOR >> 48) & 0xFF;
+    frame[7] = (MAC_ADDRESS_COORDINATOR >> 40) & 0xFF;
+    frame[8] = (MAC_ADDRESS_COORDINATOR >> 32) & 0xFF;
+    frame[9] = (MAC_ADDRESS_COORDINATOR >> 24) & 0xFF;
+    frame[10] = (MAC_ADDRESS_COORDINATOR >> 16) & 0xFF;
+    frame[11] = (MAC_ADDRESS_COORDINATOR >> 8) & 0xFF;
+    frame[12] = (MAC_ADDRESS_COORDINATOR >> 0) & 0xFF;
+    frame[13] = 0xFF; // Broadcast
+    frame[14] = 0xFE; // Broadcast
+    frame[15] = 0x00; // Broadcast radius
+    frame[16] = 0x00; // Options
+
+    // Ajout des données utiles
+    for (int i = 0; i < size; i++)
+    {
+        frame[17 + i] = data[i];
+    }
+    frame[17 + size] = checksum(frame, 3, 17 + size);
+    
+    // Envoi sur le UART
+    if (xbee->writeable())
+    {
+        for (int i = 0; i < frameLength; i++)
+        {
+            xbee->putc(frame[i]);
+        }
+    }
+}
+
+// Fonction de calcul de checksum
+char checksum(char* frame, int begin, int end)
+{
+    char sum = 0;
+
+    // Addition des bits
+    for (int i = begin; i < end; i++)
+    {
+        sum += frame[i];
+    }
+    
+    return 0xFF - sum;
+}
diff -r 000000000000 -r f8873e0badb2 Xbee.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Xbee.h	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,8 @@
+#include "mbed.h"
+#pragma once
+
+#define MAC_ADDRESS_COORDINATOR 0x0013A20040A7453E      // Adresse MAC du Xbee coordinateur
+
+void setPanId(Serial* xbee, long long panId);
+void transmitRequest(Serial* xbee, char* data, int size);
+char checksum(char* frame, int begin, int end);
diff -r 000000000000 -r f8873e0badb2 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Feb 18 13:22:31 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96
\ No newline at end of file