Contents
main.c
チュートリアル用に用意されているソースを自分なりに解析
int main()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
int main() { CyGlobalIntEnable; capsense_Start(); capsense_InitializeEnabledBaselines(); /* Start BLE stack and register the callback function */ CyBle_Start(BleCallBack); for(;;) { /* if Capsense scan is done, read the value and start another scan */ if(!capsense_IsBusy()) { fingerPos=capsense_GetCentroidPos(capsense_LINEARSLIDER0__LS); capsense_UpdateEnabledBaselines(); capsense_ScanEnabledWidgets(); updateCapsense(); } CyBle_ProcessEvents(); CyBle_EnterLPM(CYBLE_BLESS_DEEPSLEEP); } } |
6行目までは、PSoC4本体やCapsenseモジュールの起動・初期化を実施。
9行目でBLEスタックの割り込みハンドラ(後ほど解析)を登録。
forループに入って、14~20行目では、前回のCapsenseスキャンが完了していたら以下の処理を実行。
・変数fingerPosにリニアスライダ上の指の位置を格納
・有効なセンサ情報を更新
・有効なウィジェットをスキャン
・updateCapsense()を実行 (後ほど解析)
21行目では、ペンディングになってるBLEスタック処理をチェックして実行。
Low Power Mode前にはペンディング無しにする必要がある。
22行目で、Low Power Modeに移行
BleCallBack()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
void BleCallBack(uint32 event, void* eventParam) { CYBLE_GATTS_WRITE_REQ_PARAM_T *wrReqParam; switch(event) { /* if there is a disconnect or the stack just turned on from a reset then start the advertising and turn on the LED blinking */ case CYBLE_EVT_STACK_ON: case CYBLE_EVT_GAP_DEVICE_DISCONNECTED: capsenseNotify = 0; CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST); pwm_Start(); break; /* when a connection is made, update the LED and Capsense states in the GATT database and stop blinking the LED */ case CYBLE_EVT_GATT_CONNECT_IND: updateLed(); updateCapsense(); pwm_Stop(); break; /* handle a write request */ case CYBLE_EVT_GATTS_WRITE_REQ: wrReqParam = (CYBLE_GATTS_WRITE_REQ_PARAM_T *) eventParam; /* request write the LED value */ if(wrReqParam->handleValPair.attrHandle == CYBLE_LEDCAPSENSE_LED_CHAR_HANDLE) { /* only update the value and write the response if the requested write is allowed */ if(CYBLE_GATT_ERR_NONE == CyBle_GattsWriteAttributeValue(&wrReqParam->handleValPair, 0, &cyBle_connHandle, CYBLE_GATT_DB_PEER_INITIATED)) { red_Write(!wrReqParam->handleValPair.value.val[0]); CyBle_GattsWriteRsp(cyBle_connHandle); } } /* request to update the CapSense notification */ if(wrReqParam->handleValPair.attrHandle == CYBLE_LEDCAPSENSE_CAPSENSE_CAPSENSECCCD_DESC_HANDLE) { CyBle_GattsWriteAttributeValue(&wrReqParam->handleValPair, 0, &cyBle_connHandle, CYBLE_GATT_DB_PEER_INITIATED); capsenseNotify = wrReqParam->handleValPair.value.val[0] & 0x01; CyBle_GattsWriteRsp(cyBle_connHandle); } break; default: break; } } |
これがPSoC4のBLEモジュールの肝。
eventcode毎に処理を記載。
1. CYBLE_EVT_STACK_ON
BLEスタックが初期化完了した際に発生するイベント。
特に何も処理しない。
2. CYBLE_EVT_GAP_DEVICE_DISCONNECTED
確立されていた接続が切断もしくは失敗した際に発生するイベント。
・アドバタイズメント・パケット(自分の存在を周囲に定期的に発送するブロードキャストパケット)送信開始
・青LED点滅開始
3. CYBLE_EVT_GATT_CONNECT_IND
コネクション確立時に発生するイベント。
・updateLed()処理実行 (後で解析)
・updateCapsense()処理実行(後で解析)
・青LED消灯
4. CYBLE_EVT_GATTS_WRITE_REQ
クライアントから書き込み要求が来た際に発生するイベント。
・CYBLE_LEDCAPSENSE_LED_CHAR_HANDLEへの書き込み要求
・赤LEDを書き込まれた値に従い点灯(1)/消灯(0)
・クライアントにレスポンスを返す
・CYBLE_LEDCAPSENSE_CAPSENSE_CAPSENSECCCD_DESC_HANDLEへの書き込み要求
・capsenseNotifyに書き込み値を反映(1: notify有効、0: notify無効)
・クライアントにレスポンスを返す
updateLed()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void updateLed() { CYBLE_GATTS_HANDLE_VALUE_NTF_T tempHandle; uint8 red_State = !red_Read(); if(CyBle_GetState() != CYBLE_STATE_CONNECTED) return; tempHandle.attrHandle = CYBLE_LEDCAPSENSE_LED_CHAR_HANDLE; tempHandle.value.val = (uint8 *) &red_State; tempHandle.value.len = 1; CyBle_GattsWriteAttributeValue(&tempHandle,0,&cyBle_connHandle,CYBLE_GATT_DB_LOCALLY_INITIATED); } |
コネクションが確立してない場合は処理終了。
コネクションが確立していたら、現在の赤LEDの状態をGATTデータベースに反映する。
updateCapsense()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void updateCapsense() { if(CyBle_GetState() != CYBLE_STATE_CONNECTED) return; CYBLE_GATTS_HANDLE_VALUE_NTF_T tempHandle; tempHandle.attrHandle = CYBLE_LEDCAPSENSE_CAPSENSE_CHAR_HANDLE; tempHandle.value.val = (uint8 *)&fingerPos; tempHandle.value.len = 2; CyBle_GattsWriteAttributeValue(&tempHandle,0,&cyBle_connHandle,CYBLE_GATT_DB_LOCALLY_INITIATED ); /* send notification to client if notifications are enabled and finger location has changed */ if (capsenseNotify && (fingerPos != fingerPosOld) ) CyBle_GattsNotification(cyBle_connHandle,&tempHandle); fingerPosOld = fingerPos; } |
・コネクションが確立してない場合は処理終了
・コネクションが確立していたら、現在のCapsense値をGATTデータベースに反映
・notify有効時、前回のCapsense値と差分があればnotify発行
なんとなく処理がわかった。
データベースを増やしたら処理を加えていくだけで問題なさそう。