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 | 
