Coordinator code

Dependencies:   EthernetInterface WebSocketClient mbed-rtos mbed

Committer:
vinbel93
Date:
Thu Feb 18 13:21:58 2016 +0000
Revision:
0:4cb87eb1f914
Coordinator

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vinbel93 0:4cb87eb1f914 1 #include "Xbee.h"
vinbel93 0:4cb87eb1f914 2
vinbel93 0:4cb87eb1f914 3 static bool frameStarted = false;
vinbel93 0:4cb87eb1f914 4 static char readBuffer[128];
vinbel93 0:4cb87eb1f914 5 static int buffer = 0;
vinbel93 0:4cb87eb1f914 6
vinbel93 0:4cb87eb1f914 7 // Fonction d'assignation du PAN ID
vinbel93 0:4cb87eb1f914 8 void setPanId(Serial* xbee, unsigned long long panId)
vinbel93 0:4cb87eb1f914 9 {
vinbel93 0:4cb87eb1f914 10 // Construction de la trame
vinbel93 0:4cb87eb1f914 11 const int frameLength = 16;
vinbel93 0:4cb87eb1f914 12 char frame[frameLength];
vinbel93 0:4cb87eb1f914 13 frame[0] = 0x7E; // Start delimiter
vinbel93 0:4cb87eb1f914 14 frame[1] = 0x00; // Length (MSB)
vinbel93 0:4cb87eb1f914 15 frame[2] = 0x0C; // Length (LSB)
vinbel93 0:4cb87eb1f914 16 frame[3] = 0x08; // AT Command
vinbel93 0:4cb87eb1f914 17 frame[4] = 0x00; // Frame ID
vinbel93 0:4cb87eb1f914 18 frame[5] = 'I';
vinbel93 0:4cb87eb1f914 19 frame[6] = 'D';
vinbel93 0:4cb87eb1f914 20 frame[7] = (panId >> 56) & 0xFF;
vinbel93 0:4cb87eb1f914 21 frame[8] = (panId >> 48) & 0xFF;
vinbel93 0:4cb87eb1f914 22 frame[9] = (panId >> 40) & 0xFF;
vinbel93 0:4cb87eb1f914 23 frame[10] = (panId >> 32) & 0xFF;
vinbel93 0:4cb87eb1f914 24 frame[11] = (panId >> 24) & 0xFF;
vinbel93 0:4cb87eb1f914 25 frame[12] = (panId >> 16) & 0xFF;
vinbel93 0:4cb87eb1f914 26 frame[13] = (panId >> 8) & 0xFF;
vinbel93 0:4cb87eb1f914 27 frame[14] = (panId >> 0) & 0xFF;
vinbel93 0:4cb87eb1f914 28 frame[15] = checksum(frame, 3, 15);
vinbel93 0:4cb87eb1f914 29
vinbel93 0:4cb87eb1f914 30 // Envoi sur le UART
vinbel93 0:4cb87eb1f914 31 if (xbee->writeable())
vinbel93 0:4cb87eb1f914 32 {
vinbel93 0:4cb87eb1f914 33 for (int i = 0; i < frameLength; i++)
vinbel93 0:4cb87eb1f914 34 {
vinbel93 0:4cb87eb1f914 35 xbee->putc(frame[i]);
vinbel93 0:4cb87eb1f914 36 }
vinbel93 0:4cb87eb1f914 37 }
vinbel93 0:4cb87eb1f914 38 }
vinbel93 0:4cb87eb1f914 39
vinbel93 0:4cb87eb1f914 40 // Fonction de calcul du checksum
vinbel93 0:4cb87eb1f914 41 char checksum(char* frame, int begin, int end)
vinbel93 0:4cb87eb1f914 42 {
vinbel93 0:4cb87eb1f914 43 char sum = 0;
vinbel93 0:4cb87eb1f914 44
vinbel93 0:4cb87eb1f914 45 // Addition des bits
vinbel93 0:4cb87eb1f914 46 for (int i = begin; i < end; i++)
vinbel93 0:4cb87eb1f914 47 {
vinbel93 0:4cb87eb1f914 48 sum += frame[i];
vinbel93 0:4cb87eb1f914 49 }
vinbel93 0:4cb87eb1f914 50
vinbel93 0:4cb87eb1f914 51 return 0xFF - sum;
vinbel93 0:4cb87eb1f914 52 }
vinbel93 0:4cb87eb1f914 53
vinbel93 0:4cb87eb1f914 54 // Fonction de lecture des données du Xbee
vinbel93 0:4cb87eb1f914 55 bool readPacket(Serial* pc, Serial* xbee, char* output)
vinbel93 0:4cb87eb1f914 56 {
vinbel93 0:4cb87eb1f914 57 if(xbee->readable())
vinbel93 0:4cb87eb1f914 58 {
vinbel93 0:4cb87eb1f914 59 int c = xbee->getc();
vinbel93 0:4cb87eb1f914 60
vinbel93 0:4cb87eb1f914 61 // Début d'une trame
vinbel93 0:4cb87eb1f914 62 if (c == START_BYTE)
vinbel93 0:4cb87eb1f914 63 {
vinbel93 0:4cb87eb1f914 64 frameStarted = true;
vinbel93 0:4cb87eb1f914 65 }
vinbel93 0:4cb87eb1f914 66
vinbel93 0:4cb87eb1f914 67 // Ajout du caractère dans le buffer
vinbel93 0:4cb87eb1f914 68 if (frameStarted)
vinbel93 0:4cb87eb1f914 69 {
vinbel93 0:4cb87eb1f914 70 readBuffer[buffer++] = c;
vinbel93 0:4cb87eb1f914 71 }
vinbel93 0:4cb87eb1f914 72
vinbel93 0:4cb87eb1f914 73 // Si la longueur de la trame a été lue
vinbel93 0:4cb87eb1f914 74 if (buffer > 3)
vinbel93 0:4cb87eb1f914 75 {
vinbel93 0:4cb87eb1f914 76 int length = (readBuffer[1] << 8 ) | (readBuffer[2] & 0xFF);
vinbel93 0:4cb87eb1f914 77
vinbel93 0:4cb87eb1f914 78 // Vérifier que la trame au complet a été reçue et que le checksum est valide
vinbel93 0:4cb87eb1f914 79 if (buffer == length + 4 &&
vinbel93 0:4cb87eb1f914 80 checksum(readBuffer, 3, buffer) == readBuffer[buffer])
vinbel93 0:4cb87eb1f914 81 {
vinbel93 0:4cb87eb1f914 82 // Fin de la trame
vinbel93 0:4cb87eb1f914 83 frameStarted = false;
vinbel93 0:4cb87eb1f914 84 parse(readBuffer, buffer, output);
vinbel93 0:4cb87eb1f914 85 buffer = 0;
vinbel93 0:4cb87eb1f914 86 return true;
vinbel93 0:4cb87eb1f914 87 }
vinbel93 0:4cb87eb1f914 88 }
vinbel93 0:4cb87eb1f914 89 }
vinbel93 0:4cb87eb1f914 90
vinbel93 0:4cb87eb1f914 91 return false;
vinbel93 0:4cb87eb1f914 92 }
vinbel93 0:4cb87eb1f914 93
vinbel93 0:4cb87eb1f914 94 void parse(char* buffer, int size, char* output)
vinbel93 0:4cb87eb1f914 95 {
vinbel93 0:4cb87eb1f914 96 if (size >= 17)
vinbel93 0:4cb87eb1f914 97 {
vinbel93 0:4cb87eb1f914 98 // Données utiles
vinbel93 0:4cb87eb1f914 99 int button = buffer[15];
vinbel93 0:4cb87eb1f914 100 short accX = buffer[16] | buffer[17] << 8;
vinbel93 0:4cb87eb1f914 101
vinbel93 0:4cb87eb1f914 102 // Formattage pour le serveur Websockets
vinbel93 0:4cb87eb1f914 103 sprintf(output, "Button = %i, Acceleration X = %i\r\n", button, accX);
vinbel93 0:4cb87eb1f914 104 }
vinbel93 0:4cb87eb1f914 105 }