Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
Fork of BLENano_SimpleControls by
main.cpp@6:8d65e62ce233, 2016-09-08 (annotated)
- Committer:
- vgoliveira
- Date:
- Thu Sep 08 17:19:41 2016 +0000
- Revision:
- 6:8d65e62ce233
- Parent:
- 5:1ccc4165731f
Primeira vers?o funcional, implementa COMMAND e PROGRAM.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| RedBearLab | 1:81a97eb70d3d | 1 | /* |
| RedBearLab | 1:81a97eb70d3d | 2 | |
| RedBearLab | 1:81a97eb70d3d | 3 | Copyright (c) 2012-2014 RedBearLab |
| RedBearLab | 1:81a97eb70d3d | 4 | |
| RedBearLab | 1:81a97eb70d3d | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
| RedBearLab | 1:81a97eb70d3d | 6 | and associated documentation files (the "Software"), to deal in the Software without restriction, |
| RedBearLab | 1:81a97eb70d3d | 7 | including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| RedBearLab | 1:81a97eb70d3d | 8 | and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, |
| RedBearLab | 1:81a97eb70d3d | 9 | subject to the following conditions: |
| RedBearLab | 1:81a97eb70d3d | 10 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. |
| RedBearLab | 1:81a97eb70d3d | 11 | |
| RedBearLab | 1:81a97eb70d3d | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
| RedBearLab | 1:81a97eb70d3d | 13 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
| RedBearLab | 1:81a97eb70d3d | 14 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE |
| RedBearLab | 1:81a97eb70d3d | 15 | FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| RedBearLab | 1:81a97eb70d3d | 16 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| RedBearLab | 1:81a97eb70d3d | 17 | |
| RedBearLab | 1:81a97eb70d3d | 18 | */ |
| RedBearLab | 0:be2e4095513a | 19 | |
| RedBearLab | 0:be2e4095513a | 20 | #include "mbed.h" |
| RedBearLab | 2:3cd654f42efa | 21 | #include "ble/BLE.h" |
| RedBearLab | 0:be2e4095513a | 22 | #include "Servo.h" |
| RedBearLab | 0:be2e4095513a | 23 | |
| RedBearLab | 0:be2e4095513a | 24 | |
| vgoliveira | 5:1ccc4165731f | 25 | #define TXRX_BUF_LEN 20 |
| vgoliveira | 5:1ccc4165731f | 26 | |
| vgoliveira | 6:8d65e62ce233 | 27 | #define PIN_TIME_MORE P0_4 |
| vgoliveira | 6:8d65e62ce233 | 28 | #define PIN_TIME_LESS P0_5 |
| vgoliveira | 6:8d65e62ce233 | 29 | #define PIN_DOUGH_QNT P0_8 |
| vgoliveira | 6:8d65e62ce233 | 30 | #define PIN_OPTIONS P0_9 |
| vgoliveira | 6:8d65e62ce233 | 31 | #define PIN_COLOR P0_10 |
| vgoliveira | 6:8d65e62ce233 | 32 | #define PIN_INIT_STOP P0_11 |
| vgoliveira | 6:8d65e62ce233 | 33 | #define PIN_TEST_LED P0_19 // only used for debuggin (visual check) |
| RedBearLab | 0:be2e4095513a | 34 | |
| vgoliveira | 6:8d65e62ce233 | 35 | #define OPERATION 0x00 |
| vgoliveira | 6:8d65e62ce233 | 36 | #define COMMAND 0x01 |
| vgoliveira | 6:8d65e62ce233 | 37 | #define PROGRAM 0x02 |
| vgoliveira | 5:1ccc4165731f | 38 | |
| vgoliveira | 6:8d65e62ce233 | 39 | #define TIME_MORE 0x04 |
| vgoliveira | 6:8d65e62ce233 | 40 | #define TIME_LESS 0x05 |
| vgoliveira | 6:8d65e62ce233 | 41 | #define DOUGH_QNT 0x02 |
| vgoliveira | 6:8d65e62ce233 | 42 | #define INIT_STOP 0x06 |
| vgoliveira | 6:8d65e62ce233 | 43 | #define OPTIONS 0x01 |
| vgoliveira | 6:8d65e62ce233 | 44 | #define COLOR 0x03 |
| vgoliveira | 6:8d65e62ce233 | 45 | #define TEST_LED 0x07 |
| vgoliveira | 6:8d65e62ce233 | 46 | |
| vgoliveira | 6:8d65e62ce233 | 47 | #define DELAY 250 // 250 ms holding the up state for button clicking |
| vgoliveira | 6:8d65e62ce233 | 48 | |
| RedBearLab | 2:3cd654f42efa | 49 | BLE ble; |
| RedBearLab | 0:be2e4095513a | 50 | |
| vgoliveira | 6:8d65e62ce233 | 51 | DigitalOut time_more(PIN_TIME_MORE,0); |
| vgoliveira | 6:8d65e62ce233 | 52 | DigitalOut time_less(PIN_TIME_LESS,0); |
| vgoliveira | 6:8d65e62ce233 | 53 | DigitalOut dough_qnt(PIN_DOUGH_QNT,0); |
| vgoliveira | 6:8d65e62ce233 | 54 | DigitalOut init_stop(PIN_INIT_STOP,0); |
| vgoliveira | 6:8d65e62ce233 | 55 | DigitalOut options(PIN_OPTIONS,0); |
| vgoliveira | 6:8d65e62ce233 | 56 | DigitalOut color(PIN_COLOR,0); |
| vgoliveira | 6:8d65e62ce233 | 57 | DigitalOut test_led(PIN_TEST_LED,1); |
| RedBearLab | 0:be2e4095513a | 58 | |
| vgoliveira | 5:1ccc4165731f | 59 | /* The Nordic UART Service */ |
| vgoliveira | 5:1ccc4165731f | 60 | |
| vgoliveira | 5:1ccc4165731f | 61 | // RX_SERVICE_UUID do APP Android |
| vgoliveira | 5:1ccc4165731f | 62 | static const uint8_t uart_base_uuid[] = {0x6E, 0x40, 0x00, 0x01, 0xB5, 0xA3, 0xF3, 0x93, 0xE0, 0xA9, 0xE5, 0x0E, 0x24, 0xDC, 0xCA, 0x9E}; |
| vgoliveira | 5:1ccc4165731f | 63 | //TX_CHAR_UUID do APP Android |
| vgoliveira | 5:1ccc4165731f | 64 | static const uint8_t uart_tx_uuid[] = {0x6E, 0x40, 0x00, 0x02, 0xB5, 0xA3, 0xF3, 0x93, 0xE0, 0xA9, 0xE5, 0x0E, 0x24, 0xDC, 0xCA, 0x9E}; |
| vgoliveira | 5:1ccc4165731f | 65 | //RX_CHAR_UUID do APP Android |
| vgoliveira | 5:1ccc4165731f | 66 | static const uint8_t uart_rx_uuid[] = {0x6E, 0x40, 0x00, 0x03, 0xB5, 0xA3, 0xF3, 0x93, 0xE0, 0xA9, 0xE5, 0x0E, 0x24, 0xDC, 0xCA, 0x9E}; |
| vgoliveira | 5:1ccc4165731f | 67 | // RX_SERVICE_UUID do APP Android |
| vgoliveira | 5:1ccc4165731f | 68 | static const uint8_t uart_base_uuid_rev[] = {0x6E, 0x40, 0x00, 0x01, 0xB5, 0xA3, 0xF3, 0x93, 0xE0, 0xA9, 0xE5, 0x0E, 0x24, 0xDC, 0xCA, 0x9E}; |
| RedBearLab | 0:be2e4095513a | 69 | |
| RedBearLab | 0:be2e4095513a | 70 | |
| RedBearLab | 0:be2e4095513a | 71 | uint8_t txPayload[TXRX_BUF_LEN] = {0,}; |
| RedBearLab | 0:be2e4095513a | 72 | uint8_t rxPayload[TXRX_BUF_LEN] = {0,}; |
| RedBearLab | 0:be2e4095513a | 73 | |
| RedBearLab | 0:be2e4095513a | 74 | //static uint8_t rx_buf[TXRX_BUF_LEN]; |
| RedBearLab | 0:be2e4095513a | 75 | //static uint8_t rx_len=0; |
| RedBearLab | 0:be2e4095513a | 76 | |
| RedBearLab | 0:be2e4095513a | 77 | |
| RedBearLab | 0:be2e4095513a | 78 | GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); |
| RedBearLab | 0:be2e4095513a | 79 | |
| RedBearLab | 0:be2e4095513a | 80 | GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); |
| RedBearLab | 0:be2e4095513a | 81 | |
| RedBearLab | 0:be2e4095513a | 82 | GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic}; |
| RedBearLab | 0:be2e4095513a | 83 | |
| RedBearLab | 0:be2e4095513a | 84 | GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *)); |
| RedBearLab | 0:be2e4095513a | 85 | |
| RedBearLab | 0:be2e4095513a | 86 | |
| RedBearLab | 0:be2e4095513a | 87 | |
| RedBearLab | 3:f530ca03e014 | 88 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
| RedBearLab | 0:be2e4095513a | 89 | { |
| RedBearLab | 0:be2e4095513a | 90 | //pc.printf("Disconnected \r\n"); |
| RedBearLab | 0:be2e4095513a | 91 | //pc.printf("Restart advertising \r\n"); |
| vgoliveira | 5:1ccc4165731f | 92 | //ble.gap().startAdvertising(); |
| vgoliveira | 5:1ccc4165731f | 93 | ble.startAdvertising(); |
| RedBearLab | 0:be2e4095513a | 94 | } |
| RedBearLab | 0:be2e4095513a | 95 | |
| vgoliveira | 6:8d65e62ce233 | 96 | void ClickButton(DigitalOut *button, uint8_t *click_num) |
| vgoliveira | 6:8d65e62ce233 | 97 | { |
| vgoliveira | 6:8d65e62ce233 | 98 | for (uint8_t i = *click_num; i > 0; i--) |
| vgoliveira | 6:8d65e62ce233 | 99 | { |
| vgoliveira | 6:8d65e62ce233 | 100 | *button = 0; |
| vgoliveira | 6:8d65e62ce233 | 101 | wait_ms(DELAY); |
| vgoliveira | 6:8d65e62ce233 | 102 | *button = 1; |
| vgoliveira | 6:8d65e62ce233 | 103 | wait_ms(DELAY); |
| vgoliveira | 6:8d65e62ce233 | 104 | *button = 0; |
| vgoliveira | 6:8d65e62ce233 | 105 | } |
| vgoliveira | 6:8d65e62ce233 | 106 | } |
| vgoliveira | 6:8d65e62ce233 | 107 | |
| RedBearLab | 2:3cd654f42efa | 108 | void WrittenHandler(const GattWriteCallbackParams *Handler) |
| RedBearLab | 0:be2e4095513a | 109 | { |
| RedBearLab | 0:be2e4095513a | 110 | uint8_t buf[TXRX_BUF_LEN]; |
| RedBearLab | 0:be2e4095513a | 111 | uint16_t bytesRead; |
| RedBearLab | 0:be2e4095513a | 112 | |
| RedBearLab | 2:3cd654f42efa | 113 | if (Handler->handle == txCharacteristic.getValueAttribute().getHandle()) |
| RedBearLab | 0:be2e4095513a | 114 | { |
| RedBearLab | 0:be2e4095513a | 115 | ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead); |
| RedBearLab | 0:be2e4095513a | 116 | memset(txPayload, 0, TXRX_BUF_LEN); |
| RedBearLab | 0:be2e4095513a | 117 | memcpy(txPayload, buf, TXRX_BUF_LEN); |
| RedBearLab | 0:be2e4095513a | 118 | |
| vgoliveira | 6:8d65e62ce233 | 119 | switch (buf[OPERATION]) { |
| vgoliveira | 6:8d65e62ce233 | 120 | case COMMAND: |
| vgoliveira | 6:8d65e62ce233 | 121 | options = buf[OPTIONS]; |
| vgoliveira | 6:8d65e62ce233 | 122 | dough_qnt = buf[DOUGH_QNT]; |
| vgoliveira | 6:8d65e62ce233 | 123 | color = buf[COLOR]; |
| vgoliveira | 6:8d65e62ce233 | 124 | time_more = buf[TIME_MORE]; |
| vgoliveira | 6:8d65e62ce233 | 125 | time_less = buf[TIME_LESS]; |
| vgoliveira | 6:8d65e62ce233 | 126 | init_stop = buf[INIT_STOP]; |
| vgoliveira | 6:8d65e62ce233 | 127 | break; |
| vgoliveira | 6:8d65e62ce233 | 128 | case PROGRAM: |
| vgoliveira | 6:8d65e62ce233 | 129 | ClickButton(&options,&buf[OPTIONS]); |
| vgoliveira | 6:8d65e62ce233 | 130 | ClickButton(&dough_qnt, &buf[DOUGH_QNT]); |
| vgoliveira | 6:8d65e62ce233 | 131 | ClickButton(&color, &buf[COLOR]); |
| vgoliveira | 6:8d65e62ce233 | 132 | ClickButton(&time_more, &buf[TIME_MORE]); |
| vgoliveira | 6:8d65e62ce233 | 133 | ClickButton(&time_less, &buf[TIME_LESS]); |
| vgoliveira | 6:8d65e62ce233 | 134 | ClickButton(&init_stop, &buf[INIT_STOP]); |
| vgoliveira | 6:8d65e62ce233 | 135 | break; |
| RedBearLab | 0:be2e4095513a | 136 | } |
| RedBearLab | 0:be2e4095513a | 137 | } |
| RedBearLab | 0:be2e4095513a | 138 | } |
| RedBearLab | 0:be2e4095513a | 139 | /* |
| RedBearLab | 0:be2e4095513a | 140 | void uartCB(void) |
| RedBearLab | 0:be2e4095513a | 141 | { |
| RedBearLab | 0:be2e4095513a | 142 | while(pc.readable()) |
| RedBearLab | 0:be2e4095513a | 143 | { |
| RedBearLab | 0:be2e4095513a | 144 | rx_buf[rx_len++] = pc.getc(); |
| RedBearLab | 0:be2e4095513a | 145 | if(rx_len>=20 || rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n') |
| RedBearLab | 0:be2e4095513a | 146 | { |
| RedBearLab | 0:be2e4095513a | 147 | ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), rx_buf, rx_len); |
| RedBearLab | 0:be2e4095513a | 148 | pc.printf("RecHandler \r\n"); |
| RedBearLab | 0:be2e4095513a | 149 | pc.printf("Length: "); |
| RedBearLab | 0:be2e4095513a | 150 | pc.putc(rx_len); |
| RedBearLab | 0:be2e4095513a | 151 | pc.printf("\r\n"); |
| RedBearLab | 0:be2e4095513a | 152 | rx_len = 0; |
| RedBearLab | 0:be2e4095513a | 153 | break; |
| RedBearLab | 0:be2e4095513a | 154 | } |
| RedBearLab | 0:be2e4095513a | 155 | } |
| RedBearLab | 0:be2e4095513a | 156 | } |
| RedBearLab | 0:be2e4095513a | 157 | */ |
| RedBearLab | 0:be2e4095513a | 158 | void m_status_check_handle(void) |
| RedBearLab | 0:be2e4095513a | 159 | { |
| vgoliveira | 5:1ccc4165731f | 160 | /* |
| RedBearLab | 0:be2e4095513a | 161 | uint8_t buf[3]; |
| RedBearLab | 0:be2e4095513a | 162 | if (analog_enabled) // if analog reading enabled |
| RedBearLab | 0:be2e4095513a | 163 | { |
| RedBearLab | 0:be2e4095513a | 164 | // Read and send out |
| RedBearLab | 0:be2e4095513a | 165 | float s = ANALOG; |
| RedBearLab | 0:be2e4095513a | 166 | uint16_t value = s*1024; |
| RedBearLab | 0:be2e4095513a | 167 | buf[0] = (0x0B); |
| RedBearLab | 0:be2e4095513a | 168 | buf[1] = (value >> 8); |
| RedBearLab | 0:be2e4095513a | 169 | buf[2] = (value); |
| RedBearLab | 0:be2e4095513a | 170 | ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3); |
| RedBearLab | 0:be2e4095513a | 171 | } |
| RedBearLab | 0:be2e4095513a | 172 | |
| vgoliveira | 5:1ccc4165731f | 173 | If digital in changes, report the state |
| RedBearLab | 0:be2e4095513a | 174 | if (BUTTON != old_state) |
| RedBearLab | 0:be2e4095513a | 175 | { |
| RedBearLab | 0:be2e4095513a | 176 | old_state = BUTTON; |
| RedBearLab | 0:be2e4095513a | 177 | |
| RedBearLab | 0:be2e4095513a | 178 | if (BUTTON == 1) |
| RedBearLab | 0:be2e4095513a | 179 | { |
| RedBearLab | 0:be2e4095513a | 180 | buf[0] = (0x0A); |
| RedBearLab | 0:be2e4095513a | 181 | buf[1] = (0x01); |
| RedBearLab | 0:be2e4095513a | 182 | buf[2] = (0x00); |
| RedBearLab | 0:be2e4095513a | 183 | ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3); |
| RedBearLab | 0:be2e4095513a | 184 | } |
| RedBearLab | 0:be2e4095513a | 185 | else |
| RedBearLab | 0:be2e4095513a | 186 | { |
| RedBearLab | 0:be2e4095513a | 187 | buf[0] = (0x0A); |
| RedBearLab | 0:be2e4095513a | 188 | buf[1] = (0x00); |
| RedBearLab | 0:be2e4095513a | 189 | buf[2] = (0x00); |
| RedBearLab | 0:be2e4095513a | 190 | ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3); |
| RedBearLab | 0:be2e4095513a | 191 | } |
| RedBearLab | 0:be2e4095513a | 192 | } |
| vgoliveira | 5:1ccc4165731f | 193 | */ |
| RedBearLab | 0:be2e4095513a | 194 | } |
| RedBearLab | 0:be2e4095513a | 195 | |
| RedBearLab | 0:be2e4095513a | 196 | |
| RedBearLab | 0:be2e4095513a | 197 | int main(void) |
| RedBearLab | 0:be2e4095513a | 198 | { |
| RedBearLab | 0:be2e4095513a | 199 | Ticker ticker; |
| RedBearLab | 0:be2e4095513a | 200 | ticker.attach_us(m_status_check_handle, 200000); |
| RedBearLab | 0:be2e4095513a | 201 | |
| RedBearLab | 0:be2e4095513a | 202 | ble.init(); |
| RedBearLab | 0:be2e4095513a | 203 | ble.onDisconnection(disconnectionCallback); |
| RedBearLab | 0:be2e4095513a | 204 | ble.onDataWritten(WrittenHandler); |
| RedBearLab | 0:be2e4095513a | 205 | |
| RedBearLab | 0:be2e4095513a | 206 | //pc.baud(9600); |
| RedBearLab | 0:be2e4095513a | 207 | //pc.printf("SimpleChat Init \r\n"); |
| RedBearLab | 0:be2e4095513a | 208 | |
| RedBearLab | 0:be2e4095513a | 209 | //pc.attach( uartCB , pc.RxIrq); |
| RedBearLab | 0:be2e4095513a | 210 | |
| RedBearLab | 0:be2e4095513a | 211 | // setup advertising |
| RedBearLab | 0:be2e4095513a | 212 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
| RedBearLab | 0:be2e4095513a | 213 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
| RedBearLab | 0:be2e4095513a | 214 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
| vgoliveira | 6:8d65e62ce233 | 215 | (const uint8_t *)"Panificadora", sizeof("Panificadora") - 1); |
| RedBearLab | 0:be2e4095513a | 216 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
| RedBearLab | 0:be2e4095513a | 217 | (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid)); |
| RedBearLab | 0:be2e4095513a | 218 | // 100ms; in multiples of 0.625ms. |
| RedBearLab | 0:be2e4095513a | 219 | ble.setAdvertisingInterval(160); |
| RedBearLab | 0:be2e4095513a | 220 | |
| RedBearLab | 0:be2e4095513a | 221 | ble.addService(uartService); |
| RedBearLab | 0:be2e4095513a | 222 | |
| RedBearLab | 0:be2e4095513a | 223 | ble.startAdvertising(); |
| RedBearLab | 0:be2e4095513a | 224 | |
| RedBearLab | 0:be2e4095513a | 225 | //pc.printf("Advertising Start \r\n"); |
| vgoliveira | 5:1ccc4165731f | 226 | |
| RedBearLab | 0:be2e4095513a | 227 | while(1) |
| RedBearLab | 0:be2e4095513a | 228 | { |
| RedBearLab | 0:be2e4095513a | 229 | ble.waitForEvent(); |
| RedBearLab | 0:be2e4095513a | 230 | } |
| RedBearLab | 0:be2e4095513a | 231 | } |
| RedBearLab | 0:be2e4095513a | 232 | |
| RedBearLab | 0:be2e4095513a | 233 | |
| RedBearLab | 0:be2e4095513a | 234 | |
| RedBearLab | 0:be2e4095513a | 235 | |
| RedBearLab | 0:be2e4095513a | 236 | |
| RedBearLab | 0:be2e4095513a | 237 | |
| RedBearLab | 0:be2e4095513a | 238 | |
| RedBearLab | 0:be2e4095513a | 239 | |
| RedBearLab | 0:be2e4095513a | 240 | |
| RedBearLab | 0:be2e4095513a | 241 | |
| RedBearLab | 0:be2e4095513a | 242 | |
| RedBearLab | 0:be2e4095513a | 243 | |
| RedBearLab | 0:be2e4095513a | 244 | |
| RedBearLab | 0:be2e4095513a | 245 | |
| RedBearLab | 0:be2e4095513a | 246 | |
| RedBearLab | 0:be2e4095513a | 247 | |
| RedBearLab | 0:be2e4095513a | 248 | |
| RedBearLab | 0:be2e4095513a | 249 | |
| RedBearLab | 0:be2e4095513a | 250 | |
| RedBearLab | 0:be2e4095513a | 251 | |
| RedBearLab | 0:be2e4095513a | 252 | |
| RedBearLab | 0:be2e4095513a | 253 | |
| RedBearLab | 0:be2e4095513a | 254 | |
| RedBearLab | 0:be2e4095513a | 255 | |
| RedBearLab | 0:be2e4095513a | 256 | |
| RedBearLab | 0:be2e4095513a | 257 | |
| RedBearLab | 0:be2e4095513a | 258 | |
| RedBearLab | 0:be2e4095513a | 259 | |
| RedBearLab | 0:be2e4095513a | 260 | |
| RedBearLab | 0:be2e4095513a | 261 | |
| RedBearLab | 0:be2e4095513a | 262 |
