BLE基礎 (7)
2024/08/16
DevAcademyのBluetooth Low Energy Fundamentalsをやっているところである。
前回の続きから。
Lesson3 Bluetooth LE Connections
Exercise 1
- 全体に関するコールバックの定義は bt_conn_cb
void (*connected)(struct bt_conn *conn, uint8_t err)
void (*disconnected)(struct bt_conn *conn, uint8_t reason)
bool (*le_param_req)(struct bt_conn *conn, struct bt_le_conn_param *param)
void (*le_param_updated)(struct bt_conn *conn, uint16_t interval, uint16_t latency, uint16_t timeout)
void (*identity_resolved)(struct bt_conn *conn, const bt_addr_le_t *rpa, const bt_addr_le_t *identity)
void (*security_changed)(struct bt_conn *conn, bt_security_t level, enum bt_security_err err)
void (*remote_info_available)(struct bt_conn *conn, struct bt_conn_remote_info *remote_info)
void (*le_phy_updated)(struct bt_conn *conn, struct bt_conn_le_phy_info *param)
void (*le_data_len_updated)(struct bt_conn *conn, struct bt_conn_le_data_len_info *info)
- 構造体のメンバーだけ
.
(メンバー指定子)を付けて初期化することができたんだな- C99にあるらしい
- 指定しなかったメンバーはゼロ値。。。というかC言語なので素直に
0
でよいだろう- 他の言語だと、文字列は文字列型なので
\0
みたいな概念がないから「ゼロ値」と呼ぶのだったか - 他の言語だと変数値は初期化するからゼロ値というか初期値というかの決め事があるのだろう
- 他の言語だと、文字列は文字列型なので
- BLEの “connection events” とコールバックで通知される接続/切断は別物なので “connected callback events” と呼ぶことにする
struct bt_conn
は接続している間は保持しておく- コールバック関数の登録は
bt_conn_cb_register()
で行うが、BT_CONN_CB_DEFINE()
マクロを使うと構造体定義と登録を済ませてしまうそうだ。- BT_CONN_CB_DEFINE(conn_callbacks)
- このマクロがさらにマクロを含んで、さらにさらに。。。という感じで複雑
_bt_conn_cb.static.bt_conn_cb_conn_callbacks_
のような名前になってmapファイルに載っていた__attribute__((section))
やら__aligned
やら__used __noasan
やらやら。。。- 下に載せたのはMAPファイルからの抜粋。SRAMは
0x20000000
からなのでFlashに配置されるのか。
- BT_CONN_CB_DEFINE(conn_callbacks)
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
};
0x000000000002499c _bt_conn_cb_list_start = .
*(SORT_BY_NAME(SORT_BY_ALIGNMENT(._bt_conn_cb.static.*)))
._bt_conn_cb.static.bt_conn_cb_conn_callbacks_
- MDBT53ボードに載っているLED以外が制御できてないしUSBシリアルも有効になってないしなんだっけ。。。
- たった一週間で忘れていたのか、私
- LEDはoverlayファイルで対応する。本体外なのでボード定義ファイルにしたくないのだ
- USBシリアルはボード定義に追加しているが
main.c
で<zephyr/usb/usb_device.h>
のincludeとusb_enable()
での有効化
- J-LinkにCOMポートがあるのだけどSWDからシリアルに変換とかするんだろうか?
- RTTがあるしなぁ
- 画像が出ているnRF Connect for MobileのScannerは機器ごとにアイコンが派手なのだが、画面のレイアウトが違うし昔の仕様だろうか?
- 切断理由
- 意図的:
BT_HCI_ERR_REMOTE_USER_TERM_CONN
=19
- タイムアウト:
BT_HCI_ERR_CONN_TIMEOUT
=8
- スマホを電子レンジに入れると遮断しやすい
- 意図的:
- LBSを追加した後、ボタンを押すとnotifyが飛ぶ
- ボタンを押してからシリアルログが出るまでまあまあ時差がある。しかしログが出るまでボタンを押し続ける必要はない。
- dk_buttons_and_leds はどうやって判定してるのだろう?
集中力がないのか、進みが悪い。。