RCBControllerでモータを制御します。うおーるぼっとも動かせました。

Dependencies:   BLE_API_Native_IRC TB6612FNG2 mbed

Fork of BLE_RCBController by Junichi Katsu

  • 古いBLEライブラリを使っているのでプラットフォームは”Nordic nRF51822”を選択してください。
  • ライブラリ類はUpdateしないでください。コンパイルエラーになります。

うまく接続できない時は、iPhone/iPadのBluetoothをOFF->ONしてキャッシュをクリアしてみてください。

RCBControllerでうおーるぼっとを操縦する例 /media/uploads/robo8080/img_1671.jpg

RCBControllerでの操縦は次の4種類あります。 それぞれうおーるぼっとの動きが異なりますので試してみてください。

  • 左十字ボタン
  • 左のみアナログ
  • 右のみアナログ
  • 両方アナログ

うおーるぼっと(LPC1768のソケット)とHRM1017の接続はこれです。

LPC1768 ー HRM1017

p11 ーーー P0_0

p12 ーーー P0_1

p13 ーーー P0_28

p14 ーーー P0_29

p21 ーーー P0_30

p22 ーーー P0_25

GND ーーー GND

HRM1017の電源はうおーるぼっとのUSBコネクタからとります。 /media/uploads/robo8080/img_1674.jpg

Committer:
jksoft
Date:
Thu Jul 10 14:21:52 2014 +0000
Revision:
0:8c643bfe55b7
??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:8c643bfe55b7 1 /* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
jksoft 0:8c643bfe55b7 2 *
jksoft 0:8c643bfe55b7 3 * The information contained herein is property of Nordic Semiconductor ASA.
jksoft 0:8c643bfe55b7 4 * Terms and conditions of usage are described in detail in NORDIC
jksoft 0:8c643bfe55b7 5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
jksoft 0:8c643bfe55b7 6 *
jksoft 0:8c643bfe55b7 7 * Licensees are granted free, non-transferable use of the information. NO
jksoft 0:8c643bfe55b7 8 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
jksoft 0:8c643bfe55b7 9 * the file.
jksoft 0:8c643bfe55b7 10 *
jksoft 0:8c643bfe55b7 11 */
jksoft 0:8c643bfe55b7 12
jksoft 0:8c643bfe55b7 13 #include "softdevice_handler.h"
jksoft 0:8c643bfe55b7 14 #include <stdlib.h>
jksoft 0:8c643bfe55b7 15 #include "nordic_common.h"
jksoft 0:8c643bfe55b7 16 #include "app_error.h"
jksoft 0:8c643bfe55b7 17 #include "app_util.h"
jksoft 0:8c643bfe55b7 18 #include "nrf_assert.h"
jksoft 0:8c643bfe55b7 19 #include "nrf_soc.h"
jksoft 0:8c643bfe55b7 20 #include "mbed.h"
jksoft 0:8c643bfe55b7 21
jksoft 0:8c643bfe55b7 22 #if defined(ANT_STACK_SUPPORT_REQD) && defined(BLE_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 23 #include "ant_interface.h"
jksoft 0:8c643bfe55b7 24 #elif defined(ANT_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 25 #include "ant_interface.h"
jksoft 0:8c643bfe55b7 26 #elif defined(BLE_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 27 #include "ble.h"
jksoft 0:8c643bfe55b7 28 #endif
jksoft 0:8c643bfe55b7 29
jksoft 0:8c643bfe55b7 30
jksoft 0:8c643bfe55b7 31 static softdevice_evt_schedule_func_t m_evt_schedule_func; /**< Pointer to function for propagating SoftDevice events to the scheduler. */
jksoft 0:8c643bfe55b7 32
jksoft 0:8c643bfe55b7 33 #if defined (BLE_STACK_SUPPORT_REQD) || defined (ANT_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 34 // The following two definition is needed only if ANT or BLE events are needed to be pulled from the stack.
jksoft 0:8c643bfe55b7 35 static uint8_t * m_evt_buffer; /**< Buffer for receiving events from the SoftDevice. */
jksoft 0:8c643bfe55b7 36 #endif
jksoft 0:8c643bfe55b7 37
jksoft 0:8c643bfe55b7 38 #ifdef BLE_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 39 static uint16_t m_ble_evt_buffer_size; /**< Size of BLE event buffer. */
jksoft 0:8c643bfe55b7 40 #endif
jksoft 0:8c643bfe55b7 41
jksoft 0:8c643bfe55b7 42 static volatile bool m_softdevice_enabled = false; /**< Variable to indicate whether the SoftDevice is enabled. */
jksoft 0:8c643bfe55b7 43
jksoft 0:8c643bfe55b7 44 #ifdef BLE_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 45 static ble_evt_handler_t m_ble_evt_handler; /**< Application event handler for handling BLE events. */
jksoft 0:8c643bfe55b7 46 #endif
jksoft 0:8c643bfe55b7 47
jksoft 0:8c643bfe55b7 48 #ifdef ANT_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 49 static ant_evt_handler_t m_ant_evt_handler; /**< Application event handler for handling ANT events. */
jksoft 0:8c643bfe55b7 50 #endif
jksoft 0:8c643bfe55b7 51
jksoft 0:8c643bfe55b7 52 static sys_evt_handler_t m_sys_evt_handler; /**< Application event handler for handling System (SOC) events. */
jksoft 0:8c643bfe55b7 53
jksoft 0:8c643bfe55b7 54
jksoft 0:8c643bfe55b7 55 /**@brief Callback function for asserts in the SoftDevice.
jksoft 0:8c643bfe55b7 56 *
jksoft 0:8c643bfe55b7 57 * @details A pointer to this function will be passed to the SoftDevice. This function will be
jksoft 0:8c643bfe55b7 58 * called if an ASSERT statement in the SoftDevice fails.
jksoft 0:8c643bfe55b7 59 *
jksoft 0:8c643bfe55b7 60 * @param[in] pc The value of the program counter when the ASSERT call failed.
jksoft 0:8c643bfe55b7 61 * @param[in] line_num Line number of the failing ASSERT call.
jksoft 0:8c643bfe55b7 62 * @param[in] file_name File name of the failing ASSERT call.
jksoft 0:8c643bfe55b7 63 */
jksoft 0:8c643bfe55b7 64 void softdevice_assertion_handler(uint32_t pc, uint16_t line_num, const uint8_t * file_name)
jksoft 0:8c643bfe55b7 65 {
jksoft 0:8c643bfe55b7 66 UNUSED_PARAMETER(pc);
jksoft 0:8c643bfe55b7 67 assert_nrf_callback(line_num, file_name);
jksoft 0:8c643bfe55b7 68 }
jksoft 0:8c643bfe55b7 69
jksoft 0:8c643bfe55b7 70
jksoft 0:8c643bfe55b7 71 void intern_softdevice_events_execute(void)
jksoft 0:8c643bfe55b7 72 {
jksoft 0:8c643bfe55b7 73 if (!m_softdevice_enabled)
jksoft 0:8c643bfe55b7 74 {
jksoft 0:8c643bfe55b7 75 // SoftDevice not enabled. This can be possible if the SoftDevice was enabled by the
jksoft 0:8c643bfe55b7 76 // application without using this module's API (i.e softdevice_handler_init)
jksoft 0:8c643bfe55b7 77
jksoft 0:8c643bfe55b7 78 return;
jksoft 0:8c643bfe55b7 79 }
jksoft 0:8c643bfe55b7 80
jksoft 0:8c643bfe55b7 81 bool no_more_soc_evts = (m_sys_evt_handler == NULL);
jksoft 0:8c643bfe55b7 82 #ifdef BLE_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 83 bool no_more_ble_evts = (m_ble_evt_handler == NULL);
jksoft 0:8c643bfe55b7 84 #endif
jksoft 0:8c643bfe55b7 85 #ifdef ANT_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 86 bool no_more_ant_evts = (m_ant_evt_handler == NULL);
jksoft 0:8c643bfe55b7 87 #endif
jksoft 0:8c643bfe55b7 88
jksoft 0:8c643bfe55b7 89 for (;;)
jksoft 0:8c643bfe55b7 90 {
jksoft 0:8c643bfe55b7 91 uint32_t err_code;
jksoft 0:8c643bfe55b7 92
jksoft 0:8c643bfe55b7 93 if (!no_more_soc_evts)
jksoft 0:8c643bfe55b7 94 {
jksoft 0:8c643bfe55b7 95 uint32_t evt_id;
jksoft 0:8c643bfe55b7 96
jksoft 0:8c643bfe55b7 97 // Pull event from SOC.
jksoft 0:8c643bfe55b7 98 err_code = sd_evt_get(&evt_id);
jksoft 0:8c643bfe55b7 99
jksoft 0:8c643bfe55b7 100 if (err_code == NRF_ERROR_NOT_FOUND)
jksoft 0:8c643bfe55b7 101 {
jksoft 0:8c643bfe55b7 102 no_more_soc_evts = true;
jksoft 0:8c643bfe55b7 103 }
jksoft 0:8c643bfe55b7 104 else if (err_code != NRF_SUCCESS)
jksoft 0:8c643bfe55b7 105 {
jksoft 0:8c643bfe55b7 106 APP_ERROR_HANDLER(err_code);
jksoft 0:8c643bfe55b7 107 }
jksoft 0:8c643bfe55b7 108 else
jksoft 0:8c643bfe55b7 109 {
jksoft 0:8c643bfe55b7 110 // Call application's SOC event handler.
jksoft 0:8c643bfe55b7 111 m_sys_evt_handler(evt_id);
jksoft 0:8c643bfe55b7 112 }
jksoft 0:8c643bfe55b7 113 }
jksoft 0:8c643bfe55b7 114
jksoft 0:8c643bfe55b7 115 #ifdef BLE_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 116 // Fetch BLE Events.
jksoft 0:8c643bfe55b7 117 if (!no_more_ble_evts)
jksoft 0:8c643bfe55b7 118 {
jksoft 0:8c643bfe55b7 119 // Pull event from stack
jksoft 0:8c643bfe55b7 120 uint16_t evt_len = m_ble_evt_buffer_size;
jksoft 0:8c643bfe55b7 121
jksoft 0:8c643bfe55b7 122 err_code = sd_ble_evt_get(m_evt_buffer, &evt_len);
jksoft 0:8c643bfe55b7 123 if (err_code == NRF_ERROR_NOT_FOUND)
jksoft 0:8c643bfe55b7 124 {
jksoft 0:8c643bfe55b7 125 no_more_ble_evts = true;
jksoft 0:8c643bfe55b7 126 }
jksoft 0:8c643bfe55b7 127 else if (err_code != NRF_SUCCESS)
jksoft 0:8c643bfe55b7 128 {
jksoft 0:8c643bfe55b7 129 APP_ERROR_HANDLER(err_code);
jksoft 0:8c643bfe55b7 130 }
jksoft 0:8c643bfe55b7 131 else
jksoft 0:8c643bfe55b7 132 {
jksoft 0:8c643bfe55b7 133 // Call application's BLE stack event handler.
jksoft 0:8c643bfe55b7 134 m_ble_evt_handler((ble_evt_t *)m_evt_buffer);
jksoft 0:8c643bfe55b7 135 }
jksoft 0:8c643bfe55b7 136 }
jksoft 0:8c643bfe55b7 137 #endif
jksoft 0:8c643bfe55b7 138
jksoft 0:8c643bfe55b7 139 #ifdef ANT_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 140 // Fetch ANT Events.
jksoft 0:8c643bfe55b7 141 if (!no_more_ant_evts)
jksoft 0:8c643bfe55b7 142 {
jksoft 0:8c643bfe55b7 143 // Pull event from stack
jksoft 0:8c643bfe55b7 144 err_code = sd_ant_event_get(&((ant_evt_t *)m_evt_buffer)->channel,
jksoft 0:8c643bfe55b7 145 &((ant_evt_t *)m_evt_buffer)->event,
jksoft 0:8c643bfe55b7 146 ((ant_evt_t *)m_evt_buffer)->evt_buffer);
jksoft 0:8c643bfe55b7 147 if (err_code == NRF_ERROR_NOT_FOUND)
jksoft 0:8c643bfe55b7 148 {
jksoft 0:8c643bfe55b7 149 no_more_ant_evts = true;
jksoft 0:8c643bfe55b7 150 }
jksoft 0:8c643bfe55b7 151 else if (err_code != NRF_SUCCESS)
jksoft 0:8c643bfe55b7 152 {
jksoft 0:8c643bfe55b7 153 APP_ERROR_HANDLER(err_code);
jksoft 0:8c643bfe55b7 154 }
jksoft 0:8c643bfe55b7 155 else
jksoft 0:8c643bfe55b7 156 {
jksoft 0:8c643bfe55b7 157 // Call application's ANT stack event handler.
jksoft 0:8c643bfe55b7 158 m_ant_evt_handler((ant_evt_t *)m_evt_buffer);
jksoft 0:8c643bfe55b7 159 }
jksoft 0:8c643bfe55b7 160 }
jksoft 0:8c643bfe55b7 161 #endif
jksoft 0:8c643bfe55b7 162
jksoft 0:8c643bfe55b7 163 if (no_more_soc_evts)
jksoft 0:8c643bfe55b7 164 {
jksoft 0:8c643bfe55b7 165 // There are no remaining System (SOC) events to be fetched from the SoftDevice.
jksoft 0:8c643bfe55b7 166 #if defined(ANT_STACK_SUPPORT_REQD) && defined(BLE_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 167 // Check if there are any remaining BLE and ANT events.
jksoft 0:8c643bfe55b7 168 if (no_more_ble_evts && no_more_ant_evts)
jksoft 0:8c643bfe55b7 169 {
jksoft 0:8c643bfe55b7 170 break;
jksoft 0:8c643bfe55b7 171 }
jksoft 0:8c643bfe55b7 172 #elif defined(BLE_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 173 // Check if there are any remaining BLE events.
jksoft 0:8c643bfe55b7 174 if (no_more_ble_evts)
jksoft 0:8c643bfe55b7 175 {
jksoft 0:8c643bfe55b7 176 break;
jksoft 0:8c643bfe55b7 177 }
jksoft 0:8c643bfe55b7 178 #elif defined(ANT_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 179 // Check if there are any remaining ANT events.
jksoft 0:8c643bfe55b7 180 if (no_more_ant_evts)
jksoft 0:8c643bfe55b7 181 {
jksoft 0:8c643bfe55b7 182 break;
jksoft 0:8c643bfe55b7 183 }
jksoft 0:8c643bfe55b7 184 #else
jksoft 0:8c643bfe55b7 185 // No need to check for BLE or ANT events since there is no support for BLE and ANT
jksoft 0:8c643bfe55b7 186 // required.
jksoft 0:8c643bfe55b7 187 break;
jksoft 0:8c643bfe55b7 188 #endif
jksoft 0:8c643bfe55b7 189 }
jksoft 0:8c643bfe55b7 190 }
jksoft 0:8c643bfe55b7 191 }
jksoft 0:8c643bfe55b7 192
jksoft 0:8c643bfe55b7 193
jksoft 0:8c643bfe55b7 194 uint32_t softdevice_handler_init(nrf_clock_lfclksrc_t clock_source,
jksoft 0:8c643bfe55b7 195 void * p_evt_buffer,
jksoft 0:8c643bfe55b7 196 uint16_t evt_buffer_size,
jksoft 0:8c643bfe55b7 197 softdevice_evt_schedule_func_t evt_schedule_func)
jksoft 0:8c643bfe55b7 198 {
jksoft 0:8c643bfe55b7 199 uint32_t err_code;
jksoft 0:8c643bfe55b7 200
jksoft 0:8c643bfe55b7 201 // Save configuration.
jksoft 0:8c643bfe55b7 202 #if defined (BLE_STACK_SUPPORT_REQD) || defined (ANT_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 203 // Check that buffer is not NULL.
jksoft 0:8c643bfe55b7 204 if (p_evt_buffer == NULL)
jksoft 0:8c643bfe55b7 205 {
jksoft 0:8c643bfe55b7 206 return NRF_ERROR_INVALID_PARAM;
jksoft 0:8c643bfe55b7 207 }
jksoft 0:8c643bfe55b7 208
jksoft 0:8c643bfe55b7 209 // Check that buffer is correctly aligned.
jksoft 0:8c643bfe55b7 210 if (!is_word_aligned(p_evt_buffer))
jksoft 0:8c643bfe55b7 211 {
jksoft 0:8c643bfe55b7 212 return NRF_ERROR_INVALID_PARAM;
jksoft 0:8c643bfe55b7 213 }
jksoft 0:8c643bfe55b7 214
jksoft 0:8c643bfe55b7 215 m_evt_buffer = (uint8_t *)p_evt_buffer;
jksoft 0:8c643bfe55b7 216 #else
jksoft 0:8c643bfe55b7 217 // The variable p_evt_buffer is not needed if neither BLE Stack nor ANT stack support is
jksoft 0:8c643bfe55b7 218 // required.
jksoft 0:8c643bfe55b7 219 UNUSED_PARAMETER(p_evt_buffer);
jksoft 0:8c643bfe55b7 220 #endif
jksoft 0:8c643bfe55b7 221
jksoft 0:8c643bfe55b7 222 #if defined (BLE_STACK_SUPPORT_REQD)
jksoft 0:8c643bfe55b7 223 m_ble_evt_buffer_size = evt_buffer_size;
jksoft 0:8c643bfe55b7 224 #else
jksoft 0:8c643bfe55b7 225 // The variable evt_buffer_size is not needed if BLE Stack support is NOT required.
jksoft 0:8c643bfe55b7 226 UNUSED_PARAMETER(evt_buffer_size);
jksoft 0:8c643bfe55b7 227 #endif
jksoft 0:8c643bfe55b7 228
jksoft 0:8c643bfe55b7 229 m_evt_schedule_func = evt_schedule_func;
jksoft 0:8c643bfe55b7 230
jksoft 0:8c643bfe55b7 231 // Initialize SoftDevice.
jksoft 0:8c643bfe55b7 232
jksoft 0:8c643bfe55b7 233 err_code = sd_softdevice_enable(clock_source, softdevice_assertion_handler);
jksoft 0:8c643bfe55b7 234 if (err_code != NRF_SUCCESS)
jksoft 0:8c643bfe55b7 235 {
jksoft 0:8c643bfe55b7 236 return err_code;
jksoft 0:8c643bfe55b7 237 }
jksoft 0:8c643bfe55b7 238
jksoft 0:8c643bfe55b7 239 m_softdevice_enabled = true;
jksoft 0:8c643bfe55b7 240 // Enable BLE event interrupt (interrupt priority has already been set by the stack).
jksoft 0:8c643bfe55b7 241 return sd_nvic_EnableIRQ(SWI2_IRQn);
jksoft 0:8c643bfe55b7 242 }
jksoft 0:8c643bfe55b7 243
jksoft 0:8c643bfe55b7 244
jksoft 0:8c643bfe55b7 245 uint32_t softdevice_handler_sd_disable(void)
jksoft 0:8c643bfe55b7 246 {
jksoft 0:8c643bfe55b7 247 uint32_t err_code = sd_softdevice_disable();
jksoft 0:8c643bfe55b7 248
jksoft 0:8c643bfe55b7 249 m_softdevice_enabled = !(err_code == NRF_SUCCESS);
jksoft 0:8c643bfe55b7 250
jksoft 0:8c643bfe55b7 251 return err_code;
jksoft 0:8c643bfe55b7 252 }
jksoft 0:8c643bfe55b7 253
jksoft 0:8c643bfe55b7 254
jksoft 0:8c643bfe55b7 255 #ifdef BLE_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 256 uint32_t softdevice_ble_evt_handler_set(ble_evt_handler_t ble_evt_handler)
jksoft 0:8c643bfe55b7 257 {
jksoft 0:8c643bfe55b7 258 if (ble_evt_handler == NULL)
jksoft 0:8c643bfe55b7 259 {
jksoft 0:8c643bfe55b7 260 return NRF_ERROR_NULL;
jksoft 0:8c643bfe55b7 261 }
jksoft 0:8c643bfe55b7 262
jksoft 0:8c643bfe55b7 263 m_ble_evt_handler = ble_evt_handler;
jksoft 0:8c643bfe55b7 264
jksoft 0:8c643bfe55b7 265 return NRF_SUCCESS;
jksoft 0:8c643bfe55b7 266 }
jksoft 0:8c643bfe55b7 267 #endif
jksoft 0:8c643bfe55b7 268
jksoft 0:8c643bfe55b7 269
jksoft 0:8c643bfe55b7 270 #ifdef ANT_STACK_SUPPORT_REQD
jksoft 0:8c643bfe55b7 271 uint32_t softdevice_ant_evt_handler_set(ant_evt_handler_t ant_evt_handler)
jksoft 0:8c643bfe55b7 272 {
jksoft 0:8c643bfe55b7 273 if (ant_evt_handler == NULL)
jksoft 0:8c643bfe55b7 274 {
jksoft 0:8c643bfe55b7 275 return NRF_ERROR_NULL;
jksoft 0:8c643bfe55b7 276 }
jksoft 0:8c643bfe55b7 277
jksoft 0:8c643bfe55b7 278 m_ant_evt_handler = ant_evt_handler;
jksoft 0:8c643bfe55b7 279
jksoft 0:8c643bfe55b7 280 return NRF_SUCCESS;
jksoft 0:8c643bfe55b7 281 }
jksoft 0:8c643bfe55b7 282 #endif
jksoft 0:8c643bfe55b7 283
jksoft 0:8c643bfe55b7 284
jksoft 0:8c643bfe55b7 285 uint32_t softdevice_sys_evt_handler_set(sys_evt_handler_t sys_evt_handler)
jksoft 0:8c643bfe55b7 286 {
jksoft 0:8c643bfe55b7 287 if (sys_evt_handler == NULL)
jksoft 0:8c643bfe55b7 288 {
jksoft 0:8c643bfe55b7 289 return NRF_ERROR_NULL;
jksoft 0:8c643bfe55b7 290 }
jksoft 0:8c643bfe55b7 291
jksoft 0:8c643bfe55b7 292 m_sys_evt_handler = sys_evt_handler;
jksoft 0:8c643bfe55b7 293
jksoft 0:8c643bfe55b7 294 return NRF_SUCCESS;
jksoft 0:8c643bfe55b7 295 }
jksoft 0:8c643bfe55b7 296
jksoft 0:8c643bfe55b7 297
jksoft 0:8c643bfe55b7 298 /**@brief Function for handling the Application's BLE Stack events interrupt.
jksoft 0:8c643bfe55b7 299 *
jksoft 0:8c643bfe55b7 300 * @details This function is called whenever an event is ready to be pulled.
jksoft 0:8c643bfe55b7 301 */
jksoft 0:8c643bfe55b7 302 extern "C" void SWI2_IRQHandler(void)
jksoft 0:8c643bfe55b7 303 {
jksoft 0:8c643bfe55b7 304 if (m_evt_schedule_func != NULL)
jksoft 0:8c643bfe55b7 305 {
jksoft 0:8c643bfe55b7 306 uint32_t err_code = m_evt_schedule_func();
jksoft 0:8c643bfe55b7 307 APP_ERROR_CHECK(err_code);
jksoft 0:8c643bfe55b7 308 }
jksoft 0:8c643bfe55b7 309 else
jksoft 0:8c643bfe55b7 310 {
jksoft 0:8c643bfe55b7 311 intern_softdevice_events_execute();
jksoft 0:8c643bfe55b7 312 }
jksoft 0:8c643bfe55b7 313 }