Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
Cheroukee
Date:
Sat Sep 30 19:09:52 2017 +0000
Revision:
6:9ed8153f1328
Parent:
5:9e6a09a38785
Child:
8:5955af1ee445
Added parser Hex value decoded to int

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cheroukee 1:ea1b52d0a8a3 1
Cheroukee 1:ea1b52d0a8a3 2 /***
Cheroukee 1:ea1b52d0a8a3 3 * xbee.cpp - en-tete de lib xbee - fouj1807 - mcgj2701
Cheroukee 1:ea1b52d0a8a3 4 */
Cheroukee 1:ea1b52d0a8a3 5
Cheroukee 1:ea1b52d0a8a3 6 #include "xbee.h"
Cheroukee 1:ea1b52d0a8a3 7
Cheroukee 2:a9bb12eefc08 8 DigitalOut xbee_transmit_led(LED1);
Cheroukee 2:a9bb12eefc08 9 DigitalOut xbee_receive_led(LED2);
Cheroukee 1:ea1b52d0a8a3 10 DigitalOut xbee_reset(p8);
Cheroukee 1:ea1b52d0a8a3 11
Cheroukee 1:ea1b52d0a8a3 12 Serial xbee(p13, p14); // tx, rx
Cheroukee 1:ea1b52d0a8a3 13
Cheroukee 1:ea1b52d0a8a3 14 char TransmitBuffer[2048] = {0};
Cheroukee 1:ea1b52d0a8a3 15 char ReceiveBuffer[2048] = {0};
Cheroukee 1:ea1b52d0a8a3 16
Cheroukee 1:ea1b52d0a8a3 17 void xbee_init()
Cheroukee 1:ea1b52d0a8a3 18 {
Cheroukee 2:a9bb12eefc08 19 xbee_receive_led = 0;
Cheroukee 1:ea1b52d0a8a3 20
Cheroukee 1:ea1b52d0a8a3 21 wait_ms(400);
Cheroukee 1:ea1b52d0a8a3 22
Cheroukee 1:ea1b52d0a8a3 23 xbee_reset = 1;
Cheroukee 1:ea1b52d0a8a3 24
Cheroukee 1:ea1b52d0a8a3 25 wait_ms(5000);
Cheroukee 1:ea1b52d0a8a3 26
Cheroukee 2:a9bb12eefc08 27 xbee_receive_led = 1;
Cheroukee 1:ea1b52d0a8a3 28 }
Cheroukee 1:ea1b52d0a8a3 29
Cheroukee 1:ea1b52d0a8a3 30
Cheroukee 1:ea1b52d0a8a3 31 bool set_pan_id(long pan_id)
Cheroukee 1:ea1b52d0a8a3 32 {
Cheroukee 1:ea1b52d0a8a3 33 return false;
Cheroukee 1:ea1b52d0a8a3 34 }
Cheroukee 1:ea1b52d0a8a3 35
Cheroukee 1:ea1b52d0a8a3 36 long get_pan_id()
Cheroukee 1:ea1b52d0a8a3 37 {
Cheroukee 1:ea1b52d0a8a3 38 return 0L;
Cheroukee 1:ea1b52d0a8a3 39 }
Cheroukee 1:ea1b52d0a8a3 40
Cheroukee 2:a9bb12eefc08 41
Cheroukee 2:a9bb12eefc08 42 void build_api_frame_header(int frame_data_size)
Cheroukee 2:a9bb12eefc08 43 {
Cheroukee 2:a9bb12eefc08 44 // Delimiter
Cheroukee 2:a9bb12eefc08 45 TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER;
Cheroukee 2:a9bb12eefc08 46 TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8;
Cheroukee 2:a9bb12eefc08 47 TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF;
Cheroukee 2:a9bb12eefc08 48 }
Cheroukee 2:a9bb12eefc08 49
Cheroukee 2:a9bb12eefc08 50 void build_api_frame_checksum(int frame_data_size)
Cheroukee 2:a9bb12eefc08 51 {
Cheroukee 1:ea1b52d0a8a3 52 // Calculate checksum
Cheroukee 2:a9bb12eefc08 53 char checksum = 0xFF;
Cheroukee 2:a9bb12eefc08 54 for (int i = 3; i < FRAME_CHEKSUM_POS; i++)
Cheroukee 1:ea1b52d0a8a3 55 {
Cheroukee 1:ea1b52d0a8a3 56 checksum -= TransmitBuffer[i];
Cheroukee 1:ea1b52d0a8a3 57 }
Cheroukee 1:ea1b52d0a8a3 58
Cheroukee 1:ea1b52d0a8a3 59 // Insert checksum into buffer
Cheroukee 2:a9bb12eefc08 60 TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;
Cheroukee 2:a9bb12eefc08 61 }
Cheroukee 2:a9bb12eefc08 62
Cheroukee 2:a9bb12eefc08 63 void set_api_frame_type(frame_type_t frame_type)
Cheroukee 2:a9bb12eefc08 64 {
Cheroukee 2:a9bb12eefc08 65 TransmitBuffer[API_FRAME_TYPE_POS] = frame_type;
Cheroukee 2:a9bb12eefc08 66 }
Cheroukee 2:a9bb12eefc08 67
Cheroukee 2:a9bb12eefc08 68 void set_api_frame_id(int id)
Cheroukee 2:a9bb12eefc08 69 {
Cheroukee 2:a9bb12eefc08 70 TransmitBuffer[API_FRAME_ID_POS] = id;
Cheroukee 2:a9bb12eefc08 71 }
Cheroukee 2:a9bb12eefc08 72
Cheroukee 2:a9bb12eefc08 73 void set_at_command(int at_command)
Cheroukee 2:a9bb12eefc08 74 {
Cheroukee 2:a9bb12eefc08 75 // NOT IMPLEMENTED
Cheroukee 2:a9bb12eefc08 76 }
Cheroukee 2:a9bb12eefc08 77
Cheroukee 2:a9bb12eefc08 78 void set_64_addr(zigbee_addr_64_t address)
Cheroukee 2:a9bb12eefc08 79 {
Cheroukee 2:a9bb12eefc08 80 int i = 0;
Cheroukee 2:a9bb12eefc08 81 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0;
Cheroukee 2:a9bb12eefc08 82 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1;
Cheroukee 2:a9bb12eefc08 83 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2;
Cheroukee 2:a9bb12eefc08 84 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3;
Cheroukee 2:a9bb12eefc08 85
Cheroukee 2:a9bb12eefc08 86 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4;
Cheroukee 2:a9bb12eefc08 87 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5;
Cheroukee 2:a9bb12eefc08 88 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6;
Cheroukee 2:a9bb12eefc08 89 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7;
Cheroukee 2:a9bb12eefc08 90 }
Cheroukee 2:a9bb12eefc08 91
Cheroukee 2:a9bb12eefc08 92 void set_16_addr(zigbee_addr_16_t address)
Cheroukee 2:a9bb12eefc08 93 {
Cheroukee 2:a9bb12eefc08 94 TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS] = address.addr_msb;
Cheroukee 2:a9bb12eefc08 95 TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1] = address.addr_lsb;
Cheroukee 2:a9bb12eefc08 96 }
Cheroukee 2:a9bb12eefc08 97
Cheroukee 2:a9bb12eefc08 98 void set_broadcast_radius(int position, char radius)
Cheroukee 2:a9bb12eefc08 99 {
Cheroukee 2:a9bb12eefc08 100 TransmitBuffer[position] = radius;
Cheroukee 2:a9bb12eefc08 101 }
Cheroukee 2:a9bb12eefc08 102
Cheroukee 2:a9bb12eefc08 103 void set_transmit_request_options(int position, char options)
Cheroukee 2:a9bb12eefc08 104 {
Cheroukee 2:a9bb12eefc08 105 TransmitBuffer[position] = options;
Cheroukee 2:a9bb12eefc08 106 }
Cheroukee 2:a9bb12eefc08 107
Cheroukee 2:a9bb12eefc08 108 void set_transmit_request_data(char* data, int data_length)
Cheroukee 2:a9bb12eefc08 109 {
Cheroukee 2:a9bb12eefc08 110 for (int i = 0; i < data_length; i++)
Cheroukee 1:ea1b52d0a8a3 111 {
Cheroukee 2:a9bb12eefc08 112 TransmitBuffer[TRANSMIT_REQ_DATA_START + i] = data[i];
Cheroukee 1:ea1b52d0a8a3 113 }
Cheroukee 2:a9bb12eefc08 114 }
Cheroukee 2:a9bb12eefc08 115
Cheroukee 2:a9bb12eefc08 116 bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination)
Cheroukee 2:a9bb12eefc08 117 {
Cheroukee 2:a9bb12eefc08 118 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 119
Cheroukee 2:a9bb12eefc08 120 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 121 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 122
Cheroukee 2:a9bb12eefc08 123 set_64_addr(destination);
Cheroukee 2:a9bb12eefc08 124 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 2:a9bb12eefc08 125 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 2:a9bb12eefc08 126
Cheroukee 2:a9bb12eefc08 127 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 128 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 129
Cheroukee 2:a9bb12eefc08 130 set_transmit_request_data(buffer, data_length);
Cheroukee 2:a9bb12eefc08 131
Cheroukee 2:a9bb12eefc08 132 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 133
Cheroukee 2:a9bb12eefc08 134 transmit(data_length);
Cheroukee 1:ea1b52d0a8a3 135
Cheroukee 1:ea1b52d0a8a3 136 return false;
Cheroukee 1:ea1b52d0a8a3 137 }
Cheroukee 1:ea1b52d0a8a3 138
Cheroukee 2:a9bb12eefc08 139 bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination)
Cheroukee 2:a9bb12eefc08 140 {
Cheroukee 2:a9bb12eefc08 141 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 142
Cheroukee 2:a9bb12eefc08 143 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 144 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 145
Cheroukee 2:a9bb12eefc08 146 DECLARE_ADDR64_BCAST
Cheroukee 2:a9bb12eefc08 147 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 2:a9bb12eefc08 148 set_16_addr(destination);
Cheroukee 2:a9bb12eefc08 149
Cheroukee 2:a9bb12eefc08 150 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 151 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 152
Cheroukee 2:a9bb12eefc08 153 set_transmit_request_data(buffer, data_length);
Cheroukee 2:a9bb12eefc08 154
Cheroukee 2:a9bb12eefc08 155 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 156
Cheroukee 2:a9bb12eefc08 157 transmit(data_length);
Cheroukee 2:a9bb12eefc08 158
Cheroukee 2:a9bb12eefc08 159 return false;
Cheroukee 2:a9bb12eefc08 160 }
Cheroukee 2:a9bb12eefc08 161
Cheroukee 2:a9bb12eefc08 162 bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16)
Cheroukee 1:ea1b52d0a8a3 163 {
Cheroukee 2:a9bb12eefc08 164 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 165
Cheroukee 2:a9bb12eefc08 166 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 167 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 168
Cheroukee 2:a9bb12eefc08 169 set_64_addr(destination64);
Cheroukee 2:a9bb12eefc08 170 set_16_addr(destination16);
Cheroukee 2:a9bb12eefc08 171
Cheroukee 2:a9bb12eefc08 172 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 173 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 174
Cheroukee 2:a9bb12eefc08 175 set_transmit_request_data(buffer, data_length);
Cheroukee 2:a9bb12eefc08 176
Cheroukee 2:a9bb12eefc08 177 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 178
Cheroukee 2:a9bb12eefc08 179 transmit(data_length);
Cheroukee 2:a9bb12eefc08 180
Cheroukee 2:a9bb12eefc08 181 return false;
Cheroukee 2:a9bb12eefc08 182 }
Cheroukee 2:a9bb12eefc08 183
Cheroukee 2:a9bb12eefc08 184 void transmit(int packet_length)
Cheroukee 2:a9bb12eefc08 185 {
Cheroukee 2:a9bb12eefc08 186 for (int i = 0; i < 18 + packet_length; i++)
Cheroukee 2:a9bb12eefc08 187 {
Cheroukee 2:a9bb12eefc08 188 xbee.putc(TransmitBuffer[i]);
Cheroukee 2:a9bb12eefc08 189 }
Cheroukee 5:9e6a09a38785 190 xbee_transmit_led = !xbee_transmit_led;
Cheroukee 5:9e6a09a38785 191 }
Cheroukee 5:9e6a09a38785 192
Cheroukee 5:9e6a09a38785 193 int receive(char* buffer, int max_length)
Cheroukee 5:9e6a09a38785 194 {
Cheroukee 5:9e6a09a38785 195 int length = 0;
Cheroukee 5:9e6a09a38785 196
Cheroukee 5:9e6a09a38785 197 while(xbee.readable() && length < max_length)
Cheroukee 5:9e6a09a38785 198 {
Cheroukee 5:9e6a09a38785 199 buffer[length++] = xbee.getc();
Cheroukee 6:9ed8153f1328 200 }
Cheroukee 6:9ed8153f1328 201 xbee_receive_led = !xbee_receive_led;
Cheroukee 5:9e6a09a38785 202 return length;
Cheroukee 5:9e6a09a38785 203 }