Coordinator code
Dependencies: EthernetInterface WebSocketClient mbed-rtos mbed
Xbee.cpp@0:4cb87eb1f914, 2016-02-18 (annotated)
- Committer:
- vinbel93
- Date:
- Thu Feb 18 13:21:58 2016 +0000
- Revision:
- 0:4cb87eb1f914
Coordinator
Who changed what in which revision?
User | Revision | Line number | New 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 | } |