Vincent Belanger
/
Receiver
Receiver code
Revision 0:f8873e0badb2, committed 2016-02-18
- Comitter:
- vinbel93
- Date:
- Thu Feb 18 13:22:31 2016 +0000
- Commit message:
- Receiver
Changed in this revision
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